From 72474431b4cf345965d6280748bdbe9c0e2ceaf9 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:21:54 +0200 Subject: [PATCH 01/15] feat: add dependencies bedrock (RiftEngine, Geyser, Floodgate) + application in scoreboard for tests --- .gitignore | 3 + build.gradle | 7 +++ gradle.properties | 5 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- libs/RiftEngine-0.1-SNAPSHOT.jar | Bin 0 -> 31461 bytes .../java/fr/openmc/core/OMCBootstrap.java | 4 +- .../scoreboards/sb/MainScoreboard.java | 16 ++--- .../core/features/quests/objects/Quest.java | 16 ++--- .../features/quests/objects/QuestStep.java | 4 +- .../fr/openmc/core/features/quests/readme.md | 2 +- .../core/utils/text/fonts/SmallCapsUtils.java | 43 ++++++++++++++ .../utils/text/messages/MessageConvertor.java | 27 +++++++++ .../text/messages/TranslationManager.java | 56 +++++++++++++++--- src/main/resources/paper-plugin.yml | 9 +++ .../translations/default/quests.properties | 34 +++++------ .../translations/en_GB/quests.properties | 34 +++++------ .../translations/en_US/quests.properties | 34 +++++------ 17 files changed, 213 insertions(+), 83 deletions(-) create mode 100644 libs/RiftEngine-0.1-SNAPSHOT.jar 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 0000000000000000000000000000000000000000..a15c0a55d343769b4bed3823e783abb6b4b3259c GIT binary patch literal 31461 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 P9)A!KKtS58p8orPIoybS literal 0 HcmV?d00001 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/features/displays/scoreboards/sb/MainScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/MainScoreboard.java index f6779d3b7..f353c40a1 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 @@ -116,21 +116,21 @@ public static List getDefaultLines(Player player) { lines.add(empty()); lines.add(MiniMessage.miniMessage().deserialize( "%s".formatted( - player.getName())).decoration(TextDecoration.BOLD, true)); + SmallCapsUtils.toSmallCapsChar(player.getName()))).decoration(TextDecoration.BOLD, true)); lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.rank.label", true).color(NamedTextColor.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)) + .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))) + : 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)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.balance.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(toSmall(balance).color(TextColor.color(0xFF06DC))) .appendSpace() @@ -138,7 +138,7 @@ public static List getDefaultLines(Player player) { ); if (bits > 0) { lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.bits.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.bits.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(toSmall(EconomyManager.getFormattedSimplifiedNumber(bits)).color(TextColor.color(0x07A0F5))) .appendSpace() @@ -146,7 +146,7 @@ public static List getDefaultLines(Player player) { ); } lines.add(text(" • ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.location.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.location.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(location.color(TextColor.color(0xFF06DC))) ); @@ -159,7 +159,7 @@ public static List getDefaultLines(Player player) { 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)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.pumpkins.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(toSmall(pumpkinCount).color(TextColor.color(0xFF7518))) ); 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..e00852745 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. *

- * 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. *

