From 1bf5f7408bf152817e24644710ccc21207656fb0 Mon Sep 17 00:00:00 2001 From: EnZaXD Date: Tue, 28 May 2024 10:52:08 +0200 Subject: [PATCH] Add missing translation mappings and component rewriter (#761) --- .../v1_10to1_9_3/Protocol1_10To1_9_3.java | 5 + .../v1_11to1_10/Protocol1_11To1_10.java | 11 + .../rewriter/BlockItemPacketRewriter1_11.java | 2 + .../v1_12to1_11_1/Protocol1_12To1_11_1.java | 7 +- .../data/AdvancementTranslations1_11_1.java | 154 ----- .../rewriter/ComponentRewriter1_12.java | 54 +- .../rewriter/EntityPacketRewriter1_12.java | 2 +- .../v1_9_1to1_9/Protocol1_9_1To1_9.java | 9 +- .../v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java | 8 +- .../data/translation-mappings.json | 643 ++++++++++++++++-- 10 files changed, 634 insertions(+), 261 deletions(-) delete mode 100644 common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/data/AdvancementTranslations1_11_1.java diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java index 539b92f5..d5eae4bc 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/Protocol1_10To1_9_3.java @@ -21,6 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_10to1_9_3; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.data.BackwardsMappingData; import com.viaversion.viabackwards.api.rewriters.SoundRewriter; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.BlockItemPacketRewriter1_10; import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.EntityPacketRewriter1_10; import com.viaversion.viaversion.api.connection.UserConnection; @@ -33,6 +34,7 @@ import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3; +import com.viaversion.viaversion.rewriter.ComponentRewriter; public class Protocol1_10To1_9_3 extends BackwardsProtocol { @@ -89,6 +91,9 @@ public class Protocol1_10To1_9_3 extends BackwardsProtocol componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON); + componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT); } @Override diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/Protocol1_11To1_10.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/Protocol1_11To1_10.java index 4f42bc2a..6e4b2ede 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/Protocol1_11To1_10.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/Protocol1_11To1_10.java @@ -21,6 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_11to1_10; import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.data.BackwardsMappingData; import com.viaversion.viabackwards.api.rewriters.SoundRewriter; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.BlockItemPacketRewriter1_11; import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.EntityPacketRewriter1_11; import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.PlayerPacketRewriter1_11; @@ -29,14 +30,17 @@ import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.ClientWorld; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_11; import com.viaversion.viaversion.data.entity.EntityTrackerBase; +import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3; +import com.viaversion.viaversion.rewriter.ComponentRewriter; public class Protocol1_11To1_10 extends BackwardsProtocol { public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.11", "1.10"); private final EntityPacketRewriter1_11 entityRewriter = new EntityPacketRewriter1_11(this); private final BlockItemPacketRewriter1_11 itemRewriter = new BlockItemPacketRewriter1_11(this); + private TranslatableRewriter componentRewriter; public Protocol1_11To1_10() { super(ClientboundPackets1_9_3.class, ClientboundPackets1_9_3.class, ServerboundPackets1_9_3.class, ServerboundPackets1_9_3.class); @@ -51,6 +55,9 @@ public class Protocol1_11To1_10 extends BackwardsProtocol soundRewriter = new SoundRewriter<>(this); soundRewriter.registerNamedSound(ClientboundPackets1_9_3.CUSTOM_SOUND); soundRewriter.registerSound(ClientboundPackets1_9_3.SOUND); + + componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON); + componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT); } @Override @@ -81,6 +88,10 @@ public class Protocol1_11To1_10 extends BackwardsProtocol getComponentRewriter() { + return componentRewriter; + } + @Override public boolean hasMappingDataToLoad() { return true; diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java index 2935a55a..bff59cef 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java @@ -229,6 +229,8 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter { int action = wrapper.passthrough(Types.VAR_INT); @@ -94,6 +95,10 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol. - */ - -package com.viaversion.viabackwards.protocol.v1_12to1_11_1.data; - -import java.util.HashMap; -import java.util.Map; - -public class AdvancementTranslations1_11_1 { - private static final Map advancements = new HashMap<>(); - - static { - add("advancements.nether.get_wither_skull.title", "Spooky Scary Skeleton"); - add("advancements.husbandry.break_diamond_hoe.description", "Completely use up a diamond hoe, and then reevaluate your life choices"); - add("advancements.nether.fast_travel.description", "Use the Nether to travel 7km in the Overworld"); - add("advancements.story.enter_the_end.description", "Enter the End Portal"); - add("advancements.story.follow_ender_eye.title", "Eye Spy"); - add("advancements.toast.task", "Advancement Made!"); - add("advancements.nether.find_fortress.description", "Break your way into a Nether Fortress"); - add("advancements.story.form_obsidian.description", "Form and mine a block of Obsidian"); - add("advancements.adventure.sniper_duel.description", "Kill a skeleton with an arrow from more than 50 meters"); - add("advancements.end.root.description", "Or the beginning?"); - add("advancements.adventure.kill_a_mob.title", "Monster Hunter"); - add("advancements.end.elytra.description", "Find an Elytra"); - add("advancements.end.dragon_breath.description", "Collect dragon's breath in a glass bottle"); - add("advancements.story.enter_the_nether.title", "We Need to Go Deeper"); - add("advancements.story.upgrade_tools.title", "Getting an Upgrade"); - add("advancements.story.lava_bucket.title", "Hot Stuff"); - add("advancements.story.shiny_gear.title", "Cover Me With Diamonds"); - add("advancements.story.smelt_iron.description", "Smelt an iron ingot"); - add("chat.type.advancement.goal", "%s has reached the goal %s"); - add("advancements.husbandry.break_diamond_hoe.title", "Serious Dedication"); - add("advancements.story.iron_tools.description", "Upgrade your pickaxe"); - add("advancements.end.respawn_dragon.title", "The End... Again..."); - add("advancements.husbandry.tame_an_animal.description", "Tame an animal"); - add("advancements.end.levitate.description", "Levitate up 50 blocks from the attacks of a Shulker"); - add("advancements.adventure.shoot_arrow.description", "Shoot something with a bow and arrow"); - add("advancements.nether.root.description", "Bring summer clothes"); - add("advancements.story.enchant_item.description", "Enchant an item at an Enchanting Table"); - add("advancements.adventure.root.title", "Adventure"); - add("advancements.adventure.trade.title", "What a Deal!"); - add("advancements.husbandry.breed_all_animals.title", "Two by Two"); - add("advancements.nether.find_fortress.title", "A Terrible Fortress"); - add("advancements.nether.create_full_beacon.title", "Beaconator"); - add("advancements.story.cure_zombie_villager.description", "Weaken and then cure a zombie villager"); - add("advancements.toast.challenge", "Challenge Complete!"); - add("advancements.nether.create_full_beacon.description", "Bring a beacon to full power"); - add("advancements.story.follow_ender_eye.description", "Follow an Ender Eye"); - add("advancements.end.find_end_city.title", "The City at the End of the Game"); - add("chat.type.advancement.challenge", "%s has completed the challenge %s"); - add("advancements.story.deflect_arrow.title", "Not Today, Thank You"); - add("advancements.adventure.kill_all_mobs.description", "Kill one of every hostile monster"); - add("advancements.story.smelt_iron.title", "Acquire Hardware"); - add("advancements.end.levitate.title", "Great View From Up Here"); - add("advancements.end.kill_dragon.title", "Free the End"); - add("advancements.end.kill_dragon.description", "Good luck"); - add("advancements.nether.brew_potion.title", "Local Brewery"); - add("advancements.story.enchant_item.title", "Enchanter"); - add("advancements.end.respawn_dragon.description", "Respawn the ender dragon"); - add("advancements.nether.uneasy_alliance.title", "Uneasy Alliance"); - add("advancements.nether.root.title", "Nether"); - add("advancements.nether.brew_potion.description", "Brew a potion"); - add("advancements.nether.obtain_blaze_rod.title", "Into Fire"); - add("advancements.nether.summon_wither.title", "Withering Heights"); - add("advancements.story.root.title", "Minecraft"); - add("advancements.husbandry.balanced_diet.description", "Eat everything that is edible, even if it's not good for you"); - add("advancements.nether.uneasy_alliance.description", "Rescue a Ghast from the Nether, bring it safely home to the Overworld... and then kill it."); - add("advancements.husbandry.breed_all_animals.description", "Breed all the animals!"); - add("advancements.adventure.kill_all_mobs.title", "Monsters Hunted"); - add("advancements.story.cure_zombie_villager.title", "Zombie Doctor"); - add("advancements.husbandry.plant_seed.title", "A Seedy Place"); - add("advancements.end.dragon_breath.title", "You Need a Mint"); - add("advancements.story.mine_stone.title", "Stone Age"); - add("advancements.end.find_end_city.description", "Go on in, what could happen?"); - add("advancements.nether.create_beacon.description", "Construct and place a Beacon"); - add("advancements.adventure.summon_iron_golem.title", "Hired Help"); - add("advancements.end.elytra.title", "Sky's the Limit"); - add("chat.type.advancement.task", "%s has made the advancement %s"); - add("advancements.story.deflect_arrow.description", "Deflect an arrow with a shield"); - add("advancements.nether.all_effects.description", "Have every effect applied at the same time"); - add("advancements.story.enter_the_nether.description", "Build, light and enter a Nether Portal"); - add("advancements.story.mine_diamond.title", "Diamonds!"); - add("advancements.husbandry.balanced_diet.title", "A Balanced Diet"); - add("advancements.husbandry.root.title", "Husbandry"); - add("advancements.story.root.description", "The heart and story of the game"); - add("advancements.story.upgrade_tools.description", "Construct a better pickaxe"); - add("advancements.nether.all_effects.title", "How Did We Get Here?"); - add("advancements.end.enter_end_gateway.title", "Remote Getaway"); - add("advancements.story.mine_stone.description", "Mine stone with your new pickaxe"); - add("advancements.husbandry.root.description", "The world is full of friends and food"); - add("advancements.end.dragon_egg.title", "The Next Generation"); - add("advancements.toast.goal", "Goal Reached!"); - add("advancements.empty", "There doesn't seem to be anything here..."); - add("advancements.husbandry.tame_an_animal.title", "Best Friends Forever"); - add("advancements.end.root.title", "The End"); - add("advancements.husbandry.breed_an_animal.title", "The Parrots and the Bats"); - add("advancements.story.mine_diamond.description", "Acquire diamonds"); - add("advancements.adventure.sleep_in_bed.title", "Sweet dreams"); - add("advancements.nether.return_to_sender.title", "Return to Sender"); - add("advancements.story.obtain_armor.title", "Suit Up"); - add("advancements.adventure.kill_a_mob.description", "Kill any hostile monster"); - add("advancements.nether.all_potions.description", "Have every potion effect applied at the same time"); - add("advancements.story.iron_tools.title", "Isn't It Iron Pick"); - add("advancements.adventure.sleep_in_bed.description", "Change your respawn point"); - add("advancements.husbandry.plant_seed.description", "Plant a seed and watch it grow"); - add("advancements.husbandry.breed_an_animal.description", "Breed two animals together"); - add("advancements.adventure.shoot_arrow.title", "Take Aim"); - add("advancements.adventure.adventuring_time.description", "Discover every biome"); - add("advancements.adventure.adventuring_time.title", "Adventuring Time"); - add("advancements.nether.get_wither_skull.description", "Obtain a wither skeleton's skull"); - add("advancements.adventure.summon_iron_golem.description", "Summon an Iron Golem to help defend a village"); - add("advancements.nether.return_to_sender.description", "Destroy a Ghast with a fireball"); - add("advancements.adventure.trade.description", "Successfully trade with a Villager"); - add("advancements.story.obtain_armor.description", "Protect yourself with a piece of iron armor"); - add("advancements.adventure.root.description", "Adventure, exploration and combat"); - add("advancements.nether.create_beacon.title", "Bring Home the Beacon"); - add("advancements.end.dragon_egg.description", "Hold the Dragon Egg"); - add("advancements.nether.obtain_blaze_rod.description", "Relieve a Blaze of its rod"); - add("advancements.story.lava_bucket.description", "Fill a bucket with lava"); - add("advancements.story.form_obsidian.title", "Ice Bucket Challenge"); - add("advancements.story.enter_the_end.title", "The End?"); - add("advancements.nether.fast_travel.title", "Subspace Bubble"); - add("advancements.end.enter_end_gateway.description", "Escape the island"); - add("advancements.adventure.totem_of_undying.title", "Postmortal"); - add("advancements.nether.all_potions.title", "A Furious Cocktail"); - add("advancements.adventure.sniper_duel.title", "Sniper duel"); - add("advancements.nether.summon_wither.description", "Summon the Wither"); - add("advancements.adventure.totem_of_undying.description", "Use a Totem of Undying to cheat death"); - add("advancements.story.shiny_gear.description", "Diamond armor saves lives"); - } - - private static void add(String key, String value) { - advancements.put(key, value); - } - - public static String get(String key) { - return advancements.get(key); - } -} diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/ComponentRewriter1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/ComponentRewriter1_12.java index ecd906d3..3aafbc10 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/ComponentRewriter1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/ComponentRewriter1_12.java @@ -18,54 +18,34 @@ package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.v1_12to1_11_1.Protocol1_12To1_11_1; -import com.viaversion.viabackwards.protocol.v1_12to1_11_1.data.AdvancementTranslations1_11_1; import com.viaversion.viaversion.api.connection.UserConnection; -import com.viaversion.viaversion.api.rewriter.RewriterBase; -import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.libs.gson.JsonElement; import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12; import com.viaversion.viaversion.rewriter.ComponentRewriter; -public class ComponentRewriter1_12 extends RewriterBase { - - public static final ComponentRewriter COMPONENT_REWRITER = new ComponentRewriter<>(null, ComponentRewriter.ReadType.JSON) { - @Override - public void processText(UserConnection connection, JsonElement element) { - super.processText(connection, element); - if (element == null || !element.isJsonObject()) { - return; - } - - JsonObject object = element.getAsJsonObject(); - JsonElement keybind = object.remove("keybind"); - if (keybind == null) { - return; - } - - //TODO Add nicer text for the key, also use this component rewriter in more packets - object.addProperty("text", keybind.getAsString()); - } - - @Override - protected void handleTranslate(JsonObject object, String translate) { - String text = AdvancementTranslations1_11_1.get(translate); - if (text != null) { - object.addProperty("translate", text); - } - } - }; +public class ComponentRewriter1_12 extends TranslatableRewriter { public ComponentRewriter1_12(Protocol1_12To1_11_1 protocol) { - super(protocol); + super(protocol, ComponentRewriter.ReadType.JSON); } @Override - protected void registerPackets() { - protocol.registerClientbound(ClientboundPackets1_12.CHAT, wrapper -> { - JsonElement element = wrapper.passthrough(Types.COMPONENT); - COMPONENT_REWRITER.processText(wrapper.user(), element); - }); + public void processText(UserConnection connection, JsonElement element) { + super.processText(connection, element); + if (element == null || !element.isJsonObject()) { + return; + } + + JsonObject object = element.getAsJsonObject(); + JsonElement keybind = object.remove("keybind"); + if (keybind == null) { + return; + } + + //TODO Add nicer text for the key, also use this component rewriter in more packets + object.addProperty("text", keybind.getAsString()); } } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java index 493b5e46..561542af 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/EntityPacketRewriter1_12.java @@ -191,7 +191,7 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter { if (meta.dataType() == EntityDataTypes1_12.COMPONENT) { - ComponentRewriter1_12.COMPONENT_REWRITER.processText(event.user(), (JsonElement) meta.getValue()); + protocol.getComponentRewriter().processText(event.user(), (JsonElement) meta.getValue()); } }); diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_1to1_9/Protocol1_9_1To1_9.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_1to1_9/Protocol1_9_1To1_9.java index ad577523..c258962f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_1to1_9/Protocol1_9_1To1_9.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_1to1_9/Protocol1_9_1To1_9.java @@ -17,14 +17,18 @@ */ package com.viaversion.viabackwards.protocol.v1_9_1to1_9; +import com.viaversion.viabackwards.api.BackwardsProtocol; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viaversion.api.protocol.AbstractProtocol; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ClientboundPackets1_9; import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ServerboundPackets1_9; +import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; +import com.viaversion.viaversion.rewriter.ComponentRewriter; -public class Protocol1_9_1To1_9 extends AbstractProtocol { +public class Protocol1_9_1To1_9 extends BackwardsProtocol { public Protocol1_9_1To1_9() { super(ClientboundPackets1_9.class, ClientboundPackets1_9.class, ServerboundPackets1_9.class, ServerboundPackets1_9.class); @@ -61,5 +65,8 @@ public class Protocol1_9_1To1_9 extends AbstractProtocol componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON); + componentRewriter.registerComponentPacket(ClientboundPackets1_9.CHAT); } } \ No newline at end of file diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java index 195d36a7..2750a336 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_9_3to1_9_1/Protocol1_9_3To1_9_1.java @@ -17,6 +17,8 @@ */ package com.viaversion.viabackwards.protocol.v1_9_3to1_9_1; +import com.viaversion.viabackwards.api.BackwardsProtocol; +import com.viaversion.viabackwards.api.rewriters.TranslatableRewriter; import com.viaversion.viabackwards.protocol.v1_9_3to1_9_1.data.BlockEntity1_9_1; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.ClientWorld; @@ -33,8 +35,9 @@ import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ClientboundPackets1_ import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ServerboundPackets1_9; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_9_3; +import com.viaversion.viaversion.rewriter.ComponentRewriter; -public class Protocol1_9_3To1_9_1 extends AbstractProtocol { +public class Protocol1_9_3To1_9_1 extends BackwardsProtocol { public Protocol1_9_3To1_9_1() { super(ClientboundPackets1_9_3.class, ClientboundPackets1_9.class, ServerboundPackets1_9_3.class, ServerboundPackets1_9.class); @@ -108,6 +111,9 @@ public class Protocol1_9_3To1_9_1 extends AbstractProtocol componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON); + componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT); } @Override diff --git a/common/src/main/resources/assets/viabackwards/data/translation-mappings.json b/common/src/main/resources/assets/viabackwards/data/translation-mappings.json index 66730e9f..137bb38b 100644 --- a/common/src/main/resources/assets/viabackwards/data/translation-mappings.json +++ b/common/src/main/resources/assets/viabackwards/data/translation-mappings.json @@ -2909,7 +2909,6 @@ "selectWorld.edit.backupCreated": "Backed up: %s", "selectWorld.edit.backupSize": "size: %s MB", "selectWorld.edit.optimize": "Optimize World", - "selectWorld.deleteButton": "Delete", "selectWorld.backupQuestion": "Do you really want to load this world?", "selectWorld.backupWarning": "This world was last played in version %s; you are on snapshot %s. Please make a backup in case you experience world corruptions!", "selectWorld.backupQuestion.customized": "Customized worlds are no longer supported", @@ -2928,16 +2927,7 @@ "createWorld.customize.buffet.generator": "Please select a generator type", "createWorld.customize.buffet.biome": "Please select a biome", "createWorld.customize.custom.useOceanRuins": "Ocean Ruins", - "createWorld.customize.custom.presets": "Presets", - "createWorld.customize.custom.preset.waterWorld": "Water World", - "spectatorMenu.previous_page": "Previous Page", - "spectatorMenu.next_page": "Next Page", "generator.buffet": "Buffet", - "selectServer.empty": "empty", - "selectServer.edit": "Edit", - "selectServer.delete": "Delete", - "selectServer.deleteButton": "Delete", - "addServer.add": "Done", "multiplayer.message_not_delivered": "Can't deliver chat message, check server logs", "multiplayer.status.finished": "Finished", "multiplayer.status.request_handled": "Status requst has been handled", @@ -2955,24 +2945,10 @@ "connect.negotiating": "Negotiating...", "connect.encrypting": "Encrypting...", "connect.joining": "Joining world...", - "disconnect.genericReason": "%s", - "disconnect.quitting": "Quitting", - "options.music": "Music", - "options.fov.min": "Normal", "options.biomeBlendRadius": "Biome Blend", - "options.ao.off": "OFF", - "options.difficulty.normal": "Normal", - "options.difficulty.hardcore": "Hardcore", - "options.clouds.fancy": "Fancy", - "options.clouds.fast": "Fast", - "options.particles.all": "All", - "options.chat.visibility.full": "Shown", - "options.chat.visibility.hidden": "Hidden", "options.autoSuggestCommands": "Command Suggestions", "options.fullscreen.resolution": "Fullscreen Resolution", "options.fullscreen.current": "Current", - "key.categories.multiplayer": "Multiplayer", - "key.categories.creative": "Creative Mode", "key.keyboard.unknown": "Not bound", "key.keyboard.apostrophe": "'", "key.keyboard.backslash": "\\", @@ -3353,17 +3329,7 @@ "item.minecraft.phantom_membrane": "Phantom Membrane", "item.minecraft.nautilus_shell": "Nautilus Shell", "item.minecraft.heart_of_the_sea": "Heart of the Sea", - "container.inventory": "Inventory", - "container.dispenser": "Dispenser", - "container.dropper": "Dropper", - "container.furnace": "Furnace", - "container.brewing": "Brewing Stand", - "container.chest": "Chest", - "container.enderchest": "Ender Chest", - "container.beacon": "Beacon", - "container.shulkerBox": "Shulker Box", "structure_block.invalid_structure_name": "Invalid structure name '%s'", - "structure_block.mode.save": "Save", "filled_map.buried_treasure": "Buried Treasure Map", "filled_map.id": "Id #%s", "entity.minecraft.area_effect_cloud": "Area Effect Cloud", @@ -3416,8 +3382,6 @@ "death.attack.wither.player": "%1$s withered away whilst fighting %2$s", "death.attack.anvil.player": "%1$s was squashed by a falling anvil whilst fighting %2$s", "death.attack.fallingBlock.player": "%1$s was squashed by a falling block whilst fighting %2$s", - "death.attack.player": "%1$s was slain by %2$s", - "death.attack.player.item": "%1$s was slain by %2$s using %3$s", "death.attack.thorns.item": "%1$s was killed by %3$s trying to hurt %2$s", "death.attack.trident": "%1$s was impaled by %2$s", "death.attack.trident.item": "%1$s was impaled by %2$s with %3$s", @@ -3444,31 +3408,15 @@ "item.minecraft.splash_potion.effect.slow_falling": "Splash Potion of Slow Falling", "item.minecraft.lingering_potion.effect.turtle_master": "Lingering Potion of the Turtle Master", "item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling", - "potion.potency.0": "", "enchantment.minecraft.loyalty": "Loyalty", "enchantment.minecraft.impaling": "Impaling", "enchantment.minecraft.riptide": "Riptide", "enchantment.minecraft.channeling": "Channeling", - "enchantment.level.2": "II", - "enchantment.level.3": "III", - "enchantment.level.4": "IV", - "enchantment.level.5": "V", - "enchantment.level.6": "VI", - "gui.advancements": "Advancements", - "stat.blocksButton": "Blocks", "stat_type.minecraft.broken": "Times Broken", "stat.minecraft.walk_under_water_one_cm": "Distance Walked under Water", "stat.minecraft.play_record": "Music Discs Played", "stat.minecraft.walk_on_water_one_cm": "Distance Walked on Water", "stat.minecraft.time_since_rest": "Since Last Rest", - "itemGroup.redstone": "Redstone", - "itemGroup.misc": "Miscellaneous", - "attribute.modifier.plus.2": "+%s%% %s", - "attribute.modifier.take.2": "-%s%% %s", - "attribute.modifier.equals.0": "%s %s", - "attribute.modifier.equals.2": "%s%% %s", - "attribute.name.generic.movementSpeed": "Speed", - "attribute.name.generic.luck": "Luck", "subtitles.block.bubble_column.bubble_pop": "Bubbles pop", "subtitles.block.bubble_column.upwards_ambient": "Bubbles flow", "subtitles.block.bubble_column.upwards_inside": "Bubbles woosh", @@ -3478,14 +3426,6 @@ "subtitles.entity.parrot.imitate.drowned": "Parrot gurgles", "subtitles.entity.parrot.imitate.illusioner": "Parrot murmurs", "subtitles.entity.parrot.imitate.phantom": "Parrot screeches", - "subtitles.entity.parrot.imitate.polar_bear": "Parrot groans", - "subtitles.entity.parrot.imitate.silverfish": "Parrot hisses", - "subtitles.entity.parrot.imitate.slime": "Parrot squishes", - "subtitles.entity.parrot.imitate.spider": "Parrot hisses", - "subtitles.entity.parrot.imitate.stray": "Parrot rattles", - "subtitles.entity.parrot.imitate.wither_skeleton": "Parrot rattles", - "subtitles.entity.parrot.imitate.zombie": "Parrot groans", - "subtitles.entity.parrot.imitate.zombie_villager": "Parrot groans", "subtitles.entity.cod.death": "Cod dies", "subtitles.entity.cod.flop": "Cod flops", "subtitles.entity.cod.hurt": "Cod hurts", @@ -3505,8 +3445,6 @@ "subtitles.entity.drowned.shoot": "Drowned throws Trident", "subtitles.entity.drowned.step": "Drowned steps", "subtitles.entity.drowned.swim": "Drowned swims", - "subtitles.entity.generic.big_fall": "Something fell", - "subtitles.entity.horse.angry": "Horse neighs", "subtitles.entity.husk.converted_to_zombie": "Husk converted to Zombie", "subtitles.entity.phantom.ambient": "Phantom screeches", "subtitles.entity.phantom.bite": "Phantom bites", @@ -3514,7 +3452,6 @@ "subtitles.entity.phantom.flap": "Phantom flaps", "subtitles.entity.phantom.hurt": "Phantom hurts", "subtitles.entity.phantom.swoop": "Phantom swoops", - "subtitles.entity.pig.saddle": "Saddle equips", "subtitles.entity.puffer_fish.blow_out": "Pufferfish deflates", "subtitles.entity.puffer_fish.blow_up": "Pufferfish inflates", "subtitles.entity.puffer_fish.death": "Pufferfish dies", @@ -3524,8 +3461,6 @@ "subtitles.entity.salmon.death": "Salmon dies", "subtitles.entity.salmon.flop": "Salmon flops", "subtitles.entity.salmon.hurt": "Salmon hurts", - "subtitles.entity.shulker.close": "Shulker closes", - "subtitles.entity.shulker.open": "Shulker opens", "subtitles.entity.skeleton_horse.swim": "Skeleton Horse swims", "subtitles.entity.squid.squirt": "Squid shoots ink", "subtitles.entity.turtle.ambient_land": "Turtle chirps", @@ -3570,7 +3505,6 @@ "debug.crash.warning": "Crashing in %s...", "advancements.adventure.very_very_frightening.title": "Very Very Frightening", "advancements.adventure.very_very_frightening.description": "Strike a Villager with lightning", - "advancements.adventure.root.title": "Adventure", "advancements.adventure.throw_trident.title": "A Throwaway Joke", "advancements.adventure.throw_trident.description": "Throw a trident at something.\nNote: Throwing away your only weapon is not a good idea.", "advancements.husbandry.fishy_business.title": "Fishy Business", @@ -4069,5 +4003,582 @@ "generator.minecraft.floating_islands": "Floating Islands", "realms.missing.module.error.text": "Realms could not be opened right now, please try again later", "realms.missing.snapshot.error.text": "Realms is currently not supported in snapshots" + }, + "1.12": { + "gui.recipebook.moreRecipes": "Right Click for more", + "gui.recipebook.toggleRecipes.all": "Showing all", + "gui.recipebook.toggleRecipes.craftable": "Showing craftable", + "multiplayer.status.and_more": "... and %s more ...", + "multiplayer.status.cancelled": "Cancelled", + "multiplayer.status.cannot_connect": "Can't connect to server", + "multiplayer.status.cannot_resolve": "Can't resolve hostname", + "multiplayer.status.client_out_of_date": "Client out of date!", + "multiplayer.status.no_connection": "(no connection)", + "multiplayer.status.old": "Old", + "multiplayer.status.pinging": "Pinging...", + "multiplayer.status.server_out_of_date": "Server out of date!", + "multiplayer.status.unknown": "???", + "multiplayer.status.unrequested": "Received unrequested status", + "multiplayer.disconnect.authservers_down": "Authentication servers are down. Please try again later, sorry!", + "multiplayer.disconnect.banned": "You are banned from this server.", + "multiplayer.disconnect.duplicate_login": "You logged in from another location", + "multiplayer.disconnect.flying": "Flying is not enabled on this server", + "multiplayer.disconnect.generic": "Disconnected", + "multiplayer.disconnect.idling": "You have been idle for too long!", + "multiplayer.disconnect.illegal_characters": "Illegal characters in chat", + "multiplayer.disconnect.invalid_entity_attacked": "Attempting to attack an invalid entity", + "multiplayer.disconnect.invalid_player_movement": "Invalid move player packet received", + "multiplayer.disconnect.invalid_vehicle_movement": "Invalid move vehicle packet received", + "multiplayer.disconnect.ip_banned": "You have been IP banned.", + "multiplayer.disconnect.kicked": "Kicked by an operator.", + "multiplayer.disconnect.outdated_client": "Outdated client! Please use %s", + "multiplayer.disconnect.outdated_server": "Outdated server! I'm still on %s", + "multiplayer.disconnect.server_shutdown": "Server closed", + "multiplayer.disconnect.slow_login": "Took too long to log in", + "multiplayer.disconnect.unverified_username": "Failed to verify username!", + "chat.type.text.narrate": "%s says %s", + "chat.type.advancement.task": "%s has made the advancement %s", + "chat.type.advancement.challenge": "%s has completed the challenge %s", + "chat.type.advancement.goal": "%s has reached the goal %s", + "options.clouds.fancy": "Fancy", + "options.clouds.fast": "Fast", + "options.narrator": "Narrator", + "options.narrator.off": "Off", + "options.narrator.all": "Narrates all", + "options.narrator.chat": "Narrates chat", + "options.narrator.system": "Narrates system", + "options.narrator.notavailable": "Not available", + "narrator.toast.disabled": "Narrator Disabled", + "narrator.toast.enabled": "Narrator Enabled", + "key.mouse.left": "Left Click", + "key.mouse.middle": "Middle Click", + "key.mouse.right": "Right Click", + "key.saveToolbarActivator": "Save Toolbar Activator", + "key.loadToolbarActivator": "Load Toolbar Activator", + "key.advancements": "Advancements", + "key.categories.creative": "Creative Mode", + "tile.glazedTerracottaWhite.name": "White Glazed Terracotta", + "tile.glazedTerracottaOrange.name": "Orange Glazed Terracotta", + "tile.glazedTerracottaMagenta.name": "Magenta Glazed Terracotta", + "tile.glazedTerracottaLightBlue.name": "Light Blue Glazed Terracotta", + "tile.glazedTerracottaYellow.name": "Yellow Glazed Terracotta", + "tile.glazedTerracottaLime.name": "Lime Glazed Terracotta", + "tile.glazedTerracottaPink.name": "Pink Glazed Terracotta", + "tile.glazedTerracottaGray.name": "Gray Glazed Terracotta", + "tile.glazedTerracottaSilver.name": "Light Gray Glazed Terracotta", + "tile.glazedTerracottaCyan.name": "Cyan Glazed Terracotta", + "tile.glazedTerracottaPurple.name": "Purple Glazed Terracotta", + "tile.glazedTerracottaBlue.name": "Blue Glazed Terracotta", + "tile.glazedTerracottaBrown.name": "Brown Glazed Terracotta", + "tile.glazedTerracottaGreen.name": "Green Glazed Terracotta", + "tile.glazedTerracottaRed.name": "Red Glazed Terracotta", + "tile.glazedTerracottaBlack.name": "Black Glazed Terracotta", + "tile.concrete.black.name": "Black Concrete", + "tile.concrete.red.name": "Red Concrete", + "tile.concrete.green.name": "Green Concrete", + "tile.concrete.brown.name": "Brown Concrete", + "tile.concrete.blue.name": "Blue Concrete", + "tile.concrete.purple.name": "Purple Concrete", + "tile.concrete.cyan.name": "Cyan Concrete", + "tile.concrete.silver.name": "Light Gray Concrete", + "tile.concrete.gray.name": "Gray Concrete", + "tile.concrete.pink.name": "Pink Concrete", + "tile.concrete.lime.name": "Lime Concrete", + "tile.concrete.yellow.name": "Yellow Concrete", + "tile.concrete.lightBlue.name": "Light Blue Concrete", + "tile.concrete.magenta.name": "Magenta Concrete", + "tile.concrete.orange.name": "Orange Concrete", + "tile.concrete.white.name": "White Concrete", + "tile.concretePowder.black.name": "Black Concrete Powder", + "tile.concretePowder.red.name": "Red Concrete Powder", + "tile.concretePowder.green.name": "Green Concrete Powder", + "tile.concretePowder.brown.name": "Brown Concrete Powder", + "tile.concretePowder.blue.name": "Blue Concrete Powder", + "tile.concretePowder.purple.name": "Purple Concrete Powder", + "tile.concretePowder.cyan.name": "Cyan Concrete Powder", + "tile.concretePowder.silver.name": "Light Gray Concrete Powder", + "tile.concretePowder.gray.name": "Gray Concrete Powder", + "tile.concretePowder.pink.name": "Pink Concrete Powder", + "tile.concretePowder.lime.name": "Lime Concrete Powder", + "tile.concretePowder.yellow.name": "Yellow Concrete Powder", + "tile.concretePowder.lightBlue.name": "Light Blue Concrete Powder", + "tile.concretePowder.magenta.name": "Magenta Concrete Powder", + "tile.concretePowder.orange.name": "Orange Concrete Powder", + "tile.concretePowder.white.name": "White Concrete Powder", + "item.bed.black.name": "Black Bed", + "item.bed.red.name": "Red Bed", + "item.bed.green.name": "Green Bed", + "item.bed.brown.name": "Brown Bed", + "item.bed.blue.name": "Blue Bed", + "item.bed.purple.name": "Purple Bed", + "item.bed.cyan.name": "Cyan Bed", + "item.bed.silver.name": "Light Gray Bed", + "item.bed.gray.name": "Gray Bed", + "item.bed.pink.name": "Pink Bed", + "item.bed.lime.name": "Lime Bed", + "item.bed.yellow.name": "Yellow Bed", + "item.bed.lightBlue.name": "Light Blue Bed", + "item.bed.magenta.name": "Magenta Bed", + "item.bed.orange.name": "Orange Bed", + "item.bed.white.name": "White Bed", + "item.knowledgeBook.name": "Knowledge Book", + "container.enchant.level.requirement": "Level requirement: %s", + "filled_map.unknown": "Unknown Map", + "filled_map.level": "(Level %s/%s)", + "filled_map.scale": "Scaling at 1:%s", + "entity.Parrot.name": "Parrot", + "entity.IllusionIllager.name": "Illusioner", + "gui.advancements": "Advancements", + "advancements.empty": "There doesn't seem to be anything here...", + "advancements.toast.task": "Advancement Made!", + "advancements.toast.challenge": "Challenge Complete!", + "advancements.toast.goal": "Goal Reached!", + "recipe.toast.title": "New Recipes Unlocked!", + "recipe.toast.description": "Check your recipe book", + "commands.advancement.usage": "/advancement ", + "commands.advancement.advancementNotFound": "No advancement was found by the name '%1$s'", + "commands.advancement.criterionNotFound": "The advancement '%1$s' does not contain the criterion '%2$s'", + "commands.reload.usage": "/reload", + "commands.reload.success": "Successfully reloaded loot tables, advancements and functions", + "commands.function.usage": "/function [if |unless ]", + "commands.function.unknown": "Unknown function '%s'", + "commands.function.success": "Executed %2$s command(s) from function '%1$s'", + "commands.function.skipped": "Skipped execution of function '%1$s'", + "commands.advancement.grant.usage": "/advancement grant ", + "commands.advancement.grant.only.usage": "/advancement grant only [criterion]", + "commands.advancement.grant.only.failed": "Couldn't grant the advancement '%1$s' to %2$s because they already have it", + "commands.advancement.grant.only.success": "Granted the entire advancement '%1$s' to %2$s", + "commands.advancement.grant.criterion.failed": "Couldn't grant the criterion '%3$s' of advancement '%1$s' to %2$s because they already have it", + "commands.advancement.grant.criterion.success": "Granted the criterion '%3$s' of advancement '%1$s' to %2$s", + "commands.advancement.grant.until.usage": "/advancement grant until ", + "commands.advancement.grant.until.failed": "Couldn't grant the advancement '%1$s' or its ancestors to %2$s because they already have them all", + "commands.advancement.grant.until.success": "Granted '%1$s' and all ancestors (%3$s total granted) to %2$s", + "commands.advancement.grant.from.usage": "/advancement grant from ", + "commands.advancement.grant.from.failed": "Couldn't grant the advancement '%1$s' or its descendants to %2$s because they already have them all", + "commands.advancement.grant.from.success": "Granted '%1$s' and all descendants (%3$s total granted) to %2$s", + "commands.advancement.grant.through.usage": "/advancement grant through ", + "commands.advancement.grant.through.failed": "Couldn't grant the advancement '%1$s', its ancestors or its descendants to %2$s because they already have them all", + "commands.advancement.grant.through.success": "Granted '%1$s', all ancestors and all descendants (%3$s total granted) to %2$s", + "commands.advancement.grant.everything.usage": "/advancement grant everything", + "commands.advancement.grant.everything.failed": "Couldn't grant any advancements to %1$s because they already have them all", + "commands.advancement.grant.everything.success": "Granted every advancement (%2$s total granted) to %1$s", + "commands.advancement.revoke.usage": "/advancement revoke ", + "commands.advancement.revoke.only.usage": "/advancement revoke only [criterion]", + "commands.advancement.revoke.only.failed": "Couldn't revoke the advancement '%1$s' from %2$s because they haven't started it", + "commands.advancement.revoke.only.success": "Revoked the entire advancement '%1$s' from %2$s", + "commands.advancement.revoke.criterion.failed": "Couldn't revoke the criterion '%3$s' of advancement '%1$s' from %2$s because they haven't started it", + "commands.advancement.revoke.criterion.success": "Revoked the criterion '%3$s' of advancement '%1$s' from %2$s", + "commands.advancement.revoke.until.usage": "/advancement revoke until ", + "commands.advancement.revoke.until.failed": "Couldn't revoke the advancement '%1$s' or its ancestors from %2$s because they haven't started any", + "commands.advancement.revoke.until.success": "Revoked '%1$s' and all ancestors (%3$s total revoked) from %2$s", + "commands.advancement.revoke.from.usage": "/advancement revoke from ", + "commands.advancement.revoke.from.failed": "Couldn't revoke the advancement '%1$s' or its descendants from %2$s because they haven't started any", + "commands.advancement.revoke.from.success": "Revoked '%1$s' and all descendants (%3$s total revoked) from %2$s", + "commands.advancement.revoke.through.usage": "/advancement revoke through ", + "commands.advancement.revoke.through.failed": "Couldn't revoke the advancement '%1$s', its ancestors or its descendants from %2$s because they haven't started any", + "commands.advancement.revoke.through.success": "Revoked '%1$s', all ancestors and all descendants (%3$s total revoked) from %2$s", + "commands.advancement.revoke.everything.usage": "/advancement revoke everything", + "commands.advancement.revoke.everything.failed": "Couldn't revoke any advancements to %1$s because they haven't started any", + "commands.advancement.revoke.everything.success": "Revoked every advancement (%2$s total revoked) from %1$s", + "commands.advancement.test.usage": "/advancement test [criterion]", + "commands.advancement.test.criterion.success": "Player %1$s has completed criterion '%3$s' of advancement '%2$s'", + "commands.advancement.test.criterion.notDone": "Player %1$s has not completed criterion '%3$s' of advancement '%2$s'", + "commands.advancement.test.advancement.success": "Player %1$s has completed advancement '%2$s'", + "commands.advancement.test.advancement.notDone": "Player %1$s has not completed advancement '%2$s'", + "commands.recipe.usage": "/recipe [player] ", + "commands.recipe.alreadyHave": "Player %s already has a recipe for %s", + "commands.recipe.dontHave": "Player %s doesn't have the recipe for %s", + "commands.recipe.give.success.all": "Successfully given all recipes to %s", + "commands.recipe.give.success.one": "Successfully given %s the recipe for %s", + "commands.recipe.take.success.all": "Successfully taken all recipes from %s", + "commands.recipe.take.success.one": "Successfully removed the recipe for %s from %s", + "commands.recipe.unknownrecipe": "%s is an unknown recipe", + "commands.recipe.unsupported": "%s is an unsupported recipe", + "itemGroup.hotbar": "Saved Toolbars", + "inventory.hotbarSaved": "Item toolbar saved (restore with %1$s+%2$s)", + "inventory.hotbarInfo": "Save toolbar with %1$s+%2$s", + "advMode.self": "Use \"@s\" to target the executing entity", + "subtitles.entity.parrot.ambient": "Parrot talks", + "subtitles.entity.parrot.death": "Parrot dies", + "subtitles.entity.parrot.eats": "Parrot eats", + "subtitles.entity.parrot.hurts": "Parrot hurts", + "subtitles.entity.parrot.imitate.blaze": "Parrot breathes", + "subtitles.entity.parrot.imitate.cave_spider": "Parrot hisses", + "subtitles.entity.parrot.imitate.creeper": "Parrot hisses", + "subtitles.entity.parrot.imitate.elder_guardian": "Parrot flaps", + "subtitles.entity.parrot.imitate.enderdragon": "Parrot roars", + "subtitles.entity.parrot.imitate.enderman": "Parrot vwoops", + "subtitles.entity.parrot.imitate.endermite": "Parrot scuttles", + "subtitles.entity.parrot.imitate.evocation_illager": "Parrot murmurs", + "subtitles.entity.parrot.imitate.ghast": "Parrot cries", + "subtitles.entity.parrot.imitate.husk": "Parrot groans", + "subtitles.entity.parrot.imitate.illusion_illager": "Parrot murmurs", + "subtitles.entity.parrot.imitate.magmacube": "Parrot squishes", + "subtitles.entity.parrot.imitate.polar_bear": "Parrot groans", + "subtitles.entity.parrot.imitate.shulker": "Parrot lurks", + "subtitles.entity.parrot.imitate.silverfish": "Parrot hisses", + "subtitles.entity.parrot.imitate.skeleton": "Parrot rattles", + "subtitles.entity.parrot.imitate.slime": "Parrot squishes", + "subtitles.entity.parrot.imitate.spider": "Parrot hisses", + "subtitles.entity.parrot.imitate.stray": "Parrot rattles", + "subtitles.entity.parrot.imitate.vex": "Parrot vexes", + "subtitles.entity.parrot.imitate.vindication_illager": "Parrot mutters", + "subtitles.entity.parrot.imitate.witch": "Parrot giggles", + "subtitles.entity.parrot.imitate.wither": "Parrot angers", + "subtitles.entity.parrot.imitate.wither_skeleton": "Parrot rattles", + "subtitles.entity.parrot.imitate.wolf": "Parrot pants", + "subtitles.entity.parrot.imitate.zombie": "Parrot groans", + "subtitles.entity.parrot.imitate.zombie_pigman": "Parrot grunts", + "subtitles.entity.parrot.imitate.zombie_villager": "Parrot groans", + "subtitles.entity.illusion_illager.ambient": "Illusioner murmurs", + "subtitles.entity.illusion_illager.cast_spell": "Illusioner casts spell", + "subtitles.entity.illusion_illager.death": "Illusioner dies", + "subtitles.entity.illusion_illager.hurt": "Illusioner hurts", + "subtitles.entity.illusion_illager.mirror_move": "Illusioner displaces", + "subtitles.entity.illusion_illager.prepare_blindness": "Illusioner prepares blindness", + "subtitles.entity.illusion_illager.prepare_mirror": "Illusioner prepares mirror image", + "tutorial.move.title": "Move with %s, %s, %s and %s", + "tutorial.move.description": "Jump with %s", + "tutorial.look.title": "Look around", + "tutorial.look.description": "Use your mouse to turn", + "tutorial.find_tree.title": "Find a tree", + "tutorial.find_tree.description": "Punch it to collect wood", + "tutorial.punch_tree.title": "Destroy the tree", + "tutorial.punch_tree.description": "Hold down %s", + "tutorial.open_inventory.title": "Open your inventory", + "tutorial.open_inventory.description": "Press %s", + "tutorial.craft_planks.title": "Craft wooden planks", + "tutorial.craft_planks.description": "The recipe book can help", + "advancements.adventure.adventuring_time.title": "Adventuring Time", + "advancements.adventure.adventuring_time.description": "Discover every biome", + "advancements.adventure.kill_all_mobs.title": "Monsters Hunted", + "advancements.adventure.kill_all_mobs.description": "Kill one of every hostile monster", + "advancements.adventure.kill_a_mob.title": "Monster Hunter", + "advancements.adventure.kill_a_mob.description": "Kill any hostile monster", + "advancements.adventure.root.title": "Adventure", + "advancements.adventure.root.description": "Adventure, exploration and combat", + "advancements.adventure.shoot_arrow.title": "Take Aim", + "advancements.adventure.shoot_arrow.description": "Shoot something with a bow and arrow", + "advancements.adventure.sleep_in_bed.title": "Sweet dreams", + "advancements.adventure.sleep_in_bed.description": "Change your respawn point", + "advancements.adventure.sniper_duel.title": "Sniper duel", + "advancements.adventure.sniper_duel.description": "Kill a skeleton with an arrow from more than 50 meters", + "advancements.adventure.trade.title": "What a Deal!", + "advancements.adventure.trade.description": "Successfully trade with a Villager", + "advancements.adventure.summon_iron_golem.title": "Hired Help", + "advancements.adventure.summon_iron_golem.description": "Summon an Iron Golem to help defend a village", + "advancements.adventure.totem_of_undying.title": "Postmortal", + "advancements.adventure.totem_of_undying.description": "Use a Totem of Undying to cheat death", + "advancements.husbandry.root.title": "Husbandry", + "advancements.husbandry.root.description": "The world is full of friends and food", + "advancements.husbandry.breed_an_animal.title": "The Parrots and the Bats", + "advancements.husbandry.breed_an_animal.description": "Breed two animals together", + "advancements.husbandry.breed_all_animals.title": "Two by Two", + "advancements.husbandry.breed_all_animals.description": "Breed all the animals!", + "advancements.husbandry.tame_an_animal.title": "Best Friends Forever", + "advancements.husbandry.tame_an_animal.description": "Tame an animal", + "advancements.husbandry.plant_seed.title": "A Seedy Place", + "advancements.husbandry.plant_seed.description": "Plant a seed and watch it grow", + "advancements.husbandry.break_diamond_hoe.title": "Serious Dedication", + "advancements.husbandry.break_diamond_hoe.description": "Completely use up a diamond hoe, and then reevaluate your life choices", + "advancements.husbandry.balanced_diet.title": "A Balanced Diet", + "advancements.husbandry.balanced_diet.description": "Eat everything that is edible, even if it's not good for you", + "advancements.end.dragon_breath.title": "You Need a Mint", + "advancements.end.dragon_breath.description": "Collect dragon's breath in a glass bottle", + "advancements.end.dragon_egg.title": "The Next Generation", + "advancements.end.dragon_egg.description": "Hold the Dragon Egg", + "advancements.end.elytra.title": "Sky's the Limit", + "advancements.end.elytra.description": "Find an Elytra", + "advancements.end.enter_end_gateway.title": "Remote Getaway", + "advancements.end.enter_end_gateway.description": "Escape the island", + "advancements.end.find_end_city.title": "The City at the End of the Game", + "advancements.end.find_end_city.description": "Go on in, what could happen?", + "advancements.end.kill_dragon.title": "Free the End", + "advancements.end.kill_dragon.description": "Good luck", + "advancements.end.levitate.title": "Great View From Up Here", + "advancements.end.levitate.description": "Levitate up 50 blocks from the attacks of a Shulker", + "advancements.end.respawn_dragon.title": "The End... Again...", + "advancements.end.respawn_dragon.description": "Respawn the ender dragon", + "advancements.end.root.title": "The End", + "advancements.end.root.description": "Or the beginning?", + "advancements.nether.brew_potion.title": "Local Brewery", + "advancements.nether.brew_potion.description": "Brew a potion", + "advancements.nether.all_potions.title": "A Furious Cocktail", + "advancements.nether.all_potions.description": "Have every potion effect applied at the same time", + "advancements.nether.all_effects.title": "How Did We Get Here?", + "advancements.nether.all_effects.description": "Have every effect applied at the same time", + "advancements.nether.create_beacon.title": "Bring Home the Beacon", + "advancements.nether.create_beacon.description": "Construct and place a Beacon", + "advancements.nether.create_full_beacon.title": "Beaconator", + "advancements.nether.create_full_beacon.description": "Bring a beacon to full power", + "advancements.nether.find_fortress.title": "A Terrible Fortress", + "advancements.nether.find_fortress.description": "Break your way into a Nether Fortress", + "advancements.nether.get_wither_skull.title": "Spooky Scary Skeleton", + "advancements.nether.get_wither_skull.description": "Obtain a wither skeleton's skull", + "advancements.nether.obtain_blaze_rod.title": "Into Fire", + "advancements.nether.obtain_blaze_rod.description": "Relieve a Blaze of its rod", + "advancements.nether.return_to_sender.title": "Return to Sender", + "advancements.nether.return_to_sender.description": "Destroy a Ghast with a fireball", + "advancements.nether.root.title": "Nether", + "advancements.nether.root.description": "Bring summer clothes", + "advancements.nether.summon_wither.title": "Withering Heights", + "advancements.nether.summon_wither.description": "Summon the Wither", + "advancements.nether.fast_travel.title": "Subspace Bubble", + "advancements.nether.fast_travel.description": "Use the Nether to travel 7km in the Overworld", + "advancements.nether.uneasy_alliance.title": "Uneasy Alliance", + "advancements.nether.uneasy_alliance.description": "Rescue a Ghast from the Nether, bring it safely home to the Overworld... and then kill it.", + "advancements.story.cure_zombie_villager.title": "Zombie Doctor", + "advancements.story.cure_zombie_villager.description": "Weaken and then cure a zombie villager", + "advancements.story.deflect_arrow.title": "Not Today, Thank You", + "advancements.story.deflect_arrow.description": "Deflect an arrow with a shield", + "advancements.story.enchant_item.title": "Enchanter", + "advancements.story.enchant_item.description": "Enchant an item at an Enchanting Table", + "advancements.story.enter_the_end.title": "The End?", + "advancements.story.enter_the_end.description": "Enter the End Portal", + "advancements.story.enter_the_nether.title": "We Need to Go Deeper", + "advancements.story.enter_the_nether.description": "Build, light and enter a Nether Portal", + "advancements.story.follow_ender_eye.title": "Eye Spy", + "advancements.story.follow_ender_eye.description": "Follow an Ender Eye", + "advancements.story.form_obsidian.title": "Ice Bucket Challenge", + "advancements.story.form_obsidian.description": "Form and mine a block of Obsidian", + "advancements.story.iron_tools.title": "Isn't It Iron Pick", + "advancements.story.iron_tools.description": "Upgrade your pickaxe", + "advancements.story.lava_bucket.title": "Hot Stuff", + "advancements.story.lava_bucket.description": "Fill a bucket with lava", + "advancements.story.mine_diamond.title": "Diamonds!", + "advancements.story.mine_diamond.description": "Acquire diamonds", + "advancements.story.mine_stone.title": "Stone Age", + "advancements.story.mine_stone.description": "Mine stone with your new pickaxe", + "advancements.story.obtain_armor.title": "Suit Up", + "advancements.story.obtain_armor.description": "Protect yourself with a piece of iron armor", + "advancements.story.root.title": "Minecraft", + "advancements.story.root.description": "The heart and story of the game", + "advancements.story.shiny_gear.title": "Cover Me With Diamonds", + "advancements.story.shiny_gear.description": "Diamond armor saves lives", + "advancements.story.smelt_iron.title": "Acquire Hardware", + "advancements.story.smelt_iron.description": "Smelt an iron ingot", + "advancements.story.upgrade_tools.title": "Getting an Upgrade", + "advancements.story.upgrade_tools.description": "Construct a better pickaxe" + }, + "1.11": { + "selectWorld.unable_to_load": "Unable to load worlds", + "selectWorld.load_folder_access": "Unable to read or access folder where game worlds are saved!", + "createWorld.customize.preset.classic_flat": "Classic Flat", + "createWorld.customize.preset.tunnelers_dream": "Tunnelers' Dream", + "createWorld.customize.preset.water_world": "Water World", + "createWorld.customize.preset.overworld": "Overworld", + "createWorld.customize.preset.snowy_kingdom": "Snowy Kingdom", + "createWorld.customize.preset.bottomless_pit": "Bottomless Pit", + "createWorld.customize.preset.desert": "Desert", + "createWorld.customize.preset.redstone_ready": "Redstone Ready", + "createWorld.customize.preset.the_void": "The Void", + "createWorld.customize.custom.useMansions": "Woodland Mansions", + "spectatorMenu.previous_page": "Previous Page", + "spectatorMenu.next_page": "Next Page", + "spectatorMenu.close": "Close Menu", + "spectatorMenu.teleport": "Teleport to Player", + "spectatorMenu.teleport.prompt": "Select a player to teleport to", + "spectatorMenu.team_teleport": "Teleport to Team Member", + "spectatorMenu.team_teleport.prompt": "Select a team to teleport to", + "spectatorMenu.root.prompt": "Press a key to select a command, and again to use it.", + "options.chunks": "%s chunks", + "options.framerate": "%s fps", + "title.oldjava1": "Old java detected; this will prevent you from playing", + "title.oldjava2": "in the future as Java 8 will be required.", + "tile.air.name": "Air", + "tile.bed.tooFarAway": "You may not rest now, the bed is too far away", + "tile.observer.name": "Observer", + "tile.shulkerBoxWhite.name": "White Shulker Box", + "tile.shulkerBoxOrange.name": "Orange Shulker Box", + "tile.shulkerBoxMagenta.name": "Magenta Shulker Box", + "tile.shulkerBoxLightBlue.name": "Light Blue Shulker Box", + "tile.shulkerBoxYellow.name": "Yellow Shulker Box", + "tile.shulkerBoxLime.name": "Lime Shulker Box", + "tile.shulkerBoxPink.name": "Pink Shulker Box", + "tile.shulkerBoxGray.name": "Gray Shulker Box", + "tile.shulkerBoxSilver.name": "Light Gray Shulker Box", + "tile.shulkerBoxCyan.name": "Cyan Shulker Box", + "tile.shulkerBoxPurple.name": "Purple Shulker Box", + "tile.shulkerBoxBlue.name": "Blue Shulker Box", + "tile.shulkerBoxBrown.name": "Brown Shulker Box", + "tile.shulkerBoxGreen.name": "Green Shulker Box", + "tile.shulkerBoxRed.name": "Red Shulker Box", + "tile.shulkerBoxBlack.name": "Black Shulker Box", + "item.splash_potion.name": "Splash Potion", + "item.lingering_potion.name": "Lingering Potion", + "container.shulkerBox": "Shulker Box", + "container.shulkerBox.more": "and %s more...", + "item.color": "Color: %s", + "item.nbt_tags": "NBT: %s tag(s)", + "item.durability": "Durability: %s / %s", + "filled_map.mansion": "Woodland Explorer Map", + "filled_map.monument": "Ocean Explorer Map", + "entity.ZombieVillager.name": "Zombie Villager", + "entity.ElderGuardian.name": "Elder Guardian", + "entity.EvocationIllager.name": "Evoker", + "entity.Vex.name": "Vex", + "entity.VindicationIllager.name": "Vindicator", + "entity.Villager.nitwit": "Nitwit", + "entity.Villager.cartographer": "Cartographer", + "entity.Horse.name": "Horse", + "entity.Llama.name": "Llama", + "death.attack.cramming": "%1$s was squished too much", + "death.attack.fireworks": "%1$s went off with a bang", + "enchantment.sweeping": "Sweeping Edge", + "enchantment.binding_curse": "Curse of Binding", + "enchantment.vanishing_curse": "Curse of Vanishing", + "stat.shulkerBoxOpened": "Shulker Boxes Opened", + "commands.generic.blockstate.invalid": "'%s' is not a state for block %s", + "commands.generic.selector_argument": "Invalid selector argument: '%s'", + "commands.generic.player.unspecified": "You must specify which player you wish to perform this action on.", + "commands.save.flushStart": "Flushing all saves...", + "commands.save.flushEnd": "Flushing completed", + "commands.scoreboard.players.tag.tagError": "Players tag command failed, reason: %s", + "commands.spreadplayers.noop": "No players found to spread", + "commands.locate.usage": "/locate ", + "commands.locate.success": "Located %s at %s (y?) %s", + "commands.locate.failure": "Unable to locate any %s feature", + "subtitles.block.shulker_box.close": "Shulker closes", + "subtitles.block.shulker_box.open": "Shulker opens", + "subtitles.entity.elder_guardian.ambient.land": "Elder Guardian flaps", + "subtitles.entity.elder_guardian.ambient": "Elder Guardian moans", + "subtitles.entity.elder_guardian.attack": "Elder Guardian shoots", + "subtitles.entity.elder_guardian.curse": "Elder Guardian curses", + "subtitles.entity.elder_guardian.death": "Elder Guardian dies", + "subtitles.entity.elder_guardian.flop": "Elder Guardian flops", + "subtitles.entity.elder_guardian.hurt": "Elder Guardian hurts", + "subtitles.entity.evocation_fangs.attack": "Fangs snap", + "subtitles.entity.evocation_illager.ambient": "Evoker murmurs", + "subtitles.entity.evocation_illager.cast_spell": "Evoker casts spell", + "subtitles.entity.evocation_illager.death": "Evoker dies", + "subtitles.entity.evocation_illager.hurt": "Evoker hurts", + "subtitles.entity.evocation_illager.prepare_attack": "Evoker prepares attack", + "subtitles.entity.evocation_illager.prepare_summon": "Evoker prepares summoning", + "subtitles.entity.evocation_illager.prepare_wololo": "Evoker prepares charming", + "subtitles.entity.llama.ambient": "Llama bleats", + "subtitles.entity.llama.angry": "Llama bleats angry", + "subtitles.entity.llama.chest": "Llama Chest equips", + "subtitles.entity.llama.death": "Llama dies", + "subtitles.entity.llama.eat": "Llama eats", + "subtitles.entity.llama.hurt": "Llama hurts", + "subtitles.entity.llama.spit": "Llama spits", + "subtitles.entity.llama.step": "Llama steps", + "subtitles.entity.llama.swag": "Llama is decorated", + "subtitles.entity.mule.chest": "Mule Chest equips", + "subtitles.entity.vex.ambient": "Vex vexes", + "subtitles.entity.vex.charge": "Vex shrieks", + "subtitles.entity.vex.death": "Vex dies", + "subtitles.entity.vex.hurt": "Vex hurts", + "subtitles.entity.vindication_illager.ambient": "Vindicator mutters", + "subtitles.entity.vindication_illager.death": "Vindicator dies", + "subtitles.entity.vindication_illager.hurt": "Vindicator hurts", + "subtitles.entity.zombie_villager.ambient": "Zombie Villager groans", + "subtitles.entity.zombie_villager.death": "Zombie Villager dies", + "subtitles.entity.zombie_villager.hurt": "Zombie Villager hurts", + "subtitles.item.armor.equip_elytra": "Elytra rustles", + "subtitles.item.totem.use": "Totem activates", + "debug.reload_chunks.help": "F3 + A ", + "debug.show_hitboxes.help": "F3 + B ", + "debug.clear_chat.help": "F3 + D ", + "debug.cycle_renderdistance.help": "F3 + F ", + "debug.chunk_boundaries.help": "F3 + G ", + "debug.advanced_tooltips.help": "F3 + H ", + "debug.creative_spectator.help": "F3 + N ", + "debug.pause_focus.help": "F3 + P ", + "debug.help.help": "F3 + Q ", + "debug.reload_resourcepacks.help": "F3 + T ", + "debug.reload_chunks.message": "Reloading all chunks", + "debug.show_hitboxes.on": "Hitboxes: shown", + "debug.show_hitboxes.off": "Hitboxes: hidden", + "debug.cycle_renderdistance.message": "Render Distance: %s", + "debug.chunk_boundaries.on": "Chunk borders: shown", + "debug.chunk_boundaries.off": "Chunk borders: hidden", + "debug.advanced_tooltips.on": "Advanced tooltips: shown", + "debug.advanced_tooltips.off": "Advanced tooltips: hidden", + "debug.creative_spectator.error": "Unable to switch gamemode, no permission", + "debug.pause_focus.on": "Pause on lost focus: enabled", + "debug.pause_focus.off": "Pause on lost focus: disabled", + "debug.help.message": "Key bindings:", + "debug.reload_resourcepacks.message": "Reloaded resource packs", + "resourcepack.downloading": "Downloading Resource Pack", + "resourcepack.requesting": "Making Request...", + "resourcepack.progress": "Downloading file (%s MB)..." + }, + "1.10": { + "options.autoJump": "Auto-jump", + "tile.magma.name": "Magma Block", + "tile.netherWartBlock.name": "Nether Wart Block", + "tile.redNetherBrick.name": "Red Nether Brick", + "tile.boneBlock.name": "Bone Block", + "tile.structureVoid.name": "Structure Void", + "structure_block.save_success": "Structure saved as '%s'", + "structure_block.save_failure": "Unable to save structure '%s'", + "structure_block.load_success": "Structure loaded from '%s'", + "structure_block.load_prepare": "Structure '%s' position prepared", + "structure_block.load_not_found": "Structure '%s' is not available", + "structure_block.size_success": "Size successfully detected for '%s'", + "structure_block.size_failure": "Unable to detect structure size, add corners with matching structure names", + "structure_block.mode.save": "[S]", + "structure_block.mode.load": "[L]", + "structure_block.mode.data": "[D]", + "structure_block.mode.corner": "[C]", + "structure_block.hover.save": "Save: %s", + "structure_block.hover.load": "Load: %s", + "structure_block.hover.data": "Data: %s", + "structure_block.hover.corner": "Corner: %s", + "structure_block.mode_info.save": "Save mode - write to file", + "structure_block.mode_info.load": "Load mode - load from file", + "structure_block.mode_info.data": "Data mode - game logic marker", + "structure_block.mode_info.corner": "Corner mode - placement and size marker", + "structure_block.structure_name": "Structure Name", + "structure_block.custom_data": "Custom Data Tag Name", + "structure_block.position": "Relative Position", + "structure_block.size": "Structure Size", + "structure_block.integrity": "Structure Integrity and Seed", + "structure_block.include_entities": "Include entities:", + "structure_block.detect_size": "Detect structure size and position:", + "structure_block.button.detect_size": "DETECT", + "structure_block.button.save": "SAVE", + "structure_block.button.load": "LOAD", + "structure_block.show_air": "Show invisible blocks:", + "structure_block.show_boundingbox": "Show bounding box:", + "entity.WitherSkeleton.name": "Wither Skeleton", + "entity.Stray.name": "Stray", + "entity.Husk.name": "Husk", + "entity.PolarBear.name": "Polar Bear", + "entity.Donkey.name": "Donkey", + "entity.Mule.name": "Mule", + "entity.SkeletonHorse.name": "Skeleton Horse", + "entity.ZombieHorse.name": "Zombie Horse", + "death.attack.hotFloor": "%1$s discovered floor was lava", + "death.attack.hotFloor.player": "%1$s walked into danger zone due to %2$s", + "commands.teleport.usage": "/teleport [ ]", + "commands.teleport.success.coordinates": "Teleported %s to %s, %s, %s", + "subtitles.entity.husk.ambient": "Husk groans", + "subtitles.entity.husk.death": "Husk dies", + "subtitles.entity.husk.hurt": "Husk hurts", + "subtitles.entity.polar_bear.ambient": "Polar Bear groans", + "subtitles.entity.polar_bear.baby_ambient": "Polar Bear hums", + "subtitles.entity.polar_bear.death": "Polar Bear dies", + "subtitles.entity.polar_bear.hurt": "Polar Bear hurts", + "subtitles.entity.polar_bear.warning": "Polar Bear roars", + "subtitles.entity.stray.ambient": "Stray rattles", + "subtitles.entity.stray.death": "Stray dies", + "subtitles.entity.stray.hurt": "Stray hurts", + "subtitles.entity.wither_skeleton.ambient": "Wither Skeleton rattles", + "subtitles.entity.wither_skeleton.death": "Wither Skeleton dies", + "subtitles.entity.wither_skeleton.hurt": "Wither Skeleton hurts" + }, + "1.9.3": { + "commands.stopsound.usage": "/stopsound [source] [sound]", + "commands.stopsound.unknownSoundSource": "Source %s is unknown", + "commands.stopsound.success.individualSound": "Stopped sound '%s' with source '%s' for %s", + "commands.stopsound.success.soundSource": "Stopped source '%s' for %s", + "commands.stopsound.success.all": "Stopped all sounds for %s" + }, + "1.9.1": { + "entity.MinecartHopper.name": "Minecart with Hopper", + "entity.MinecartChest.name": "Minecart with Chest", + "attribute.name.generic.armorToughness": "Armor Toughness" } } \ No newline at end of file