Add missing translation mappings and component rewriter (#761)

This commit is contained in:
EnZaXD 2024-05-28 10:52:08 +02:00 committed by GitHub
parent 9e63243003
commit 1bf5f7408b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 634 additions and 261 deletions

View File

@ -21,6 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_10to1_9_3;
import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData; import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter; 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.BlockItemPacketRewriter1_10;
import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.EntityPacketRewriter1_10; import com.viaversion.viabackwards.protocol.v1_10to1_9_3.rewriter.EntityPacketRewriter1_10;
import com.viaversion.viaversion.api.connection.UserConnection; 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.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.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_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<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> { public class Protocol1_10To1_9_3 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
@ -89,6 +91,9 @@ public class Protocol1_10To1_9_3 extends BackwardsProtocol<ClientboundPackets1_9
map(Types.VAR_INT); // 1 - Result map(Types.VAR_INT); // 1 - Result
} }
}); });
TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
} }
@Override @Override

View File

@ -21,6 +21,7 @@ package com.viaversion.viabackwards.protocol.v1_11to1_10;
import com.viaversion.viabackwards.api.BackwardsProtocol; import com.viaversion.viabackwards.api.BackwardsProtocol;
import com.viaversion.viabackwards.api.data.BackwardsMappingData; import com.viaversion.viabackwards.api.data.BackwardsMappingData;
import com.viaversion.viabackwards.api.rewriters.SoundRewriter; 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.BlockItemPacketRewriter1_11;
import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.EntityPacketRewriter1_11; import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.EntityPacketRewriter1_11;
import com.viaversion.viabackwards.protocol.v1_11to1_10.rewriter.PlayerPacketRewriter1_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.ClientWorld;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_11; import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_11;
import com.viaversion.viaversion.data.entity.EntityTrackerBase; 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.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_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<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> { public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3> {
public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.11", "1.10"); public static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.11", "1.10");
private final EntityPacketRewriter1_11 entityRewriter = new EntityPacketRewriter1_11(this); private final EntityPacketRewriter1_11 entityRewriter = new EntityPacketRewriter1_11(this);
private final BlockItemPacketRewriter1_11 itemRewriter = new BlockItemPacketRewriter1_11(this); private final BlockItemPacketRewriter1_11 itemRewriter = new BlockItemPacketRewriter1_11(this);
private TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter;
public Protocol1_11To1_10() { public Protocol1_11To1_10() {
super(ClientboundPackets1_9_3.class, ClientboundPackets1_9_3.class, ServerboundPackets1_9_3.class, ServerboundPackets1_9_3.class); 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<ClientboundPackets1_9_
SoundRewriter<ClientboundPackets1_9_3> soundRewriter = new SoundRewriter<>(this); SoundRewriter<ClientboundPackets1_9_3> soundRewriter = new SoundRewriter<>(this);
soundRewriter.registerNamedSound(ClientboundPackets1_9_3.CUSTOM_SOUND); soundRewriter.registerNamedSound(ClientboundPackets1_9_3.CUSTOM_SOUND);
soundRewriter.registerSound(ClientboundPackets1_9_3.SOUND); soundRewriter.registerSound(ClientboundPackets1_9_3.SOUND);
componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
} }
@Override @Override
@ -81,6 +88,10 @@ public class Protocol1_11To1_10 extends BackwardsProtocol<ClientboundPackets1_9_
return itemRewriter; return itemRewriter;
} }
public TranslatableRewriter<ClientboundPackets1_9_3> getComponentRewriter() {
return componentRewriter;
}
@Override @Override
public boolean hasMappingDataToLoad() { public boolean hasMappingDataToLoad() {
return true; return true;

View File

@ -229,6 +229,8 @@ public class BlockItemPacketRewriter1_11 extends LegacyBlockItemRewriter<Clientb
if (wrapper.get(Types.STRING, 0).equals("EntityHorse")) { if (wrapper.get(Types.STRING, 0).equals("EntityHorse")) {
entityId = wrapper.passthrough(Types.INT); entityId = wrapper.passthrough(Types.INT);
} }
// Rewrite window title
protocol.getComponentRewriter().processText(wrapper.user(), wrapper.get(Types.COMPONENT, 0));
// Track Inventory // Track Inventory
String inventory = wrapper.get(Types.STRING, 0); String inventory = wrapper.get(Types.STRING, 0);

View File

@ -42,6 +42,7 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol<ClientboundPackets1_
private static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.12", "1.11"); private static final BackwardsMappingData MAPPINGS = new BackwardsMappingData("1.12", "1.11");
private final EntityPacketRewriter1_12 entityRewriter = new EntityPacketRewriter1_12(this); private final EntityPacketRewriter1_12 entityRewriter = new EntityPacketRewriter1_12(this);
private final BlockItemPacketRewriter1_12 itemRewriter = new BlockItemPacketRewriter1_12(this); private final BlockItemPacketRewriter1_12 itemRewriter = new BlockItemPacketRewriter1_12(this);
private final ComponentRewriter1_12 componentRewriter = new ComponentRewriter1_12(this);
public Protocol1_12To1_11_1() { public Protocol1_12To1_11_1() {
super(ClientboundPackets1_12.class, ClientboundPackets1_9_3.class, ServerboundPackets1_12.class, ServerboundPackets1_9_3.class); super(ClientboundPackets1_12.class, ClientboundPackets1_9_3.class, ServerboundPackets1_12.class, ServerboundPackets1_9_3.class);
@ -51,8 +52,8 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol<ClientboundPackets1_
protected void registerPackets() { protected void registerPackets() {
itemRewriter.register(); itemRewriter.register();
entityRewriter.register(); entityRewriter.register();
componentRewriter.registerComponentPacket(ClientboundPackets1_12.CHAT);
new SoundPacketRewriter1_12(this).register(); new SoundPacketRewriter1_12(this).register();
new ComponentRewriter1_12(this).register();
registerClientbound(ClientboundPackets1_12.SET_TITLES, wrapper -> { registerClientbound(ClientboundPackets1_12.SET_TITLES, wrapper -> {
int action = wrapper.passthrough(Types.VAR_INT); int action = wrapper.passthrough(Types.VAR_INT);
@ -94,6 +95,10 @@ public class Protocol1_12To1_11_1 extends BackwardsProtocol<ClientboundPackets1_
return itemRewriter; return itemRewriter;
} }
public ComponentRewriter1_12 getComponentRewriter() {
return componentRewriter;
}
@Override @Override
public boolean hasMappingDataToLoad() { public boolean hasMappingDataToLoad() {
return true; return true;

View File

@ -1,154 +0,0 @@
/*
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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<String, String> 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);
}
}

View File

@ -18,54 +18,34 @@
package com.viaversion.viabackwards.protocol.v1_12to1_11_1.rewriter; 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.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.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.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject; import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12; import com.viaversion.viaversion.protocols.v1_11_1to1_12.packet.ClientboundPackets1_12;
import com.viaversion.viaversion.rewriter.ComponentRewriter; import com.viaversion.viaversion.rewriter.ComponentRewriter;
public class ComponentRewriter1_12 extends RewriterBase<Protocol1_12To1_11_1> { public class ComponentRewriter1_12 extends TranslatableRewriter<ClientboundPackets1_12> {
public static final ComponentRewriter<ClientboundPackets1_12> 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 ComponentRewriter1_12(Protocol1_12To1_11_1 protocol) { public ComponentRewriter1_12(Protocol1_12To1_11_1 protocol) {
super(protocol); super(protocol, ComponentRewriter.ReadType.JSON);
} }
@Override @Override
protected void registerPackets() { public void processText(UserConnection connection, JsonElement element) {
protocol.registerClientbound(ClientboundPackets1_12.CHAT, wrapper -> { super.processText(connection, element);
JsonElement element = wrapper.passthrough(Types.COMPONENT); if (element == null || !element.isJsonObject()) {
COMPONENT_REWRITER.processText(wrapper.user(), element); 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());
} }
} }

View File

@ -191,7 +191,7 @@ public class EntityPacketRewriter1_12 extends LegacyEntityRewriter<ClientboundPa
filter().handler((event, meta) -> { filter().handler((event, meta) -> {
if (meta.dataType() == EntityDataTypes1_12.COMPONENT) { if (meta.dataType() == EntityDataTypes1_12.COMPONENT) {
ComponentRewriter1_12.COMPONENT_REWRITER.processText(event.user(), (JsonElement) meta.getValue()); protocol.getComponentRewriter().processText(event.user(), (JsonElement) meta.getValue());
} }
}); });

View File

@ -17,14 +17,18 @@
*/ */
package com.viaversion.viabackwards.protocol.v1_9_1to1_9; 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.AbstractProtocol;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types; 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.ClientboundPackets1_9;
import com.viaversion.viaversion.protocols.v1_8to1_9.packet.ServerboundPackets1_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<ClientboundPackets1_9, ClientboundPackets1_9, ServerboundPackets1_9, ServerboundPackets1_9> { public class Protocol1_9_1To1_9 extends BackwardsProtocol<ClientboundPackets1_9, ClientboundPackets1_9, ServerboundPackets1_9, ServerboundPackets1_9> {
public Protocol1_9_1To1_9() { public Protocol1_9_1To1_9() {
super(ClientboundPackets1_9.class, ClientboundPackets1_9.class, ServerboundPackets1_9.class, ServerboundPackets1_9.class); 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<ClientboundPackets1_9,
}); });
} }
}); });
TranslatableRewriter<ClientboundPackets1_9> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9.CHAT);
} }
} }