- * 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 getDescription(UUID playerUUID) { /** * Get the next tier description of the quest for a player. *

- * 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 */ @@ -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. *

- * 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/utils/text/fonts/SmallCapsUtils.java b/src/main/java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java index 71545f556..13daa8737 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,7 +1,13 @@ package fr.openmc.core.utils.text.fonts; +import fr.openmc.riftengine.core.RiftRegistry; +import fr.openmc.riftengine.core.registry.glyphs.Glyph; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; + +import java.util.ArrayList; +import java.util.List; public class SmallCapsUtils { public final static Key SMALL_CAPS_FONT = Key.key("omc_fonts", "small_caps"); @@ -13,4 +19,41 @@ public static Component toSmall(String 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 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.key() + ":" + charStr; + System.out.println(namespacedId); + Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); + + if (glyph != null) { + sb.append(glyph.getBedrockChar()); + } 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..53484b273 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,37 @@ 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) { + return new MessageFormat(convert(legacyPattern), locale); + } + public static String toLegacy(String miniMessage) { return LEGACY.serialize(MINI.deserialize(miniMessage)); } 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..66675b7cb 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 @@ -9,15 +9,20 @@ 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 org.geysermc.floodgate.api.FloodgateApi; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.text.MessageFormat; import java.util.*; /** @@ -32,7 +37,7 @@ public class TranslationManager { .setPrettyPrinting() .create(); - private static final PlainTextComponentSerializer PLAIN_TEXT_COMPONENT_SERIALIZER = PlainTextComponentSerializer.plainText(); + private static TranslationStore.StringBased adventureStore; /** * Initialise le gestionnaire de traductions et génère les ressource packs. @@ -42,7 +47,7 @@ public class TranslationManager { * @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,15 @@ 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", @@ -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,6 +105,14 @@ public static void init(BootstrapContext context, Locale defaultLang, Locale... } } + private static void registerAdventureTranslations(Locale locale, Map translations) { + Map formats = new HashMap<>(); + for (Map.Entry 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. @@ -135,13 +159,27 @@ 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 (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) { + 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). diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index c7ba8d785..9c063effe 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/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/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/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 From 6d310e2f3af9aae8126d44b590e17d5411a866ae Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:23:59 +0200 Subject: [PATCH 02/15] fix: always fallback small caps aaaaa --- .../java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 13daa8737..b5c06129a 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 @@ -41,8 +41,7 @@ public static String toSmallCapsChar(String input) { while (i < input.length()) { String charStr = input.substring(i, i + 1); - String namespacedId = SMALL_CAPS_FONT.namespace() + ":" - + SMALL_CAPS_FONT.key() + ":" + charStr; + String namespacedId = SMALL_CAPS_FONT.key() + ":" + charStr; System.out.println(namespacedId); Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); From cf9d0a378ed2a300b126913e3a0570c6c643a938 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sat, 29 Aug 2026 18:31:38 +0200 Subject: [PATCH 03/15] fix: always fallback small caps aaaaa --- .../java/fr/openmc/core/utils/text/fonts/SmallCapsUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 b5c06129a..f0e6489d6 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 @@ -41,7 +41,8 @@ public static String toSmallCapsChar(String input) { while (i < input.length()) { String charStr = input.substring(i, i + 1); - String namespacedId = SMALL_CAPS_FONT.key() + ":" + charStr; + String namespacedId = SMALL_CAPS_FONT.namespace() + ":" + + SMALL_CAPS_FONT.value() + ":" + charStr; System.out.println(namespacedId); Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); From 24400e2abab8af6732cf96ae361380c6ff0222c7 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 10:47:44 +0200 Subject: [PATCH 04/15] fix: point and char how apply unicode font degeu la --- .../openmc/core/commands/utils/Restart.java | 6 ++-- .../features/bits/commands/BitsCommands.java | 4 +-- .../city/commands/AdminCityCommands.java | 3 +- .../scoreboards/sb/CityWarScoreboard.java | 27 +++++++------- .../scoreboards/sb/MainScoreboard.java | 29 +++++++-------- .../dream/displays/DreamScoreboard.java | 13 +++---- .../homes/menu/HomeChangeIconMenu.java | 3 +- .../core/features/quests/objects/Quest.java | 2 +- .../utils/bedrock/CharRemplacementUtils.java | 11 ++++++ .../core/utils/text/DirectionUtils.java | 3 +- .../core/utils/text/fonts/SmallCapsUtils.java | 8 +++-- .../core/utils/text/messages/MessageType.java | 20 +++++++---- .../utils/text/messages/MessagesManager.java | 36 +++++++++---------- .../core/utils/text/messages/Prefix.java | 7 ++-- .../default/dailyevents.properties | 4 +-- .../translations/en_GB/dailyevents.properties | 4 +-- .../translations/en_US/dailyevents.properties | 4 +-- 17 files changed, 106 insertions(+), 78 deletions(-) create mode 100644 src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java 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/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/displays/scoreboards/sb/CityWarScoreboard.java b/src/main/java/fr/openmc/core/features/displays/scoreboards/sb/CityWarScoreboard.java index db0357261..7d6f64cfa 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; @@ -55,25 +56,25 @@ public void update(Player player, SternalBoard board) { ) .decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("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("%s".formatted(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) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.phase.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(phaseComponent) @@ -93,7 +94,7 @@ 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) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.distance.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(direction, TextColor.color(0xFFE206))) @@ -103,7 +104,7 @@ public void update(Player player, SternalBoard board) { switch (war.getPhase()) { - case PREPARATION -> lines.add(text(" • ", NamedTextColor.DARK_GRAY) + case PREPARATION -> lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.starts_in.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.convertSecondToTime(war.getPreparationTimeRemaining()), TextColor.color(0xF52727))) @@ -111,27 +112,27 @@ public void update(Player player, SternalBoard board) { case COMBAT -> { if (mascot != null) - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.mascot.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(mascot)) ); if (enemyMascot != null) - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.enemy.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(enemyMascot)) ); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("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) + case ENDED -> lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.citywar.state.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(TranslationManager.translation("feature.displays.scoreboard.citywar.state.ended", true).color(NamedTextColor.GRAY)) 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 f353c40a1..09aacb4f6 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; @@ -74,13 +75,13 @@ public void update(Player player, SternalBoard board) { "</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(data.getCamp2ToSmall()) ); - lines.add(Component.text(" • ", NamedTextColor.DARK_GRAY) + lines.add(Component.text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.displays.scoreboard.contest.ends", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) @@ -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()); @@ -116,36 +117,36 @@ public static List<Component> getDefaultLines(Player player) { lines.add(empty()); lines.add(MiniMessage.miniMessage().deserialize( "<gradient:#FF45B9:#FF1FCC><font:omc_fonts:small_caps>%s</font></gradient>".formatted( - SmallCapsUtils.toSmallCapsChar(player.getName()))).decoration(TextDecoration.BOLD, true)); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + player.getName())).decoration(TextDecoration.BOLD, true)); + 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) + 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)) + ? 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) + 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(balance).color(TextColor.color(0xFF06DC))) + .append(toSmall(player, balance).color(TextColor.color(0xFF06DC))) .appendSpace() .append(text(EconomyManager.getEconomyIcon())) ); if (bits > 0) { - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + 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(EconomyManager.getFormattedSimplifiedNumber(bits)).color(TextColor.color(0x07A0F5))) + .append(toSmall(player, EconomyManager.getFormattedSimplifiedNumber(bits)).color(TextColor.color(0x07A0F5))) .appendSpace() .append(text(BitsManager.getBitsIcon())) ); } - lines.add(text(" • ", NamedTextColor.DARK_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 +159,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) + 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..450ab567d 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; @@ -55,14 +56,14 @@ public void update(Player player, SternalBoard board) { long time = dreamPlayer.getDreamTime(); int cold = dreamPlayer.getCold(); - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("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) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.dream.scoreboard.cold", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(dreamPlayer.getCold()).color(TextColor.color(0x44EBDA))) @@ -72,7 +73,7 @@ public void update(Player player, SternalBoard board) { } if (dreamBiome != null) { - lines.add(text(" • ", NamedTextColor.DARK_GRAY) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.dream.scoreboard.biome", true).color(NamedTextColor.GRAY)) .appendSpace() .append(dreamBiome.getSmallName()) @@ -82,10 +83,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) + lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation("feature.dream.scoreboard.location", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(nameLocation)) + .append(toSmall(player, nameLocation)) ); } 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 e00852745..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 @@ -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)) 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..3cb094bd6 --- /dev/null +++ b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java @@ -0,0 +1,11 @@ +package fr.openmc.core.utils.bedrock; + +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; + +public class CharRemplacementUtils { + public static String getPointChar(Player player) { + return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? + "·" : "" + CharRemplacementUtils.getPointChar(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 f0e6489d6..b5c5766bf 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 @@ -5,6 +5,8 @@ import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; import java.util.ArrayList; import java.util.List; @@ -12,8 +14,10 @@ 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 FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? component : component.font(SMALL_CAPS_FONT); } public static Component toSmallComponent(Component text){ 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..4c8e08b0e 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 @@ -2,21 +2,29 @@ import lombok.Getter; import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; @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 FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? 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..89fe86147 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,8 +27,8 @@ 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()) + 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» ") .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» ") + .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..a0311f61b 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 @@ -4,6 +4,8 @@ import lombok.Getter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; +import org.geysermc.floodgate.api.FloodgateApi; /** * Enum representing various prefixes for messages. @@ -52,8 +54,9 @@ public enum Prefix { this.toSmall = toSmall; } - public Component getPrefixComponent() { + public Component getPrefixComponent(Player player) { + if (player == null) return prefix; if (!toSmall) return prefix; - return prefix.font(SmallCapsUtils.SMALL_CAPS_FONT); + return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? prefix : prefix.font(SmallCapsUtils.SMALL_CAPS_FONT); } } \ No newline at end of file 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/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_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> From 1b508b3fd795055e72ab4d80c7f564d4efc6d457 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 14:35:18 +0200 Subject: [PATCH 05/15] fix: point and char how apply unicode font degeu la --- .../scoreboards/sb/CityWarScoreboard.java | 23 ++++++------- .../scoreboards/sb/MainScoreboard.java | 32 ++++++++++--------- .../dream/displays/DreamScoreboard.java | 13 ++++---- .../utils/bedrock/CharRemplacementUtils.java | 2 +- .../core/utils/text/fonts/SmallCapsUtils.java | 4 +++ .../core/utils/text/messages/Prefix.java | 16 ++++++++-- .../translations/default/displays.properties | 4 +-- .../translations/en_GB/displays.properties | 4 +-- .../translations/en_US/displays.properties | 4 +-- 9 files changed, 59 insertions(+), 43 deletions(-) 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 7d6f64cfa..9eb6f72a1 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 @@ -47,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<Component> lines = new ArrayList<>(MainScoreboard.getDefaultLines(player)); + List<Component> lines = new ArrayList<>(MainScoreboard.getDefaultLines(player, true)); lines.add(MiniMessage.miniMessage() .deserialize( @@ -57,7 +57,7 @@ public void update(Player player, SternalBoard board) { .decoration(TextDecoration.BOLD, true)); lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.enemy.label", true).color(TextColor.color(0xAAAAAA))) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.enemy.label", true).color(TextColor.color(0xAAAAAA))) .appendSpace() .append(toSmall(player, enemyCity.getName()).color(TextColor.color(0xFF0634))) ); @@ -65,7 +65,8 @@ public void update(Player player, SternalBoard board) { Component phaseComponent; switch (war.getPhase()) { case PREPARATION -> phaseComponent = MiniMessage.miniMessage() - .deserialize("<gradient:#FF7518:#FFD580>%s</gradient>".formatted(toSmall(player, WarManager.getFormattedPhase(war.getPhase())))); + .deserialize("<gradient:#FF7518:#FFD580><title></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(player, WarManager.getFormattedPhase(war.getPhase())) @@ -75,7 +76,7 @@ public void update(Player player, SternalBoard board) { } lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.phase.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.phase.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(phaseComponent) ); @@ -95,7 +96,7 @@ public void update(Player player, SternalBoard board) { int rounded = (int) Math.round(distance); lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.distance.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.distance.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(direction, TextColor.color(0xFFE206))) .appendSpace() @@ -105,7 +106,7 @@ public void update(Player player, SternalBoard board) { switch (war.getPhase()) { case PREPARATION -> lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.starts_in.label", true).color(NamedTextColor.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))) ); @@ -113,29 +114,29 @@ public void update(Player player, SternalBoard board) { case COMBAT -> { if (mascot != null) lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.mascot.label", true).color(NamedTextColor.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(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.enemy.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.citywar.enemy.label", true).color(NamedTextColor.GRAY)) .appendSpace() .append(getColoredHealth(enemyMascot)) ); lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.ends_in.label", true).color(NamedTextColor.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(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.citywar.state.label", true).color(NamedTextColor.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)) ); } 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 09aacb4f6..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 @@ -49,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) { @@ -78,11 +78,11 @@ public void update(Player player, SternalBoard board) { 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(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.displays.scoreboard.contest.ends", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.contest.ends", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY), TextColor.color(0xFF8F06))) ); @@ -95,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)); @@ -130,21 +130,23 @@ public static List<Component> getDefaultLines(Player player) { ? toSmall(player, city.getName()).color(TextColor.color(0xFF06DC)) : TranslationManager.translation(player, "feature.displays.scoreboard.city.none", true).color(TextColor.color(0xFF06DC))) ); - 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(player, balance).color(TextColor.color(0xFF06DC))) - .appendSpace() - .append(text(EconomyManager.getEconomyIcon())) - ); - if (bits > 0) { + if (!inWar) { lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation(player, "feature.displays.scoreboard.bits.label", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.displays.scoreboard.balance.label", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(player, 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(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) .append(TranslationManager.translation(player, "feature.displays.scoreboard.location.label", true).color(NamedTextColor.GRAY)) 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 450ab567d..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 @@ -17,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; @@ -57,14 +57,14 @@ public void update(Player player, SternalBoard board) { int cold = dreamPlayer.getCold(); lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.time", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.time", true).color(NamedTextColor.GRAY)) .appendSpace() .append(toSmall(player, DateUtils.convertSecondToTime(time)).color(TextColor.color(0x00CC34))) ); if (cold > 0) lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.cold", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.cold", true).color(NamedTextColor.GRAY)) .appendSpace() .append(text(dreamPlayer.getCold()).color(TextColor.color(0x44EBDA))) ); @@ -74,7 +74,7 @@ public void update(Player player, SternalBoard board) { if (dreamBiome != null) { lines.add(text(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.biome", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player,"feature.dream.scoreboard.biome", true).color(NamedTextColor.GRAY)) .appendSpace() .append(dreamBiome.getSmallName()) ); @@ -82,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(" " + CharRemplacementUtils.getPointChar(player) + " ", NamedTextColor.DARK_GRAY) - .append(TranslationManager.translation("feature.dream.scoreboard.location", true).color(NamedTextColor.GRAY)) + .append(TranslationManager.translation(player, "feature.dream.scoreboard.location", true).color(NamedTextColor.GRAY)) .appendSpace() - .append(toSmall(player, nameLocation)) + .append(toSmallComponent(dreamStructure.getName())) ); } diff --git a/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java index 3cb094bd6..e29420f49 100644 --- a/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java +++ b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java @@ -6,6 +6,6 @@ public class CharRemplacementUtils { public static String getPointChar(Player player) { return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? - "·" : "" + CharRemplacementUtils.getPointChar(player) + ""; + "■" : "•"; } } 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 b5c5766bf..27faa211d 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 @@ -20,6 +20,10 @@ public static Component toSmall(Player player, String text){ return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? component : component.font(SMALL_CAPS_FONT); } + public static Component toSmallComponent(Player player, Component text) { + return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? toSmallComponentBedrock(text) : toSmallComponent(text); + } + public static Component toSmallComponent(Component text){ return text.font(SMALL_CAPS_FONT); } 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 a0311f61b..07d17f69f 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 @@ -29,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>"), @@ -42,6 +42,8 @@ public enum Prefix { @Getter private final Component prefix; @Getter + private Component bedrockPrefix = null; + @Getter private final boolean toSmall; Prefix(String prefix) { @@ -54,9 +56,17 @@ public enum Prefix { this.toSmall = toSmall; } + 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) { - if (player == null) return prefix; + boolean isBedrockPlayer = FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()); + + if (bedrockPrefix != null && isBedrockPlayer) return bedrockPrefix; if (!toSmall) return prefix; - return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? prefix : 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/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/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_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: From 9e0e104566336fc743874708cf0f61fede4eb39f Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 14:37:24 +0200 Subject: [PATCH 06/15] fix: translation {0} and {1} ' --- .../utils/text/messages/MessageConvertor.java | 8 +++++++- .../core/utils/text/messages/MessagesManager.java | 6 +++--- .../utils/text/messages/TranslationManager.java | 15 ++++++++------- .../resources/translations/en_US/utils.properties | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) 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 53484b273..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 @@ -31,7 +31,13 @@ public static String convert(String legacyPattern) { } public static MessageFormat toMessageFormat(String legacyPattern, Locale locale) { - return new MessageFormat(convert(legacyPattern), 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) { 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 89fe86147..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 @@ -29,7 +29,7 @@ public static void sendMessage(CommandSender sender, Component message, Prefix p Component messageComponent = 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» ") + .append(Component.text(" §7» §r") .append(message) ); @@ -93,7 +93,7 @@ public static void broadcastMessage(Component message, Prefix prefix, MessageTyp 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» ") + .append(Component.text(" §7» §r") .append(message) )); } @@ -112,7 +112,7 @@ public static void broadcastMessage(World world, Component message, Prefix prefi for (Player player : world.getPlayers()) { player.sendMessage(Component.text(type == MessageType.NONE ? "" : "§7(" + type.getPrefix(player) + "§7) ") .append(prefix.getPrefixComponent(player)) - .append(Component.text(" §7» ") + .append(Component.text(" §7» §") .append(message) )); } 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 66675b7cb..4031af636 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 @@ -42,7 +42,7 @@ public class TranslationManager { /** * 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 @@ -75,6 +75,7 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local ); fallbackTranslations = toLegacyMap(defaultBundle.getAllTranslations()); + registerAdventureTranslations(defaultLang, fallbackTranslations); try { injectLangs(resourcePackFolder, fallbackTranslations, defaultLang); } catch (Exception e) { @@ -116,7 +117,7 @@ private static void registerAdventureTranslations(Locale locale, Map<String, Str /** * 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é) @@ -179,11 +180,11 @@ public static Component translation(Player player, String key, boolean toSmall, 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é) @@ -220,7 +221,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 (§) */ @@ -237,7 +238,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 */ @@ -248,7 +249,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/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> From 057356751b6eac5c8feb77b97855eaff0dbe1ff8 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 16:09:08 +0200 Subject: [PATCH 07/15] fix: heart caracter --- .../openmc/core/features/city/sub/mascots/MascotsManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) ); } From e8ebfd624aeb20c49cc125e4051a4927550f9315 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 17:18:39 +0200 Subject: [PATCH 08/15] fix: crash without geyser; floodgate, ex. BedrockHook --- src/main/java/fr/openmc/core/OMCPlugin.java | 7 +++ .../fr/openmc/core/bootstrap/hooks/Hooks.java | 62 ++++++++++++------- .../core/bootstrap/hooks/HttpsHook.java | 7 ++- .../fr/openmc/core/hooks/BedrockHook.java | 50 +++++++++++++++ .../fr/openmc/core/hooks/FancyNpcsHook.java | 7 ++- .../fr/openmc/core/hooks/LuckPermsHook.java | 6 +- .../java/fr/openmc/core/hooks/PapiHook.java | 7 ++- .../fr/openmc/core/hooks/ProtocolLibHook.java | 7 ++- .../fr/openmc/core/hooks/WorldGuardHook.java | 5 +- .../core/hooks/itemsadder/ItemsAdderHook.java | 5 +- .../utils/bedrock/CharRemplacementUtils.java | 4 +- .../core/utils/text/fonts/SmallCapsUtils.java | 15 ++--- .../core/utils/text/messages/MessageType.java | 4 +- .../core/utils/text/messages/Prefix.java | 4 +- .../text/messages/TranslationManager.java | 23 ++++--- 15 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 src/main/java/fr/openmc/core/hooks/BedrockHook.java diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 9349c0050..09e034d0a 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..039c6b64b 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,79 @@ public abstract class Hooks { private static final Map<Class<? extends Hooks>, Boolean> ENABLED = new ConcurrentHashMap<>(); + public boolean arePluginEnable() { + if (!(this instanceof HttpsHook)) return true; + boolean enabled = true; + + Set<String> 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 = arePluginEnable(); + if (enabled) { + ENABLED.put(getClass(), enabled); + this.init(); + OMCLogger.successFormatted("Hook " + hookName + " activé."); + } + } catch (Exception e) { + 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 = arePluginEnable() && 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 +122,7 @@ public static boolean isEnabled(Class<? extends Hooks> hookClass) { * * @return Nom du plugin cible */ - protected abstract String getPluginName(); + protected abstract Set<String> 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<String> getPluginsName() { + return Collections.singleton(getName()); } } 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..04b41610a --- /dev/null +++ b/src/main/java/fr/openmc/core/hooks/BedrockHook.java @@ -0,0 +1,50 @@ +package fr.openmc.core.hooks; + +import fr.openmc.core.bootstrap.hooks.Hooks; +import fr.openmc.riftengine.core.RiftRegistry; +import fr.openmc.riftengine.core.registry.glyphs.Glyph; +import lombok.Getter; +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 isEnable() { + 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 (!isEnable()) 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(); + } +} 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 index e29420f49..aa6d5f523 100644 --- a/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java +++ b/src/main/java/fr/openmc/core/utils/bedrock/CharRemplacementUtils.java @@ -1,11 +1,11 @@ package fr.openmc.core.utils.bedrock; +import fr.openmc.core.hooks.BedrockHook; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; public class CharRemplacementUtils { public static String getPointChar(Player player) { - return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? + return BedrockHook.isBedrockPlayer(player) ? "■" : "•"; } } 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 27faa211d..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,12 +1,10 @@ package fr.openmc.core.utils.text.fonts; -import fr.openmc.riftengine.core.RiftRegistry; -import fr.openmc.riftengine.core.registry.glyphs.Glyph; +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 org.geysermc.floodgate.api.FloodgateApi; import java.util.ArrayList; import java.util.List; @@ -17,11 +15,11 @@ public class SmallCapsUtils { public static Component toSmall(Player player, String text){ Component component = Component.text(text.toLowerCase()); - return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? component : component.font(SMALL_CAPS_FONT); + return BedrockHook.isBedrockPlayer(player) ? component : component.font(SMALL_CAPS_FONT); } public static Component toSmallComponent(Player player, Component text) { - return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? toSmallComponentBedrock(text) : toSmallComponent(text); + return BedrockHook.isBedrockPlayer(player) ? toSmallComponentBedrock(text) : toSmallComponent(text); } public static Component toSmallComponent(Component text){ @@ -51,11 +49,10 @@ public static String toSmallCapsChar(String input) { String namespacedId = SMALL_CAPS_FONT.namespace() + ":" + SMALL_CAPS_FONT.value() + ":" + charStr; - System.out.println(namespacedId); - Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); - if (glyph != null) { - sb.append(glyph.getBedrockChar()); + Character bedrockChar = BedrockHook.getGlyph(namespacedId); + if (bedrockChar != null) { + sb.append(bedrockChar); } else { sb.append(charStr); } 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 4c8e08b0e..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,9 +1,9 @@ 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; -import org.geysermc.floodgate.api.FloodgateApi; @Getter public enum MessageType { @@ -25,6 +25,6 @@ public enum MessageType { } public String getPrefix(Player player) { - return FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()) ? bedrockPrefix : prefix; + return BedrockHook.isBedrockPlayer(player) ? bedrockPrefix : prefix; } } \ No newline at end of file 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 07d17f69f..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,11 +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; -import org.geysermc.floodgate.api.FloodgateApi; /** * Enum representing various prefixes for messages. @@ -63,7 +63,7 @@ public enum Prefix { } public Component getPrefixComponent(Player player) { - boolean isBedrockPlayer = FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()); + boolean isBedrockPlayer = BedrockHook.isBedrockPlayer(player); if (bedrockPrefix != null && isBedrockPlayer) return bedrockPrefix; if (!toSmall) return prefix; 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 4031af636..0e02b3ae2 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,6 +5,7 @@ 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; @@ -17,7 +18,6 @@ import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.translation.TranslationStore; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; import java.io.IOException; import java.nio.file.Files; @@ -60,13 +60,14 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local } // * Enregistre les clés coté serveur afin de pouvoir transformer le text pour bedrock - if (adventureStore != null) { - GlobalTranslator.translator().removeSource(adventureStore); + if (BedrockHook.isEnable()) { + if (adventureStore != null) { + GlobalTranslator.translator().removeSource(adventureStore); + } + adventureStore = TranslationStore.messageFormat(Key.key("omc", "translations")); + adventureStore.defaultLocale(defaultLang); + GlobalTranslator.translator().addSource(adventureStore); } - adventureStore = TranslationStore.messageFormat(Key.key("omc", "translations")); - adventureStore.defaultLocale(defaultLang); - GlobalTranslator.translator().addSource(adventureStore); - // * Load default lang MultiResourceBundle defaultBundle = new MultiResourceBundle( @@ -75,7 +76,8 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local ); fallbackTranslations = toLegacyMap(defaultBundle.getAllTranslations()); - registerAdventureTranslations(defaultLang, fallbackTranslations); + if (BedrockHook.isEnable()) + registerAdventureTranslations(defaultLang, fallbackTranslations); try { injectLangs(resourcePackFolder, fallbackTranslations, defaultLang); } catch (Exception e) { @@ -93,7 +95,8 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local translations.putAll(localeTranslations); - registerAdventureTranslations(locale, translations); + if (BedrockHook.isEnable()) + registerAdventureTranslations(locale, translations); try { injectLangs(resourcePackFolder, translations, locale); @@ -170,7 +173,7 @@ public static Component translation(String key, boolean toSmall, ComponentLike.. */ public static Component translation(Player player, String key, boolean toSmall, ComponentLike... args) { // si joueur java - if (!FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId())) { + if (!BedrockHook.isBedrockPlayer(player)) { return translation(key, toSmall, args); } From 5ffc1e3f890e041368b35159b15b63ff36d3666b Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 17:25:53 +0200 Subject: [PATCH 09/15] fix: doesnt load with bedrock hook actived (normal) --- .../text/messages/TranslationManager.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) 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 0e02b3ae2..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 @@ -60,14 +60,12 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local } // * Enregistre les clés coté serveur afin de pouvoir transformer le text pour bedrock - if (BedrockHook.isEnable()) { - if (adventureStore != null) { - GlobalTranslator.translator().removeSource(adventureStore); - } - adventureStore = TranslationStore.messageFormat(Key.key("omc", "translations")); - adventureStore.defaultLocale(defaultLang); - GlobalTranslator.translator().addSource(adventureStore); + 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( @@ -76,8 +74,7 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local ); fallbackTranslations = toLegacyMap(defaultBundle.getAllTranslations()); - if (BedrockHook.isEnable()) - registerAdventureTranslations(defaultLang, fallbackTranslations); + registerAdventureTranslations(defaultLang, fallbackTranslations); try { injectLangs(resourcePackFolder, fallbackTranslations, defaultLang); } catch (Exception e) { @@ -95,8 +92,7 @@ public static void bootstrap(BootstrapContext context, Locale defaultLang, Local translations.putAll(localeTranslations); - if (BedrockHook.isEnable()) - registerAdventureTranslations(locale, translations); + registerAdventureTranslations(locale, translations); try { injectLangs(resourcePackFolder, translations, locale); From 99657485ff115482c2668a58bb7223b851a8d73e Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 19:08:46 +0200 Subject: [PATCH 10/15] fix: chronometer + todo for after --- .../java/fr/openmc/api/chronometer/Chronometer.java | 12 +++++------- .../openmc/api/input/location/ItemInteraction.java | 9 ++++++++- .../core/features/city/actions/CityCreateAction.java | 2 +- .../features/city/sub/mascots/menu/MascotMenu.java | 2 +- .../city/sub/mayor/actions/MayorSetWarpAction.java | 2 +- .../features/city/sub/mayor/managers/NPCManager.java | 4 ++-- .../city/sub/mayor/menu/npc/MayorNpcMenu.java | 2 +- .../city/sub/mayor/menu/npc/OwnerNpcMenu.java | 2 +- .../displays/scoreboards/sb/CityWarScoreboard.java | 1 + .../resources/translations/default/city.properties | 6 +++--- .../resources/translations/en_GB/city.properties | 6 +++--- .../resources/translations/en_US/city.properties | 6 +++--- 12 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/main/java/fr/openmc/api/chronometer/Chronometer.java b/src/main/java/fr/openmc/api/chronometer/Chronometer.java index 131ac2917..8d470fc23 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)); - 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<Location, Boolean> result, Runnable onFail) { + public static void runLocationInteraction(Player player, + ItemStack item, + String chronometerGroup, + int chronometerTime, + String startMessage, + Component endMessage, + Function<Location, Boolean> 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/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/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 9eb6f72a1..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 @@ -164,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/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/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_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! From 83a528778802b394cb538e3c77966529816b68a7 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 19:14:35 +0200 Subject: [PATCH 11/15] fix: choropn --- .../openmc/core/features/shops/managers/PlayerShopManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From 57796bba7141eed57df3eb239b8be7b8828c5bd7 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 20:20:51 +0200 Subject: [PATCH 12/15] fix: choro --- src/main/java/fr/openmc/api/chronometer/Chronometer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/openmc/api/chronometer/Chronometer.java b/src/main/java/fr/openmc/api/chronometer/Chronometer.java index 8d470fc23..6f7d49a5c 100644 --- a/src/main/java/fr/openmc/api/chronometer/Chronometer.java +++ b/src/main/java/fr/openmc/api/chronometer/Chronometer.java @@ -92,7 +92,7 @@ public void run() { int remainingTime = chronometer.get(entityUUID).get(group); if (key != null && entity instanceof Player player) { - Component timerMessage = TranslationManager.translation(key, Component.text(remainingTime)); + Component timerMessage = TranslationManager.translation(key, Component.text(remainingTime + "s")); sendMessage(player, messageType, timerMessage); } From e0b96bda1e18dc91a19733e47896f99027646d93 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 21:38:26 +0200 Subject: [PATCH 13/15] desactive bedrock feature (mark as experimental) --- src/main/java/fr/openmc/core/OMCPlugin.java | 10 ++--- .../fr/openmc/core/bootstrap/hooks/Hooks.java | 6 +-- .../fr/openmc/core/hooks/BedrockHook.java | 37 +++++++++---------- src/main/resources/paper-plugin.yml | 18 ++++----- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/main/java/fr/openmc/core/OMCPlugin.java b/src/main/java/fr/openmc/core/OMCPlugin.java index 09e034d0a..4c3fee7c0 100644 --- a/src/main/java/fr/openmc/core/OMCPlugin.java +++ b/src/main/java/fr/openmc/core/OMCPlugin.java @@ -221,11 +221,11 @@ 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()); - } +// 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 039c6b64b..cc7fbb2da 100644 --- a/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java +++ b/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java @@ -19,7 +19,7 @@ public abstract class Hooks { private static final Map<Class<? extends Hooks>, Boolean> ENABLED = new ConcurrentHashMap<>(); - public boolean arePluginEnable() { + public boolean arePluginEnabled() { if (!(this instanceof HttpsHook)) return true; boolean enabled = true; @@ -53,7 +53,7 @@ public void startInit() { String hookName = this.getClass().getSimpleName(); try { - boolean enabled = arePluginEnable(); + boolean enabled = arePluginEnabled(); if (enabled) { ENABLED.put(getClass(), enabled); this.init(); @@ -81,7 +81,7 @@ public void startSave() { return; } - boolean enabled = arePluginEnable() && ENABLED.get(getClass()) != null + boolean enabled = arePluginEnabled() && ENABLED.get(getClass()) != null && ENABLED.get(getClass()); String hookName = this.getClass().getSimpleName(); diff --git a/src/main/java/fr/openmc/core/hooks/BedrockHook.java b/src/main/java/fr/openmc/core/hooks/BedrockHook.java index 04b41610a..d0631c4be 100644 --- a/src/main/java/fr/openmc/core/hooks/BedrockHook.java +++ b/src/main/java/fr/openmc/core/hooks/BedrockHook.java @@ -1,18 +1,15 @@ package fr.openmc.core.hooks; import fr.openmc.core.bootstrap.hooks.Hooks; -import fr.openmc.riftengine.core.RiftRegistry; -import fr.openmc.riftengine.core.registry.glyphs.Glyph; -import lombok.Getter; import org.bukkit.entity.Player; -import org.geysermc.floodgate.api.FloodgateApi; -import org.geysermc.geyser.api.GeyserApi; +//import org.geysermc.floodgate.api.FloodgateApi; +//import org.geysermc.geyser.api.GeyserApi; import java.util.Set; public class BedrockHook extends Hooks { - public static boolean isEnable() { - return Hooks.isEnabled(FancyNpcsHook.class); + public static boolean isEnabled() { + return false; // return Hooks.isEnabled(FancyNpcsHook.class); } @Override @@ -20,15 +17,15 @@ protected Set<String> getPluginsName() { return Set.of("Geyser-Spigot", "floodgate", "RiftEngine"); } - @Getter - private static GeyserApi geyserApi; - @Getter - private static FloodgateApi floodgateApi; +// @Getter +// private static GeyserApi geyserApi; +// @Getter +// private static FloodgateApi floodgateApi; @Override public void init() { - floodgateApi = FloodgateApi.getInstance(); - geyserApi = GeyserApi.api(); +// floodgateApi = FloodgateApi.getInstance(); +// geyserApi = GeyserApi.api(); } /** @@ -37,14 +34,16 @@ public void init() { * @return true si le joueur est un joueur Bedrock, false sinon */ public static boolean isBedrockPlayer(Player player) { - if (!isEnable()) return false; - return floodgateApi.isFloodgatePlayer(player.getUniqueId()); + 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(); +// Glyph glyph = RiftRegistry.GLYPHS.get(namespacedId).orElse(null); +// if (glyph == null) return null; +// +// return glyph.getBedrockChar(); + return null; } } diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index 9c063effe..9fc4f692d 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -30,15 +30,15 @@ dependencies: FastAsyncWorldEdit: load: BEFORE required: false - Geyser-Spigot: - load: BEFORE - required: false - floodgate: - load: BEFORE - required: false - RiftEngine: - load: AFTER - required: false +# Geyser-Spigot: +# load: BEFORE +# required: false +# floodgate: +# load: BEFORE +# required: false +# RiftEngine: +# load: AFTER +# required: false prefix: OMC authors: [ La communauté ] From 792e48293f59f7a3c116e383db9169a3834df103 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 21:46:54 +0200 Subject: [PATCH 14/15] fix test --- src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cc7fbb2da..95196afe5 100644 --- a/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java +++ b/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java @@ -59,7 +59,7 @@ public void startInit() { this.init(); OMCLogger.successFormatted("Hook " + hookName + " activé."); } - } catch (Exception e) { + } catch (Throwable e) { OMCLogger.errorFormatted("Hook " + hookName + " non activé."); OMCLogger.error(e.getMessage(), e); } From ae9281db4134d16edf4e6ea5281890f5c5440f36 Mon Sep 17 00:00:00 2001 From: iambibi_ <89582596+iambibi@users.noreply.github.com> Date: Sun, 30 Aug 2026 21:50:13 +0200 Subject: [PATCH 15/15] fix test --- src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java | 1 + 1 file changed, 1 insertion(+) 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 95196afe5..e800a2d8b 100644 --- a/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java +++ b/src/main/java/fr/openmc/core/bootstrap/hooks/Hooks.java @@ -60,6 +60,7 @@ public void startInit() { OMCLogger.successFormatted("Hook " + hookName + " activé."); } } catch (Throwable e) { + ENABLED.remove(getClass()); OMCLogger.errorFormatted("Hook " + hookName + " non activé."); OMCLogger.error(e.getMessage(), e); }