From c964552da17e98580af4caeeb1e447ebbfe8ab47 Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Sat, 31 Jan 2026 23:16:56 +0800 Subject: [PATCH] Add support for resource reloading event to refresh translations --- .../events/MinecraftEventHandler.java | 8 ++-- .../minecraft/events/MinecraftEvents.java | 7 ++++ .../MixinReloadableServerResources.java | 40 +++++++++++++++++++ .../minecraft/utils/TranslationManager.java | 28 ++++++++----- minecraft/src/main/resources/dmcc.mixins.json | 1 + 5 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinReloadableServerResources.java diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java index 25664c94..7e64f568 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEventHandler.java @@ -24,9 +24,6 @@ public class MinecraftEventHandler { * Initializes the Minecraft event handlers. */ public static void init() { - // Initialize Minecraft translations - TranslationManager.init(); - EventManager.register(MinecraftEvents.ServerStarted.class, event -> { Map placeholders = Map.of(); NetworkManager.sendPacketToServer(new MinecraftEventPacket(MinecraftEventPacket.MessageType.SERVER_STARTED, placeholders)); @@ -96,6 +93,11 @@ public class MinecraftEventHandler { // Register Minecraft /dmcc commands MinecraftCommands.register(event.dispatcher()); }); + + EventManager.register(MinecraftEvents.ReloadResources.class, event -> { + // Refresh Minecraft translations + TranslationManager.init(); + }); } /** diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java index 11dfee4c..d2e7a2ba 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/events/MinecraftEvents.java @@ -114,4 +114,11 @@ public class MinecraftEvents { CommandDispatcher dispatcher ) { } + + /** + * Posted when Minecraft is reloading resources. + */ + public record ReloadResources( + ) { + } } diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinReloadableServerResources.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinReloadableServerResources.java new file mode 100644 index 00000000..085ace76 --- /dev/null +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/mixins/MixinReloadableServerResources.java @@ -0,0 +1,40 @@ +package com.xujiayao.discord_mc_chat.minecraft.mixins; + +import com.xujiayao.discord_mc_chat.minecraft.events.MinecraftEvents; +import com.xujiayao.discord_mc_chat.utils.events.EventManager; +import net.minecraft.commands.Commands; +import net.minecraft.core.LayeredRegistryAccess; +import net.minecraft.core.Registry; +import net.minecraft.server.RegistryLayer; +import net.minecraft.server.ReloadableServerResources; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.flag.FeatureFlagSet; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +/** + * @author Xujiayao + */ +@Mixin(ReloadableServerResources.class) +public class MixinReloadableServerResources { + + @Inject(method = "loadResources", at = @At("RETURN")) + private static void loadResources(ResourceManager p_248588_, + LayeredRegistryAccess p_335667_, + List> p_363739_, + FeatureFlagSet p_250212_, + Commands.CommandSelection p_249301_, + int p_251126_, + Executor p_249136_, + Executor p_249601_, + CallbackInfoReturnable> cir) { + // ReloadResources Event + EventManager.post(new MinecraftEvents.ReloadResources()); + } +} diff --git a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/utils/TranslationManager.java b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/utils/TranslationManager.java index 6c070c20..96d43eb8 100644 --- a/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/utils/TranslationManager.java +++ b/minecraft/src/main/java/com/xujiayao/discord_mc_chat/minecraft/utils/TranslationManager.java @@ -15,6 +15,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Stream; import static com.xujiayao.discord_mc_chat.Constants.LOGGER; @@ -37,21 +39,25 @@ public class TranslationManager { * Loads translations for the current target language first, then falls back to en_us. */ public static void init() { - TRANSLATIONS.clear(); + try (ExecutorService executor = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Translations"))) { + executor.submit(() -> { + TRANSLATIONS.clear(); - String language = I18nManager.getLanguage(); + String language = I18nManager.getLanguage(); - // Load the target language translations - loadTranslations(language); - int loadedCount = TRANSLATIONS.size(); + // Load the target language translations + loadTranslations(language); + int loadedCount = TRANSLATIONS.size(); - // Load en_us translations to fill in missing keys (fallback) - if (!"en_us".equals(language)) { - loadTranslations("en_us"); - LOGGER.info("Loaded {}/{} Minecraft \"{}\" translations", loadedCount, TRANSLATIONS.size(), language); + // Load en_us translations to fill in missing keys (fallback) + if (!"en_us".equals(language)) { + loadTranslations("en_us"); + LOGGER.info("Loaded {}/{} Minecraft \"{}\" translations", loadedCount, TRANSLATIONS.size(), language); + } + + currentLoadedLanguage = language; + }); } - - currentLoadedLanguage = language; } /** diff --git a/minecraft/src/main/resources/dmcc.mixins.json b/minecraft/src/main/resources/dmcc.mixins.json index 1c717703..bf62ee12 100644 --- a/minecraft/src/main/resources/dmcc.mixins.json +++ b/minecraft/src/main/resources/dmcc.mixins.json @@ -7,6 +7,7 @@ "MixinMinecraftServer", "MixinPlayerAdvancements", "MixinPlayerList", + "MixinReloadableServerResources", "MixinSayCommand", "MixinServerGamePacketListenerImpl", "MixinServerPlayer",