View File

@ -17,6 +17,8 @@
*/ */
package com.viaversion.viabackwards.protocol.v1_9_3to1_9_1; 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.viabackwards.protocol.v1_9_3to1_9_1.data.BlockEntity1_9_1;
import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ClientWorld; 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_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.ClientboundPackets1_9_3;
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ServerboundPackets1_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<ClientboundPackets1_9_3, ClientboundPackets1_9, ServerboundPackets1_9_3, ServerboundPackets1_9> { public class Protocol1_9_3To1_9_1 extends BackwardsProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9, ServerboundPackets1_9_3, ServerboundPackets1_9> {
public Protocol1_9_3To1_9_1() { public Protocol1_9_3To1_9_1() {
super(ClientboundPackets1_9_3.class, ClientboundPackets1_9.class, ServerboundPackets1_9_3.class, ServerboundPackets1_9.class); 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<ClientboundPackets1_9
}); });
} }
}); });
TranslatableRewriter<ClientboundPackets1_9_3> componentRewriter = new TranslatableRewriter<>(this, ComponentRewriter.ReadType.JSON);
componentRewriter.registerComponentPacket(ClientboundPackets1_9_3.CHAT);
} }
@Override @Override

View File

@ -2909,7 +2909,6 @@
"selectWorld.edit.backupCreated": "Backed up: %s", "selectWorld.edit.backupCreated": "Backed up: %s",
"selectWorld.edit.backupSize": "size: %s MB", "selectWorld.edit.backupSize": "size: %s MB",
"selectWorld.edit.optimize": "Optimize World", "selectWorld.edit.optimize": "Optimize World",
"selectWorld.deleteButton": "Delete",
"selectWorld.backupQuestion": "Do you really want to load this world?", "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.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", "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.generator": "Please select a generator type",
"createWorld.customize.buffet.biome": "Please select a biome", "createWorld.customize.buffet.biome": "Please select a biome",
"createWorld.customize.custom.useOceanRuins": "Ocean Ruins", "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", "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.message_not_delivered": "Can't deliver chat message, check server logs",
"multiplayer.status.finished": "Finished", "multiplayer.status.finished": "Finished",
"multiplayer.status.request_handled": "Status requst has been handled", "multiplayer.status.request_handled": "Status requst has been handled",
@ -2955,24 +2945,10 @@
"connect.negotiating": "Negotiating...", "connect.negotiating": "Negotiating...",
"connect.encrypting": "Encrypting...", "connect.encrypting": "Encrypting...",
"connect.joining": "Joining world...", "connect.joining": "Joining world...",
"disconnect.genericReason": "%s",
"disconnect.quitting": "Quitting",
"options.music": "Music",
"options.fov.min": "Normal",
"options.biomeBlendRadius": "Biome Blend", "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.autoSuggestCommands": "Command Suggestions",
"options.fullscreen.resolution": "Fullscreen Resolution", "options.fullscreen.resolution": "Fullscreen Resolution",
"options.fullscreen.current": "Current", "options.fullscreen.current": "Current",
"key.categories.multiplayer": "Multiplayer",
"key.categories.creative": "Creative Mode",
"key.keyboard.unknown": "Not bound", "key.keyboard.unknown": "Not bound",
"key.keyboard.apostrophe": "'", "key.keyboard.apostrophe": "'",
"key.keyboard.backslash": "\\", "key.keyboard.backslash": "\\",
@ -3353,17 +3329,7 @@
"item.minecraft.phantom_membrane": "Phantom Membrane", "item.minecraft.phantom_membrane": "Phantom Membrane",
"item.minecraft.nautilus_shell": "Nautilus Shell", "item.minecraft.nautilus_shell": "Nautilus Shell",
"item.minecraft.heart_of_the_sea": "Heart of the Sea", "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.invalid_structure_name": "Invalid structure name '%s'",
"structure_block.mode.save": "Save",
"filled_map.buried_treasure": "Buried Treasure Map", "filled_map.buried_treasure": "Buried Treasure Map",
"filled_map.id": "Id #%s", "filled_map.id": "Id #%s",
"entity.minecraft.area_effect_cloud": "Area Effect Cloud", "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.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.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.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.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": "%1$s was impaled by %2$s",
"death.attack.trident.item": "%1$s was impaled by %2$s with %3$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.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.turtle_master": "Lingering Potion of the Turtle Master",
"item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling", "item.minecraft.lingering_potion.effect.slow_falling": "Lingering Potion of Slow Falling",
"potion.potency.0": "",
"enchantment.minecraft.loyalty": "Loyalty", "enchantment.minecraft.loyalty": "Loyalty",
"enchantment.minecraft.impaling": "Impaling", "enchantment.minecraft.impaling": "Impaling",
"enchantment.minecraft.riptide": "Riptide", "enchantment.minecraft.riptide": "Riptide",
"enchantment.minecraft.channeling": "Channeling", "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_type.minecraft.broken": "Times Broken",
"stat.minecraft.walk_under_water_one_cm": "Distance Walked under Water", "stat.minecraft.walk_under_water_one_cm": "Distance Walked under Water",
"stat.minecraft.play_record": "Music Discs Played", "stat.minecraft.play_record": "Music Discs Played",
"stat.minecraft.walk_on_water_one_cm": "Distance Walked on Water", "stat.minecraft.walk_on_water_one_cm": "Distance Walked on Water",
"stat.minecraft.time_since_rest": "Since Last Rest", "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.bubble_pop": "Bubbles pop",
"subtitles.block.bubble_column.upwards_ambient": "Bubbles flow", "subtitles.block.bubble_column.upwards_ambient": "Bubbles flow",
"subtitles.block.bubble_column.upwards_inside": "Bubbles woosh", "subtitles.block.bubble_column.upwards_inside": "Bubbles woosh",
@ -3478,14 +3426,6 @@
"subtitles.entity.parrot.imitate.drowned": "Parrot gurgles", "subtitles.entity.parrot.imitate.drowned": "Parrot gurgles",
"subtitles.entity.parrot.imitate.illusioner": "Parrot murmurs", "subtitles.entity.parrot.imitate.illusioner": "Parrot murmurs",
"subtitles.entity.parrot.imitate.phantom": "Parrot screeches", "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.death": "Cod dies",
"subtitles.entity.cod.flop": "Cod flops", "subtitles.entity.cod.flop": "Cod flops",
"subtitles.entity.cod.hurt": "Cod hurts", "subtitles.entity.cod.hurt": "Cod hurts",
@ -3505,8 +3445,6 @@
"subtitles.entity.drowned.shoot": "Drowned throws Trident", "subtitles.entity.drowned.shoot": "Drowned throws Trident",
"subtitles.entity.drowned.step": "Drowned steps", "subtitles.entity.drowned.step": "Drowned steps",
"subtitles.entity.drowned.swim": "Drowned swims", "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.husk.converted_to_zombie": "Husk converted to Zombie",
"subtitles.entity.phantom.ambient": "Phantom screeches", "subtitles.entity.phantom.ambient": "Phantom screeches",
"subtitles.entity.phantom.bite": "Phantom bites", "subtitles.entity.phantom.bite": "Phantom bites",
@ -3514,7 +3452,6 @@
"subtitles.entity.phantom.flap": "Phantom flaps", "subtitles.entity.phantom.flap": "Phantom flaps",
"subtitles.entity.phantom.hurt": "Phantom hurts", "subtitles.entity.phantom.hurt": "Phantom hurts",
"subtitles.entity.phantom.swoop": "Phantom swoops", "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_out": "Pufferfish deflates",
"subtitles.entity.puffer_fish.blow_up": "Pufferfish inflates", "subtitles.entity.puffer_fish.blow_up": "Pufferfish inflates",
"subtitles.entity.puffer_fish.death": "Pufferfish dies", "subtitles.entity.puffer_fish.death": "Pufferfish dies",
@ -3524,8 +3461,6 @@
"subtitles.entity.salmon.death": "Salmon dies", "subtitles.entity.salmon.death": "Salmon dies",
"subtitles.entity.salmon.flop": "Salmon flops", "subtitles.entity.salmon.flop": "Salmon flops",
"subtitles.entity.salmon.hurt": "Salmon hurts", "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.skeleton_horse.swim": "Skeleton Horse swims",
"subtitles.entity.squid.squirt": "Squid shoots ink", "subtitles.entity.squid.squirt": "Squid shoots ink",
"subtitles.entity.turtle.ambient_land": "Turtle chirps", "subtitles.entity.turtle.ambient_land": "Turtle chirps",
@ -3570,7 +3505,6 @@
"debug.crash.warning": "Crashing in %s...", "debug.crash.warning": "Crashing in %s...",
"advancements.adventure.very_very_frightening.title": "Very Very Frightening", "advancements.adventure.very_very_frightening.title": "Very Very Frightening",
"advancements.adventure.very_very_frightening.description": "Strike a Villager with lightning", "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.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.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", "advancements.husbandry.fishy_business.title": "Fishy Business",
@ -4069,5 +4003,582 @@
"generator.minecraft.floating_islands": "Floating Islands", "generator.minecraft.floating_islands": "Floating Islands",
"realms.missing.module.error.text": "Realms could not be opened right now, please try again later", "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" "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 <grant|revoke|test> <player>",
"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 <name> [if <selector>|unless <selector>]",
"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 <player> <only|until|from|through|everything>",
"commands.advancement.grant.only.usage": "/advancement grant <player> only <advancement> [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 <player> until <advancement>",
"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 <player> from <advancement>",
"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 <player> through <advancement>",
"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 <player> 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 <player> <only|until|from|through|everything>",
"commands.advancement.revoke.only.usage": "/advancement revoke <player> only <advancement> [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 <player> until <advancement>",
"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 <player> from <advancement>",
"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 <player> through <advancement>",
"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 <player> 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 <player> <advancement> [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 <give|take> [player] <name|*>",
"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 <feature>",
"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 <entity> <x> <y> <z> [<y-rot> <x-rot>]",
"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 <player> [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"
} }
} }