From fc37a8192ce802fefcf6d26ff7dc5c6e4e0ec5eb Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 30 Mar 2025 00:56:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(core):=20=E6=B7=BB=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=96=B9=E5=9D=97=E5=90=8D=E7=A7=B0=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../default/configuration/block_name.yml | 37 ++++++++++++ .../core/plugin/locale/I18NData.java | 58 ++++++++++++++++++- 2 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml b/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml new file mode 100644 index 000000000..0665394b7 --- /dev/null +++ b/bukkit/loader/src/main/resources/resources/default/configuration/block_name.yml @@ -0,0 +1,37 @@ +lang: + en_us: + block_name:default:chinese_lantern: "Chinese Lantern" + block_name:default:netherite_anvil: "Netherite Anvil" + block_name:default:topaz_ore: "Topaz Ore" + block_name:default:deepslate_topaz_ore: "Deepslate Topaz Ore" + block_name:default:palm_log: "Palm Log" + block_name:default:stripped_palm_log: "Stripped Palm Log" + block_name:default:palm_wood: "Palm Wood" + block_name:default:stripped_palm_wood: "Stripped Palm Wood" + block_name:default:palm_planks: "Palm Planks" + block_name:default:palm_sapling: "Palm Sapling" + block_name:default:palm_leaves: "Palm Leaves" + block_name:default:fairy_flower: "Fairy Flower" + block_name:default:reed: "Reed" + block_name:default:flame_cane: "Flame Cane" + block_name:default:ender_pearl_flower: "Ender Pearl Flower" + block_name:default:gunpowder_block: "GunPowder Block" + block_name:default:solid_gunpowder_block: "Solid GunPowder Block" + zh_cn: + block_name:default:chinese_lantern: "灯笼" + block_name:default:netherite_anvil: "下界合金砧" + block_name:default:topaz_ore: "黄玉矿石" + block_name:default:deepslate_topaz_ore: "深层黄玉矿石" + block_name:default:palm_log: "棕榈原木" + block_name:default:stripped_palm_log: "去皮棕榈原木" + block_name:default:palm_wood: "棕榈木" + block_name:default:stripped_palm_wood: "去皮棕榈木" + block_name:default:palm_planks: "棕榈木板" + block_name:default:palm_sapling: "棕榈树苗" + block_name:default:palm_leaves: "棕榈树叶" + block_name:default:fairy_flower: "仙灵花" + block_name:default:reed: "芦苇" + block_name:default:flame_cane: "烈焰甘蔗" + block_name:default:ender_pearl_flower: "末影珍珠花" + block_name:default:gunpowder_block: "火药粉末" + block_name:default:solid_gunpowder_block: "凝固火药块" \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java index febcbe746..2c2610ee9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java @@ -1,14 +1,19 @@ package net.momirealms.craftengine.core.plugin.locale; +import net.momirealms.craftengine.core.block.BlockStateParser; +import net.momirealms.craftengine.core.block.BlockStateVariantProvider; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; public class I18NData { public final Map translations = new HashMap<>(); public void addTranslations(Map data) { + addBlockName(data); translations.putAll(data); } @@ -36,4 +41,51 @@ public class I18NData { }); }); } -} \ No newline at end of file + + private static void addBlockName(Map data) { + String[] keyBuffer = new String[data.size()]; + int validKeyCount = 0; + for (Map.Entry entry : data.entrySet()) { + String key = entry.getKey(); + if (key != null && key.length() > 11 && key.startsWith("block_name:")) { + keyBuffer[validKeyCount++] = key; + } + } + + for (String key : keyBuffer) { + String value = data.remove(key); + ImmutableBlockState states = BlockStateParser.deserialize(key.substring(11)); + if (states == null) continue; + + BlockStateVariantProvider variantProvider = states.owner().value().variantProvider(); + Collection stateCollection = variantProvider.states(); + for (ImmutableBlockState state : stateCollection) { + Object blockState = state.customBlockState().handle(); + String id = blockState.toString(); + int first = -1, last = -1; + for (int i = 0; i < id.length(); i++) { + char c = id.charAt(i); + if (c == '{' && first == -1) { + first = i; + } else if (c == '}') { + last = i; + } + } + if (first == -1 || last == -1 || last <= first) { + CraftEngine.instance().logger().warn("Invalid block ID format: " + id); + continue; + } + int length = last - first - 1; + char[] chars = new char[length]; + id.getChars(first + 1, last, chars, 0); + for (int i = 0; i < length; i++) { + if (chars[i] == ':') { + chars[i] = '.'; + } + } + String blockId = new String(chars); + data.put("block." + blockId, value); + } + } + } +}