From 3a48e54e52025403da090a3e9bf82ee143e8fc4f Mon Sep 17 00:00:00 2001 From: KennyTV Date: Thu, 25 Jun 2020 16:22:53 +0200 Subject: [PATCH 1/2] Directly read components as json, to only de-/serialize once --- .../metadata/types/MetaType1_13.java | 4 +- .../metadata/types/MetaType1_13_2.java | 4 +- .../metadata/types/MetaType1_14.java | 4 +- .../api/rewriters/ComponentRewriter.java | 97 ++++++++++++++++ .../us/myles/ViaVersion/api/type/Type.java | 5 +- .../api/type/types/ComponentStringType.java | 15 --- .../api/type/types/ComponentType.java | 24 ++++ .../types/minecraft/OptionalChatType.java | 27 ----- .../minecraft/OptionalComponentType.java | 28 +++++ .../Protocol1_11To1_10.java | 5 +- .../Protocol1_12To1_11_1.java | 12 +- .../Protocol1_13_1To1_13.java | 2 +- .../protocol1_13to1_12_2/ChatRewriter.java | 81 +++++-------- .../Protocol1_13To1_12_2.java | 106 +++++++----------- .../packets/InventoryPackets.java | 6 +- .../blockentities/BannerHandler.java | 2 +- .../blockentities/CommandBlockHandler.java | 8 +- .../InventoryNameRewriter.java | 46 -------- .../packets/InventoryPackets.java | 26 +++-- .../Protocol1_16To1_15_2.java | 2 +- .../packets/InventoryPackets.java | 2 +- .../Protocol1_9_3To1_9_1_2.java | 13 ++- .../protocol1_9to1_8/ItemRewriter.java | 4 +- .../protocol1_9to1_8/Protocol1_9To1_8.java | 37 ++++-- .../packets/PlayerPackets.java | 3 +- 25 files changed, 302 insertions(+), 261 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/api/rewriters/ComponentRewriter.java delete mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentStringType.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentType.java delete mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalChatType.java create mode 100644 common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalComponentType.java delete mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/InventoryNameRewriter.java diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java index eddf6af9a..2937dfec3 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java @@ -9,8 +9,8 @@ public enum MetaType1_13 implements MetaType { VarInt(1, Type.VAR_INT), Float(2, Type.FLOAT), String(3, Type.STRING), - Chat(4, Type.STRING), - OptChat(5, Type.OPTIONAL_CHAT), + Chat(4, Type.COMPONENT), + OptChat(5, Type.OPTIONAL_COMPONENT), Slot(6, Type.FLAT_ITEM), Boolean(7, Type.BOOLEAN), Vector3F(8, Type.ROTATION), diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java index a5f3da767..38d884e96 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java @@ -9,8 +9,8 @@ public enum MetaType1_13_2 implements MetaType { VarInt(1, Type.VAR_INT), Float(2, Type.FLOAT), String(3, Type.STRING), - Chat(4, Type.STRING), - OptChat(5, Type.OPTIONAL_CHAT), + Chat(4, Type.COMPONENT), + OptChat(5, Type.OPTIONAL_COMPONENT), Slot(6, Type.FLAT_VAR_INT_ITEM), Boolean(7, Type.BOOLEAN), Vector3F(8, Type.ROTATION), diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java index 94265618b..ea47c9584 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java @@ -9,8 +9,8 @@ public enum MetaType1_14 implements MetaType { VarInt(1, Type.VAR_INT), Float(2, Type.FLOAT), String(3, Type.STRING), - Chat(4, Type.STRING), - OptChat(5, Type.OPTIONAL_CHAT), + Chat(4, Type.COMPONENT), + OptChat(5, Type.OPTIONAL_COMPONENT), Slot(6, Type.FLAT_VAR_INT_ITEM), Boolean(7, Type.BOOLEAN), Vector3F(8, Type.ROTATION), diff --git a/common/src/main/java/us/myles/ViaVersion/api/rewriters/ComponentRewriter.java b/common/src/main/java/us/myles/ViaVersion/api/rewriters/ComponentRewriter.java new file mode 100644 index 000000000..f45d6fc1e --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/rewriters/ComponentRewriter.java @@ -0,0 +1,97 @@ +package us.myles.ViaVersion.api.rewriters; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import us.myles.ViaVersion.util.GsonUtil; + +// Packets using components: +// ping (status) +// disconnect (play and login) +// chat +// bossbar +// open window +// combat event +// title +// tablist +// teams +// scoreboard +// player info +// map data +// declare commands +// advancements +// update sign +public class ComponentRewriter { + + public JsonElement processText(String value) { + JsonElement root = GsonUtil.getJsonParser().parse(value); + processText(root); + return root; + } + + public void processText(JsonElement element) { + if (element == null || element.isJsonNull()) return; + if (element.isJsonArray()) { + processAsArray(element); + return; + } + if (element.isJsonPrimitive()) { + handleText(element.getAsJsonPrimitive()); + return; + } + + JsonObject object = element.getAsJsonObject(); + JsonPrimitive text = object.getAsJsonPrimitive("text"); + if (text != null) { + handleText(text); + } + + JsonElement translate = object.get("translate"); + if (translate != null) { + handleTranslate(object, translate.getAsString()); + + JsonElement with = object.get("with"); + if (with != null) { + processAsArray(with); + } + } + + JsonElement extra = object.get("extra"); + if (extra != null) { + processAsArray(extra); + } + + JsonObject hoverEvent = object.getAsJsonObject("hoverEvent"); + if (hoverEvent != null) { + handleHoverEvent(hoverEvent); + } + } + + protected void handleText(JsonPrimitive text) { + // To override if needed + } + + protected void handleTranslate(JsonObject object, String translate) { + // To override if needed + } + + // To override if needed (don't forget to call super if needed) + protected void handleHoverEvent(JsonObject hoverEvent) { + String action = hoverEvent.getAsJsonPrimitive("action").getAsString(); + if (action.equals("show_text")) { + JsonElement value = hoverEvent.get("value"); + processText(value != null ? value : hoverEvent.get("contents")); + } else if (action.equals("show_entity")) { + JsonObject contents = hoverEvent.getAsJsonObject("contents"); + if (contents != null) { + processText(contents.get("name")); + } + } + } + + private void processAsArray(JsonElement element) { + for (JsonElement jsonElement : element.getAsJsonArray()) { + processText(jsonElement); + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java index 215bcb9f0..b300033b3 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.api.type; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; +import com.google.gson.JsonElement; import us.myles.ViaVersion.api.minecraft.*; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.type.types.*; @@ -77,7 +78,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { @Deprecated public static final Type UNSIGNED_SHORT_ARRAY = new ArrayType<>(Type.UNSIGNED_SHORT); /* Other Types */ - public static final Type COMPONENT_STRING = new ComponentStringType(); + public static final Type COMPONENT = new ComponentType(); public static final Type STRING = new StringType(); public static final Type STRING_ARRAY = new ArrayType<>(Type.STRING); @@ -110,7 +111,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { public static final Type NBT_ARRAY = new ArrayType<>(Type.NBT); public static final Type OPTIONAL_UUID = new OptUUIDType(); - public static final Type OPTIONAL_CHAT = new OptionalChatType(); + public static final Type OPTIONAL_COMPONENT = new OptionalComponentType(); public static final Type OPTIONAL_POSITION = new OptPositionType(); public static final Type OPTIONAL_POSITION_1_14 = new OptPosition1_14Type(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentStringType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentStringType.java deleted file mode 100644 index bc99f5047..000000000 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentStringType.java +++ /dev/null @@ -1,15 +0,0 @@ -package us.myles.ViaVersion.api.type.types; - -import us.myles.ViaVersion.api.type.Type; - -public class ComponentStringType extends StringType { - - public ComponentStringType() { - super(262144); - } - - @Override - public Class getBaseClass() { - return StringType.class; - } -} diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentType.java new file mode 100644 index 000000000..bbc32c2da --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/ComponentType.java @@ -0,0 +1,24 @@ +package us.myles.ViaVersion.api.type.types; + +import com.google.gson.JsonElement; +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.util.GsonUtil; + +public class ComponentType extends Type { + private static final StringType STRING_TAG = new StringType(262144); + + public ComponentType() { + super(JsonElement.class); + } + + @Override + public JsonElement read(ByteBuf buffer) throws Exception { + return GsonUtil.getJsonParser().parse(STRING_TAG.read(buffer)); + } + + @Override + public void write(ByteBuf buffer, JsonElement object) throws Exception { + STRING_TAG.write(buffer, object.toString()); + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalChatType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalChatType.java deleted file mode 100644 index 527650a10..000000000 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalChatType.java +++ /dev/null @@ -1,27 +0,0 @@ -package us.myles.ViaVersion.api.type.types.minecraft; - -import io.netty.buffer.ByteBuf; -import us.myles.ViaVersion.api.type.Type; - -public class OptionalChatType extends Type { - public OptionalChatType() { - super(String.class); - } - - @Override - public String read(ByteBuf buffer) throws Exception { - boolean present = buffer.readBoolean(); - if (!present) return null; - return Type.STRING.read(buffer); - } - - @Override - public void write(ByteBuf buffer, String object) throws Exception { - if (object == null) { - buffer.writeBoolean(false); - } else { - buffer.writeBoolean(true); - Type.STRING.write(buffer, object); - } - } -} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalComponentType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalComponentType.java new file mode 100644 index 000000000..bd4ef8611 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/OptionalComponentType.java @@ -0,0 +1,28 @@ +package us.myles.ViaVersion.api.type.types.minecraft; + +import com.google.gson.JsonElement; +import io.netty.buffer.ByteBuf; +import us.myles.ViaVersion.api.type.Type; + +public class OptionalComponentType extends Type { + + public OptionalComponentType() { + super(JsonElement.class); + } + + @Override + public JsonElement read(ByteBuf buffer) throws Exception { + boolean present = buffer.readBoolean(); + return present ? Type.COMPONENT.read(buffer) : null; + } + + @Override + public void write(ByteBuf buffer, JsonElement object) throws Exception { + if (object == null) { + buffer.writeBoolean(false); + } else { + buffer.writeBoolean(true); + Type.COMPONENT.write(buffer, object); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java index 8b10749e2..cffe389dc 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_11to1_10/Protocol1_11To1_10.java @@ -150,12 +150,11 @@ public class Protocol1_11To1_10 extends Protocol= 2) + if (action >= 2) { wrapper.set(Type.VAR_INT, 0, action + 1); + } } }); - - } }); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java index 2a3eec570..5c73a9060 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java @@ -16,16 +16,15 @@ import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.rewriters.SoundRewriter; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_12; -import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; -import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.ServerboundPackets1_9_3; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.metadata.MetadataRewriter1_12To1_11_1; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.packets.InventoryPackets; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InventoryQuickMoveProvider; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.EntityTracker1_12; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types.Chunk1_9_3_4Type; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.ClientboundPackets1_9_3; +import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.ServerboundPackets1_9_3; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9To1_8; -import us.myles.ViaVersion.util.GsonUtil; public class Protocol1_12To1_11_1 extends Protocol { @@ -76,21 +75,18 @@ public class Protocol1_12To1_11_1 extends Protocol components = new ArrayList<>(); + public static JsonElement fromLegacyText(String message, ChatColor defaultColor) { + List components = new ArrayList<>(); StringBuilder builder = new StringBuilder(); TextComponent component = new TextComponent(); - Matcher matcher = url.matcher(message); + Matcher matcher = URL.matcher(message); for (int i = 0; i < message.length(); i++) { char c = message.charAt(i); @@ -110,56 +128,19 @@ public class ChatRewriter { component.setText(builder.toString()); components.add(component); - return components.toArray(new BaseComponent[0]); + final String serializedComponents = ComponentSerializer.toString(components.toArray(A)); + return GsonUtil.getJsonParser().parse(serializedComponents); } - public static String legacyTextToJson(String legacyText) { - return ComponentSerializer.toString(fromLegacyText(legacyText, ChatColor.WHITE)); + public static JsonElement legacyTextToJson(String legacyText) { + return fromLegacyText(legacyText, ChatColor.WHITE); } public static String jsonTextToLegacy(String value) { return TextComponent.toLegacyText(ComponentSerializer.parse(value)); } - public static String processTranslate(String value) { - BaseComponent[] components = ComponentSerializer.parse(value); - for (BaseComponent component : components) { - processTranslate(component); - } - if (components.length == 1) { - return ComponentSerializer.toString(components[0]); - } else { - return ComponentSerializer.toString(components); - } - } - - private static void processTranslate(BaseComponent component) { - if (component == null) return; - if (component instanceof TranslatableComponent) { - String oldTranslate = ((TranslatableComponent) component).getTranslate(); - String newTranslate; - newTranslate = MappingData.translateMapping.get(oldTranslate); - if (newTranslate == null) { - newTranslate = MappingData.mojangTranslation.get(oldTranslate); - } - if (newTranslate != null) { - ((TranslatableComponent) component).setTranslate(newTranslate); - } - if (((TranslatableComponent) component).getWith() != null) { - for (BaseComponent baseComponent : ((TranslatableComponent) component).getWith()) { - processTranslate(baseComponent); - } - } - } - if (component.getHoverEvent() != null) { - for (BaseComponent baseComponent : component.getHoverEvent().getValue()) { - processTranslate(baseComponent); - } - } - if (component.getExtra() != null) { - for (BaseComponent baseComponent : component.getExtra()) { - processTranslate(baseComponent); - } - } + public static void processTranslate(JsonElement value) { + COMPONENT_REWRITER.processText(value); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index f08ad02c5..9ee0f9088 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -154,13 +154,7 @@ public class Protocol1_13To1_12_2 extends Protocol ChatRewriter.processTranslate(wrapper.passthrough(Type.COMPONENT))); } }); @@ -258,7 +252,7 @@ public class Protocol1_13To1_12_2 extends Protocol ChatRewriter.processTranslate(wrapper.passthrough(Type.COMPONENT))); } }); registerOutgoing(ClientboundPackets1_12_1.TAB_COMPLETE, new PacketRemapper() { @@ -322,8 +310,7 @@ public class Protocol1_13To1_12_2 extends Protocol wrapper.set(Type.STRING, 1, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 1)))); + handler(wrapper -> ChatRewriter.processTranslate(wrapper.passthrough(Type.COMPONENT))); // Title } }); @@ -369,8 +356,7 @@ public class Protocol1_13To1_12_2 extends Protocol wrapper.set(Type.STRING, 0, ChatRewriter.processTranslate(wrapper.get(Type.STRING, 0)))); + handler(wrapper -> ChatRewriter.processTranslate(wrapper.passthrough(Type.COMPONENT))); } }); @@ -420,30 +406,6 @@ public class Protocol1_13To1_12_2 extends Protocol> 4; - wrapper.write(Type.VAR_INT, type); - wrapper.passthrough(Type.BYTE); // Icon X - wrapper.passthrough(Type.BYTE); // Icon Z - byte direction = (byte) (directionAndType & 0x0F); - wrapper.write(Type.BYTE, direction); - wrapper.write(Type.OPTIONAL_CHAT, null); // Display Name - } - } - }); - } - }); registerOutgoing(ClientboundPackets1_12_1.CRAFT_RECIPE_RESPONSE, new PacketRemapper() { @Override @@ -462,7 +424,31 @@ public class Protocol1_13To1_12_2 extends Protocol> 4; + wrapper.write(Type.VAR_INT, type); + wrapper.passthrough(Type.BYTE); // Icon X + wrapper.passthrough(Type.BYTE); // Icon Z + byte direction = (byte) (directionAndType & 0x0F); + wrapper.write(Type.BYTE, direction); + wrapper.write(Type.OPTIONAL_COMPONENT, null); // Display Name } } }); @@ -586,8 +572,7 @@ public class Protocol1_13To1_12_2 extends Protocol= 0 && action <= 2) { - wrapper.write(Type.STRING, ChatRewriter.processTranslate(wrapper.read(Type.STRING))); + ChatRewriter.processTranslate(wrapper.passthrough(Type.COMPONENT)); } } }); @@ -694,13 +678,11 @@ public class Protocol1_13To1_12_2 extends Protocol wrapper.write(Type.STRING, "MC|AutoCmd")); handler(POS_TO_3_INT); map(Type.STRING); // Command handler(new PacketHandler() { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java index 93bef93f3..7ad4d6998 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/packets/InventoryPackets.java @@ -304,11 +304,7 @@ public class InventoryPackets { if (display.get("Name") instanceof StringTag) { StringTag name = display.get("Name"); display.put(new StringTag(NBT_TAG_NAME + "|Name", name.getValue())); - name.setValue( - ChatRewriter.legacyTextToJson( - name.getValue() - ) - ); + name.setValue(ChatRewriter.legacyTextToJson(name.getValue()).toString()); } } // ench is now Enchantments and now uses identifiers diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/BannerHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/BannerHandler.java index 9f3c87af8..a8ca133f5 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/BannerHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/BannerHandler.java @@ -55,7 +55,7 @@ public class BannerHandler implements BlockEntityProvider.BlockEntityHandler { Tag name = tag.get("CustomName"); if (name instanceof StringTag) { - ((StringTag) name).setValue(ChatRewriter.legacyTextToJson(((StringTag) name).getValue())); + ((StringTag) name).setValue(ChatRewriter.legacyTextToJson(((StringTag) name).getValue()).toString()); } return blockId; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/CommandBlockHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/CommandBlockHandler.java index e49833bb3..3218b5721 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/CommandBlockHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/CommandBlockHandler.java @@ -3,20 +3,24 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.blockentiti import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; +import com.google.gson.JsonElement; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ChatRewriter; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.BlockEntityProvider; +import us.myles.ViaVersion.util.GsonUtil; public class CommandBlockHandler implements BlockEntityProvider.BlockEntityHandler { @Override public int transform(UserConnection user, CompoundTag tag) { Tag name = tag.get("CustomName"); if (name instanceof StringTag) { - ((StringTag) name).setValue(ChatRewriter.legacyTextToJson(((StringTag) name).getValue())); + ((StringTag) name).setValue(ChatRewriter.legacyTextToJson(((StringTag) name).getValue()).toString()); } Tag out = tag.get("LastOutput"); if (out instanceof StringTag) { - ((StringTag) out).setValue(ChatRewriter.processTranslate(((StringTag) out).getValue())); + JsonElement value = GsonUtil.getJsonParser().parse(((StringTag) out).getValue()); + ChatRewriter.processTranslate(value); + ((StringTag) out).setValue(value.toString()); } return -1; } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/InventoryNameRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/InventoryNameRewriter.java deleted file mode 100644 index 0d810f7c7..000000000 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/InventoryNameRewriter.java +++ /dev/null @@ -1,46 +0,0 @@ -package us.myles.ViaVersion.protocols.protocol1_14to1_13_2; - -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TranslatableComponent; -import net.md_5.bungee.chat.ComponentSerializer; - -public class InventoryNameRewriter { - public static String processTranslate(String value) { - BaseComponent[] components = ComponentSerializer.parse(value); - for (BaseComponent component : components) { - processTranslate(component); - } - if (components.length == 1) { - return ComponentSerializer.toString(components[0]); - } else { - return ComponentSerializer.toString(components); - } - } - - private static void processTranslate(BaseComponent component) { - if (component == null) return; - if (component instanceof TranslatableComponent) { - String oldTranslate = ((TranslatableComponent) component).getTranslate(); - - // Mojang decided to remove .name from inventory titles - if (oldTranslate.startsWith("block.") && oldTranslate.endsWith(".name")) { - ((TranslatableComponent) component).setTranslate(oldTranslate.substring(0, oldTranslate.length() - 5)); - } - if (((TranslatableComponent) component).getWith() != null) { - for (BaseComponent baseComponent : ((TranslatableComponent) component).getWith()) { - processTranslate(baseComponent); - } - } - } - if (component.getHoverEvent() != null) { - for (BaseComponent baseComponent : component.getHoverEvent().getValue()) { - processTranslate(baseComponent); - } - } - if (component.getExtra() != null) { - for (BaseComponent baseComponent : component.getExtra()) { - processTranslate(baseComponent); - } - } - } -} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java index 9e6b7b570..293f6c714 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java @@ -7,17 +7,19 @@ import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.google.common.collect.Sets; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; +import us.myles.ViaVersion.api.rewriters.ComponentRewriter; import us.myles.ViaVersion.api.rewriters.ItemRewriter; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ChatRewriter; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13; -import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.InventoryNameRewriter; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.ServerboundPackets1_14; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.MappingData; @@ -29,6 +31,16 @@ import java.util.concurrent.ThreadLocalRandom; public class InventoryPackets { private static final String NBT_TAG_NAME = "ViaVersion|" + Protocol1_14To1_13_2.class.getSimpleName(); private static final Set REMOVED_RECIPE_TYPES = Sets.newHashSet("crafting_special_banneraddpattern", "crafting_special_repairitem"); + private static final ComponentRewriter COMPONENT_REWRITER = new ComponentRewriter() { + @Override + protected void handleTranslate(JsonObject object, String translate) { + super.handleTranslate(object, translate); + // Mojang decided to remove .name from inventory titles + if (translate.startsWith("block.") && translate.endsWith(".name")) { + object.addProperty("translate", translate.substring(0, translate.length() - 5)); + } + } + }; public static void register(Protocol protocol) { ItemRewriter itemRewriter = new ItemRewriter(protocol, InventoryPackets::toClient, InventoryPackets::toServer); @@ -43,10 +55,10 @@ public class InventoryPackets { public void handle(PacketWrapper wrapper) throws Exception { Short windowsId = wrapper.read(Type.UNSIGNED_BYTE); String type = wrapper.read(Type.STRING); - String title = InventoryNameRewriter.processTranslate(wrapper.read(Type.STRING)); + JsonElement title = wrapper.read(Type.COMPONENT); + COMPONENT_REWRITER.processText(title); Short slots = wrapper.read(Type.UNSIGNED_BYTE); - if (type.equals("EntityHorse")) { wrapper.setId(0x1F); int entityId = wrapper.read(Type.INT); @@ -101,7 +113,7 @@ public class InventoryPackets { } wrapper.write(Type.VAR_INT, typeId); - wrapper.write(Type.COMPONENT_STRING, title); + wrapper.write(Type.COMPONENT, title); } } }); @@ -258,11 +270,7 @@ public class InventoryPackets { display.put(ConverterRegistry.convertToTag(NBT_TAG_NAME + "|Lore", ConverterRegistry.convertToValue(lore))); for (Tag loreEntry : lore) { if (loreEntry instanceof StringTag) { - ((StringTag) loreEntry).setValue( - ChatRewriter.legacyTextToJson( - ((StringTag) loreEntry).getValue() - ) - ); + ((StringTag) loreEntry).setValue(ChatRewriter.legacyTextToJson(((StringTag) loreEntry).getValue()).toString()); } } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java index 403c67f9f..d96bbd12b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java @@ -100,7 +100,7 @@ public class Protocol1_16To1_15_2 extends Protocol wrapper.write(Type.UUID, ZERO_UUID)); // sender uuid } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java index 4fb84e267..e21a8d11c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/packets/InventoryPackets.java @@ -27,7 +27,7 @@ public class InventoryPackets { public void registerMap() { map(Type.VAR_INT); map(Type.VAR_INT); - map(Type.COMPONENT_STRING); + map(Type.COMPONENT); handler(wrapper -> { int windowType = wrapper.get(Type.VAR_INT, 1); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3To1_9_1_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3To1_9_1_2.java index 58b82a7af..6aa668c1b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3To1_9_1_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9_3to1_9_1_2/Protocol1_9_3To1_9_1_2.java @@ -3,6 +3,7 @@ package us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.google.gson.JsonElement; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; @@ -37,9 +38,10 @@ public class Protocol1_9_3To1_9_1_2 extends ProtocolsingletonList(new StringTag(Protocol1_9To1_8.fixJson("")))); + pages = new ListTag("pages", Collections.singletonList(new StringTag(Protocol1_9To1_8.fixJson("").toString()))); tag.put(pages); item.setTag(tag); return; @@ -273,7 +273,7 @@ public class ItemRewriter { if (!(pages.get(i) instanceof StringTag)) continue; StringTag page = pages.get(i); - page.setValue(Protocol1_9To1_8.fixJson(page.getValue())); + page.setValue(Protocol1_9To1_8.fixJson(page.getValue()).toString()); } item.setTag(tag); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java index 91eabf123..1325aba2d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9To1_8.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.protocols.protocol1_9to1_8; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; @@ -14,17 +15,32 @@ import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_8.ClientboundPackets1_8; import us.myles.ViaVersion.protocols.protocol1_8.ServerboundPackets1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter1_9To1_8; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.*; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.*; -import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.*; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.EntityPackets; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.InventoryPackets; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.PlayerPackets; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.SpawnPackets; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.packets.WorldPackets; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BossBarProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.CommandBlockProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.EntityIdProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MainHandProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.ClientChunks; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.CommandBlockStorage; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker1_9; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.InventoryTracker; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.MovementTracker; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.PlaceBlockTracker; import us.myles.ViaVersion.util.GsonUtil; import java.util.List; public class Protocol1_9To1_8 extends Protocol { - public static final ValueTransformer FIX_JSON = new ValueTransformer(Type.STRING) { + public static final ValueTransformer FIX_JSON = new ValueTransformer(Type.COMPONENT) { @Override - public String transform(PacketWrapper wrapper, String line) { + public JsonElement transform(PacketWrapper wrapper, String line) { return fixJson(line); } }; @@ -33,7 +49,7 @@ public class Protocol1_9To1_8 extends Protocol Date: Sat, 27 Jun 2020 16:56:57 +0200 Subject: [PATCH 2/2] Rename some A's --- .../protocols/protocol1_13to1_12_2/ChatRewriter.java | 4 ++-- .../protocol1_13to1_12_2/blockconnections/ConnectionData.java | 4 ++-- .../protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java | 4 ++-- .../protocols/protocol1_16to1_15_2/types/Chunk1_16Type.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java index 69811c74e..394b793b7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/ChatRewriter.java @@ -18,7 +18,7 @@ import java.util.regex.Pattern; public class ChatRewriter { private static final Pattern URL = Pattern.compile("^(?:(https?)://)?([-\\w_.]{2,}\\.[a-z]{2,4})(/\\S*)?$"); - private static final BaseComponent[] A = new BaseComponent[0]; + private static final BaseComponent[] EMPTY_COMPONENTS = new BaseComponent[0]; private static final ComponentRewriter COMPONENT_REWRITER = new ComponentRewriter() { @Override protected void handleTranslate(JsonObject object, String translate) { @@ -128,7 +128,7 @@ public class ChatRewriter { component.setText(builder.toString()); components.add(component); - final String serializedComponents = ComponentSerializer.toString(components.toArray(A)); + final String serializedComponents = ComponentSerializer.toString(components.toArray(EMPTY_COMPONENTS)); return GsonUtil.getJsonParser().parse(serializedComponents); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java index ca987d257..80940ba8b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java @@ -29,7 +29,7 @@ import java.util.Map; import java.util.Map.Entry; public class ConnectionData { - private static final BlockChangeRecord[] A = new BlockChangeRecord[0]; + private static final BlockChangeRecord[] EMPTY_RECORDS = new BlockChangeRecord[0]; public static BlockConnectionProvider blockConnectionProvider; static Int2ObjectMap idToKey = new Int2ObjectOpenHashMap<>(8582, 1F); static Map keyToId = new HashMap<>(8582, 1F); @@ -121,7 +121,7 @@ public class ConnectionData { PacketWrapper wrapper = new PacketWrapper(0x0F, null, user); wrapper.write(Type.INT, chunkX + chunkDeltaX); wrapper.write(Type.INT, chunkZ + chunkDeltaZ); - wrapper.write(Type.BLOCK_CHANGE_RECORD_ARRAY, updates.toArray(A)); + wrapper.write(Type.BLOCK_CHANGE_RECORD_ARRAY, updates.toArray(EMPTY_RECORDS)); try { wrapper.send(Protocol1_13To1_12_2.class, true, true); } catch (Exception e) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java index a25767794..176f8c839 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/types/Chunk1_15Type.java @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.List; public class Chunk1_15Type extends PartialType { - private static final CompoundTag[] A = new CompoundTag[0]; + private static final CompoundTag[] EMPTY_COMPOUNDS = new CompoundTag[0]; public Chunk1_15Type(ClientWorld param) { super(param, Chunk.class); @@ -98,7 +98,7 @@ public class Chunk1_15Type extends PartialType { } // Write Block Entities - Type.NBT_ARRAY.write(output, chunk.getBlockEntities().toArray(A)); + Type.NBT_ARRAY.write(output, chunk.getBlockEntities().toArray(EMPTY_COMPOUNDS)); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/types/Chunk1_16Type.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/types/Chunk1_16Type.java index fdf5abafe..0ea8f25ce 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/types/Chunk1_16Type.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/types/Chunk1_16Type.java @@ -17,7 +17,7 @@ import java.util.Arrays; import java.util.List; public class Chunk1_16Type extends PartialType { - private static final CompoundTag[] A = new CompoundTag[0]; + private static final CompoundTag[] EMPTY_COMPOUNDS = new CompoundTag[0]; public Chunk1_16Type(ClientWorld param) { super(param, Chunk.class); @@ -100,7 +100,7 @@ public class Chunk1_16Type extends PartialType { } // Write Block Entities - Type.NBT_ARRAY.write(output, chunk.getBlockEntities().toArray(A)); + Type.NBT_ARRAY.write(output, chunk.getBlockEntities().toArray(EMPTY_COMPOUNDS)); } @Override