diff --git a/.gitignore b/.gitignore index 9911a085b..23cf5857b 100644 --- a/.gitignore +++ b/.gitignore @@ -134,3 +134,6 @@ spigot.yml .project .settings/ bin/ + +# Rift Engine lib +!RiftEngine-*.jar \ No newline at end of file diff --git a/build.gradle b/build.gradle index 415e4c8c8..04409aeb8 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,8 @@ repositories { maven { url "https://repo.dmulloy2.net/repository/public/" } + // * GeyserMC + maven {url "https://repo.opencollab.dev/main/"} maven { url "https://jitpack.io" // Toujours à la fin } @@ -65,6 +67,11 @@ dependencies { compileOnly "de.oliver:FancyNpcs:${fancyNpcsVersion}" compileOnly "net.dmulloy2:ProtocolLib:${protocolLibVersion}" + // Bedrock Dependencies + compileOnly files("libs/RiftEngine-${riftEngineVersion}.jar") + compileOnly "org.geysermc.geyser:api:${geyserApiVersion}" + compileOnly "org.geysermc.floodgate:api:${floodgateApiVersion}" + implementation "org.jetbrains:annotations:${jetbrainsAnnotationsVersion}" implementation "io.github.revxrsal:lamp.common:${revxrsalLampVersion}" implementation "io.github.revxrsal:lamp.bukkit:${revxrsalLampVersion}" diff --git a/gradle.properties b/gradle.properties index 429ac18f2..0957c4797 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,11 @@ revxrsalLampVersion = 4.0.0-rc.17 ormVersion = 6.1 lombokVersion = 1.18.46 +# Bedrock Dependencies +geyserApiVersion = 2.10.0-SNAPSHOT +floodgateApiVersion = 2.2.5-SNAPSHOT +riftEngineVersion = 0.1-SNAPSHOT + # Test Dependencies slf4jVersion = 2.1.0-alpha1 junitVersion = 6.1.1 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 53761cb27..64a5b37dc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/libs/RiftEngine-0.1-SNAPSHOT.jar b/libs/RiftEngine-0.1-SNAPSHOT.jar new file mode 100644 index 000000000..a15c0a55d Binary files /dev/null and b/libs/RiftEngine-0.1-SNAPSHOT.jar differ diff --git a/src/main/java/fr/openmc/api/chronometer/Chronometer.java b/src/main/java/fr/openmc/api/chronometer/Chronometer.java index 131ac2917..6f7d49a5c 100644 --- a/src/main/java/fr/openmc/api/chronometer/Chronometer.java +++ b/src/main/java/fr/openmc/api/chronometer/Chronometer.java @@ -8,7 +8,6 @@ import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -62,7 +61,7 @@ public static HandlerList getHandlerList() { * @param group Chronometer group * @param time duration in second * @param messageType display type - * @param message to display the time + * @param key translation key * @param finishMessageType display type * @param finishMessage message display when the chronometer ends normally */ @@ -71,7 +70,7 @@ public static void startChronometer( String group, int time, ChronometerType messageType, - Component message, + String key, ChronometerType finishMessageType, Component finishMessage ) { @@ -92,11 +91,10 @@ public void run() { int remainingTime = chronometer.get(entityUUID).get(group); - if (message != null && entity instanceof Player player) { - String timerMessage = PlainTextComponentSerializer.plainText().serialize(message) - .replace("%sec%", String.valueOf(remainingTime)); + if (key != null && entity instanceof Player player) { + Component timerMessage = TranslationManager.translation(key, Component.text(remainingTime + "s")); - sendMessage(player, messageType, Component.text(timerMessage)); + sendMessage(player, messageType, timerMessage); } if (timerEnd(entityUUID, group)) { diff --git a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java index 310b6e924..4225df776 100644 --- a/src/main/java/fr/openmc/api/input/location/ItemInteraction.java +++ b/src/main/java/fr/openmc/api/input/location/ItemInteraction.java @@ -52,7 +52,14 @@ public class ItemInteraction implements Listener { /* * Méthode qui permet de donner un objet à une personne et de quand elle clique avec l'Item, la méthode renverra la positon ou il a cliqué */ - public static void runLocationInteraction(Player player, ItemStack item, String chronometerGroup, int chronometerTime, Component startMessage, Component endMessage, Function result, Runnable onFail) { + public static void runLocationInteraction(Player player, + ItemStack item, + String chronometerGroup, + int chronometerTime, + String startMessage, + Component endMessage, + Function result, + Runnable onFail) { if (!ItemUtils.hasAvailableSlot(player)) { MessagesManager.sendMessage(player, TranslationManager.translation("api.iteminteraction.not_egnough_space"), Prefix.OPENMC, MessageType.ERROR, false); diff --git a/src/main/java/fr/openmc/core/OMCBootstrap.java b/src/main/java/fr/openmc/core/OMCBootstrap.java index ccdc6e821..86ec2d885 100644 --- a/src/main/java/fr/openmc/core/OMCBootstrap.java +++ b/src/main/java/fr/openmc/core/OMCBootstrap.java @@ -7,8 +7,6 @@ import io.papermc.paper.plugin.bootstrap.BootstrapContext; import io.papermc.paper.plugin.bootstrap.PluginBootstrap; import io.papermc.paper.plugin.bootstrap.PluginProviderContext; -import io.papermc.paper.registry.event.RegistryEvents; -import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; @@ -41,7 +39,7 @@ public void bootstrap(@NotNull BootstrapContext context) { // ** LOAD TRANSLATION ** // this creates resource pack who is needed for item adder - TranslationManager.init( + TranslationManager.bootstrap( context, Locale.FRANCE, Locale.US, diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 9349c0050..4c3fee7c0 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -220,6 +220,13 @@ public void onEnable() { public void loadAfterItemsAdder() { ItemsAddersListener.setLoaded(true); + // todo: a rewrite lors registre hook et features +// try { +// new BedrockHook().startInit(); +// } catch (NoClassDefFoundError e) { +// OMCLogger.error("Hook BedrockHook désactivé (package non trouvé) " + e.getMessage()); +// } + /* LOAD ITEMS ADDER CONTENTS */ ItemsAdderHook.loadContents(); diff --git a/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java b/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java index 9d99c88bf..e800a2d8b 100644 --- a/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java +++ b/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java @@ -9,6 +9,7 @@ import java.sql.SQLException; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -18,64 +19,80 @@ public abstract class Hooks { private static final Map, Boolean> ENABLED = new ConcurrentHashMap<>(); + public boolean arePluginEnabled() { + if (!(this instanceof HttpsHook)) return true; + boolean enabled = true; + + Set pluginsName = getPluginsName(); + for (String pluginName : pluginsName) { + PluginManager pluginManager = OMCPlugin.getInstance().getServer().getPluginManager(); + boolean pluginEnable = pluginManager.getPlugin(pluginName) != null + && pluginManager.isPluginEnabled(pluginName); + + if (!pluginEnable) return false; + } + + return enabled; + } /** * Verifie la presence du plugin cible, puis initialise le hook si actif. */ public void startInit() { - String pluginName = getPluginName(); if (this instanceof HttpsHook httpsHook) { + String hookName = httpsHook.getName(); try { httpsHook.init(); - OMCLogger.successFormatted("Hook " + pluginName + " activé."); + OMCLogger.successFormatted("Hook " + hookName + " activé."); } catch (Exception e) { - OMCLogger.errorFormatted("Hook " + pluginName + " non activé."); + OMCLogger.errorFormatted("Hook " + hookName + " non activé."); OMCLogger.error(e.getMessage(), e); } return; } - PluginManager pluginManager = OMCPlugin.getInstance().getServer().getPluginManager(); - boolean enabled = pluginManager.getPlugin(pluginName) != null - && pluginManager.isPluginEnabled(pluginName); - ENABLED.put(getClass(), enabled); - if (enabled) { - init(); - OMCLogger.successFormatted("Hook " + pluginName + " activé."); - return; + String hookName = this.getClass().getSimpleName(); + try { + boolean enabled = arePluginEnabled(); + if (enabled) { + ENABLED.put(getClass(), enabled); + this.init(); + OMCLogger.successFormatted("Hook " + hookName + " activé."); + } + } catch (Throwable e) { + ENABLED.remove(getClass()); + OMCLogger.errorFormatted("Hook " + hookName + " non activé."); + OMCLogger.error(e.getMessage(), e); } - OMCLogger.errorFormatted("Hook " + pluginName + " non activé."); } /** * Verifie la presence du plugin cible, puis save le hook si actif. */ public void startSave() { - String pluginName = getPluginName(); - if (this instanceof HttpsHook httpsHook) { + String hookName = httpsHook.getName(); try { httpsHook.save(); - OMCLogger.successFormatted("Hook " + pluginName + " desactivé avec succes."); + OMCLogger.successFormatted("Hook " + hookName + " desactivé avec succes."); } catch (Exception e) { - OMCLogger.errorFormatted("Hook " + pluginName + " a rencontré une erreur lors du save."); + OMCLogger.errorFormatted("Hook " + hookName + " a rencontré une erreur lors du save."); OMCLogger.error(e.getMessage(), e); } return; } - PluginManager pluginManager = OMCPlugin.getInstance().getServer().getPluginManager(); - boolean enabled = pluginManager.getPlugin(pluginName) != null - && pluginManager.isPluginEnabled(pluginName) - && ENABLED.get(getClass()) != null + boolean enabled = arePluginEnabled() && ENABLED.get(getClass()) != null && ENABLED.get(getClass()); + String hookName = this.getClass().getSimpleName(); if (enabled) { + ENABLED.remove(getClass()); save(); - OMCLogger.successFormatted("Hook " + pluginName + " désactivé avec succès."); + OMCLogger.successFormatted("Hook " + hookName + " désactivé avec succès."); return; } - OMCLogger.errorFormatted("Hook " + pluginName + " désactivé avec échec."); + OMCLogger.errorFormatted("Hook " + hookName + " désactivé avec échec."); } /** @@ -106,7 +123,7 @@ public static boolean isEnabled(Class hookClass) { * * @return Nom du plugin cible */ - protected abstract String getPluginName(); + protected abstract Set getPluginsName(); /** * Initialise les méthodes du hook lorsqu'il est actif. diff --git a/src/main/java/fr/openmc/core/bootstrap/hooks/HttpsHook.java b/src/main/java/fr/openmc/core/bootstrap/hooks/HttpsHook.java index 14a589e2b..627562482 100644 --- a/src/main/java/fr/openmc/core/bootstrap/hooks/HttpsHook.java +++ b/src/main/java/fr/openmc/core/bootstrap/hooks/HttpsHook.java @@ -1,5 +1,8 @@ package fr.openmc.core.bootstrap.hooks; +import java.util.Collections; +import java.util.Set; + public abstract class HttpsHook extends Hooks { abstract public String getName(); @@ -8,7 +11,7 @@ public static boolean isEnable() { } @Override - protected String getPluginName() { - return getName(); + protected Set getPluginsName() { + return Collections.singleton(getName()); } } diff --git a/src/main/java/fr/openmc/core/commands/utils/Restart.java b/src/main/java/fr/openmc/core/commands/utils/Restart.java index d752466c1..11ccbf410 100644 --- a/src/main/java/fr/openmc/core/commands/utils/Restart.java +++ b/src/main/java/fr/openmc/core/commands/utils/Restart.java @@ -34,8 +34,8 @@ public class Restart { @Description("Redémarre le serveur après 1min") @CommandPermission("omc.admin.commands.restart") public void restart(CommandSender sender) { - if (sender instanceof Player) { - MessagesManager.sendMessage(sender, TranslationManager.translation("messages.global.cannot_do_this"), Prefix.OPENMC, MessageType.ERROR, false); + if (sender instanceof Player player) { + MessagesManager.sendMessage(player, TranslationManager.translation("messages.global.cannot_do_this"), Prefix.OPENMC, MessageType.ERROR, false); return; } @@ -50,7 +50,7 @@ public void restart(CommandSender sender) { if (player == null || !player.isOnline()) continue; - MessagesManager.sendMessage(sender, TranslationManager.translation("command.utils.restart.cannot_open_city_chest"), Prefix.OPENMC, MessageType.INFO, false); + MessagesManager.sendMessage(player, TranslationManager.translation("command.utils.restart.cannot_open_city_chest"), Prefix.OPENMC, MessageType.INFO, false); player.closeInventory(); } diff --git a/src/main/java/fr/openmc/core/features/bits/commands/BitsCommands.java b/src/main/java/fr/openmc/core/features/bits/commands/BitsCommands.java index 9a8ea4613..e8df1b4b0 100644 --- a/src/main/java/fr/openmc/core/features/bits/commands/BitsCommands.java +++ b/src/main/java/fr/openmc/core/features/bits/commands/BitsCommands.java @@ -33,9 +33,9 @@ public void getBits( @Subcommand("set") @Description("Permet de définir les bits d'un joueur") @CommandPermission("omc.admin.commands.bits.set") - public void setBits(CommandSender player, @SuggestWith(OnlinePlayerAutoComplete.class) OfflinePlayer target, @Range(min = 1E-10) double amount) { + public void setBits(CommandSender sender, @SuggestWith(OnlinePlayerAutoComplete.class) OfflinePlayer target, @Range(min = 1E-10) double amount) { BitsManager.setBits(target.getUniqueId(), amount); - MessagesManager.sendMessage(player, + MessagesManager.sendMessage(sender, TranslationManager.translation( "feature.economy.bits.set.success", Component.text(target.getName()).color(NamedTextColor.YELLOW), diff --git a/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java b/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java index 3f5d6080e..d079746f4 100644 --- a/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java +++ b/src/main/java/fr/openmc/core/features/city/actions/CityCreateAction.java @@ -52,7 +52,7 @@ public static void beginCreateCity(Player player, String cityName) { getMascotStick(), "mascot:stick", 300, - TranslationManager.translation("feature.city.mascot.mascot_wand.claim_mascot_wand"), + "feature.city.mascot.mascot_wand.claim_mascot_wand", TranslationManager.translation("feature.city.mascot.mascot_wand.create_cancelled"), location -> { if (!isValidLocation(player, location)) return false; diff --git a/src/main/java/fr/openmc/core/features/city/commands/AdminCityCommands.java b/src/main/java/fr/openmc/core/features/city/commands/AdminCityCommands.java index d6b105775..a28f0f40d 100644 --- a/src/main/java/fr/openmc/core/features/city/commands/AdminCityCommands.java +++ b/src/main/java/fr/openmc/core/features/city/commands/AdminCityCommands.java @@ -9,6 +9,7 @@ import fr.openmc.core.features.city.commands.autocomplete.CityNameAutoComplete; import fr.openmc.core.features.city.menu.list.CityListDetailsMenu; import fr.openmc.core.features.economy.EconomyManager; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import fr.openmc.core.utils.text.messages.MessageType; import fr.openmc.core.utils.text.messages.MessagesManager; import fr.openmc.core.utils.text.messages.Prefix; @@ -79,7 +80,7 @@ void list(Player player) { Component line = Component.text("- ") .append(Component.text(cityUUID.toString()).color(NamedTextColor.GRAY)) - .append(Component.text(" • ")) + .append(Component.text(" " + CharRemplacementUtils.getPointChar(player) + " ")) .append(Component.text(name).color(NamedTextColor.WHITE)) .append(TranslationManager.translation("feature.city.admin.commands.list.copy_label") .color(NamedTextColor.GREEN) diff --git a/src/main/java/fr/openmc/core/features/city/sub/mascots/MascotsManager.java b/src/main/java/fr/openmc/core/features/city/sub/mascots/MascotsManager.java index 270d0f781..df4872ba3 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mascots/MascotsManager.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mascots/MascotsManager.java @@ -319,7 +319,7 @@ public static Component getAliveMascotName(String cityName, double health, doubl "feature.city.mascots.name.alive", Component.text(cityName).decorate(TextDecoration.BOLD), Component.text(formattedHealth).color(NamedTextColor.RED), - Component.text("/" + formattedMaxHealth + "❤").color(NamedTextColor.RED) + Component.text("/" + formattedMaxHealth + "♥").color(NamedTextColor.RED) ); } diff --git a/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java index bb6b9bed6..fc9411cd8 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mascots/menu/MascotMenu.java @@ -168,7 +168,7 @@ public void onInventoryClick(InventoryClickEvent inventoryClickEvent) { mascotsMoveItem, "mascots:moveInteraction", 120, - TranslationManager.translation("feature.city.mascots.menu.main.move.interaction.remaining"), + "feature.city.mascots.menu.main.move.interaction.remaining", TranslationManager.translation("feature.city.mascots.menu.main.move.interaction.cancelled"), mascotMove -> { if (mascotMove == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java index bfbaccf5c..e36d4e36e 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/actions/MayorSetWarpAction.java @@ -46,7 +46,7 @@ public static void setWarp(Player player) { getWarpWand(), "mayor:wait-set-warp", 300, - TranslationManager.translation("feature.city.mayor.warp.interaction.remaining", Component.text("300s").color(NamedTextColor.GRAY)), + "feature.city.mayor.warp.interaction.remaining", TranslationManager.translation("feature.city.mayor.warp.interaction.timeout"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java index 2c5232cbf..317ac3592 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/managers/NPCManager.java @@ -242,7 +242,7 @@ public void onInteractWithMayorNPC(NpcInteractEvent event) { itemToGive, "mayor:mayor-npc-move", 300, - TranslationManager.translation("feature.city.mayor.npc.move.interaction.remaining", Component.text("300s").color(NamedTextColor.GRAY)), + "feature.city.mayor.npc.move.interaction.remaining", TranslationManager.translation("feature.city.mayor.npc.move.interaction.timeout"), locationClick -> { if (locationClick == null) return true; @@ -331,7 +331,7 @@ public void onInteractWithMayorNPC(NpcInteractEvent event) { itemToGive, "mayor:owner-npc-move", 300, - TranslationManager.translation("feature.city.mayor.npc.move.interaction.remaining", Component.text("300s").color(NamedTextColor.GRAY)), + "feature.city.mayor.npc.move.interaction.remaining", TranslationManager.translation("feature.city.mayor.npc.move.interaction.timeout"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java index 7817372ed..4f20d5f3c 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/MayorNpcMenu.java @@ -133,7 +133,7 @@ public void onClose(InventoryCloseEvent event) { itemToGive, "mayor:owner-npc-move", 300, - TranslationManager.translation("feature.city.mayor.npc.move.interaction.remaining", Component.text("300s").color(NamedTextColor.GRAY)), + "feature.city.mayor.npc.move.interaction.remaining", TranslationManager.translation("feature.city.mayor.npc.move.interaction.timeout"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java index 52bac479f..5d2210b7e 100644 --- a/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java +++ b/src/main/java/fr/openmc/core/features/city/sub/mayor/menu/npc/OwnerNpcMenu.java @@ -179,7 +179,7 @@ public void onClose(InventoryCloseEvent event) { itemToGive, "mayor:owner-npc-move", 300, - TranslationManager.translation("feature.city.mayor.npc.move.interaction.remaining", Component.text("300s").color(NamedTextColor.GRAY)), + "feature.city.mayor.npc.move.interaction.remaining", TranslationManager.translation("feature.city.mayor.npc.move.interaction.timeout"), locationClick -> { if (locationClick == null) return true; diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java index db0357261..4688cb757 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java @@ -8,6 +8,7 @@ import fr.openmc.core.features.city.sub.war.WarManager; import fr.openmc.core.features.displays.scoreboards.BaseScoreboard; import fr.openmc.core.utils.MathUtils; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.DirectionUtils; import fr.openmc.core.utils.text.messages.TranslationManager; @@ -46,7 +47,7 @@ public void update(Player player, SternalBoard board) { War war = city.getWar(); City enemyCity = war.getCityAttacker().equals(city) ? war.getCityDefender() : war.getCityAttacker(); - List lines = new ArrayList<>(MainScoreboard.getDefaultLines(player)); + List lines = new ArrayList<>(MainScoreboard.getDefaultLines(player, true)); lines.add(MiniMessage.miniMessage() .deserialize( @@ -55,26 +56,27 @@ public void update(Player player, SternalBoard board) { ) .decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.enemy.label", true).color(TextColor.color(0xAAAAAA))) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.enemy.label", true).color(TextColor.color(0xAAAAAA))) .appendSpace() - .append(toSmall(enemyCity.getName()).color(TextColor.color(0xFF0634))) + .append(toSmall(player, enemyCity.getName()).color(TextColor.color(0xFF0634))) ); Component phaseComponent; switch (war.getPhase()) { case PREPARATION -> phaseComponent = MiniMessage.miniMessage() - .deserialize("%s".formatted(toSmall(WarManager.getFormattedPhase(war.getPhase())))); - case COMBAT -> phaseComponent = toSmall(WarManager.getFormattedPhase(war.getPhase())) + .deserialize("</gradient>", + Placeholder.component("title", toSmall(player, WarManager.getFormattedPhase(war.getPhase())))); + case COMBAT -> phaseComponent = toSmall(player, WarManager.getFormattedPhase(war.getPhase())) .color(TextColor.color(0xFC1C1C)); - case ENDED -> phaseComponent = toSmall(WarManager.getFormattedPhase(war.getPhase())) + case ENDED -> phaseComponent = toSmall(player, WarManager.getFormattedPhase(war.getPhase())) .color(NamedTextColor.GRAY); - default -> phaseComponent = toSmall(WarManager.getFormattedPhase(war.getPhase())) + default -> phaseComponent = toSmall(player, WarManager.getFormattedPhase(war.getPhase())) .color(NamedTextColor.WHITE); } - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.phase.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.phase.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(phaseComponent) ); @@ -93,8 +95,8 @@ public void update(Player player, SternalBoard board) { double distance = mascotLocation.distance(player.getLocation()); int rounded = (int) Math.round(distance); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.distance.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.distance.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(direction, TextColor.color(0xFFE206))) .appendSpace() @@ -103,38 +105,38 @@ public void update(Player player, SternalBoard board) { switch (war.getPhase()) { - case PREPARATION -> lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.starts_in.label", true).color(NamedTextColor.GRAY)) + case PREPARATION -> lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.starts_in.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.convertSecondToTime(war.getPreparationTimeRemaining()), TextColor.color(0xF52727))) ); case COMBAT -> { if (mascot != null) - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.mascot.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.mascot.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(mascot)) ); if (enemyMascot != null) - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.enemy.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.enemy.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(enemyMascot)) ); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.ends_in.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.ends_in.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.convertSecondToTime(war.getCombatTimeRemaining()), TextColor.color(0xF52727))) ); } - case ENDED -> lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.state.label", true).color(NamedTextColor.GRAY)) + case ENDED -> lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.state.label", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.state.ended", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player,"feature.displays.scoreboard.citywar.state.ended", true).color(NamedTextColor.GRAY)) ); } @@ -162,6 +164,7 @@ protected int updateInterval() { } private Component getColoredHealth(LivingEntity entity) { + // todo glyph if (entity.isDead()) return TranslationManager.translation( "feature.displays.scoreboard.citywar.mascot.dead", true, diff --git a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index f6779d3b7..f953efcde 100644 --- a/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java +++ b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java @@ -21,6 +21,7 @@ import fr.openmc.core.hooks.FancyNpcsHook; import fr.openmc.core.hooks.LuckPermsHook; import fr.openmc.core.hooks.WorldGuardHook; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.fonts.SmallCapsUtils; import fr.openmc.core.utils.text.messages.TranslationManager; @@ -48,7 +49,7 @@ protected void updateTitle(Player player, SternalBoard board) { @Override public void update(Player player, SternalBoard board) { - List<Component> lines = new ArrayList<>(getDefaultLines(player)); + List<Component> lines = new ArrayList<>(getDefaultLines(player, false)); // Corpse if (CorpseNPCManager.getNPC(player.getUniqueId()) instanceof CorpseNPC corpse) { @@ -74,14 +75,14 @@ public void update(Player player, SternalBoard board) { "<gradient:#FFB800:#F0DF49><title></gradient>", Placeholder.component("title", TranslationManager.translation("feature.displays.scoreboard.contest.title", true)) ).decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(data.getCamp1ToSmall()) .appendSpace() - .append(TranslationManager.translation("feature.displays.scoreboard.contest.vs", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.contest.vs", true).color(NamedTextColor.GRAY)) .append(data.getCamp2ToSmall()) ); - lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.contest.ends", true).color(NamedTextColor.GRAY)) + lines.add(Component.text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.contest.ends", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) ); @@ -94,7 +95,7 @@ public void update(Player player, SternalBoard board) { board.updateLines(lines); } - public static List<Component> getDefaultLines(Player player) { + public static List<Component> getDefaultLines(Player player, boolean inWar) { Component rank = LuckPermsHook.isEnable() ? Component.text(LuckPermsHook.getFormattedPAPIPrefix(player)) : TranslationManager.translation("feature.displays.scoreboard.rank.none", true).color(TextColor.color(0xFF1FCC)); @@ -106,7 +107,7 @@ public static List<Component> getDefaultLines(Player player) { Component location = isInRegion ? TranslationManager.translation("feature.displays.scoreboard.location.protected", true) : TranslationManager.translation("feature.displays.scoreboard.location.wilderness", true); - location = (chunkCity != null) ? toSmall(chunkCity.getName()) : location; + location = (chunkCity != null) ? toSmall(player, chunkCity.getName()) : location; String balance = EconomyManager.getMiniBalance(player.getUniqueId()); double bits = BitsManager.getBits(player.getUniqueId()); @@ -117,36 +118,38 @@ public static List<Component> getDefaultLines(Player player) { lines.add(MiniMessage.miniMessage().deserialize( "<gradient:#FF45B9:#FF1FCC><font:omc_fonts:small_caps>%s</font></gradient>".formatted( player.getName())).decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.rank.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.rank.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(rank) ); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.city.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.city.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(city != null - ? toSmall(city.getName()).color(TextColor.color(0xFF06DC)) - : TranslationManager.translation("feature.displays.scoreboard.city.none", true).color(TextColor.color(0xFF06DC))) + ? toSmall(player, city.getName()).color(TextColor.color(0xFF06DC)) + : TranslationManager.translation(player, "feature.displays.scoreboard.city.none", true).color(TextColor.color(0xFF06DC))) ); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.balance.label", true).color(NamedTextColor.GRAY)) - .appendSpace() - .append(toSmall(balance).color(TextColor.color(0xFF06DC))) - .appendSpace() - .append(text(EconomyManager.getEconomyIcon())) - ); - if (bits > 0) { - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.bits.label", true).color(NamedTextColor.GRAY)) + if (!inWar) { + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.balance.label", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(EconomyManager.getFormattedSimplifiedNumber(bits)).color(TextColor.color(0x07A0F5))) + .append(toSmall(player, balance).color(TextColor.color(0xFF06DC))) .appendSpace() - .append(text(BitsManager.getBitsIcon())) + .append(text(EconomyManager.getEconomyIcon())) ); + if (bits > 0) { + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.bits.label", true).color(NamedTextColor.GRAY)) + .appendSpace() + .append(toSmall(player, EconomyManager.getFormattedSimplifiedNumber(bits)).color(TextColor.color(0x07A0F5))) + .appendSpace() + .append(text(BitsManager.getBitsIcon())) + ); + } } - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.location.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.location.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(location.color(TextColor.color(0xFF06DC))) ); @@ -158,10 +161,10 @@ public static List<Component> getDefaultLines(Player player) { halloweenNPC = npcManager.getNpc("halloween_pumpkin_deposit_npc"); if (halloweenNPC != null) { String pumpkinCount = EconomyManager.getFormattedSimplifiedNumber(HalloweenManager.getPumpkinCount(player.getUniqueId())); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.pumpkins.label", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.pumpkins.label", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(pumpkinCount).color(TextColor.color(0xFF7518))) + .append(toSmall(player, pumpkinCount).color(TextColor.color(0xFF7518))) ); } } diff --git a/src/main/java/fr/openmc/core/features/dream/displays/DreamScoreboard.java b/src/main/java/fr/openmc/core/features/dream/displays/DreamScoreboard.java index f8f3c8037..7e08494b0 100644 --- a/src/main/java/fr/openmc/core/features/dream/displays/DreamScoreboard.java +++ b/src/main/java/fr/openmc/core/features/dream/displays/DreamScoreboard.java @@ -8,6 +8,7 @@ import fr.openmc.core.features.dream.models.db.DreamPlayer; import fr.openmc.core.features.dream.registries.DreamBiome; import fr.openmc.core.features.dream.registries.DreamStructure; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import fr.openmc.core.utils.text.DateUtils; import fr.openmc.core.utils.text.messages.TranslationManager; import net.kyori.adventure.text.Component; @@ -16,13 +17,13 @@ import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; import static fr.openmc.core.utils.text.fonts.SmallCapsUtils.toSmall; +import static fr.openmc.core.utils.text.fonts.SmallCapsUtils.toSmallComponent; import static net.kyori.adventure.text.Component.empty; import static net.kyori.adventure.text.Component.text; @@ -55,15 +56,15 @@ public void update(Player player, SternalBoard board) { long time = dreamPlayer.getDreamTime(); int cold = dreamPlayer.getCold(); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.time", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.time", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(DateUtils.convertSecondToTime(time)).color(TextColor.color(0x00CC34))) + .append(toSmall(player, DateUtils.convertSecondToTime(time)).color(TextColor.color(0x00CC34))) ); if (cold > 0) - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.cold", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.cold", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(dreamPlayer.getCold()).color(TextColor.color(0x44EBDA))) ); @@ -72,8 +73,8 @@ public void update(Player player, SternalBoard board) { } if (dreamBiome != null) { - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.biome", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player,"feature.dream.scoreboard.biome", true).color(NamedTextColor.GRAY)) .appendSpace() .append(dreamBiome.getSmallName()) ); @@ -81,11 +82,10 @@ public void update(Player player, SternalBoard board) { DreamStructure dreamStructure = DreamStructure.getDreamStructure(player); if (dreamStructure != null) { - String nameLocation = PlainTextComponentSerializer.plainText().serialize(dreamStructure.getName()); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.location", true).color(NamedTextColor.GRAY)) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.location", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(nameLocation)) + .append(toSmallComponent(dreamStructure.getName())) ); } diff --git a/src/main/java/fr/openmc/core/features/homes/menu/HomeChangeIconMenu.java b/src/main/java/fr/openmc/core/features/homes/menu/HomeChangeIconMenu.java index d69e130c3..8a418010b 100644 --- a/src/main/java/fr/openmc/core/features/homes/menu/HomeChangeIconMenu.java +++ b/src/main/java/fr/openmc/core/features/homes/menu/HomeChangeIconMenu.java @@ -11,6 +11,7 @@ import fr.openmc.core.features.homes.icons.HomeIcon; import fr.openmc.core.features.homes.icons.HomeIconCacheManager; import fr.openmc.core.features.homes.models.Home; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import fr.openmc.core.utils.bukkit.ItemUtils; import fr.openmc.core.utils.text.messages.Prefix; import fr.openmc.core.utils.text.messages.TranslationManager; @@ -181,7 +182,7 @@ public Map<Integer, ItemMenuBuilder> getButtons() { } private Component formatCategoryLine(NamedTextColor color, Component name, boolean selected) { - return Component.text(selected ? "• " : " ", color) + return Component.text(selected ? CharRemplacementUtils.getPointChar(getOwner()) + " " : " ", color) .append(name.color(NamedTextColor.DARK_GRAY)); } diff --git a/src/main/java/fr/openmc/core/features/quests/objects/Quest.java b/src/main/java/fr/openmc/core/features/quests/objects/Quest.java index 60fe15b64..69bdb3ff2 100644 --- a/src/main/java/fr/openmc/core/features/quests/objects/Quest.java +++ b/src/main/java/fr/openmc/core/features/quests/objects/Quest.java @@ -228,8 +228,8 @@ public int getNextTierTarget(UUID playerUUID) { /** * Get the name of the quest for a player. * <p> - * The name can contain the placeholder {target} which will be replaced by the current target number. - * And the placeholder {s} which will be replaced by "s" if the current target is greater than 1. + * The name can contain the placeholder [target] which will be replaced by the current target number. + * And the placeholder [s] which will be replaced by "s" if the current target is greater than 1. * * @param playerUUID The UUID of the player * @return the name of the quest for the player @@ -244,8 +244,8 @@ public Component getName(UUID playerUUID) { /** * Get the description of the quest for a player. * <p> - * The description can contain the placeholder {target} which will be replaced by the current target number. - * And the placeholder {s} which will be replaced by "s" if the current target is greater than 1. + * The description can contain the placeholder [target] which will be replaced by the current target number. + * And the placeholder [s] which will be replaced by "s" if the current target is greater than 1. * @param playerUUID The UUID of the player * @return the description of the quest for the player */ @@ -261,8 +261,8 @@ public List<Component> getDescription(UUID playerUUID) { /** * Get the next tier description of the quest for a player. * <p> - * The description can contain the placeholder {target} which will be replaced by the next tier target number. - * And the placeholder {s} which will be replaced by "s" if the next tier target is greater than 1. + * The description can contain the placeholder [target] which will be replaced by the next tier target number. + * And the placeholder [s] which will be replaced by "s" if the next tier target is greater than 1. * @param playerUUID The UUID of the player * @return the next tier description of the quest for the player */ @@ -578,7 +578,7 @@ public void incrementProgress(UUID playerUUID, int amount, boolean authorizeDrea if (onlinePlayer.isOnline()) { if (this.isLargeActionBar && newProgress % 50 != 0) return; Component actionBar = Component.text() - .append(Prefix.QUEST.getPrefixComponent()) + .append(Prefix.QUEST.getPrefixComponent(onlinePlayer)) .append(Component.text(" » ", NamedTextColor.DARK_GRAY)) .append(TranslationManager.translation("feature.quests.actionbar.progress_label") .color(NamedTextColor.GRAY)) @@ -653,10 +653,10 @@ public void incrementStepProgressByDescription(UUID playerUUID, String stepDescr private Component formattedQuestComponent(Component initial, String target, String s) { return initial.replaceText(b -> { - b.matchLiteral("{target}"); + b.matchLiteral("[target]"); b.replacement(String.valueOf(target)); }).replaceText(b -> { - b.matchLiteral("{s}"); + b.matchLiteral("[s]"); b.replacement(s); }); } diff --git a/src/main/java/fr/openmc/core/features/quests/objects/QuestStep.java b/src/main/java/fr/openmc/core/features/quests/objects/QuestStep.java index be508470c..d901f9dec 100644 --- a/src/main/java/fr/openmc/core/features/quests/objects/QuestStep.java +++ b/src/main/java/fr/openmc/core/features/quests/objects/QuestStep.java @@ -31,12 +31,12 @@ public QuestStep(Component description, int target) { /** * Get the description of the step. * <p> - * The description can contain the placeholder {target} which will be replaced by the target number. + * The description can contain the placeholder [target] which will be replaced by the target number. * @return The description of the step with the target number replaced */ public Component getDescription() { return this.description.replaceText(b -> { - b.matchLiteral("{target}"); + b.matchLiteral("[target]"); b.replacement(String.valueOf(this.target)); }); } diff --git a/src/main/java/fr/openmc/core/features/quests/readme.md b/src/main/java/fr/openmc/core/features/quests/readme.md index 15f38e38f..f547b008b 100644 --- a/src/main/java/fr/openmc/core/features/quests/readme.md +++ b/src/main/java/fr/openmc/core/features/quests/readme.md @@ -48,7 +48,7 @@ public class MinerQuest extends Quest { public MinerQuest() { // Nom de la quête: String, description: String, icône: ItemStack ou Material, Action bar: boolean *facultatif* - super("Mineur professionnel", "Miner {target} blocs", Material.DIAMOND_PICKAXE, false); + super("Mineur professionnel", "Miner [target] blocs", Material.DIAMOND_PICKAXE, false); this.addTiers( new QuestTier(10, new QuestMoneyReward(100)), diff --git a/src/main/java/fr/openmc/core/features/shops/managers/PlayerShopManager.java b/src/main/java/fr/openmc/core/features/shops/managers/PlayerShopManager.java index e98a747f0..161430006 100644 --- a/src/main/java/fr/openmc/core/features/shops/managers/PlayerShopManager.java +++ b/src/main/java/fr/openmc/core/features/shops/managers/PlayerShopManager.java @@ -46,7 +46,7 @@ public static void startCreatingShop(Player player) { ItemStack.of(Material.BARREL), "shops:shop_creator", 300, - TranslationManager.translation("feature.shop.player.creating_begin"), + "feature.shop.player.creating_begin", TranslationManager.translation("feature.shop.player.creating_cancel"), location -> { if (location == null) return false; diff --git a/src/main/java/fr/openmc/core/hooks/BedrockHook.java b/src/main/java/fr/openmc/core/hooks/BedrockHook.java new file mode 100644 index 000000000..d0631c4be --- /dev/null +++ b/src/main/java/fr/openmc/core/hooks/BedrockHook.java @@ -0,0 +1,49 @@ +package fr.openmc.core.hooks; + +import fr.openmc.core.bootstrap.hooks.Hooks; +import org.bukkit.entity.Player; +//import org.geysermc.floodgate.api.FloodgateApi; +//import org.geysermc.geyser.api.GeyserApi; + +import java.util.Set; + +public class BedrockHook extends Hooks { + public static boolean isEnabled() { + return false; // return Hooks.isEnabled(FancyNpcsHook.class); + } + + @Override + protected Set<String> getPluginsName() { + return Set.of("Geyser-Spigot", "floodgate", "RiftEngine"); + } + +// @Getter +// private static GeyserApi geyserApi; +// @Getter +// private static FloodgateApi floodgateApi; + + @Override + public void init() { +// floodgateApi = FloodgateApi.getInstance(); +// geyserApi = GeyserApi.api(); + } + + /** + * Vérifie si le joueur est un joueur Bedrock + * @param player le joueur EN LIGNE + * @return true si le joueur est un joueur Bedrock, false sinon + */ + public static boolean isBedrockPlayer(Player player) { + if (!isEnabled()) return false; + return false; +// return floodgateApi.isFloodgatePlayer(player.getUniqueId()); + } + + public static Character getGlyph(String namespacedId) { +// Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); +// if (glyph == null) return null; +// +// return glyph.getBedrockChar(); + return null; + } +} diff --git a/src/main/java/fr/openmc/core/hooks/FancyNpcsHook.java b/src/main/java/fr/openmc/core/hooks/FancyNpcsHook.java index d9d0542d0..5c0008598 100644 --- a/src/main/java/fr/openmc/core/hooks/FancyNpcsHook.java +++ b/src/main/java/fr/openmc/core/hooks/FancyNpcsHook.java @@ -2,6 +2,9 @@ import fr.openmc.core.bootstrap.hooks.Hooks; +import java.util.Collections; +import java.util.Set; + public class FancyNpcsHook extends Hooks { public static long FANCY_INIT_DELAY = 20L * 30; // 30 seconds @@ -10,7 +13,7 @@ public static boolean isEnable() { } @Override - protected String getPluginName() { - return "FancyNpcs"; + protected Set<String> getPluginsName() { + return Collections.singleton("FancyNpcs"); } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/hooks/LuckPermsHook.java b/src/main/java/fr/openmc/core/hooks/LuckPermsHook.java index 1272682da..ebf7173b9 100644 --- a/src/main/java/fr/openmc/core/hooks/LuckPermsHook.java +++ b/src/main/java/fr/openmc/core/hooks/LuckPermsHook.java @@ -14,7 +14,9 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.Objects; +import java.util.Set; public class LuckPermsHook extends Hooks implements ApiHook<LuckPerms> { @Getter @@ -25,8 +27,8 @@ public static boolean isEnable() { } @Override - protected String getPluginName() { - return "LuckPerms"; + protected Set<String> getPluginsName() { + return Collections.singleton("LuckPerms"); } @Override diff --git a/src/main/java/fr/openmc/core/hooks/PapiHook.java b/src/main/java/fr/openmc/core/hooks/PapiHook.java index 4af1383fd..dac260492 100644 --- a/src/main/java/fr/openmc/core/hooks/PapiHook.java +++ b/src/main/java/fr/openmc/core/hooks/PapiHook.java @@ -2,13 +2,16 @@ import fr.openmc.core.bootstrap.hooks.Hooks; +import java.util.Collections; +import java.util.Set; + public class PapiHook extends Hooks { public static boolean isEnable() { return Hooks.isEnabled(PapiHook.class); } @Override - protected String getPluginName() { - return "PlaceholderAPI"; + protected Set<String> getPluginsName() { + return Collections.singleton("PlaceholderAPI"); } } diff --git a/src/main/java/fr/openmc/core/hooks/ProtocolLibHook.java b/src/main/java/fr/openmc/core/hooks/ProtocolLibHook.java index f70ddb6d3..d1804fe64 100644 --- a/src/main/java/fr/openmc/core/hooks/ProtocolLibHook.java +++ b/src/main/java/fr/openmc/core/hooks/ProtocolLibHook.java @@ -2,13 +2,16 @@ import fr.openmc.core.bootstrap.hooks.Hooks; +import java.util.Collections; +import java.util.Set; + public class ProtocolLibHook extends Hooks { public static boolean isEnable() { return Hooks.isEnabled(ProtocolLibHook.class); } @Override - protected String getPluginName() { - return "ProtocolLib"; + protected Set<String> getPluginsName() { + return Collections.singleton("ProtocolLib"); } } diff --git a/src/main/java/fr/openmc/core/hooks/WorldGuardHook.java b/src/main/java/fr/openmc/core/hooks/WorldGuardHook.java index eddfb0daf..5b5159920 100644 --- a/src/main/java/fr/openmc/core/hooks/WorldGuardHook.java +++ b/src/main/java/fr/openmc/core/hooks/WorldGuardHook.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.Collections; +import java.util.Set; public class WorldGuardHook extends Hooks { public static boolean isEnable() { @@ -21,8 +22,8 @@ public static boolean isEnable() { } @Override - protected String getPluginName() { - return "WorldGuard"; + protected Set<String> getPluginsName() { + return Collections.singleton("WorldGuard"); } public static boolean isRegionConflict(Location location) { diff --git a/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java b/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java index c252d7668..cf9f14742 100644 --- a/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java +++ b/src/main/java/fr/openmc/core/hooks/itemsadder/ItemsAdderHook.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -37,8 +38,8 @@ public static boolean isEnable() { } @Override - protected String getPluginName() { - return "ItemsAdder"; + protected Set<String> getPluginsName() { + return Collections.singleton("ItemsAdder"); } @Override diff --git a/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java new file mode 100644 index 000000000..aa6d5f523 --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java @@ -0,0 +1,11 @@ +package fr.openmc.core.utils.bedrock; + +import fr.openmc.core.hooks.BedrockHook; +import org.bukkit.entity.Player; + +public class CharRemplacementUtils { + public static String getPointChar(Player player) { + return BedrockHook.isBedrockPlayer(player) ? + "■" : "•"; + } +} diff --git a/src/main/java/fr/openmc/core/utils/text/DirectionUtils.java b/src/main/java/fr/openmc/core/utils/text/DirectionUtils.java index a0e716e1f..d20c7413b 100644 --- a/src/main/java/fr/openmc/core/utils/text/DirectionUtils.java +++ b/src/main/java/fr/openmc/core/utils/text/DirectionUtils.java @@ -1,5 +1,6 @@ package fr.openmc.core.utils.text; +import fr.openmc.core.utils.bedrock.CharRemplacementUtils; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -16,7 +17,7 @@ public static String getDirectionArrow(Player player, Location target) { double dx = target.getX() - player.getLocation().getX(); double dz = target.getZ() - player.getLocation().getZ(); if (dx == 0 && dz == 0) { - return "•"; + return CharRemplacementUtils.getPointChar(player); } double len = Math.sqrt(dx * dx + dz * dz); diff --git a/src/main/java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java b/src/main/java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java index 71545f556..ccc30bc38 100644 --- a/src/main/java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java +++ b/src/main/java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java @@ -1,16 +1,64 @@ package fr.openmc.core.utils.text.fonts; +import fr.openmc.core.hooks.BedrockHook; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; public class SmallCapsUtils { public final static Key SMALL_CAPS_FONT = Key.key("omc_fonts", "small_caps"); - public static Component toSmall(String text){ - return Component.text(text.toLowerCase()).font(SMALL_CAPS_FONT); + public static Component toSmall(Player player, String text){ + Component component = Component.text(text.toLowerCase()); + + return BedrockHook.isBedrockPlayer(player) ? component : component.font(SMALL_CAPS_FONT); + } + + public static Component toSmallComponent(Player player, Component text) { + return BedrockHook.isBedrockPlayer(player) ? toSmallComponentBedrock(text) : toSmallComponent(text); } public static Component toSmallComponent(Component text){ return text.font(SMALL_CAPS_FONT); } + + public static Component toSmallComponentBedrock(Component component) { + Component transformed = component; + + if (component instanceof TextComponent textComponent) { + String converted = SmallCapsUtils.toSmallCapsChar(textComponent.content()); + transformed = textComponent.content(converted); + } + + List<Component> newChildren = new ArrayList<>(); + for (Component child : component.children()) { + newChildren.add(toSmallComponentBedrock(child)); + } + return transformed.children(newChildren); + } + + public static String toSmallCapsChar(String input) { + StringBuilder sb = new StringBuilder(); + int i = 0; + while (i < input.length()) { + String charStr = input.substring(i, i + 1); + + String namespacedId = SMALL_CAPS_FONT.namespace() + ":" + + SMALL_CAPS_FONT.value() + ":" + charStr; + + Character bedrockChar = BedrockHook.getGlyph(namespacedId); + if (bedrockChar != null) { + sb.append(bedrockChar); + } else { + sb.append(charStr); + } + i++; + } + return sb.toString(); + } + } diff --git a/src/main/java/fr/openmc/core/utils/text/messages/MessageConvertor.java b/src/main/java/fr/openmc/core/utils/text/messages/MessageConvertor.java index cb8ea8de3..6013590a7 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/MessageConvertor.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/MessageConvertor.java @@ -3,10 +3,43 @@ import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class MessageConvertor { private static final MiniMessage MINI = MiniMessage.miniMessage(); private static final LegacyComponentSerializer LEGACY = LegacyComponentSerializer.legacySection(); + private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("%(\\d+)\\$s|%s"); + + public static String convert(String legacyPattern) { + Matcher matcher = PLACEHOLDER_PATTERN.matcher(legacyPattern); + StringBuilder result = new StringBuilder(); + int autoIndex = 0; + + while (matcher.find()) { + int index = matcher.group(1) != null + ? Integer.parseInt(matcher.group(1)) - 1 + : autoIndex++; + matcher.appendReplacement(result, "{" + index + "}"); + } + matcher.appendTail(result); + + return result.toString(); + } + + public static MessageFormat toMessageFormat(String legacyPattern, Locale locale) { + String converted = convert(legacyPattern); + String escaped = escapeMessageFormatQuotes(converted); // fix les ' qui annulent le MessageFormat + return new MessageFormat(escaped, locale); + } + + private static String escapeMessageFormatQuotes(String pattern) { + return pattern.replace("'", "''"); + } + public static String toLegacy(String miniMessage) { return LEGACY.serialize(MINI.deserialize(miniMessage)); } diff --git a/src/main/java/fr/openmc/core/utils/text/messages/MessageType.java b/src/main/java/fr/openmc/core/utils/text/messages/MessageType.java index 7993e7c8c..1b2edc0fd 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/MessageType.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/MessageType.java @@ -1,22 +1,30 @@ package fr.openmc.core.utils.text.messages; +import fr.openmc.core.hooks.BedrockHook; import lombok.Getter; import org.bukkit.Sound; +import org.bukkit.entity.Player; @Getter public enum MessageType { - ERROR("§c❗", Sound.BLOCK_NOTE_BLOCK_BASS), - WARNING("§6⚠", Sound.BLOCK_NOTE_BLOCK_HARP), - SUCCESS("§a✔", Sound.BLOCK_NOTE_BLOCK_PLING), - INFO("§bℹ", Sound.BLOCK_NOTE_BLOCK_BIT), - NONE("", null) + ERROR("§c❗", "§c!", Sound.BLOCK_NOTE_BLOCK_BASS), + WARNING("§6⚠", "§6!", Sound.BLOCK_NOTE_BLOCK_HARP), + SUCCESS("§a✔", "§aOK", Sound.BLOCK_NOTE_BLOCK_PLING), + INFO("§bℹ", "§bi", Sound.BLOCK_NOTE_BLOCK_BIT), + NONE("", "", null) ; private final String prefix; + private final String bedrockPrefix; private final Sound sound; - MessageType(String prefix, Sound sound) { + MessageType(String prefix, String bedrockPrefix, Sound sound) { this.prefix = prefix; + this.bedrockPrefix = bedrockPrefix; this.sound = sound; } + + public String getPrefix(Player player) { + return BedrockHook.isBedrockPlayer(player) ? bedrockPrefix : prefix; + } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java b/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java index e7fab255c..e2da7bb03 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/MessagesManager.java @@ -27,9 +27,9 @@ public class MessagesManager { */ public static void sendMessage(CommandSender sender, Component message, Prefix prefix, MessageType type, float soundVolume, boolean sound) { Component messageComponent = - Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix() + "§7) ") - .append(prefix.getPrefixComponent()) - .append(Component.text(" §7» ") + Component.text(type == MessageType.NONE ? "" : "§7(" + (sender instanceof Player player ? type.getPrefix(player) : type.getBedrockPrefix()) + "§7) ") + .append(sender instanceof Player player ? prefix.getPrefixComponent(player) : prefix.getPrefixComponent(null)) + .append(Component.text(" §7» §r") .append(message) ); @@ -58,11 +58,11 @@ public static void sendMessage(OfflinePlayer sender, Component message, Prefix p * * Sends a formatted message to the player with an accompanying sound. * - * @param sender The player to send the message to (can be a console) + * @param sender The player to send the message to * @param message The content of the message * @param prefix The prefix for the message */ - public static void sendMessage(CommandSender sender, Component message, Prefix prefix) { + public static void sendMessage(Player sender, Component message, Prefix prefix) { sendMessage(sender, message, prefix, MessageType.NONE, false); } @@ -90,14 +90,13 @@ public static void sendMessage(Player player, List<Component> messages) { * @param type The type of message (information, error, success, warning) */ public static void broadcastMessage(Component message, Prefix prefix, MessageType type) { - Component messageComponent = - Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix() + "§7) ") - .append(prefix.getPrefixComponent()) - .append(Component.text(" §7» ") - .append(message) - ); - - Bukkit.broadcast(messageComponent); + for (Player player : Bukkit.getOnlinePlayers()) { + player.sendMessage(Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix(player) + "§7) ") + .append(prefix.getPrefixComponent(player)) + .append(Component.text(" §7» §r") + .append(message) + )); + } } /** @@ -110,15 +109,12 @@ public static void broadcastMessage(Component message, Prefix prefix, MessageTyp * @param type The type of message (information, error, success, warning) */ public static void broadcastMessage(World world, Component message, Prefix prefix, MessageType type) { - Component messageComponent = - Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix() + "§7) ") - .append(prefix.getPrefixComponent()) - .append(Component.text(" §7» ") - .append(message) - ); - for (Player player : world.getPlayers()) { - player.sendMessage(messageComponent); + player.sendMessage(Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix(player) + "§7) ") + .append(prefix.getPrefixComponent(player)) + .append(Component.text(" §7» §") + .append(message) + )); } } } diff --git a/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java b/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java index 816d563a3..bf240ee3b 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/Prefix.java @@ -1,9 +1,11 @@ package fr.openmc.core.utils.text.messages; +import fr.openmc.core.hooks.BedrockHook; import fr.openmc.core.utils.text.fonts.SmallCapsUtils; import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; /** * Enum representing various prefixes for messages. @@ -27,7 +29,7 @@ public enum Prefix { BANK("<gradient:#084CFB:#ADB6FD>bank</gradient>"), SHOP("<gradient:#084CFB:#5AAFC4>shop</gradient>"), ADMINSHOP("<gradient:#EE2222:#F04949>adminshop</gradient>"), - DEATH("<gradient:#FF0000:#FF7F7F>☠</gradient>", false), + DEATH("<gradient:#FF0000:#FF7F7F>☠</gradient>", "<gradient:#FF0000:#FF7F7F>MORT</gradient>", false), SETTINGS("<gradient:#2C82E0:#67C8FF>settings</gradient>"), MILLESTONE("<gradient:#A2D182:#B8E89D>milestones</gradient>"), DREAM("<gradient:#4498DB:#412AEF>dream</gradient>"), @@ -40,6 +42,8 @@ public enum Prefix { @Getter private final Component prefix; @Getter + private Component bedrockPrefix = null; + @Getter private final boolean toSmall; Prefix(String prefix) { @@ -52,8 +56,17 @@ public enum Prefix { this.toSmall = toSmall; } - public Component getPrefixComponent() { + Prefix(String prefix, String bedrockPrefix, boolean toSmall) { + this.prefix = MiniMessage.miniMessage().deserialize(prefix); + this.toSmall = toSmall; + this.bedrockPrefix = MiniMessage.miniMessage().deserialize(bedrockPrefix); + } + + public Component getPrefixComponent(Player player) { + boolean isBedrockPlayer = BedrockHook.isBedrockPlayer(player); + + if (bedrockPrefix != null && isBedrockPlayer) return bedrockPrefix; if (!toSmall) return prefix; - return prefix.font(SmallCapsUtils.SMALL_CAPS_FONT); + return isBedrockPlayer ? prefix : prefix.font(SmallCapsUtils.SMALL_CAPS_FONT); } } \ No newline at end of file diff --git a/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java b/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java index 7c5a7cb6b..6d5a6468f 100644 --- a/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java +++ b/src/main/java/fr/openmc/core/utils/text/messages/TranslationManager.java @@ -5,19 +5,24 @@ import com.google.gson.JsonObject; import fr.openmc.core.bootstrap.integration.OMCLogger; import fr.openmc.core.bootstrap.integration.ResourcePacksGenerator; +import fr.openmc.core.hooks.BedrockHook; import fr.openmc.core.utils.text.ComponentUtils; import fr.openmc.core.utils.text.fonts.SmallCapsUtils; import fr.openmc.core.utils.types.MultiResourceBundle; import io.papermc.paper.plugin.bootstrap.BootstrapContext; +import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import net.kyori.adventure.translation.GlobalTranslator; +import net.kyori.adventure.translation.TranslationStore; +import org.bukkit.entity.Player; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.text.MessageFormat; import java.util.*; /** @@ -32,17 +37,17 @@ public class TranslationManager { .setPrettyPrinting() .create(); - private static final PlainTextComponentSerializer PLAIN_TEXT_COMPONENT_SERIALIZER = PlainTextComponentSerializer.plainText(); + private static TranslationStore.StringBased<MessageFormat> adventureStore; /** * Initialise le gestionnaire de traductions et génère les ressource packs. * Charge les traductions en MiniMessage et les convertit en format legacy pour Minecraft. - * + * * @param context Le contexte de bootstrap du plugin Paper * @param defaultLang La langue par défaut du serveur (fallback) * @param langsSuppoorted Les langues additionnelles à supporter */ - public static void init(BootstrapContext context, Locale defaultLang, Locale... langsSuppoorted) { + public static void bootstrap(BootstrapContext context, Locale defaultLang, Locale... langsSuppoorted) { // * Generate resource pack Path resourcePackFolder; try { @@ -54,6 +59,14 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... return; } + // * Enregistre les clés coté serveur afin de pouvoir transformer le text pour bedrock + if (adventureStore != null) { + GlobalTranslator.translator().removeSource(adventureStore); + } + adventureStore = TranslationStore.messageFormat(Key.key("omc", "translations")); + adventureStore.defaultLocale(defaultLang); + GlobalTranslator.translator().addSource(adventureStore); + // * Load default lang MultiResourceBundle defaultBundle = new MultiResourceBundle( "translations", @@ -61,6 +74,7 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... ); fallbackTranslations = toLegacyMap(defaultBundle.getAllTranslations()); + registerAdventureTranslations(defaultLang, fallbackTranslations); try { injectLangs(resourcePackFolder, fallbackTranslations, defaultLang); } catch (Exception e) { @@ -78,6 +92,8 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... translations.putAll(localeTranslations); + registerAdventureTranslations(locale, translations); + try { injectLangs(resourcePackFolder, translations, locale); } catch (Exception e) { @@ -89,10 +105,18 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... } } + private static void registerAdventureTranslations(Locale locale, Map<String, String> translations) { + Map<String, MessageFormat> formats = new HashMap<>(); + for (Map.Entry<String, String> entry : translations.entrySet()) { + formats.put(entry.getKey(), MessageConvertor.toMessageFormat(entry.getValue(), locale)); + } + adventureStore.registerAll(locale, formats); + } + /** * Crée un composant texte traduisible avec arguments. * Le client Minecraft cherchera la traduction dans son resource pack. - * + * * @param key La clé de traduction (ex: "command.fun.playtime.success") * @param args Les arguments à interpoler dans la traduction * @return Un composant Paper Adventure traduisible (italique désactivé) @@ -135,17 +159,31 @@ public static Component translation(String key, boolean toSmall, ComponentLike.. } /** - * Retourne une traduction sous forme de String au format legacy. - * ATTENTION RETOURNE DIRECTEMENT LE FALLBACK - * - * @param key La clé de traduction - * @param args Les arguments à interpoler - * @return Une chaîne au format legacy (codes §) + * Creer un component translatable, safe pour bedrock. + * (utiliser le uniquement lorsque vous voulez appliquer un font (comme toSmall) + * @param player le joueur + * @param key la clé + * @param toSmall si c'est avec le font to small + * @param args les arguments de la clé + * @return le component translatable */ + public static Component translation(Player player, String key, boolean toSmall, ComponentLike... args) { + // si joueur java + if (!BedrockHook.isBedrockPlayer(player)) { + return translation(key, toSmall, args); + } + + // sinon joueur bedrock + Component translatable = translation(key, args); + Component rendered = GlobalTranslator.render(translatable, player.locale()); + + return toSmall ? SmallCapsUtils.toSmallComponentBedrock(rendered) : rendered; + } + /** * Crée une liste de lignes traduisibles pour une lore d'objet. * Divise le texte en plusieurs lignes (séparées par \n). - * + * * @param key La clé de traduction * @param componentsArgs Les arguments de composants à interpoler * @return Une liste de composants, un par ligne (italique désactivé) @@ -182,7 +220,7 @@ public static String getTranslationKey(Component component) { /** * Convertit une carte de traductions du format MiniMessage au format legacy. - * + * * @param miniMessageMap La carte de traductions en format MiniMessage * @return Une nouvelle carte avec les valeurs converties en format legacy (§) */ @@ -199,7 +237,7 @@ private static Map<String, String> toLegacyMap(Map<String, String> miniMessageMa /** * Récupère la traduction de secours (fallback) pour une clé. - * + * * @param key La clé de traduction * @return La traduction de fallback, ou la clé si elle n'existe pas */ @@ -210,7 +248,7 @@ private static String getFallbackTranslation(String key) { /** * Génère le fichier JSON de traductions pour une locale donnée. * Crée un fichier dans assets/minecraft/lang/{locale}.json du resource pack. - * + * * @param resourcePackFolder Le chemin racine du resource pack * @param translations La carte des traductions à injecter * @param locale La locale cible (ex: fr_FR, en_US) diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index c7ba8d785..9fc4f692d 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -30,6 +30,15 @@ dependencies: FastAsyncWorldEdit: load: BEFORE required: false +# Geyser-Spigot: +# load: BEFORE +# required: false +# floodgate: +# load: BEFORE +# required: false +# RiftEngine: +# load: AFTER +# required: false prefix: OMC authors: [ La communauté ] diff --git a/src/main/resources/translations/default/city.properties b/src/main/resources/translations/default/city.properties index 7eb7d1259..d8337cce2 100644 --- a/src/main/resources/translations/default/city.properties +++ b/src/main/resources/translations/default/city.properties @@ -749,7 +749,7 @@ feature.city.mascots.menu.main.move.lore.cooldown=<gray>Vous ne pouvez pas chang feature.city.mascots.menu.main.move.item.title=<gray>Déplacer votre <bold>mascotte</bold></gray> feature.city.mascots.menu.main.move.item.lore=<red>Votre mascotte sera posée à l'emplacement du coffre</red> \ <br><red>Ce coffre n'est pas retirable</red> -feature.city.mascots.menu.main.move.interaction.remaining=Temps restant : %%ssec%%s +feature.city.mascots.menu.main.move.interaction.remaining=Temps restant : %1$s feature.city.mascots.menu.main.move.interaction.cancelled=<red>Déplacement de la mascotte annulée</red> feature.city.mascots.menu.main.move.error.inventory_space=<red>Libérez de la place dans votre inventaire</red> feature.city.mascots.menu.main.move.error.invalid_chunk=<red>Impossible de déplacer la mascotte ici car ce chunk ne vous appartient pas ou est adjacent à une autre ville</red> @@ -879,8 +879,8 @@ feature.city.war.result.draw=<dark_gray><strikethrough> <br><dark_gray><italic>Il y a eu égalité !</italic></dark_gray> \ <br> \ <br><gray>Statistiques globales:</gray> \ - <br><gray> -</gray> <red>Kills de %3$s :</red> %4$s \ - <br><gray> -</gray> <blue>Kills de %5$s :</blue> %6$s \ + <br><gray> -</gray> <red>Kills de %1$s :</red> %2$s \ + <br><gray> -</gray> <blue>Kills de %3$s :</blue> %4$s \ <br> \ <br><dark_gray><strikethrough> </strikethrough></dark_gray> feature.city.war.result.reason.win.mascot_death=Vous avez tué la mascotte adverse ! diff --git a/src/main/resources/translations/default/dailyevents.properties b/src/main/resources/translations/default/dailyevents.properties index 606776ae9..2182bc9b8 100644 --- a/src/main/resources/translations/default/dailyevents.properties +++ b/src/main/resources/translations/default/dailyevents.properties @@ -206,11 +206,11 @@ feature.dailyevents.golden_harvest.menu.info.obese_crops.lore=<gray>Des versions feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.breaking=<yellow>Accessible en cassant une culture :</yellow> feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.growing=<green>Accessible lors de la pousse de :</green> -feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.golden_crops.unknown_source=<gray>Source inconnue</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.growing=<green>Accessible lorsqu'une culture finit de pousser.</green> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.obtainable_on=<gray>Obtenable sur :</gray> -feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.chance=<gray>Chance d'obtention : %1$s</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.unknown_source=<gray>Source inconnue</gray>" \ No newline at end of file diff --git a/src/main/resources/translations/default/displays.properties b/src/main/resources/translations/default/displays.properties index 81d24ae4e..a74e1f9d7 100644 --- a/src/main/resources/translations/default/displays.properties +++ b/src/main/resources/translations/default/displays.properties @@ -4,10 +4,10 @@ feature.displays.tablist.footer.default=\n<light_purple>play.openmc.fr</light_pu feature.displays.tablist.footer.dream=\n<dark_blue>play.openmc.fr</dark_blue>\n feature.displays.scoreboard.title.text=<light_purple>OPENMC</light_purple> feature.displays.scoreboard.footer.text=play.openmc.fr -feature.displays.scoreboard.contest.title=contest +feature.displays.scoreboard.contest.title=Contest feature.displays.scoreboard.contest.vs= VS feature.displays.scoreboard.contest.ends=fin: -feature.displays.scoreboard.corpse.title=cadavre +feature.displays.scoreboard.corpse.title=Cadavre feature.displays.scoreboard.rank.label=rang: feature.displays.scoreboard.rank.none=aucun feature.displays.scoreboard.city.label=ville: diff --git a/src/main/resources/translations/default/quests.properties b/src/main/resources/translations/default/quests.properties index 2f78c1035..bb50e511e 100644 --- a/src/main/resources/translations/default/quests.properties +++ b/src/main/resources/translations/default/quests.properties @@ -28,19 +28,19 @@ feature.quests.message.step_completed=✓ Étape %1$s de %2$s validée ! feature.quests.break_log.lore.line=%1$s : %2$s points feature.quests.break_diamond.name=Richou -feature.quests.break_diamond.description=Casser {target} minerai{s} de diamant +feature.quests.break_diamond.description=Casser [target] minerai[s] de diamant feature.quests.break_log.name=Bûcheron de l'extrême -feature.quests.break_log.description=Casser {target} bûches +feature.quests.break_log.description=Casser [target] bûches feature.quests.break_stone.name=Casseur de pierres -feature.quests.break_stone.description=Miner {target} blocs de pierre +feature.quests.break_stone.description=Miner [target] blocs de pierre feature.quests.break_wheat.name=Fermier dévoué -feature.quests.break_wheat.description=Récolter {target} blé +feature.quests.break_wheat.description=Récolter [target] blé feature.quests.chicken_thrower.name=Lanceur de poules -feature.quests.chicken_thrower.description=Lancer {target} oeufs +feature.quests.chicken_thrower.description=Lancer [target] oeufs feature.quests.consume_kebab.name=Miam miam -feature.quests.consume_kebab.description=Manger {target} kebab{s} +feature.quests.consume_kebab.description=Manger [target] kebab[s] feature.quests.craft_cake.name=Le pâtissier -feature.quests.craft_cake.description=Craft {target} gâteaux +feature.quests.craft_cake.description=Craft [target] gâteaux feature.quests.craft_diamond_armor.name=Armure précieuse feature.quests.craft_diamond_armor.description=Fabriquer une armure complète en diamant feature.quests.craft_diamond_armor.step.helmet=Casque en diamant @@ -48,25 +48,25 @@ feature.quests.craft_diamond_armor.step.chestplate=Plastron en diamant feature.quests.craft_diamond_armor.step.leggings=Pantalon en diamant feature.quests.craft_diamond_armor.step.boots=Bottes en diamant feature.quests.craft_the_mixture.name=The Mixture -feature.quests.craft_the_mixture.description=Fabriquer {target} The Mixture{s} +feature.quests.craft_the_mixture.description=Fabriquer [target] The Mixture[s] feature.quests.enchant_first_item.name=Abracadabra feature.quests.enchant_first_item.description=Enchanter un objet pour la première fois feature.quests.fishing.name=Pêcheur expérimenté -feature.quests.fishing.description=Pêcher {target} poissons +feature.quests.fishing.description=Pêcher [target] poissons feature.quests.kill_players.name=Tueur à gage -feature.quests.kill_players.description=Tuer {target} joueurs +feature.quests.kill_players.description=Tuer [target] joueurs feature.quests.kill_super_creeper.name=Le boss des creepers -feature.quests.kill_super_creeper.description=Tuer {target} creepers super chargés +feature.quests.kill_super_creeper.description=Tuer [target] creepers super chargés feature.quests.kill_zombie.name=Apocalypse zombie ? -feature.quests.kill_zombie.description=Tuer {target} zombies +feature.quests.kill_zombie.description=Tuer [target] zombies feature.quests.mine_aywenite.name=Ohhh... c'est précieux ça ? -feature.quests.mine_aywenite.description=Miner {target} Aywenite{s} +feature.quests.mine_aywenite.description=Miner [target] Aywenite[s] feature.quests.save_the_earth.name=Sauvons la planète -feature.quests.save_the_earth.description=Planter {target} arbres et les faire grandir avec des poudres d'os +feature.quests.save_the_earth.description=Planter [target] arbres et les faire grandir avec des poudres d'os feature.quests.smelt_iron.name=Chaud devant ! -feature.quests.smelt_iron.description=Faire fondre {target} lingots de fer +feature.quests.smelt_iron.description=Faire fondre [target] lingots de fer feature.quests.walk.name=Le randonneur -feature.quests.walk.description=Marcher {target} blocs +feature.quests.walk.description=Marcher [target] blocs feature.quests.win_contest.name=Choisir son camp -feature.quests.win_contest.description=Gagne {target} contest +feature.quests.win_contest.description=Gagne [target] contest diff --git a/src/main/resources/translations/en_GB/city.properties b/src/main/resources/translations/en_GB/city.properties index 5e6557f5c..09283c5e0 100644 --- a/src/main/resources/translations/en_GB/city.properties +++ b/src/main/resources/translations/en_GB/city.properties @@ -749,7 +749,7 @@ feature.city.mascots.menu.main.move.lore.cooldown=<gray>You cannot change the po feature.city.mascots.menu.main.move.item.title=<gray>Move your <bold>mascot</bold></gray> feature.city.mascots.menu.main.move.item.lore=<red>Your mascot will be placed in the location of the chest</red> \ <br><red>This safe is not removable</red> -feature.city.mascots.menu.main.move.interaction.remaining=Time remaining: %%sdry%%s +feature.city.mascots.menu.main.move.interaction.remaining=Time remaining: %1$s feature.city.mascots.menu.main.move.interaction.cancelled=<red>Mascot move canceled</red> feature.city.mascots.menu.main.move.error.inventory_space=<red>Free up space in your inventory</red> feature.city.mascots.menu.main.move.error.invalid_chunk=<red>Cannot move the mascot here because this chunk does not belong to you or is adjacent to another city</red> @@ -879,8 +879,8 @@ feature.city.war.result.draw=<dark_gray><strikethrough> <br><dark_gray><italic>There was a tie!</italic></dark_gray> \ <br> \ <br><gray>Overall statistics:</gray> \ - <br><gray> -</gray> <red>Kills %3$s :</red> %4$s \ - <br><gray> -</gray> <blue>Kills %5$s :</blue> %6$s \ + <br><gray> -</gray> <red>Kills %1$s :</red> %2$s \ + <br><gray> -</gray> <blue>Kills %3$s :</blue> %4$s \ <br> \ <br><dark_gray><strikethrough> </strikethrough></dark_gray> feature.city.war.result.reason.win.mascot_death=You have killed the opposing mascot! diff --git a/src/main/resources/translations/en_GB/dailyevents.properties b/src/main/resources/translations/en_GB/dailyevents.properties index e4b481ef9..bbc936bfc 100644 --- a/src/main/resources/translations/en_GB/dailyevents.properties +++ b/src/main/resources/translations/en_GB/dailyevents.properties @@ -205,11 +205,11 @@ feature.dailyevents.golden_harvest.menu.info.obese_crops.lore=<gray>Compact vers feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.breaking=<yellow>Available by breaking a crop:</yellow> feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.growing=<green>Available when these crops grow:</green> -feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.golden_crops.unknown_source=<gray>Unknown source</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.growing=<green>Available when a crop finishes growing.</green> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.obtainable_on=<gray>Obtainable on:</gray> -feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.chance=<gray>Drop chance: %1$s</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.unknown_source=<gray>Unknown source</gray> diff --git a/src/main/resources/translations/en_GB/displays.properties b/src/main/resources/translations/en_GB/displays.properties index 1498a2015..269bafad2 100644 --- a/src/main/resources/translations/en_GB/displays.properties +++ b/src/main/resources/translations/en_GB/displays.properties @@ -4,10 +4,10 @@ feature.displays.tablist.footer.default=\n<light_purple>play.openmc.fr</light_pu feature.displays.tablist.footer.dream=\n<dark_blue>play.openmc.fr</dark_blue>\n feature.displays.scoreboard.title.text=<light_purple>OPEN™</light_purple> feature.displays.scoreboard.footer.text=play.openmc.fr -feature.displays.scoreboard.contest.title=contest +feature.displays.scoreboard.contest.title=Contest feature.displays.scoreboard.contest.vs= VS feature.displays.scoreboard.contest.ends=END: -feature.displays.scoreboard.corpse.title=corpse +feature.displays.scoreboard.corpse.title=Corpse feature.displays.scoreboard.rank.label=rank: feature.displays.scoreboard.rank.none=none feature.displays.scoreboard.city.label=city: diff --git a/src/main/resources/translations/en_GB/quests.properties b/src/main/resources/translations/en_GB/quests.properties index 21a644e9d..309f0d99e 100644 --- a/src/main/resources/translations/en_GB/quests.properties +++ b/src/main/resources/translations/en_GB/quests.properties @@ -28,19 +28,19 @@ feature.quests.message.step_completed=✓ Step %1$s of %2$s validated! feature.quests.break_log.lore.line=%1$s : %2$s points feature.quests.break_diamond.name=Richou -feature.quests.break_diamond.description=Break diamond {target} ore{s} +feature.quests.break_diamond.description=Break diamond [target] ore[s] feature.quests.break_log.name=Extreme lumberjack -feature.quests.break_log.description=Break {target} logs +feature.quests.break_log.description=Break [target] logs feature.quests.break_stone.name=Stone Breaker -feature.quests.break_stone.description=Mine {target} stone blocks +feature.quests.break_stone.description=Mine [target] stone blocks feature.quests.break_wheat.name=Dedicated farmer -feature.quests.break_wheat.description=Harvest {target} wheat +feature.quests.break_wheat.description=Harvest [target] wheat feature.quests.chicken_thrower.name=Chicken thrower -feature.quests.chicken_thrower.description=Throw {target} eggs +feature.quests.chicken_thrower.description=Throw [target] eggs feature.quests.consume_kebab.name=Yum yum -feature.quests.consume_kebab.description=Eat {target} kebab{s} +feature.quests.consume_kebab.description=Eat [target] kebab[s] feature.quests.craft_cake.name=The pastry chef -feature.quests.craft_cake.description=Craft {target} cakes +feature.quests.craft_cake.description=Craft [target] cakes feature.quests.craft_diamond_armor.name=Precious armor feature.quests.craft_diamond_armor.description=Craft Full Diamond Armor feature.quests.craft_diamond_armor.step.helmet=Diamond Helmet @@ -48,25 +48,25 @@ feature.quests.craft_diamond_armor.step.chestplate=Diamond breastplate feature.quests.craft_diamond_armor.step.leggings=Diamond pants feature.quests.craft_diamond_armor.step.boots=Diamond Boots feature.quests.craft_the_mixture.name=The Mixture -feature.quests.craft_the_mixture.description=Make {target} The Mixture{s} +feature.quests.craft_the_mixture.description=Make [target] The Mixture[s] feature.quests.enchant_first_item.name=Abracadabra feature.quests.enchant_first_item.description=Enchant an item for the first time feature.quests.fishing.name=Experienced fisherman -feature.quests.fishing.description=Catch {target} fish +feature.quests.fishing.description=Catch [target] fish feature.quests.kill_players.name=Hitman -feature.quests.kill_players.description=Kill {target} players +feature.quests.kill_players.description=Kill [target] players feature.quests.kill_super_creeper.name=The creeper boss -feature.quests.kill_super_creeper.description=Kill {target} Super Charged Creepers +feature.quests.kill_super_creeper.description=Kill [target] Super Charged Creepers feature.quests.kill_zombie.name=Zombie Apocalypse? -feature.quests.kill_zombie.description=Kill {target} zombies +feature.quests.kill_zombie.description=Kill [target] zombies feature.quests.mine_aywenite.name=Ohhh... is that precious? -feature.quests.mine_aywenite.description=Mine {target} Aywenite{s} +feature.quests.mine_aywenite.description=Mine [target] Aywenite[s] feature.quests.save_the_earth.name=Let's save the planet -feature.quests.save_the_earth.description=Plant {target} trees and make them grow with bone meal +feature.quests.save_the_earth.description=Plant [target] trees and make them grow with bone meal feature.quests.smelt_iron.name=Hot in front! -feature.quests.smelt_iron.description=Melt {target} iron ingots +feature.quests.smelt_iron.description=Melt [target] iron ingots feature.quests.walk.name=The hiker -feature.quests.walk.description=Walk {target} blocks +feature.quests.walk.description=Walk [target] blocks feature.quests.win_contest.name=Choose your side -feature.quests.win_contest.description=Win {target} contest +feature.quests.win_contest.description=Win [target] contest diff --git a/src/main/resources/translations/en_US/city.properties b/src/main/resources/translations/en_US/city.properties index 5e6557f5c..09283c5e0 100644 --- a/src/main/resources/translations/en_US/city.properties +++ b/src/main/resources/translations/en_US/city.properties @@ -749,7 +749,7 @@ feature.city.mascots.menu.main.move.lore.cooldown=<gray>You cannot change the po feature.city.mascots.menu.main.move.item.title=<gray>Move your <bold>mascot</bold></gray> feature.city.mascots.menu.main.move.item.lore=<red>Your mascot will be placed in the location of the chest</red> \ <br><red>This safe is not removable</red> -feature.city.mascots.menu.main.move.interaction.remaining=Time remaining: %%sdry%%s +feature.city.mascots.menu.main.move.interaction.remaining=Time remaining: %1$s feature.city.mascots.menu.main.move.interaction.cancelled=<red>Mascot move canceled</red> feature.city.mascots.menu.main.move.error.inventory_space=<red>Free up space in your inventory</red> feature.city.mascots.menu.main.move.error.invalid_chunk=<red>Cannot move the mascot here because this chunk does not belong to you or is adjacent to another city</red> @@ -879,8 +879,8 @@ feature.city.war.result.draw=<dark_gray><strikethrough> <br><dark_gray><italic>There was a tie!</italic></dark_gray> \ <br> \ <br><gray>Overall statistics:</gray> \ - <br><gray> -</gray> <red>Kills %3$s :</red> %4$s \ - <br><gray> -</gray> <blue>Kills %5$s :</blue> %6$s \ + <br><gray> -</gray> <red>Kills %1$s :</red> %2$s \ + <br><gray> -</gray> <blue>Kills %3$s :</blue> %4$s \ <br> \ <br><dark_gray><strikethrough> </strikethrough></dark_gray> feature.city.war.result.reason.win.mascot_death=You have killed the opposing mascot! diff --git a/src/main/resources/translations/en_US/dailyevents.properties b/src/main/resources/translations/en_US/dailyevents.properties index 363f8cb00..3e5492ca3 100644 --- a/src/main/resources/translations/en_US/dailyevents.properties +++ b/src/main/resources/translations/en_US/dailyevents.properties @@ -204,11 +204,11 @@ feature.dailyevents.golden_harvest.menu.info.obese_crops.lore=<gray>Compact vers feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.breaking=<yellow>Available by breaking a crop:</yellow> feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.growing=<green>Available when these crops grow:</green> -feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.golden_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.golden_crops.unknown_source=<gray>Unknown source</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.growing=<green>Available when a crop finishes growing.</green> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.obtainable_on=<gray>Obtainable on:</gray> -feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> • <gray>%1$s</gray></dark_gray> +feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.source=<dark_gray> - <gray>%1$s</gray></dark_gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.lore.chance=<gray>Drop chance: %1$s</gray> feature.dailyevents.golden_harvest.menu.info.obese_crops.unknown_source=<gray>Unknown source</gray> diff --git a/src/main/resources/translations/en_US/displays.properties b/src/main/resources/translations/en_US/displays.properties index 1498a2015..269bafad2 100644 --- a/src/main/resources/translations/en_US/displays.properties +++ b/src/main/resources/translations/en_US/displays.properties @@ -4,10 +4,10 @@ feature.displays.tablist.footer.default=\n<light_purple>play.openmc.fr</light_pu feature.displays.tablist.footer.dream=\n<dark_blue>play.openmc.fr</dark_blue>\n feature.displays.scoreboard.title.text=<light_purple>OPEN™</light_purple> feature.displays.scoreboard.footer.text=play.openmc.fr -feature.displays.scoreboard.contest.title=contest +feature.displays.scoreboard.contest.title=Contest feature.displays.scoreboard.contest.vs= VS feature.displays.scoreboard.contest.ends=END: -feature.displays.scoreboard.corpse.title=corpse +feature.displays.scoreboard.corpse.title=Corpse feature.displays.scoreboard.rank.label=rank: feature.displays.scoreboard.rank.none=none feature.displays.scoreboard.city.label=city: diff --git a/src/main/resources/translations/en_US/quests.properties b/src/main/resources/translations/en_US/quests.properties index 21a644e9d..309f0d99e 100644 --- a/src/main/resources/translations/en_US/quests.properties +++ b/src/main/resources/translations/en_US/quests.properties @@ -28,19 +28,19 @@ feature.quests.message.step_completed=✓ Step %1$s of %2$s validated! feature.quests.break_log.lore.line=%1$s : %2$s points feature.quests.break_diamond.name=Richou -feature.quests.break_diamond.description=Break diamond {target} ore{s} +feature.quests.break_diamond.description=Break diamond [target] ore[s] feature.quests.break_log.name=Extreme lumberjack -feature.quests.break_log.description=Break {target} logs +feature.quests.break_log.description=Break [target] logs feature.quests.break_stone.name=Stone Breaker -feature.quests.break_stone.description=Mine {target} stone blocks +feature.quests.break_stone.description=Mine [target] stone blocks feature.quests.break_wheat.name=Dedicated farmer -feature.quests.break_wheat.description=Harvest {target} wheat +feature.quests.break_wheat.description=Harvest [target] wheat feature.quests.chicken_thrower.name=Chicken thrower -feature.quests.chicken_thrower.description=Throw {target} eggs +feature.quests.chicken_thrower.description=Throw [target] eggs feature.quests.consume_kebab.name=Yum yum -feature.quests.consume_kebab.description=Eat {target} kebab{s} +feature.quests.consume_kebab.description=Eat [target] kebab[s] feature.quests.craft_cake.name=The pastry chef -feature.quests.craft_cake.description=Craft {target} cakes +feature.quests.craft_cake.description=Craft [target] cakes feature.quests.craft_diamond_armor.name=Precious armor feature.quests.craft_diamond_armor.description=Craft Full Diamond Armor feature.quests.craft_diamond_armor.step.helmet=Diamond Helmet @@ -48,25 +48,25 @@ feature.quests.craft_diamond_armor.step.chestplate=Diamond breastplate feature.quests.craft_diamond_armor.step.leggings=Diamond pants feature.quests.craft_diamond_armor.step.boots=Diamond Boots feature.quests.craft_the_mixture.name=The Mixture -feature.quests.craft_the_mixture.description=Make {target} The Mixture{s} +feature.quests.craft_the_mixture.description=Make [target] The Mixture[s] feature.quests.enchant_first_item.name=Abracadabra feature.quests.enchant_first_item.description=Enchant an item for the first time feature.quests.fishing.name=Experienced fisherman -feature.quests.fishing.description=Catch {target} fish +feature.quests.fishing.description=Catch [target] fish feature.quests.kill_players.name=Hitman -feature.quests.kill_players.description=Kill {target} players +feature.quests.kill_players.description=Kill [target] players feature.quests.kill_super_creeper.name=The creeper boss -feature.quests.kill_super_creeper.description=Kill {target} Super Charged Creepers +feature.quests.kill_super_creeper.description=Kill [target] Super Charged Creepers feature.quests.kill_zombie.name=Zombie Apocalypse? -feature.quests.kill_zombie.description=Kill {target} zombies +feature.quests.kill_zombie.description=Kill [target] zombies feature.quests.mine_aywenite.name=Ohhh... is that precious? -feature.quests.mine_aywenite.description=Mine {target} Aywenite{s} +feature.quests.mine_aywenite.description=Mine [target] Aywenite[s] feature.quests.save_the_earth.name=Let's save the planet -feature.quests.save_the_earth.description=Plant {target} trees and make them grow with bone meal +feature.quests.save_the_earth.description=Plant [target] trees and make them grow with bone meal feature.quests.smelt_iron.name=Hot in front! -feature.quests.smelt_iron.description=Melt {target} iron ingots +feature.quests.smelt_iron.description=Melt [target] iron ingots feature.quests.walk.name=The hiker -feature.quests.walk.description=Walk {target} blocks +feature.quests.walk.description=Walk [target] blocks feature.quests.win_contest.name=Choose your side -feature.quests.win_contest.description=Win {target} contest +feature.quests.win_contest.description=Win [target] contest diff --git a/src/main/resources/translations/en_US/utils.properties b/src/main/resources/translations/en_US/utils.properties index a48eee6bc..1949e1c55 100644 --- a/src/main/resources/translations/en_US/utils.properties +++ b/src/main/resources/translations/en_US/utils.properties @@ -1,3 +1,3 @@ core.utils.fade_title.teleporting=<bold><green>Teleport...</green></bold> -core.utils.aywenite.not_enough=You don't have enough%1$s <white>(%2$s necessary)</white> +core.utils.aywenite.not_enough=You don't have enough %1$s <white>(%2$s necessary)</white> core.utils.aywenite.not_enough_space=You do not have enough space in your inventory to receive %1$s of%2$s<white>. Aywenite is available in your mailbox</white>