From 3ce26b630de512db5ea4a2c757374459841b305c Mon Sep 17 00:00:00 2001 From: Marcel Konrad Date: Fri, 29 Jul 2022 22:40:02 +0200 Subject: [PATCH] Added locate gui, partially implements #24 --- .../builder/impl/LocateCommandBuilder.java | 54 ++++ .../worldhandler/gui/category/Category.java | 2 +- .../worldhandler/gui/content/Content.java | 2 + .../worldhandler/gui/content/Contents.java | 3 +- .../gui/content/impl/ContentLocate.java | 250 ++++++++++++++++++ .../worldhandler/util/RegistryHelper.java | 13 +- .../assets/worldhandler/lang/de_de.json | 7 + .../assets/worldhandler/lang/en_us.json | 7 + .../assets/worldhandler/lang/fr_fr.json | 7 + .../assets/worldhandler/lang/ru_ru.json | 7 + .../assets/worldhandler/lang/zh_cn.json | 7 + 11 files changed, 350 insertions(+), 9 deletions(-) create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/LocateCommandBuilder.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentLocate.java diff --git a/src/main/java/exopandora/worldhandler/builder/impl/LocateCommandBuilder.java b/src/main/java/exopandora/worldhandler/builder/impl/LocateCommandBuilder.java new file mode 100644 index 0000000..197524d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/LocateCommandBuilder.java @@ -0,0 +1,54 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.CommandNode; +import exopandora.worldhandler.builder.CommandNodeLiteral; +import exopandora.worldhandler.builder.argument.Arguments; +import exopandora.worldhandler.builder.argument.PrimitiveArgument; +import net.minecraft.resources.ResourceLocation; + +public class LocateCommandBuilder extends CommandBuilder +{ + private final PrimitiveArgument biome = Arguments.resourceLocation(); + private final PrimitiveArgument structure = Arguments.resourceLocation(); + private final PrimitiveArgument poi = Arguments.resourceLocation(); + + private final CommandNodeLiteral root = CommandNode.literal("locate") + .then(CommandNode.literal("biome") + .then(CommandNode.argument("biome", this.biome) + .label(Label.BIOME))) + .then(CommandNode.literal("structure") + .then(CommandNode.argument("structure", this.structure) + .label(Label.STRUCTURE))) + .then(CommandNode.literal("poi") + .then(CommandNode.argument("poi", this.poi) + .label(Label.POI))); + + public PrimitiveArgument biome() + { + return this.biome; + } + + public PrimitiveArgument structure() + { + return this.structure; + } + + public PrimitiveArgument poi() + { + return this.poi; + } + + @Override + protected CommandNodeLiteral root() + { + return this.root; + } + + public static enum Label + { + BIOME, + STRUCTURE, + POI; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/category/Category.java b/src/main/java/exopandora/worldhandler/gui/category/Category.java index 2948a70..e4feaa9 100644 --- a/src/main/java/exopandora/worldhandler/gui/category/Category.java +++ b/src/main/java/exopandora/worldhandler/gui/category/Category.java @@ -95,7 +95,7 @@ public class Category RegistryHelper.register(event, REGISTRY_KEY, "entities", () -> new Category("summon", "butcher")); RegistryHelper.register(event, REGISTRY_KEY, "items", () -> new Category("custom_item", "enchantment", "recipes")); RegistryHelper.register(event, REGISTRY_KEY, "blocks", () -> new Category("edit_blocks", "sign_editor", "note_editor")); - RegistryHelper.register(event, REGISTRY_KEY, "world", () -> new Category("world", "gamerules")); + RegistryHelper.register(event, REGISTRY_KEY, "world", () -> new Category("world", "gamerules", "locate")); RegistryHelper.register(event, REGISTRY_KEY, "player", () -> new Category("player", "experience", "advancements")); RegistryHelper.register(event, REGISTRY_KEY, "scoreboard", () -> new Category("scoreboard_objectives", "scoreboard_teams", "scoreboard_players")); diff --git a/src/main/java/exopandora/worldhandler/gui/content/Content.java b/src/main/java/exopandora/worldhandler/gui/content/Content.java index 2281900..8014a9c 100644 --- a/src/main/java/exopandora/worldhandler/gui/content/Content.java +++ b/src/main/java/exopandora/worldhandler/gui/content/Content.java @@ -18,6 +18,7 @@ import exopandora.worldhandler.gui.content.impl.ContentEditBlocks; import exopandora.worldhandler.gui.content.impl.ContentEnchantment; import exopandora.worldhandler.gui.content.impl.ContentExperience; import exopandora.worldhandler.gui.content.impl.ContentGamerules; +import exopandora.worldhandler.gui.content.impl.ContentLocate; import exopandora.worldhandler.gui.content.impl.ContentMain; import exopandora.worldhandler.gui.content.impl.ContentMultiplayer; import exopandora.worldhandler.gui.content.impl.ContentNoteEditor; @@ -86,6 +87,7 @@ public abstract class Content implements IContent //WORLD RegistryHelper.register(event, REGISTRY_KEY, "world", () -> new ContentWorldInfo()); RegistryHelper.register(event, REGISTRY_KEY, "gamerules", () -> new ContentGamerules()); + RegistryHelper.register(event, REGISTRY_KEY, "locate", () -> new ContentLocate()); //PLAYER RegistryHelper.register(event, REGISTRY_KEY, "player", () -> new ContentPlayer()); diff --git a/src/main/java/exopandora/worldhandler/gui/content/Contents.java b/src/main/java/exopandora/worldhandler/gui/content/Contents.java index b4a3c69..a197ab2 100644 --- a/src/main/java/exopandora/worldhandler/gui/content/Contents.java +++ b/src/main/java/exopandora/worldhandler/gui/content/Contents.java @@ -19,6 +19,7 @@ public class Contents public static final Content CUSTOM_ITEM = Contents.getRegisteredContent("custom_item"); public static final Content ENCHANTMENT = Contents.getRegisteredContent("enchantment"); + public static final Content RECIPES = Contents.getRegisteredContent("recipes"); public static final Content EDIT_BLOCKS = Contents.getRegisteredContent("edit_blocks"); public static final Content SIGN_EDITOR = Contents.getRegisteredContent("sign_editor"); @@ -26,7 +27,7 @@ public class Contents public static final Content WORLD_INFO = Contents.getRegisteredContent("world"); public static final Content GAMERULES = Contents.getRegisteredContent("gamerules"); - public static final Content RECIPES = Contents.getRegisteredContent("recipes"); + public static final Content LOCATE = Contents.getRegisteredContent("locate"); public static final Content PLAYER = Contents.getRegisteredContent("player"); public static final Content EXPERIENCE = Contents.getRegisteredContent("experience"); diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentLocate.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentLocate.java new file mode 100644 index 0000000..5e67b30 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentLocate.java @@ -0,0 +1,250 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.ArrayList; +import java.util.List; + +import exopandora.worldhandler.builder.impl.LocateCommandBuilder; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.widget.button.GuiButtonBase; +import exopandora.worldhandler.gui.widget.button.GuiButtonTooltip; +import exopandora.worldhandler.gui.widget.menu.impl.ILogicPageList; +import exopandora.worldhandler.gui.widget.menu.impl.MenuPageList; +import exopandora.worldhandler.util.ActionHandler; +import exopandora.worldhandler.util.ActionHelper; +import exopandora.worldhandler.util.CommandHelper; +import exopandora.worldhandler.util.RegistryHelper; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistries; + +public class ContentLocate extends Content +{ + private final LocateCommandBuilder builderLocate = new LocateCommandBuilder(); + private final CommandPreview previewLocateBiome = new CommandPreview(this.builderLocate, LocateCommandBuilder.Label.BIOME); + private final CommandPreview previewLocateStructure = new CommandPreview(this.builderLocate, LocateCommandBuilder.Label.STRUCTURE); + private final CommandPreview previewLocatePoi = new CommandPreview(this.builderLocate, LocateCommandBuilder.Label.POI); + private Page page = Page.BIOME; + + @Override + public CommandPreview getCommandPreview() + { + if(Page.BIOME.equals(this.page)) + { + return this.previewLocateBiome; + } + else if(Page.STRUCTURE.equals(this.page)) + { + return this.previewLocateStructure; + } + else if(Page.POI.equals(this.page)) + { + return this.previewLocatePoi; + } + + return null; + } + + @Override + public void initGui(Container container, int x, int y) + { + if(Page.BIOME.equals(this.page)) + { + List biomes = new ArrayList(ForgeRegistries.BIOMES.getKeys()); + MenuPageList list = new MenuPageList(x + 118, y, biomes, 114, 20, 3, container, new ILogicPageList() + { + @Override + public MutableComponent translate(ResourceLocation biome) + { + return Component.translatable(biome.toLanguageKey("biome")); + } + + @Override + public MutableComponent toTooltip(ResourceLocation biome) + { + return Component.literal(biome.toString()); + } + + @Override + public void onClick(ResourceLocation biome) + { + ContentLocate.this.builderLocate.biome().set(biome); + container.initButtons(); + } + + @Override + public GuiButtonBase onRegister(int x, int y, int width, int height, MutableComponent text, ResourceLocation biome, ActionHandler actionHandler) + { + return new GuiButtonTooltip(x, y, width, height, text, this.toTooltip(biome), actionHandler); + } + + @Override + public String getId() + { + return "biomes"; + } + }); + container.add(list); + } + else if(Page.STRUCTURE.equals(this.page)) + { + List structures = new ArrayList(RegistryAccess.BUILTIN.get().registry(Registry.STRUCTURE_REGISTRY).get().keySet()); + MenuPageList list = new MenuPageList(x + 118, y, structures, 114, 20, 3, container, new ILogicPageList() + { + @Override + public MutableComponent translate(ResourceLocation structure) + { + return Component.literal(structure.toString()); + } + + @Override + public MutableComponent toTooltip(ResourceLocation structure) + { + return Component.literal(structure.toString()); + } + + @Override + public void onClick(ResourceLocation structure) + { + ContentLocate.this.builderLocate.structure().set(structure); + container.initButtons(); + } + + @Override + public GuiButtonBase onRegister(int x, int y, int width, int height, MutableComponent text, ResourceLocation structure, ActionHandler actionHandler) + { + return new GuiButtonTooltip(x, y, width, height, text, this.toTooltip(structure), actionHandler); + } + + @Override + public String getId() + { + return "structures"; + } + }); + container.add(list); + } + else if(Page.POI.equals(this.page)) + { + List pois = new ArrayList(ForgeRegistries.POI_TYPES.getKeys()); + MenuPageList list = new MenuPageList(x + 118, y, pois, 114, 20, 3, container, new ILogicPageList() + { + @Override + public MutableComponent translate(ResourceLocation poi) + { + String result = RegistryHelper.translate(poi); + + if(result != null) + { + return Component.translatable(result); + } + + return Component.literal(poi.toString()); + } + + @Override + public MutableComponent toTooltip(ResourceLocation poi) + { + return Component.literal(poi.toString()); + } + + @Override + public void onClick(ResourceLocation poi) + { + ContentLocate.this.builderLocate.poi().set(poi); + container.initButtons(); + } + + @Override + public GuiButtonBase onRegister(int x, int y, int width, int height, MutableComponent text, ResourceLocation poi, ActionHandler actionHandler) + { + return new GuiButtonTooltip(x, y, width, height, text, this.toTooltip(poi), actionHandler); + } + + @Override + public String getId() + { + return "pois"; + } + }); + container.add(list); + } + } + + public void initButtons(Container container, int x, int y) + { + GuiButtonBase button1; + GuiButtonBase button2; + GuiButtonBase button3; + + container.add(new GuiButtonBase(x, y + 96, 114, 20, "gui.worldhandler.generic.back", () -> ActionHelper.back(this))); + container.add(new GuiButtonBase(x + 118, y + 96, 114, 20, "gui.worldhandler.generic.backToGame", ActionHelper::backToGame)); + + container.add(button1 = new GuiButtonBase(x, y, 114, 20, "gui.worldhandler.locate.biome", () -> this.changePage(container, Page.BIOME))); + container.add(button2 = new GuiButtonBase(x, y + 24, 114, 20, "gui.worldhandler.locate.structure", () -> this.changePage(container, Page.STRUCTURE))); + container.add(button3 = new GuiButtonBase(x, y + 48, 114, 20, "gui.worldhandler.locate.poi", () -> this.changePage(container, Page.POI))); + container.add(new GuiButtonBase(x, y + 72, 114, 20, "gui.worldhandler.locate.locate", () -> + { + CommandHelper.sendCommand(container.getPlayer(), this.builderLocate, this.page.getLabel()); + })); + + button1.active = !Page.BIOME.equals(this.page); + button2.active = !Page.STRUCTURE.equals(this.page); + button3.active = !Page.POI.equals(this.page); + } + + private void changePage(Container container, Page page) + { + this.page = page; + container.init(); + } + + @Override + public Category getCategory() + { + return Categories.WORLD; + } + + @Override + public MutableComponent getTitle() + { + return Component.translatable("gui.worldhandler.title.world.locate"); + } + + @Override + public MutableComponent getTabTitle() + { + return Component.translatable("gui.worldhandler.tab.world.locate"); + } + + @Override + public Content getActiveContent() + { + return Contents.LOCATE; + } + + private static enum Page + { + BIOME(LocateCommandBuilder.Label.BIOME), + STRUCTURE(LocateCommandBuilder.Label.STRUCTURE), + POI(LocateCommandBuilder.Label.POI); + + private final LocateCommandBuilder.Label label; + + private Page(LocateCommandBuilder.Label label) + { + this.label = label; + } + + public LocateCommandBuilder.Label getLabel() + { + return this.label; + } + } +} diff --git a/src/main/java/exopandora/worldhandler/util/RegistryHelper.java b/src/main/java/exopandora/worldhandler/util/RegistryHelper.java index e30bbea..02a7eb0 100644 --- a/src/main/java/exopandora/worldhandler/util/RegistryHelper.java +++ b/src/main/java/exopandora/worldhandler/util/RegistryHelper.java @@ -9,7 +9,6 @@ import javax.annotation.Nullable; import exopandora.worldhandler.Main; import net.minecraft.core.Registry; -import net.minecraft.locale.Language; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.effect.MobEffect; @@ -30,15 +29,15 @@ public class RegistryHelper registerRegistry(ForgeRegistries.BLOCKS, Block::getDescriptionId); registerRegistry(ForgeRegistries.ITEMS, Item::getDescriptionId); registerRegistry(ForgeRegistries.MOB_EFFECTS, MobEffect::getDescriptionId); - registerRegistry(ForgeRegistries.BIOMES, biome -> - { - ResourceLocation resource = ForgeRegistries.BIOMES.getKey(biome); - String key = "biome." + resource.getNamespace() + "." + resource.getPath(); - return Language.getInstance().has(key) ? key : resource.toString(); - }); + registerRegistry(ForgeRegistries.BIOMES, biome -> ForgeRegistries.BIOMES.getKey(biome).toLanguageKey("biome")); registerRegistry(ForgeRegistries.ENCHANTMENTS, Enchantment::getDescriptionId); registerRegistry(ForgeRegistries.ENTITY_TYPES, EntityType::getDescriptionId); registerRegistry(ForgeRegistries.STAT_TYPES, stat -> "stat." + stat.toString().replace(':', '.')); + registerRegistry(ForgeRegistries.VILLAGER_PROFESSIONS, profession -> + { + ResourceLocation profName = ForgeRegistries.VILLAGER_PROFESSIONS.getKey(profession); + return EntityType.VILLAGER.getDescriptionId() + '.' + (!"minecraft".equals(profName.getNamespace()) ? profName.getNamespace() + '.' : "") + profName.getPath(); + }); } private static void registerRegistry(IForgeRegistry registry, Function mapper) diff --git a/src/main/resources/assets/worldhandler/lang/de_de.json b/src/main/resources/assets/worldhandler/lang/de_de.json index 7258bcc..392f33e 100644 --- a/src/main/resources/assets/worldhandler/lang/de_de.json +++ b/src/main/resources/assets/worldhandler/lang/de_de.json @@ -69,6 +69,7 @@ "gui.worldhandler.tab.world.world": "Welt", "gui.worldhandler.tab.world.gamerules": "Spielregeln", + "gui.worldhandler.tab.world.locate": "Finden", "gui.worldhandler.tab.blocks.edit_blocks": "Blöcke Ändern", "gui.worldhandler.tab.blocks.sign_editor": "Schilder Ändern", @@ -96,6 +97,7 @@ "gui.worldhandler.title.world.world": "Welt", "gui.worldhandler.title.world.gamerules": "Gamerules", + "gui.worldhandler.title.world.locate": "Finden", "gui.worldhandler.title.player.player": "Spieler", "gui.worldhandler.title.player.experience": "Erfahrung", @@ -223,6 +225,11 @@ "gui.worldhandler.world_info.statistics.world_time": "Weltzeit", "gui.worldhandler.world_info.statistics.played": "Played", + "gui.worldhandler.locate.biome": "Biom", + "gui.worldhandler.locate.structure": "Struktur", + "gui.worldhandler.locate.poi": "Interessanter Ort", + "gui.worldhandler.locate.locate": "Finden", + "gui.worldhandler.edit_blocks.coordinates": "Koordinaten", "gui.worldhandler.edit_blocks.fill": "Füllen", "gui.worldhandler.edit_blocks.replace": "Ersetzen", diff --git a/src/main/resources/assets/worldhandler/lang/en_us.json b/src/main/resources/assets/worldhandler/lang/en_us.json index c788da9..1cbef4a 100644 --- a/src/main/resources/assets/worldhandler/lang/en_us.json +++ b/src/main/resources/assets/worldhandler/lang/en_us.json @@ -69,6 +69,7 @@ "gui.worldhandler.tab.world.world": "World", "gui.worldhandler.tab.world.gamerules": "Gamerules", + "gui.worldhandler.tab.world.locate": "Locate", "gui.worldhandler.tab.blocks.edit_blocks": "Edit Blocks", "gui.worldhandler.tab.blocks.sign_editor": "Sign Editor", @@ -96,6 +97,7 @@ "gui.worldhandler.title.world.world": "World", "gui.worldhandler.title.world.gamerules": "Gamerules", + "gui.worldhandler.title.world.locate": "Locate", "gui.worldhandler.title.player.player": "Player", "gui.worldhandler.title.player.experience": "Experience", @@ -223,6 +225,11 @@ "gui.worldhandler.world_info.statistics.world_time": "World Time", "gui.worldhandler.world_info.statistics.played": "Played", + "gui.worldhandler.locate.biome": "Biome", + "gui.worldhandler.locate.structure": "Structure", + "gui.worldhandler.locate.poi": "Point Of Interest", + "gui.worldhandler.locate.locate": "Locate", + "gui.worldhandler.edit_blocks.coordinates": "Coordinates", "gui.worldhandler.edit_blocks.fill": "Fill", "gui.worldhandler.edit_blocks.replace": "Replace", diff --git a/src/main/resources/assets/worldhandler/lang/fr_fr.json b/src/main/resources/assets/worldhandler/lang/fr_fr.json index a75561a..c9b6057 100644 --- a/src/main/resources/assets/worldhandler/lang/fr_fr.json +++ b/src/main/resources/assets/worldhandler/lang/fr_fr.json @@ -69,6 +69,7 @@ "gui.worldhandler.tab.world.world": "Monde", "gui.worldhandler.tab.world.gamerules": "Règles de jeu", + "gui.worldhandler.tab.world.locate": "Locate", "gui.worldhandler.tab.blocks.edit_blocks": "Blocs", "gui.worldhandler.tab.blocks.sign_editor": "Pancarte", @@ -96,6 +97,7 @@ "gui.worldhandler.title.world.world": "Monde", "gui.worldhandler.title.world.gamerules": "Règles de jeu", + "gui.worldhandler.title.world.locate": "Locate", "gui.worldhandler.title.player.player": "Joueur", "gui.worldhandler.title.player.experience": "Expérience ", @@ -224,6 +226,11 @@ "gui.worldhandler.world_info.statistics.world_time": "Heure monde ", "gui.worldhandler.world_info.statistics.played": "Ouvert ", + "gui.worldhandler.locate.biome": "Biome", + "gui.worldhandler.locate.structure": "Structure", + "gui.worldhandler.locate.poi": "Point Of Interest", + "gui.worldhandler.locate.locate": "Locate", + "gui.worldhandler.edit_blocks.coordinates": "Coordonnées", "gui.worldhandler.edit_blocks.fill": "Remplir", "gui.worldhandler.edit_blocks.replace": "Remplacer", diff --git a/src/main/resources/assets/worldhandler/lang/ru_ru.json b/src/main/resources/assets/worldhandler/lang/ru_ru.json index dafd21d..64445ab 100644 --- a/src/main/resources/assets/worldhandler/lang/ru_ru.json +++ b/src/main/resources/assets/worldhandler/lang/ru_ru.json @@ -69,6 +69,7 @@ "gui.worldhandler.tab.world.world": "Мир", "gui.worldhandler.tab.world.gamerules": "Правила игры", + "gui.worldhandler.tab.world.locate": "Locate", "gui.worldhandler.tab.blocks.edit_blocks": "Редактировать блоки", "gui.worldhandler.tab.blocks.sign_editor": "Редактор знака", @@ -96,6 +97,7 @@ "gui.worldhandler.title.world.world": "Мир", "gui.worldhandler.title.world.gamerules": "Правила игры", + "gui.worldhandler.title.world.locate": "Locate", "gui.worldhandler.title.player.player": "Игрок", "gui.worldhandler.title.player.experience": "Опыт", @@ -223,6 +225,11 @@ "gui.worldhandler.world_info.statistics.world_time": "Время мира", "gui.worldhandler.world_info.statistics.played": "Сыгранно", + "gui.worldhandler.locate.biome": "Biome", + "gui.worldhandler.locate.structure": "Structure", + "gui.worldhandler.locate.poi": "Point Of Interest", + "gui.worldhandler.locate.locate": "Locate", + "gui.worldhandler.edit_blocks.coordinates": "Координаты", "gui.worldhandler.edit_blocks.fill": "Заполнить", "gui.worldhandler.edit_blocks.replace": "Заменить", diff --git a/src/main/resources/assets/worldhandler/lang/zh_cn.json b/src/main/resources/assets/worldhandler/lang/zh_cn.json index 92c5d80..a5221c6 100644 --- a/src/main/resources/assets/worldhandler/lang/zh_cn.json +++ b/src/main/resources/assets/worldhandler/lang/zh_cn.json @@ -70,6 +70,7 @@ "gui.worldhandler.tab.world.world": "世界", "gui.worldhandler.tab.world.gamerules": "游戏规则", + "gui.worldhandler.tab.world.locate": "Locate", "gui.worldhandler.tab.blocks.edit_blocks": "编辑方块", "gui.worldhandler.tab.blocks.sign_editor": "告示牌编辑器", @@ -97,6 +98,7 @@ "gui.worldhandler.title.world.world": "世界", "gui.worldhandler.title.world.gamerules": "游戏规则", + "gui.worldhandler.title.world.locate": "Locate", "gui.worldhandler.title.player.player": "玩家", "gui.worldhandler.title.player.experience": "经验等级", @@ -224,6 +226,11 @@ "gui.worldhandler.world_info.statistics.world_time": "世界时间", "gui.worldhandler.world_info.statistics.played": "已游玩", + "gui.worldhandler.locate.biome": "Biome", + "gui.worldhandler.locate.structure": "Structure", + "gui.worldhandler.locate.poi": "Point Of Interest", + "gui.worldhandler.locate.locate": "Locate", + "gui.worldhandler.edit_blocks.coordinates": "坐标", "gui.worldhandler.edit_blocks.fill": "填充", "gui.worldhandler.edit_blocks.replace": "替换",