From b00ae1b701e9d838a25cc364837e0425470af4e6 Mon Sep 17 00:00:00 2001 From: KennyTV <28825609+KennyTV@users.noreply.github.com> Date: Thu, 16 Jan 2020 11:09:26 +0100 Subject: [PATCH] Handle 1.13->1.12.2 translatable key changes --- .../api/rewriters/SoundRewriter.java | 21 ++-- .../Protocol1_12_2To1_13.java | 95 +++++++++++++++++-- .../TranslationRewriter.java | 45 +++++++++ .../data/BackwardsMappings.java | 5 + 4 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/TranslationRewriter.java diff --git a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/SoundRewriter.java b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/SoundRewriter.java index 45d0ab32..ac625be2 100644 --- a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/SoundRewriter.java +++ b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/SoundRewriter.java @@ -14,11 +14,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import nl.matsv.viabackwards.api.BackwardsProtocol; +import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; public abstract class SoundRewriter extends Rewriter { - private Map soundRewrites = new ConcurrentHashMap<>(); + private final Map soundRewrites = new HashMap<>(); public SoundData added(int id, int replacement) { return added(id, replacement, -1); @@ -38,8 +38,9 @@ public abstract class SoundRewriter extends Rewrite public int handleSounds(int soundId) { int newSoundId = soundId; - if (soundRewrites.containsKey(soundId)) - return soundRewrites.get(soundId).getReplacementSound(); + SoundData data = soundRewrites.get(soundId); + if (data != null) return data.getReplacementSound(); + for (Map.Entry entry : soundRewrites.entrySet()) { if (soundId > entry.getKey()) { if (entry.getValue().isAdded()) { @@ -53,20 +54,18 @@ public abstract class SoundRewriter extends Rewrite } public boolean hasPitch(int soundId) { - if (soundRewrites.containsKey(soundId)) - return soundRewrites.get(soundId).isChangePitch(); - return false; + SoundData data = soundRewrites.get(soundId); + return data != null && data.isChangePitch(); } public float handlePitch(int soundId) { - if (soundRewrites.containsKey(soundId)) - return soundRewrites.get(soundId).getNewPitch(); - return 1f; + SoundData data = soundRewrites.get(soundId); + return data != null ? data.getNewPitch() : 1F; } @Data @AllArgsConstructor - public class SoundData { + public static class SoundData { private int replacementSound; private boolean changePitch = false; private float newPitch = 1f; diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java index 00f06a68..daf0b896 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/Protocol1_12_2To1_13.java @@ -28,6 +28,7 @@ import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.remapper.PacketRemapper; +import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -50,13 +51,10 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol { // Thanks to https://wiki.vg/index.php?title=Pre-release_protocol&oldid=14150 - out(State.PLAY, 0x0E, 0x0F); // Chat Message (clientbound) out(State.PLAY, 0x11, -1, cancel()); // Declare Commands TODO NEW out(State.PLAY, 0x12, 0x11); // Confirm Transaction (clientbound) out(State.PLAY, 0x13, 0x12); // Close Window (clientbound) - out(State.PLAY, 0x14, 0x13); // Open Window out(State.PLAY, 0x16, 0x15); // Window Property - out(State.PLAY, 0x1B, 0x1A); // Disconnect (play) out(State.PLAY, 0x1C, 0x1B); // Entity Status out(State.PLAY, 0x1D, -1, cancel()); // NBT Query Response (client won't send a request, so the server should not answer) out(State.PLAY, 0x1E, 0x1C); // Explosion @@ -71,7 +69,6 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol { out(State.PLAY, 0x2C, 0x2A); // Open Sign Editor out(State.PLAY, 0x2D, 0x2B, cancel()); // Craft Recipe Response TODO MODIFIED out(State.PLAY, 0x2E, 0x2C); // Player Abilities (clientbound) - out(State.PLAY, 0x2F, 0x2D); // Combat Event out(State.PLAY, 0x33, 0x30); // Use Bed out(State.PLAY, 0x34, 0x31, cancel()); // Unlock Recipes TODO MODIFIED out(State.PLAY, 0x36, 0x33); // Remove Entity Effect @@ -90,8 +87,6 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol { out(State.PLAY, 0x48, 0x45); // Update Score out(State.PLAY, 0x49, 0x46); // Spawn Position out(State.PLAY, 0x4A, 0x47); // Time Update - out(State.PLAY, 0x4B, 0x48); // Title - out(State.PLAY, 0x4E, 0x4A); // Player List Header And Footer out(State.PLAY, 0x4F, 0x4B); // Collect Item out(State.PLAY, 0x50, 0x4C); // Entity Teleport out(State.PLAY, 0x51, 0x4D, cancel()); // Advancements @@ -124,6 +119,94 @@ public class Protocol1_12_2To1_13 extends BackwardsProtocol { in(State.PLAY, 0x28, 0x1E); // Spectate in(State.PLAY, 0x29, 0x1F); // Player Block Placement in(State.PLAY, 0x2A, 0x20); // Use Item + + // Handle translation key changes + + out(State.LOGIN, 0x00, 0x00, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING)))); + } + }); + + // Bossbar + out(State.LOGIN, 0x0C, 0x0C, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.UUID); + map(Type.VAR_INT); + handler(wrapper -> { + int action = wrapper.get(Type.VAR_INT, 0); + if (action == 0 || action == 3) { + wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING))); + } + }); + } + }); + + // Chat Message + out(State.PLAY, 0x0E, 0x0F, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING)))); + } + }); + + // Open Window + out(State.PLAY, 0x14, 0x13, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.UNSIGNED_BYTE); // Id + map(Type.STRING); // Window Type + handler(wrapper -> wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING)))); + } + }); + + // Disconnect + out(State.PLAY, 0x1B, 0x1A, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING)))); + } + }); + + // Combat Event + out(State.PLAY, 0x2F, 0x2D, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + if (wrapper.passthrough(Type.VAR_INT) == 2) { + wrapper.passthrough(Type.VAR_INT); + wrapper.passthrough(Type.INT); + wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING))); + } + }); + } + }); + + // Title + out(State.PLAY, 0x4B, 0x48, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + int action = wrapper.passthrough(Type.VAR_INT); + if (action >= 0 && action <= 2) { + wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING))); + } + }); + } + }); + + // Player List Header And Footer + out(State.PLAY, 0x4E, 0x4A, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING))); + wrapper.write(Type.STRING, TranslationRewriter.processTranslate(wrapper.read(Type.STRING))); + }); + } + }); } @Override diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/TranslationRewriter.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/TranslationRewriter.java new file mode 100644 index 00000000..c526c6de --- /dev/null +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/TranslationRewriter.java @@ -0,0 +1,45 @@ +package nl.matsv.viabackwards.protocol.protocol1_12_2to1_13; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import nl.matsv.viabackwards.protocol.protocol1_12_2to1_13.data.BackwardsMappings; + +// Slightly changed methods of the ChatRewriter +public class TranslationRewriter { + + public static String processTranslate(String value) { + BaseComponent[] components = ComponentSerializer.parse(value); + for (BaseComponent component : components) { + processTranslate(component); + } + return components.length == 1 ? ComponentSerializer.toString(components[0]) : ComponentSerializer.toString(components); + } + + private static void processTranslate(BaseComponent component) { + if (component == null) return; + if (component instanceof TranslatableComponent) { + TranslatableComponent translatableComponent = (TranslatableComponent) component; + String oldTranslate = translatableComponent.getTranslate(); + String newTranslate = BackwardsMappings.translateMappings.get(oldTranslate); + if (newTranslate != null) { + translatableComponent.setTranslate(newTranslate); + } + if (translatableComponent.getWith() != null) { + for (BaseComponent baseComponent : translatableComponent.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/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java index fc28664b..e269f9f8 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_12_2to1_13/data/BackwardsMappings.java @@ -16,6 +16,7 @@ import nl.matsv.viabackwards.api.data.VBMappings; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.MappingDataLoader; import us.myles.ViaVersion.api.data.Mappings; +import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.StatisticMappings; import us.myles.viaversion.libs.gson.JsonElement; import us.myles.viaversion.libs.gson.JsonObject; @@ -27,6 +28,7 @@ import java.util.Map; public class BackwardsMappings { public static final Map statisticMappings = new HashMap<>(); + public static final Map translateMappings = new HashMap<>(); public static BlockMappingsShortArray blockMappings; public static Mappings soundMappings; @@ -43,6 +45,9 @@ public class BackwardsMappings { for (Map.Entry entry : StatisticMappings.statistics.entrySet()) { statisticMappings.put(entry.getValue(), entry.getKey()); } + for (Map.Entry entry : MappingData.translateMapping.entrySet()) { + translateMappings.put(entry.getValue(), entry.getKey()); + } } // Has lots of compat layers, so we can't use the default Via method