From 09a224bf80bf8f5464ca3fd212208ed31657b338 Mon Sep 17 00:00:00 2001 From: Teddy Li Date: Thu, 25 Jun 2026 12:17:59 +0800 Subject: [PATCH 1/2] Add 1.21.11 (ResourceLocation -> Identifier) --- build.fabric.gradle.kts | 6 ++++++ build.neoforge.gradle.kts | 6 ++++++ settings.gradle.kts | 1 + stonecutter.gradle.kts | 2 +- versions/1.21.11-fabric/gradle.properties | 4 ++++ versions/1.21.11-neoforge/gradle.properties | 4 ++++ 6 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 versions/1.21.11-fabric/gradle.properties create mode 100644 versions/1.21.11-neoforge/gradle.properties diff --git a/build.fabric.gradle.kts b/build.fabric.gradle.kts index 445626f..b050578 100644 --- a/build.fabric.gradle.kts +++ b/build.fabric.gradle.kts @@ -62,6 +62,12 @@ java { targetCompatibility = javaCompat } +stonecutter { + replacements.string(eval(current.version, ">=1.21.11")) { + replace("ResourceLocation", "Identifier") + } +} + val supportedMinecraftVersions: List = com.google.common.collect.ImmutableList.builder() .addAll( (property("publish.additionalVersions") as String?) diff --git a/build.neoforge.gradle.kts b/build.neoforge.gradle.kts index 9eb2716..fb9115d 100644 --- a/build.neoforge.gradle.kts +++ b/build.neoforge.gradle.kts @@ -72,6 +72,12 @@ java { targetCompatibility = javaCompat } +stonecutter { + replacements.string(eval(current.version, ">=1.21.11")) { + replace("ResourceLocation", "Identifier") + } +} + val supportedMinecraftVersions: List = com.google.common.collect.ImmutableList.builder() .addAll( (property("publish.additionalVersions") as String?) diff --git a/settings.gradle.kts b/settings.gradle.kts index 74b68b5..e21977d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,6 +27,7 @@ stonecutter { match("1.21.3", "neoforge") match("1.21.8", "fabric") match("1.21.10", "fabric", "neoforge") + match("1.21.11", "fabric", "neoforge") vcsVersion = "1.21.10-fabric" } diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index 6788cc3..9f01daa 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -1,7 +1,7 @@ plugins { id("dev.kikugie.stonecutter") id("co.uzzu.dotenv.gradle") version "4.0.0" - id("fabric-loom") version "1.11-SNAPSHOT" apply false + id("fabric-loom") version "1.13-SNAPSHOT" apply false id("net.neoforged.moddev") version "2.0.115" apply false id("dev.kikugie.postprocess.jsonlang") version "2.1-beta.4" apply false id("me.modmuss50.mod-publish-plugin") version "0.8.+" apply false diff --git a/versions/1.21.11-fabric/gradle.properties b/versions/1.21.11-fabric/gradle.properties new file mode 100644 index 0000000..f98e763 --- /dev/null +++ b/versions/1.21.11-fabric/gradle.properties @@ -0,0 +1,4 @@ +deps.minecraft=1.21.11 +deps.fabric-api=0.141.4+1.21.11 +deps.parchment=1.21.11:2025.12.20 +publish.additionalVersions= \ No newline at end of file diff --git a/versions/1.21.11-neoforge/gradle.properties b/versions/1.21.11-neoforge/gradle.properties new file mode 100644 index 0000000..bdb720e --- /dev/null +++ b/versions/1.21.11-neoforge/gradle.properties @@ -0,0 +1,4 @@ +deps.minecraft=1.21.11 +deps.neoforge=21.11.42 +deps.parchment=1.21.11:2025.12.20 +publish.additionalVersions= \ No newline at end of file From eae25d2bc5214b87d53536fa254de17ac6c75e57 Mon Sep 17 00:00:00 2001 From: Teddy Li Date: Thu, 25 Jun 2026 12:52:40 +0800 Subject: [PATCH 2/2] Optimize `ServerI18nReloader` --- .../server/i18n/ServerI18nReloader.java | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/iafenvoy/server/i18n/ServerI18nReloader.java b/src/main/java/com/iafenvoy/server/i18n/ServerI18nReloader.java index 1f250d2..e424f7c 100644 --- a/src/main/java/com/iafenvoy/server/i18n/ServerI18nReloader.java +++ b/src/main/java/com/iafenvoy/server/i18n/ServerI18nReloader.java @@ -8,6 +8,8 @@ import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; +import java.io.Reader; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -15,32 +17,51 @@ public enum ServerI18nReloader implements ResourceManagerReloadListener { INSTANCE; public static final ResourceLocation ID = /*? >=1.21 {*/ResourceLocation.fromNamespaceAndPath/*?} else {*//*new ResourceLocation*//*?}*/(ServerI18nApi.MOD_ID, ServerI18nApi.MOD_ID); public static final String DEFAULT_LANGUAGE = "en_us"; - private static final Map> DATA = new HashMap<>(); + private static volatile Map> DATA = Collections.emptyMap(); @Override public void onResourceManagerReload(ResourceManager manager) { - DATA.clear(); + final Map> pendingData = new HashMap<>(); for (Map.Entry entry : manager.listResources("lang", p -> p.getPath().endsWith(".json")).entrySet()) { - String language = entry.getKey().getPath().replaceAll(".json", "").replaceAll("lang/", ""); - if (!DATA.containsKey(language)) DATA.put(language, new HashMap<>()); - Map map = DATA.get(language); + String language = removeSurrounding(entry.getKey().getPath()); + + Map map = pendingData.computeIfAbsent(language, k -> new HashMap<>()); try { - JsonElement element = JsonParser.parseReader(entry.getValue().openAsReader()); + JsonElement element; + try (Reader reader = entry.getValue().openAsReader()) { + element = JsonParser.parseReader(reader); + } if (!element.isJsonObject()) continue; JsonObject obj = element.getAsJsonObject(); - for (String s : obj.keySet()) map.put(s, obj.get(s).getAsString()); + obj.asMap().forEach((key, value) -> { + if (!value.isJsonPrimitive()) return; + map.put(key, value.getAsString()); + }); } catch (Exception e) { ServerI18nApi.LOGGER.error("Failed to load {}", entry.getKey().toString(), e); } } + DATA = Collections.unmodifiableMap(pendingData); + } + + private static String removeSurrounding(String s) { + int startIndex = 0, endIndex = s.length(); + if (s.startsWith("lang/")) startIndex = "lang/".length(); + if (s.endsWith(".json")) endIndex -= ".json".length(); + + if (startIndex > endIndex) return ""; // does not happen + return s.substring(startIndex, endIndex); } public static String translate(String language, String key) { - if (DATA.containsKey(language)) { - Map map = DATA.get(language); - if (map.containsKey(key)) return DATA.get(language).get(key); + String value = null; + Map map; + if ((map = DATA.get(language)) != null) { + value = map.get(key); + } + if (value == null && (map = DATA.get(DEFAULT_LANGUAGE)) != null) { + value = map.get(key); } - if (DATA.containsKey(DEFAULT_LANGUAGE)) return DATA.get(DEFAULT_LANGUAGE).getOrDefault(key, key); - return key; + return value != null ? value : key; } }