diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java index fa6098658..b070deb9c 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingData.java @@ -22,6 +22,8 @@ */ package com.viaversion.viaversion.api.data; +import org.checkerframework.checker.nullness.qual.Nullable; + public interface FullMappingData { Mappings mappings(); @@ -41,4 +43,28 @@ public interface FullMappingData { * @return mapped int id, or -1 if not found */ int mappedId(String mappedIdentifier); + + /** + * Returns the unmapped string identifier for the given mapped id. + * + * @param id unmapped id + * @return unmapped string identifier + */ + String identifier(int id); + + /** + * Returns the mapped string identifier for the given mapped id. + * + * @param mappedId mapped id + * @return mapped string identifier + */ + String mappedIdentifier(int mappedId); + + /** + * Returns the mapped string identifier for the given unmapped identifier. + * + * @param identifier unmapped identifier + * @return mapped string identifier, or null if not found + */ + @Nullable String mappedIdentifier(String identifier); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java index 29ffc2677..ef3ef44c7 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java +++ b/api/src/main/java/com/viaversion/viaversion/api/data/FullMappingDataBase.java @@ -24,10 +24,13 @@ package com.viaversion.viaversion.api.data; import com.google.gson.JsonArray; import it.unimi.dsi.fastutil.objects.Object2IntMap; +import org.checkerframework.checker.nullness.qual.Nullable; public class FullMappingDataBase implements FullMappingData { private final Object2IntMap stringToId; private final Object2IntMap mappedStringToId; + private final String[] idToString; + private final String[] mappedIdToString; private final Mappings mappings; public FullMappingDataBase(final JsonArray oldMappings, final JsonArray newMappings, final Mappings mappings) { @@ -36,6 +39,16 @@ public class FullMappingDataBase implements FullMappingData { mappedStringToId = MappingDataLoader.arrayToMap(newMappings); stringToId.defaultReturnValue(-1); mappedStringToId.defaultReturnValue(-1); + + idToString = new String[oldMappings.size()]; + for (int i = 0; i < oldMappings.size(); i++) { + idToString[i] = oldMappings.get(i).getAsString(); + } + + mappedIdToString = new String[newMappings.size()]; + for (int i = 0; i < newMappings.size(); i++) { + mappedIdToString[i] = newMappings.get(i).getAsString(); + } } @Override @@ -52,4 +65,25 @@ public class FullMappingDataBase implements FullMappingData { public int mappedId(final String mappedIdentifier) { return mappedStringToId.getInt(mappedIdentifier); } + + @Override + public String identifier(final int id) { + return idToString[id]; + } + + @Override + public String mappedIdentifier(final int mappedId) { + return mappedIdToString[mappedId]; + } + + @Override + public @Nullable String mappedIdentifier(final String identifier) { + final int id = id(identifier); + if (id == -1) { + return null; + } + + final int mappedId = mappings.getNewId(id); + return mappedId != -1 ? mappedIdentifier(mappedId) : null; + } } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/data/CommandRewriter1_14.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/data/CommandRewriter1_14.java index 924ee20ac..59bbad43d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/data/CommandRewriter1_14.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_14to1_13_2/data/CommandRewriter1_14.java @@ -28,7 +28,7 @@ public class CommandRewriter1_14 extends CommandRewriter { } @Override - protected @Nullable String handleArgumentType(String argumentType) { + public @Nullable String handleArgumentType(String argumentType) { if (argumentType.equals("minecraft:nbt")) { return "minecraft:nbt_compound_tag"; } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java index c85faa13e..7ba9fc6ce 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_19to1_18_2/packets/EntityPackets.java @@ -47,6 +47,7 @@ import java.util.Map; public final class EntityPackets extends EntityRewriter { + //TODO move to compressed nbt file private static final String CHAT_REGISTRY_SNBT = "{\n" + " \"minecraft:chat_type\":{\n" + " \"type\":\"minecraft:chat_type\",\n" + diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java index b05ba840b..a9498f937 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/CommandRewriter.java @@ -122,13 +122,57 @@ public class CommandRewriter { }); } + public void registerDeclareCommands1_19(ClientboundPacketType packetType) { + protocol.registerClientbound(packetType, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + int size = wrapper.passthrough(Type.VAR_INT); + for (int i = 0; i < size; i++) { + byte flags = wrapper.passthrough(Type.BYTE); + wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); // Children indices + if ((flags & 0x08) != 0) { + wrapper.passthrough(Type.VAR_INT); // Redirect node index + } + + byte nodeType = (byte) (flags & 0x03); + if (nodeType == 1 || nodeType == 2) { // Literal/argument node + wrapper.passthrough(Type.STRING); // Name + } + + if (nodeType == 2) { // Argument node + int argumentTypeId = wrapper.read(Type.VAR_INT); + String argumentType = protocol.getMappingData().getArgumentTypeMappings().identifier(argumentTypeId); + String newArgumentType = handleArgumentType(argumentType); + if (newArgumentType != null) { + wrapper.write(Type.VAR_INT, protocol.getMappingData().getArgumentTypeMappings().mappedId(newArgumentType)); + } + + // Always call the handler using the previous name + handleArgument(wrapper, argumentType); + } + + if ((flags & 0x10) != 0) { + wrapper.passthrough(Type.STRING); // Suggestion type + } + } + + wrapper.passthrough(Type.VAR_INT); // Root node index + }); + } + }); + } + /** * Can be overridden if needed. * * @param argumentType argument type * @return new argument type, or null if it should be removed */ - protected @Nullable String handleArgumentType(String argumentType) { + public @Nullable String handleArgumentType(String argumentType) { + if (protocol.getMappingData().getArgumentTypeMappings() != null) { + return protocol.getMappingData().getArgumentTypeMappings().mappedIdentifier(argumentType); + } return argumentType; } diff --git a/common/src/main/resources/assets/viaversion/data/mappingdiff-1.18to1.19.json b/common/src/main/resources/assets/viaversion/data/mappingdiff-1.18to1.19.json index 69b5c62f4..5bffd85b6 100644 --- a/common/src/main/resources/assets/viaversion/data/mappingdiff-1.18to1.19.json +++ b/common/src/main/resources/assets/viaversion/data/mappingdiff-1.18to1.19.json @@ -112,7 +112,6 @@ "257": "minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=false]", "258": "minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]", "259": "minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=false]", - "1416": "minecraft:piston_head[type=normal,facing=north,short=true]", "1417": "minecraft:piston_head[type=sticky,facing=north,short=true]", "1418": "minecraft:piston_head[type=normal,facing=north,short=false]",