diff --git a/src/main/java/fr/openmc/core/ListenersManager.java b/src/main/java/fr/openmc/core/ListenersManager.java index 1ea12e498..c4a5a44d1 100644 --- a/src/main/java/fr/openmc/core/ListenersManager.java +++ b/src/main/java/fr/openmc/core/ListenersManager.java @@ -5,6 +5,7 @@ import fr.openmc.core.features.cube.listeners.CubeListener; import fr.openmc.core.features.cube.listeners.RepulseEffectListener; import fr.openmc.core.features.cube.multiblocks.MultiBlocksListeners; +import fr.openmc.core.features.displays.bossbar.listeners.BossbarListener; import fr.openmc.core.features.itemsadder.SpawnerExtractorListener; import fr.openmc.core.features.settings.PlayerSettingsManager; import fr.openmc.core.features.tickets.TicketListener; @@ -33,6 +34,7 @@ public static void init() { new SleepListener(), new PlayerDeathListener(), new AsyncChatListener(OMCPlugin.getInstance()), + new BossbarListener(), new PlayerSettingsManager(), new InteractListener(), new EquipableItemListener(), diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index ac1fbb50c..3518e9882 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -19,7 +19,6 @@ import fr.openmc.core.features.cube.multiblocks.MultiBlockManager; import fr.openmc.core.features.displays.TabList; import fr.openmc.core.features.displays.bossbar.BossbarManager; -import fr.openmc.core.features.displays.bossbar.contents.HelpConfigManager; import fr.openmc.core.features.displays.holograms.HologramLoader; import fr.openmc.core.features.displays.scoreboards.ScoreboardManager; import fr.openmc.core.features.dream.DreamManager; @@ -135,7 +134,6 @@ public void onEnable() { QuestProgressSaveManager.init(); TabList.init(); AdminShopManager.init(); - HelpConfigManager.init(); BossbarManager.init(); AnimationsManager.init(); HalloweenManager.init(); diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/BaseBossbar.java b/src/main/java/fr/openmc/core/features/displays/bossbar/BaseBossbar.java deleted file mode 100644 index 8f4ef79d3..000000000 --- a/src/main/java/fr/openmc/core/features/displays/bossbar/BaseBossbar.java +++ /dev/null @@ -1,57 +0,0 @@ -package fr.openmc.core.features.displays.bossbar; - -import net.kyori.adventure.bossbar.BossBar; -import org.bukkit.boss.BarColor; -import org.bukkit.entity.Player; - -public abstract class BaseBossbar { - /** - * Initialise la boss bar pour un joueur - * - * @param player Le joueur - */ - public void init(Player player, BossBar bar) { - update(player, bar); - } - - protected abstract String id(); - - /** - * Met à jour la boss bar - * - * @param player Le joueur - */ - protected abstract void update(Player player, BossBar bar); - - /** - * Détermine la couleur de la boss bar - * @param player Le joueur - * @return La couleur de la boss bar - */ - protected abstract BossBar.Color color(Player player); - - /** - * Détermine le style de la boss bar - * @param player Le joueur - * @return Le style de la boss bar - */ - protected abstract BossBar.Overlay style(Player player); - - /** - * Détermine si le boss bar doit être affiché pour un joueur - * - * @param player Le joueur à vérifier - * @return true si la boss bar doit être affiché, false sinon - */ - protected abstract boolean shouldDisplay(Player player); - - /** - * @return Le poids de la boss bar (plus la valeur est haute, plus la position de la boss bar sera haute). - */ - protected abstract int weight(); - - /** - * @return L'intervalle de mise à jour en secondes - */ - protected abstract Integer updateInterval(); -} diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/BossbarManager.java b/src/main/java/fr/openmc/core/features/displays/bossbar/BossbarManager.java index f6b30bc53..1c1b003fd 100644 --- a/src/main/java/fr/openmc/core/features/displays/bossbar/BossbarManager.java +++ b/src/main/java/fr/openmc/core/features/displays/bossbar/BossbarManager.java @@ -3,9 +3,10 @@ import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; import fr.openmc.core.features.displays.bossbar.commands.BossBarCommand; -import fr.openmc.core.features.displays.bossbar.contents.MainBossbar; -import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; -import fr.openmc.core.features.dream.displays.DreamBossBar; +import fr.openmc.core.features.milestones.MilestoneUtils; +import fr.openmc.core.utils.messages.MessageType; +import fr.openmc.core.utils.messages.MessagesManager; +import fr.openmc.core.utils.messages.Prefix; import lombok.Getter; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; @@ -19,174 +20,267 @@ import java.util.*; public class BossbarManager { - private static final List registeredBossbar = new ArrayList<>(); - - private static final Map> activeBossbars = new HashMap<>(); - private static final Map> lastUpdate = new HashMap<>(); - private static final Map> offBossbars = new HashMap<>(); - + @Getter + private static final List helpMessages = new ArrayList<>(); + private static final HashMap> activeBossBars = new HashMap<>(); + private static final Map playerPreferences = new HashMap<>(); + @Getter + private static boolean bossBarEnabled = true; + @Getter + private static File configFile; + private static int currentMessageIndex = 0; + + public static BossBar bossBarHelp; + + /** + * Initializes the BossbarManager + */ public static void init() { + configFile = new File(OMCPlugin.getInstance().getDataFolder() + "/data", "bossbars.yml"); + loadConfig(); + loadDefaultMessages(); + startRotationTask(); CommandsManager.getHandler().register(new BossBarCommand()); - registerBossbars( - new MainBossbar(), - new DreamBossBar() + bossBarHelp = BossBar.bossBar( + helpMessages.getFirst(), + 0f, + BossBar.Color.RED, + BossBar.Overlay.PROGRESS ); + } - start(); + /** + * Loads configuration from bossbars.yml file + * Creates the file if it doesn't exist + */ + private static void loadConfig() { + if (!configFile.exists()) { + configFile.getParentFile().mkdirs(); + OMCPlugin.getInstance().saveResource("data/bossbars.yml", false); + } + reloadMessages(); } - public static void registerBossbars(BaseBossbar... bossbar) { - registeredBossbar.addAll(Arrays.asList(bossbar)); - registeredBossbar.sort(Comparator.comparingInt(BaseBossbar::weight).reversed()); + /** + * Loads messages from the configuration file + */ + private static void loadDefaultMessages() { + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + helpMessages.clear(); + + for (String rawMessage : config.getStringList("messages")) { + helpMessages.add(MiniMessage.miniMessage().deserialize(rawMessage)); + } + + if (helpMessages.isEmpty()) { + OMCPlugin.getInstance().getSLF4JLogger().warn("No messages found in bossbars.yml."); + } } - private static void start() { + /** + * Starts the message rotation task for bossbars + * Messages change every 10 seconds (200 ticks) + */ + private static void startRotationTask() { new BukkitRunnable() { @Override public void run() { - for (Player player : Bukkit.getOnlinePlayers()) { - updatePlayer(player); - } - } - }.runTaskTimer(OMCPlugin.getInstance(), 0L, 20L); - } - + if (helpMessages.isEmpty()) return; - private static void updatePlayer(Player player) { + currentMessageIndex = (currentMessageIndex + 1) % helpMessages.size(); + Component message = helpMessages.get(currentMessageIndex); - UUID uuid = player.getUniqueId(); - - activeBossbars.putIfAbsent(uuid, new HashMap<>()); - offBossbars.putIfAbsent(uuid, new HashSet<>()); - lastUpdate.putIfAbsent(uuid, new HashMap<>()); - - Map playerBars = activeBossbars.get(uuid); - Set toggled = offBossbars.get(uuid); - Map playerLastUpdate = lastUpdate.get(uuid); + activeBossBars.forEach((type, bossBarData) -> { + if (!type.equals(BossbarsType.HELP)) return; - long now = System.currentTimeMillis(); - - for (BaseBossbar base : registeredBossbar) { - String id = base.id(); - - if (toggled.contains(id)) { - removeBossBar(player, id); - continue; + bossBarData.forEach((uuid, bossBar) -> { + if (bossBar != null) { + bossBar.name(message); + } + }); + }); } + }.runTaskTimer(OMCPlugin.getInstance(), 0, 200); + } - boolean shouldDisplay = base.shouldDisplay(player); - BossBar existing = playerBars.get(id); - - if (shouldDisplay) { + /** + * Adds a bossbar to the specified player + * @param type The type of bossbar to add + * @param bossbar The bossbar to add + * @param player The player to add the bossbar to + */ + public static void addBossBar(BossbarsType type, BossBar bossbar, Player player) { + if (!bossBarEnabled) return; + + Map bars = activeBossBars.get(type); + if (bars != null && bars.containsKey(player.getUniqueId())) return; + + Boolean preference = playerPreferences.get(player.getUniqueId()); + if (preference != null && !preference) { + return; + } + removeBossBar(type, player); - if (existing == null) { - existing = BossBar.bossBar( - Component.text(), - 1f, - base.color(player), - base.style(player) - ); + player.showBossBar(bossbar); + activeBossBars.computeIfAbsent(type, k -> new HashMap<>()).put(player.getUniqueId(), bossbar); + } - player.showBossBar(existing); - playerBars.put(id, existing); + /** + * Removes the bossbar from the specified player + * @param type The type of bossbar to remove + * @param player The player to remove the bossbar from + */ + public static void removeBossBar(BossbarsType type, Player player) { + Map map = activeBossBars.get(type); + if (map == null) return; + + BossBar bossBar = map.remove(player.getUniqueId()); + if (bossBar != null) { + player.hideBossBar(bossBar); + } + } - base.update(player, existing); - playerLastUpdate.put(id, now); - continue; - } + /** + * Gets the bossbar for a specific player + * + * @param type The type of bossbar to get + * @param player The player to get the bossbar for + * @return The bossbar for the specified player, or null if not found + */ + public static BossBar getBossBar(BossbarsType type, Player player) { + if (activeBossBars.get(type) == null) return null; - long last = playerLastUpdate.getOrDefault(id, 0L); - long intervalMillis = base.updateInterval() * 1000L; + return activeBossBars.get(type).get(player.getUniqueId()); - if (now - last >= intervalMillis) { - base.update(player, existing); - playerLastUpdate.put(id, now); - } + } + /** + * Toggles the bossbar for a specific player + * @param player The player to toggle the bossbar for + */ + public static void toggleBossBar(Player player) { + UUID uuid = player.getUniqueId(); + boolean enabled = false; + + for (Map.Entry> activeBossBar : activeBossBars.entrySet()) { + BossbarsType type = activeBossBar.getKey(); + Map bossBarData = activeBossBar.getValue(); + if (bossBarData.containsKey(uuid)) { + removeBossBar(type, player); + enabled = false; + playerPreferences.put(uuid, false); } else { - removeBossBar(player, id); - playerLastUpdate.remove(id); + switch (type) { + case HELP -> { + addBossBar(type, bossBarHelp, player); + enabled = true; + playerPreferences.put(uuid, true); + } + + case TUTORIAL -> { + MilestoneUtils.setBossBar(player); + enabled = true; + playerPreferences.put(uuid, true); + } + } } } - } - - public static void addBossBar(Player player, String id) { - BaseBossbar base = getRegistered(id); - if (base == null) return; - activeBossbars.putIfAbsent(player.getUniqueId(), new HashMap<>()); - - Map playerBars = activeBossbars.get(player.getUniqueId()); + if (enabled) { + MessagesManager.sendMessage(player, Component.text("Bossbar activée"), Prefix.OPENMC, MessageType.SUCCESS, true); + } else { + MessagesManager.sendMessage(player, Component.text("Bossbar désactivée"), Prefix.OPENMC, MessageType.WARNING, true); + } + } - if (playerBars.containsKey(id)) return; + /** + * Reloads messages from the configuration file + */ + public static void reloadMessages() { + helpMessages.clear(); + loadDefaultMessages(); + } - BossBar bar = BossBar.bossBar( - Component.text(), - 1L, - base.color(player), - base.style(player) - ); + /** + * Checks if bossbars are globally enabled + * @return true if bossbars are enabled, false otherwise + */ + public static boolean hasBossBar() { + return bossBarEnabled; + } - player.showBossBar(bar); - playerBars.put(id, bar); + /** + * Sets the list of messages to display in bossbars + * @param messages The list of new messages + */ + public static void setHelpMessages(List messages) { + helpMessages.clear(); + helpMessages.addAll(messages); + saveMessagesToConfig(); } - public static void removeBossBar(Player player, String id) { - Map bars = activeBossbars.get(player.getUniqueId()); - if (bars == null) return; + /** + * Saves messages to the configuration file + */ + private static void saveMessagesToConfig() { + try { + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + List serializedMessages = new ArrayList<>(); - BossBar bar = bars.remove(id); + for (Component message : helpMessages) { + serializedMessages.add(MiniMessage.miniMessage().serialize(message)); + } - if (bar != null) { - player.hideBossBar(bar); + config.set("messages", serializedMessages); + config.save(configFile); + } catch (Exception e) { + OMCPlugin.getInstance().getSLF4JLogger().warn("Failed to save bossbar messages to config: {}", e.getMessage(), e); } } - public static BossBar getBossBar(Player player, String id) { - Map bars = activeBossbars.get(player.getUniqueId()); - if (bars == null) return null; - return bars.get(id); + /** + * Adds a message to the message list + * @param message The message to add + */ + public static void addMessage(Component message) { + helpMessages.add(message); + saveMessagesToConfig(); } - public static void toggleBossBar(Player player, String id) { - offBossbars.putIfAbsent(player.getUniqueId(), new HashSet<>()); - - Set toggled = offBossbars.get(player.getUniqueId()); - - if (toggled.contains(id)) { - toggled.remove(id); - } else { - toggled.add(id); - removeBossBar(player, id); + /** + * Removes a message from the message list + * @param index The index of the message to remove + */ + public static void removeMessage(int index) { + if (index >= 0 && index < helpMessages.size()) { + helpMessages.remove(index); + saveMessagesToConfig(); } } - public static void toggleAllBossBar(Player player) { - for (BaseBossbar baseBossbar : registeredBossbar) { - toggleBossBar(player, baseBossbar.id()); + /** + * Updates an existing message + * @param index The index of the message to update + * @param newMessage The new message content + */ + public static void updateMessage(int index, Component newMessage) { + if (index >= 0 && index < helpMessages.size()) { + helpMessages.set(index, newMessage); + saveMessagesToConfig(); } } - public static boolean isToggled(Player player, String id) { - return offBossbars.getOrDefault(player.getUniqueId(), Set.of()).contains(id); - } + /** + * Toggles bossbars globally for all players + */ + public static void toggleGlobalBossBar() { + bossBarEnabled = !bossBarEnabled; - public static void removePlayer(Player player) { - Map bars = activeBossbars.remove(player.getUniqueId()); - if (bars != null) { - for (BossBar bar : bars.values()) { - player.hideBossBar(bar); - } + if (bossBarEnabled) { + Bukkit.getOnlinePlayers().forEach(player -> addBossBar(BossbarsType.HELP, bossBarHelp, player)); + } else { + Bukkit.getOnlinePlayers().forEach(player -> removeBossBar(BossbarsType.HELP, player)); } - - offBossbars.remove(player.getUniqueId()); - } - - private static BaseBossbar getRegistered(String id) { - return registeredBossbar.stream() - .filter(b -> b.id().equalsIgnoreCase(id)) - .findFirst() - .orElse(null); } } diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/commands/BossBarCommand.java b/src/main/java/fr/openmc/core/features/displays/bossbar/commands/BossBarCommand.java index efb045e33..7d81d9960 100644 --- a/src/main/java/fr/openmc/core/features/displays/bossbar/commands/BossBarCommand.java +++ b/src/main/java/fr/openmc/core/features/displays/bossbar/commands/BossBarCommand.java @@ -25,7 +25,141 @@ public class BossBarCommand { @CommandPlaceholder() - public void mainCommand(Player player) { - BossbarManager.toggleBossBar(player, "omc:help"); + public void mainCommand(CommandSender sender) { + if (!(sender instanceof Player player)) { + MessagesManager.sendMessage(sender, MessagesManager.Message.NO_PERMISSION.getMessage(), Prefix.OPENMC, MessageType.ERROR, true); + return; + } + + BossbarManager.toggleBossBar(player); + } + + @CommandPermission("omc.admin.commands.bossbar.reload") + @Subcommand("reload") + public void reloadCommand(CommandSender sender) { + BossbarManager.reloadMessages(); + MessagesManager.sendMessage(sender, Component.text("§aBossbar rechargée avec succès !"), Prefix.OPENMC, MessageType.SUCCESS, true); + } + + @CommandPermission("omc.admin.commands.bossbar.toggle") + @Subcommand("toggle") + public void toggleCommand(CommandSender sender) { + BossbarManager.toggleGlobalBossBar(); + if (sender instanceof Player player) { + MessagesManager.sendMessage(player, Component.text("§aBossbar " + (BossbarManager.hasBossBar() ? "activée" : "désactivée") + " pour vous."), Prefix.OPENMC, MessageType.SUCCESS, true); + } + } + + @CommandPermission("omc.admin.commands.bossbar.manage") + @Subcommand("manage") + public void manageCommand(BukkitCommandActor actor) { + if (!(actor.sender() instanceof Player player)) { + return; + } + + List messages = BossbarManager.getHelpMessages(); + + Component header = Component.text("\n§6§lGestion des messages de la bossbar\n") + .color(NamedTextColor.GOLD) + .decorate(TextDecoration.BOLD); + + MessagesManager.sendMessage(player, header, Prefix.OPENMC, MessageType.NONE, false); + + Component addButton = Component.text("[Ajouter un message]") + .color(NamedTextColor.GREEN) + .clickEvent(ClickEvent.suggestCommand("/omcbossbar add ")) + .hoverEvent(HoverEvent.showText(Component.text("Cliquez pour ajouter un message"))); + + MessagesManager.sendMessage(player, addButton, Prefix.OPENMC, MessageType.NONE, false); + + for (int i = 0; i < messages.size(); i++) { + Component messageLine = Component.text((i + 1) + ". ", NamedTextColor.GRAY) + .append(messages.get(i)) + .append(Component.space()) + .append(createActionButton("✎ Éditer", "/omcbossbar edit " + i + " " + messages.get(i), NamedTextColor.YELLOW)) + .append(Component.space()) + .append(createActionButton("✖ Supprimer", "/omcbossbar confirm " + i, NamedTextColor.RED)); + + MessagesManager.sendMessage(player, messageLine, Prefix.OPENMC, MessageType.NONE, false); + } + + Component refreshButton = Component.text("\n[Rafraîchir]") + .color(NamedTextColor.BLUE) + .clickEvent(ClickEvent.runCommand("/omcbossbar manage")) + .hoverEvent(HoverEvent.showText(Component.text("Actualiser la liste"))); + + MessagesManager.sendMessage(player, refreshButton, Prefix.OPENMC, MessageType.NONE, false); + } + + private Component createActionButton(String text, String command, NamedTextColor color) { + return Component.text(text) + .color(color) + .clickEvent(ClickEvent.suggestCommand(command)) + .hoverEvent(HoverEvent.showText(Component.text("Exécuter : " + command))); + } + + @CommandPermission("omc.admin.commands.bossbar.manage") + @Subcommand("add") + public void addMessage( + BukkitCommandActor actor, + @Named("message") String message + ) { + try { + Component component = MiniMessage.miniMessage().deserialize(message); + BossbarManager.addMessage(component); + BossbarManager.reloadMessages(); + + MessagesManager.sendMessage(actor.sender(), Component.text("§aMessage ajouté avec succès !"), Prefix.OPENMC, MessageType.SUCCESS, true); + manageCommand(actor); + } catch (Exception e) { + MessagesManager.sendMessage(actor.sender(), Component.text("§cErreur lors de l'ajout du message ! Assurez-vous que le format est correct."), Prefix.OPENMC, MessageType.ERROR, true); + } + } + + @CommandPermission("omc.admin.commands.bossbar.manage") + @Subcommand("edit") + public void editMessage( + BukkitCommandActor actor, + @Named("index") int index, + @Named("message edité") String newMessage + ) { + try { + Component component = MiniMessage.miniMessage().deserialize(newMessage); + BossbarManager.updateMessage(index, component); + BossbarManager.reloadMessages(); + MessagesManager.sendMessage(actor.sender(), Component.text("§aMessage mis à jour avec succès !"), Prefix.OPENMC, MessageType.SUCCESS, true); + manageCommand(actor); + } catch (Exception e) { + MessagesManager.sendMessage(actor.sender(), Component.text("§cFormat de message ou index invalide !"), Prefix.OPENMC, MessageType.ERROR, true); + } + } + + @CommandPermission("omc.admin.commands.bossbar.manage") + @Subcommand("confirm") + public void confirmDelete( + BukkitCommandActor actor, + @Named("index") int index + ) { + Component confirmation = Component.text() + .append(Component.text("§eÊtes-vous sûr de vouloir supprimer ce message ?")) + .append(Component.text("[OUI]") + .color(NamedTextColor.RED) + .clickEvent(ClickEvent.runCommand("/omcbossbar delete " + index)) + .hoverEvent(HoverEvent.showText(Component.text("Confirmer la suppression")))) + .build(); + + actor.reply(confirmation); + } + + @CommandPermission("omc.admin.commands.bossbar.manage") + @Subcommand("delete") + public void deleteMessage( + BukkitCommandActor actor, + @Named("index") int index + ) { + BossbarManager.removeMessage(index); + BossbarManager.reloadMessages(); + MessagesManager.sendMessage(actor.sender(), Component.text("Message supprimé avec succès."), Prefix.OPENMC, MessageType.SUCCESS, true); + manageCommand(actor); } } diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/contents/HelpConfigManager.java b/src/main/java/fr/openmc/core/features/displays/bossbar/contents/HelpConfigManager.java deleted file mode 100644 index b4ea4d6b0..000000000 --- a/src/main/java/fr/openmc/core/features/displays/bossbar/contents/HelpConfigManager.java +++ /dev/null @@ -1,67 +0,0 @@ -package fr.openmc.core.features.displays.bossbar.contents; - -import fr.openmc.core.CommandsManager; -import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.displays.bossbar.commands.BossBarCommand; -import lombok.Getter; -import net.kyori.adventure.bossbar.BossBar; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class HelpConfigManager { - - @Getter - private static final List helpMessages = new ArrayList<>(); - @Getter - private static File configFile; - - /** - * Initializes the HelpConfigManager by loading the configuration and default messages - */ - public static void init() { - configFile = new File(OMCPlugin.getInstance().getDataFolder() + "/data", "bossbars.yml"); - loadConfig(); - loadDefaultMessages(); - } - - /** - * Loads configuration from bossbars.yml file - * Creates the file if it doesn't exist - */ - private static void loadConfig() { - if (!configFile.exists()) { - configFile.getParentFile().mkdirs(); - OMCPlugin.getInstance().saveResource("data/bossbars.yml", false); - } - reloadMessages(); - } - - /** - * Loads messages from the configuration file - */ - private static void loadDefaultMessages() { - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - helpMessages.clear(); - - for (String rawMessage : config.getStringList("messages")) { - helpMessages.add(MiniMessage.miniMessage().deserialize(rawMessage)); - } - - if (helpMessages.isEmpty()) { - OMCPlugin.getInstance().getSLF4JLogger().warn("No messages found in bossbars.yml."); - } - } - - /** - * Reloads messages from the configuration file - */ - public static void reloadMessages() { - helpMessages.clear(); - loadDefaultMessages(); - } -} diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/contents/MainBossbar.java b/src/main/java/fr/openmc/core/features/displays/bossbar/contents/MainBossbar.java deleted file mode 100644 index f146dd2d7..000000000 --- a/src/main/java/fr/openmc/core/features/displays/bossbar/contents/MainBossbar.java +++ /dev/null @@ -1,51 +0,0 @@ -package fr.openmc.core.features.displays.bossbar.contents; - -import fr.openmc.core.features.displays.bossbar.BaseBossbar; -import fr.openmc.core.features.dream.DreamUtils; -import net.kyori.adventure.bossbar.BossBar; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.entity.Player; - -import java.util.List; - -public class MainBossbar extends BaseBossbar { - - private static int indexMessage = 0; - - @Override - protected String id() { - return "omc:help"; - } - - @Override - protected void update(Player player, BossBar bar) { - indexMessage = (indexMessage + 1) % HelpConfigManager.getHelpMessages().size(); - - bar.name(HelpConfigManager.getHelpMessages().get(indexMessage)); - } - - @Override - protected BossBar.Color color(Player player) { - return BossBar.Color.RED; - } - - @Override - protected BossBar.Overlay style(Player player) { - return BossBar.Overlay.PROGRESS; - } - - @Override - protected boolean shouldDisplay(Player player) { - return !DreamUtils.isInDreamWorld(player); - } - - @Override - protected int weight() { - return 10; - } - - @Override - protected Integer updateInterval() { - return 20; - } -} diff --git a/src/main/java/fr/openmc/core/features/displays/bossbar/listeners/BossbarListener.java b/src/main/java/fr/openmc/core/features/displays/bossbar/listeners/BossbarListener.java new file mode 100644 index 000000000..45379736d --- /dev/null +++ b/src/main/java/fr/openmc/core/features/displays/bossbar/listeners/BossbarListener.java @@ -0,0 +1,23 @@ +package fr.openmc.core.features.displays.bossbar.listeners; + +import fr.openmc.core.features.displays.bossbar.BossbarManager; +import fr.openmc.core.features.displays.bossbar.BossbarsType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import static fr.openmc.core.features.displays.bossbar.BossbarManager.bossBarHelp; + +public class BossbarListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + BossbarManager.addBossBar(BossbarsType.HELP, bossBarHelp, event.getPlayer()); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + BossbarManager.removeBossBar(BossbarsType.HELP, event.getPlayer()); + } +} diff --git a/src/main/java/fr/openmc/core/features/dream/displays/DreamBossBar.java b/src/main/java/fr/openmc/core/features/dream/displays/DreamBossBar.java index 246591489..cf3efd507 100644 --- a/src/main/java/fr/openmc/core/features/dream/displays/DreamBossBar.java +++ b/src/main/java/fr/openmc/core/features/dream/displays/DreamBossBar.java @@ -1,11 +1,7 @@ package fr.openmc.core.features.dream.displays; -import fr.openmc.core.features.displays.bossbar.BaseBossbar; import fr.openmc.core.features.displays.bossbar.BossbarManager; import fr.openmc.core.features.displays.bossbar.BossbarsType; -import fr.openmc.core.features.dream.DreamManager; -import fr.openmc.core.features.dream.DreamUtils; -import fr.openmc.core.features.dream.models.db.DreamPlayer; import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; @@ -15,45 +11,45 @@ * *

Cette classe permet d'ajouter, mettre à jour et cacher la BossBar associée à un joueur.

*/ -public class DreamBossBar extends BaseBossbar { - @Override - protected String id() { - return "omc:dream"; +public class DreamBossBar { + + private static final Component TEXTURE_BOSSBAR = Component.text(""); + + /** + * Ajoute une BossBar pour le joueur spécifié dans la Dimension des Rêves. + * + * @param player le joueur auquel ajouter la BossBar + * @param progress la progression de la BossBar + */ + public static void addDreamBossBarForPlayer(Player player, float progress) { + BossBar bar = BossBar.bossBar( + TEXTURE_BOSSBAR, + progress, + BossBar.Color.BLUE, + BossBar.Overlay.PROGRESS + ); + BossbarManager.addBossBar(BossbarsType.DREAM, bar, player); } - @Override - protected void update(Player player, BossBar bar) { - DreamPlayer dreamPlayer = DreamManager.getDreamPlayer(player); - - if (dreamPlayer == null) return; - - float progress = Math.min(1, (float) dreamPlayer.getDreamTime() / dreamPlayer.getMaxDreamTime()); - - bar.progress(progress); - } - - @Override - protected BossBar.Color color(Player player) { - return BossBar.Color.BLUE; - } - - @Override - protected BossBar.Overlay style(Player player) { - return BossBar.Overlay.PROGRESS; - } - - @Override - protected boolean shouldDisplay(Player player) { - return DreamUtils.isInDreamWorld(player); - } - - @Override - protected int weight() { - return 10; + /** + * Met à jour la progression de la BossBar pour le joueur spécifié. + * + * @param player le joueur dont la BossBar doit être mise à jour + * @param progress la nouvelle progression de la BossBar + */ + public static void update(Player player, float progress) { + BossBar bar = BossbarManager.getBossBar(BossbarsType.DREAM, player); + if (bar != null) { + bar.progress(progress); + } } - @Override - protected Integer updateInterval() { - return 1; + /** + * Cache (supprime) la BossBar du joueur spécifié. + * + * @param player le joueur dont la BossBar doit être supprimée + */ + public static void hide(Player player) { + BossbarManager.removeBossBar(BossbarsType.DREAM, player); } } diff --git a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerChangeWorldListener.java b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerChangeWorldListener.java index dd7393748..84ba003f7 100644 --- a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerChangeWorldListener.java +++ b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerChangeWorldListener.java @@ -24,6 +24,10 @@ public void onDreamEntrered(PlayerTeleportEvent event) { if (!DreamUtils.isDreamWorld(event.getTo())) return; if (DreamUtils.isDreamWorld(event.getFrom())) return; + for (BossbarsType type : BossbarsType.values()) { + BossbarManager.removeBossBar(type, player); + } + try { DreamManager.addDreamPlayer(player, event.getFrom()); } catch (IOException e) { @@ -33,6 +37,8 @@ public void onDreamEntrered(PlayerTeleportEvent event) { DreamPlayer dreamPlayer = DreamManager.getDreamPlayer(player); if (dreamPlayer == null) return; + DreamBossBar.addDreamBossBarForPlayer(player, Math.min(1, (float) dreamPlayer.getDreamTime() / dreamPlayer.getMaxDreamTime())); + player.setFoodLevel(20); player.setSaturation(10.0f); AttributeInstance inst = player.getAttribute(Attribute.MAX_HEALTH); @@ -47,6 +53,14 @@ public void onDreamLeave(PlayerTeleportEvent event) { if (!DreamUtils.isDreamWorld(event.getFrom())) return; if (DreamUtils.isDreamWorld(event.getTo())) return; + for (BossbarsType type : BossbarsType.values()) { + if (type.equals(BossbarsType.DREAM)) continue; + + BossbarManager.addBossBar(type, BossbarManager.bossBarHelp, player); + } + + BossbarManager.removeBossBar(BossbarsType.DREAM, player); + DreamManager.removeDreamPlayer(player, event.getFrom()); } } diff --git a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerJoinListener.java b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerJoinListener.java index 80ada5d61..f507cec39 100644 --- a/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerJoinListener.java +++ b/src/main/java/fr/openmc/core/features/dream/listeners/dream/PlayerJoinListener.java @@ -23,6 +23,14 @@ public void onPlayerJoinInDream(PlayerJoinEvent event) { if (!DreamUtils.isInDreamWorld(player)) return; + for (BossbarsType type : BossbarsType.values()) { + if (type.equals(BossbarsType.DREAM)) continue; + + BossbarManager.addBossBar(type, BossbarManager.bossBarHelp, player); + } + + BossbarManager.removeBossBar(BossbarsType.DREAM, player); + try { DreamManager.preloadSavePlayer(player, player.getLocation()); } catch (IOException e) { diff --git a/src/main/java/fr/openmc/core/features/dream/models/db/DreamPlayer.java b/src/main/java/fr/openmc/core/features/dream/models/db/DreamPlayer.java index 65fe90834..530c48d22 100644 --- a/src/main/java/fr/openmc/core/features/dream/models/db/DreamPlayer.java +++ b/src/main/java/fr/openmc/core/features/dream/models/db/DreamPlayer.java @@ -98,7 +98,10 @@ public void scheduleTimeTask() { Bukkit.getServer().getPluginManager().callEvent(new DreamEndEvent(this.player)) ); this.cancelTimeTask(); + return; } + + DreamBossBar.update(player, Math.min(1, (float) this.getDreamTime() / this.getMaxDreamTime())); }, 0L, 20L); } diff --git a/src/main/java/fr/openmc/core/features/milestones/Milestone.java b/src/main/java/fr/openmc/core/features/milestones/Milestone.java index 6052e510c..8358b023b 100644 --- a/src/main/java/fr/openmc/core/features/milestones/Milestone.java +++ b/src/main/java/fr/openmc/core/features/milestones/Milestone.java @@ -1,18 +1,15 @@ package fr.openmc.core.features.milestones; import fr.openmc.api.menulib.Menu; -import fr.openmc.core.features.milestones.bossbar.MilestoneBossBarOptions; -import fr.openmc.core.features.milestones.tutorial.TutorialStep; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.UUID; -public interface Milestone & MilestoneStep> { +public interface Milestone { HashMap playerData = new HashMap<>(); /** @@ -45,18 +42,13 @@ default HashMap getPlayerData() { * @return The icon of the milestone. */ ItemStack getIcon(); - - /** - * @return The class of the steps for the milestone. - */ - Class getStepClass(); - + /** - * @return The enum constants of the step class for the milestone. + * Returns the steps of the milestone. + * + * @return A step list of the milestone. */ - default T[] getStepEnum() { - return this.getStepClass().getEnumConstants(); - } + List getSteps(); /** * Returns the Type of the Milestone @@ -72,30 +64,4 @@ default T[] getStepEnum() { * @return The menu for the milestone. */ Menu getMenu(Player player); - - /** - * Returns the boss bar options for the milestone. - * If set to null, no boss bar will be displayed for the milestone. - * - * @return The boss bar options for the milestone. - */ - MilestoneBossBarOptions getBossBarOptions(); - - /** - * Determines whether the boss bar should be displayed for the given player. - * - * @param player The player for whom to check if the boss bar should be displayed. - * @return true if the boss bar should be displayed for the player, false otherwise. - */ - boolean shouldDisplayBossBar(Player player); - /** - * Returns the steps of the milestone. - * - * @return A step list of the milestone. - */ - default List getSteps() { - T[] enumStep = this.getStepEnum(); - return Arrays.stream(enumStep).map(MilestoneStep::getQuest).toList(); - } - } diff --git a/src/main/java/fr/openmc/core/features/milestones/MilestoneQuest.java b/src/main/java/fr/openmc/core/features/milestones/MilestoneQuest.java index f72576d79..fed40f108 100644 --- a/src/main/java/fr/openmc/core/features/milestones/MilestoneQuest.java +++ b/src/main/java/fr/openmc/core/features/milestones/MilestoneQuest.java @@ -13,9 +13,9 @@ public class MilestoneQuest extends Quest { protected final MilestoneType type; - protected final Enum step; + protected final Enum step; - public MilestoneQuest(String name, List baseDescription, Material icon, MilestoneType type, Enum step, QuestTier quest) { + public MilestoneQuest(String name, List baseDescription, Material icon, MilestoneType type, Enum step, QuestTier quest) { super(name, baseDescription, icon); this.type = type; this.step = step; @@ -24,7 +24,7 @@ public MilestoneQuest(String name, List baseDescription, Material icon, )); } - public MilestoneQuest(String name, List baseDescription, ItemStack icon, MilestoneType type, Enum step, QuestTier quest) { + public MilestoneQuest(String name, List baseDescription, ItemStack icon, MilestoneType type, Enum step, QuestTier quest) { this(name, baseDescription, icon.getType(), type, step, quest); } } diff --git a/src/main/java/fr/openmc/core/features/milestones/MilestoneStep.java b/src/main/java/fr/openmc/core/features/milestones/MilestoneStep.java deleted file mode 100644 index 1478ad3b9..000000000 --- a/src/main/java/fr/openmc/core/features/milestones/MilestoneStep.java +++ /dev/null @@ -1,6 +0,0 @@ -package fr.openmc.core.features.milestones; - -public interface MilestoneStep { - MilestoneQuest getQuest(); - -} diff --git a/src/main/java/fr/openmc/core/features/milestones/MilestoneType.java b/src/main/java/fr/openmc/core/features/milestones/MilestoneType.java index eb837a6f9..6979f390f 100644 --- a/src/main/java/fr/openmc/core/features/milestones/MilestoneType.java +++ b/src/main/java/fr/openmc/core/features/milestones/MilestoneType.java @@ -6,12 +6,15 @@ @Getter public enum MilestoneType { TUTORIAL( - new TutorialMilestone() + new TutorialMilestone(), + true ); - private final Milestone milestone; + private final Milestone milestone; + private final boolean boosBar; - MilestoneType(Milestone milestone) { + MilestoneType(Milestone milestone, boolean bossBar) { this.milestone = milestone; + this.boosBar = bossBar; } } diff --git a/src/main/java/fr/openmc/core/features/milestones/MilestoneUtils.java b/src/main/java/fr/openmc/core/features/milestones/MilestoneUtils.java index 1ddd72c5f..e1e185e18 100644 --- a/src/main/java/fr/openmc/core/features/milestones/MilestoneUtils.java +++ b/src/main/java/fr/openmc/core/features/milestones/MilestoneUtils.java @@ -1,18 +1,60 @@ package fr.openmc.core.features.milestones; +import fr.openmc.core.features.displays.bossbar.BossbarManager; +import fr.openmc.core.features.displays.bossbar.BossbarsType; +import fr.openmc.core.features.milestones.tutorial.TutorialBossBar; +import fr.openmc.core.features.milestones.tutorial.TutorialMilestone; +import fr.openmc.core.features.milestones.tutorial.TutorialStep; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; public class MilestoneUtils { - public static void completeStep(MilestoneType type, Player player, Enum step) { + public static void completeStep(MilestoneType type, Player player, Enum step) { int stepInt = step.ordinal() + 1; if (MilestonesManager.getPlayerStep(type, player) >= stepInt) return; MilestonesManager.setPlayerStep(type, player, stepInt); + MilestonesManager.getMilestoneData(type).get(player.getUniqueId()).setProgress(0); + + if (type != MilestoneType.TUTORIAL) return; //TODO Refaire les bossbars + + int maxStep = TutorialStep.values().length; + + if (stepInt >= maxStep) { + TutorialBossBar.hide(player); + BossbarManager.removeBossBar(BossbarsType.TUTORIAL, player); + return; + } + + TutorialBossBar.update( + player, + Component.text(TutorialBossBar.PLACEHOLDER_TUTORIAL_BOSSBAR.formatted( + (stepInt + 1), + TutorialStep.values()[stepInt].getQuest().getName(player.getUniqueId()) + )), + (float) (stepInt + 1) / maxStep + ); } - public static boolean hasFinishedMilestone(MilestoneType type, Player player) { - return MilestonesManager.getPlayerStep(type, player) >= type.getMilestone().getSteps().size(); + public static void setBossBar(Player player) { + int maxStep = TutorialStep.values().length; + int step = MilestonesManager.getPlayerStep(MilestoneType.TUTORIAL, player); + + if (step >= maxStep) return; + String progressStr = ""; + if (step == 0) { + progressStr = " (" + TutorialMilestone.playerData.get(player.getUniqueId()).getProgress() + " / 30)"; + } + + TutorialBossBar.addTutorialBossBarForPlayer( + player, + Component.text(TutorialBossBar.PLACEHOLDER_TUTORIAL_BOSSBAR.formatted( + step + 1, + TutorialStep.values()[step].getQuest().getName(player.getUniqueId()) + progressStr + )), + step == 0 ? (float) TutorialStep.BREAK_AYWENITE.getQuest().getProgress(player.getUniqueId()) / 30 : (float) (step + 1) / maxStep + ); } } diff --git a/src/main/java/fr/openmc/core/features/milestones/MilestonesManager.java b/src/main/java/fr/openmc/core/features/milestones/MilestonesManager.java index 11fcdb547..fe9bc5672 100644 --- a/src/main/java/fr/openmc/core/features/milestones/MilestonesManager.java +++ b/src/main/java/fr/openmc/core/features/milestones/MilestonesManager.java @@ -6,9 +6,8 @@ import com.j256.ormlite.table.TableUtils; import fr.openmc.core.CommandsManager; import fr.openmc.core.OMCPlugin; -import fr.openmc.core.features.displays.bossbar.BossbarManager; -import fr.openmc.core.features.milestones.bossbar.MilestoneBossBar; import fr.openmc.core.features.milestones.listeners.PlayerJoin; +import fr.openmc.core.features.milestones.tutorial.listeners.TutorialBossBarEvent; import fr.openmc.core.features.quests.objects.Quest; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -17,7 +16,7 @@ import java.util.*; public class MilestonesManager { - private static final Set> milestones = new HashSet<>(); + private static final Set milestones = new HashSet<>(); private static Dao millestoneDao; @@ -30,7 +29,8 @@ public static void init() { registerMilestoneCommand(); OMCPlugin.registerEvents( - new PlayerJoin() + new PlayerJoin(), + new TutorialBossBarEvent() ); } @@ -54,7 +54,7 @@ public static void loadMilestonesData() { for (MilestoneModel data : milestoneData) { MilestoneType type = MilestoneType.valueOf(data.getType()); - Milestone milestone = type.getMilestone(); + Milestone milestone = type.getMilestone(); milestone.getPlayerData().put(data.getUUID(), data); } } catch (SQLException e) { @@ -68,7 +68,7 @@ public static void loadMilestonesData() { */ public static void saveMilestonesData() { try { - for (Milestone milestone : milestones) { + for (Milestone milestone : milestones) { for (Map.Entry entry : milestone.getPlayerData().entrySet()) { MilestoneModel model = entry.getValue(); millestoneDao.createOrUpdate(model); @@ -83,7 +83,7 @@ public static void saveMilestonesData() { * Load the quest progress for each player of each milestone */ public static void loadMilestonesProgress() { - for (Milestone milestone : milestones) { + for (Milestone milestone : milestones) { // Pour tous les joueurs du milestone, la progression est chargée à l'étape actuelle for (Map.Entry playerData : milestone.getPlayerData().entrySet()) { int step = playerData.getValue().getStep(); @@ -102,7 +102,7 @@ public static void loadMilestonesProgress() { * @param milestone the milestone to get data for * @return a map of player UUIDs to their MilestoneModel */ - public static Map getMilestoneData(Milestone milestone) { + public static Map getMilestoneData(Milestone milestone) { return milestone.getPlayerData(); } @@ -160,7 +160,7 @@ public static void setPlayerStep(MilestoneType type, Player player, int step) { * Get all registered milestones. * @return a set of all registered milestones */ - public static Set> getRegisteredMilestones() { + public static Set getRegisteredMilestones() { return milestones; } @@ -169,12 +169,12 @@ public static Set> getRegisteredMilestones() { * This method adds the provided milestone to the internal set and registers it quests. * @param milestone the milestone to register */ - public static void registerMilestone(Milestone milestone) { + public static void registerMilestone(Milestone milestone) { if (milestone == null) return; milestones.add(milestone); registerQuestMilestone(milestone); - registerMilestoneBossBar(milestone); + } /** @@ -190,19 +190,11 @@ public static void registerMilestoneCommand() { * This method iterates through the steps of the milestone and registers any Listener instances. * @param milestone the milestone whose quests are to be registered */ - public static void registerQuestMilestone(Milestone milestone) { - for (MilestoneQuest quest : milestone.getSteps()) { + public static void registerQuestMilestone(Milestone milestone) { + for (Quest quest : milestone.getSteps()) { if (quest instanceof Listener listener) { OMCPlugin.registerEvents(listener); } } } - - public static void registerMilestoneBossBar(Milestone milestone) { - if (milestone.getBossBarOptions() == null) return; - - BossbarManager.registerBossbars( - new MilestoneBossBar(milestone) - ); - } } diff --git a/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBar.java b/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBar.java deleted file mode 100644 index c0feddfb5..000000000 --- a/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBar.java +++ /dev/null @@ -1,85 +0,0 @@ -package fr.openmc.core.features.milestones.bossbar; - -import fr.openmc.core.features.displays.bossbar.BaseBossbar; -import fr.openmc.core.features.milestones.*; -import net.kyori.adventure.bossbar.BossBar; -import net.kyori.adventure.text.Component; -import org.bukkit.entity.Player; - -public class MilestoneBossBar extends BaseBossbar { - - private final Milestone milestone; - - public MilestoneBossBar(Milestone milestone) { - this.milestone = milestone; - } - public static final String PLACEHOLDER_MILESTONE_BOSSBAR = "§6Étape %s : %s"; - public static final String PLACEHOLDER_MILESTONE_BOSSBAR_PROGRESS = "§6Étape %s : %s (%s/%s)"; - - @Override - protected String id() { - return "omc:" + milestone.getType().toString() + "_milestone"; - } - - @Override - protected void update(Player player, BossBar bar) { - int currentStep = MilestonesManager.getPlayerStep(milestone.getType(), player); - - MilestoneStep[] steps = milestone.getStepEnum(); - - if (currentStep >= steps.length) return; // pas affiché par défaut (shouldDisplay()) - - int maxStep = steps.length; - MilestoneStep step = steps[currentStep]; - MilestoneQuest quest = step.getQuest(); - - int progress = quest.getProgress(player.getUniqueId()); - int goal = quest.getCurrentTarget(player.getUniqueId()); - - String questName = quest.getName(player.getUniqueId()); - - if (goal <= 1) { - bar.name(Component.text( - PLACEHOLDER_MILESTONE_BOSSBAR.formatted(currentStep + 1, questName) - )); - - bar.progress((float) currentStep / maxStep); - } else { - bar.name(Component.text( - PLACEHOLDER_MILESTONE_BOSSBAR_PROGRESS.formatted( - currentStep + 1, - quest.getName(player.getUniqueId()), - progress, - goal - ) - )); - - bar.progress((float) progress / goal); - } - } - - @Override - protected BossBar.Color color(Player player) { - return milestone.getBossBarOptions().color(); - } - - @Override - protected BossBar.Overlay style(Player player) { - return milestone.getBossBarOptions().style(); - } - - @Override - protected boolean shouldDisplay(Player player) { - return milestone.shouldDisplayBossBar(player); - } - - @Override - protected int weight() { - return 5; - } - - @Override - protected Integer updateInterval() { - return 2; - } -} diff --git a/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBarOptions.java b/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBarOptions.java deleted file mode 100644 index 23a3d240a..000000000 --- a/src/main/java/fr/openmc/core/features/milestones/bossbar/MilestoneBossBarOptions.java +++ /dev/null @@ -1,5 +0,0 @@ -package fr.openmc.core.features.milestones.bossbar; - -import net.kyori.adventure.bossbar.BossBar; - -public record MilestoneBossBarOptions(BossBar.Color color, BossBar.Overlay style) { } diff --git a/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialBossBar.java b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialBossBar.java new file mode 100644 index 000000000..5607cb084 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialBossBar.java @@ -0,0 +1,54 @@ +package fr.openmc.core.features.milestones.tutorial; + +import fr.openmc.core.features.displays.bossbar.BossbarManager; +import fr.openmc.core.features.displays.bossbar.BossbarsType; +import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +public class TutorialBossBar { + + public static final String PLACEHOLDER_TUTORIAL_BOSSBAR = "§6Étape %s : %s"; + + /** + * Adds a tutorial boss bar for the player with the given message and progress. + * + * @param player The player to add the boss bar for. + * @param message The message to display on the boss bar. + * @param progress The progress of the tutorial step (0.0 to 1.0). + */ + public static void addTutorialBossBarForPlayer(Player player, Component message, float progress) { + BossBar bar = BossBar.bossBar( + message, + progress, + BossBar.Color.YELLOW, + BossBar.Overlay.PROGRESS + ); + BossbarManager.addBossBar(BossbarsType.TUTORIAL, bar, player); + } + + /** + * Updates the tutorial boss bar for the player with the given message and progress. + * + * @param player The player to update the boss bar for. + * @param message The new message to display on the boss bar. + * @param progress The new progress of the tutorial step (0.0 to 1.0). + */ + public static void update(Player player, Component message, float progress) { + BossBar bar = BossbarManager.getBossBar(BossbarsType.TUTORIAL, player); + + if (bar != null) { + bar.name(message); + bar.progress(progress); + } + } + + /** + * Hides the tutorial boss bar for the player. + * + * @param player The player to hide the boss bar for. + */ + public static void hide(Player player) { + BossbarManager.removeBossBar(BossbarsType.TUTORIAL, player); + } +} diff --git a/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialMilestone.java b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialMilestone.java index eb7156448..eb927ae9f 100644 --- a/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialMilestone.java +++ b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialMilestone.java @@ -1,11 +1,10 @@ package fr.openmc.core.features.milestones.tutorial; import fr.openmc.api.menulib.Menu; -import fr.openmc.core.features.dream.DreamUtils; -import fr.openmc.core.features.milestones.*; -import fr.openmc.core.features.milestones.bossbar.MilestoneBossBarOptions; +import fr.openmc.core.features.milestones.Milestone; +import fr.openmc.core.features.milestones.MilestoneQuest; +import fr.openmc.core.features.milestones.MilestoneType; import fr.openmc.core.features.milestones.menus.MilestoneMenu; -import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -14,7 +13,7 @@ import java.util.Arrays; import java.util.List; -public class TutorialMilestone implements Milestone { +public class TutorialMilestone implements Milestone { @Override public String getName() { return "§7Tutoriel d'OpenMC"; @@ -36,8 +35,8 @@ public ItemStack getIcon() { } @Override - public Class getStepClass() { - return TutorialStep.class; + public List getSteps() { + return Arrays.stream(TutorialStep.values()).map(TutorialStep::getQuest).toList(); } @Override @@ -49,17 +48,4 @@ public MilestoneType getType() { public Menu getMenu(Player player) { return new MilestoneMenu(player, this); } - - @Override - public MilestoneBossBarOptions getBossBarOptions() { - return new MilestoneBossBarOptions( - BossBar.Color.YELLOW, - BossBar.Overlay.PROGRESS - ); - } - - @Override - public boolean shouldDisplayBossBar(Player player) { - return !DreamUtils.isInDreamWorld(player) && !MilestoneUtils.hasFinishedMilestone(this.getType(), player); - } } diff --git a/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialStep.java b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialStep.java index a6801e1ee..ffb679a54 100644 --- a/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialStep.java +++ b/src/main/java/fr/openmc/core/features/milestones/tutorial/TutorialStep.java @@ -1,12 +1,11 @@ package fr.openmc.core.features.milestones.tutorial; import fr.openmc.core.features.milestones.MilestoneQuest; -import fr.openmc.core.features.milestones.MilestoneStep; import fr.openmc.core.features.milestones.tutorial.quests.*; import lombok.Getter; @Getter -public enum TutorialStep implements MilestoneStep { +public enum TutorialStep { BREAK_AYWENITE(null), CITY_CREATE(null), CITY_LEVEL_2(null), diff --git a/src/main/java/fr/openmc/core/features/milestones/tutorial/listeners/TutorialBossBarEvent.java b/src/main/java/fr/openmc/core/features/milestones/tutorial/listeners/TutorialBossBarEvent.java new file mode 100644 index 000000000..85db1ea27 --- /dev/null +++ b/src/main/java/fr/openmc/core/features/milestones/tutorial/listeners/TutorialBossBarEvent.java @@ -0,0 +1,25 @@ +package fr.openmc.core.features.milestones.tutorial.listeners; + +import fr.openmc.core.features.displays.bossbar.BossbarManager; +import fr.openmc.core.features.displays.bossbar.BossbarsType; +import fr.openmc.core.features.milestones.MilestoneUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class TutorialBossBarEvent implements Listener { + + @EventHandler + void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + MilestoneUtils.setBossBar(player); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + BossbarManager.removeBossBar(BossbarsType.TUTORIAL, event.getPlayer()); + } +} diff --git a/src/main/java/fr/openmc/core/features/milestones/tutorial/quests/BreakAyweniteQuest.java b/src/main/java/fr/openmc/core/features/milestones/tutorial/quests/BreakAyweniteQuest.java index 252f04189..db0e67e76 100644 --- a/src/main/java/fr/openmc/core/features/milestones/tutorial/quests/BreakAyweniteQuest.java +++ b/src/main/java/fr/openmc/core/features/milestones/tutorial/quests/BreakAyweniteQuest.java @@ -3,10 +3,10 @@ import dev.lone.itemsadder.api.CustomBlock; import fr.openmc.api.hooks.ItemsAdderHook; import fr.openmc.core.features.city.CityManager; -import fr.openmc.core.features.displays.bossbar.BossbarManager; import fr.openmc.core.features.milestones.MilestoneQuest; import fr.openmc.core.features.milestones.MilestoneType; import fr.openmc.core.features.milestones.MilestonesManager; +import fr.openmc.core.features.milestones.tutorial.TutorialBossBar; import fr.openmc.core.features.milestones.tutorial.TutorialStep; import fr.openmc.core.features.quests.objects.QuestTier; import fr.openmc.core.features.quests.rewards.QuestMethodsReward; @@ -15,7 +15,6 @@ import fr.openmc.core.registry.items.CustomItemRegistry; import fr.openmc.core.utils.messages.MessageType; import fr.openmc.core.utils.messages.Prefix; -import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -65,7 +64,19 @@ public void onPlayerBreakBlock(BlockBreakEvent event) { ) { Player player = event.getPlayer(); this.incrementProgress(player.getUniqueId()); - this.getType().getMilestone().getPlayerData().get(player.getUniqueId()).incrementProgress(); + getType().getMilestone().getPlayerData().get(player.getUniqueId()).incrementProgress(); + + int progress = this.getProgress(player.getUniqueId()); + + if (progress >= 30) return; + TutorialBossBar.update( + player, + Component.text(TutorialBossBar.PLACEHOLDER_TUTORIAL_BOSSBAR.formatted( + (step.ordinal() + 1), + TutorialStep.values()[step.ordinal()].getQuest().getName(player.getUniqueId()) + " (" + progress + " / 30)" + )), + (float) this.getProgress(player.getUniqueId()) / 30 + ); } } }