diff --git a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriterBase.java b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriterBase.java index 6f5221de..12ede7fe 100644 --- a/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriterBase.java +++ b/core/src/main/java/nl/matsv/viabackwards/api/rewriters/EntityRewriterBase.java @@ -224,8 +224,8 @@ public abstract class EntityRewriterBase extends Re /** * Helper method to handle player, painting, or xp orb trackers without meta changes. */ - protected void registerExtraTracker(int packetId, EntityType entityType, Type intType) { - getProtocol().registerOutgoing(State.PLAY, packetId, packetId, new PacketRemapper() { + protected void registerExtraTracker(int oldId, int newId, EntityType entityType, Type intType) { + getProtocol().registerOutgoing(State.PLAY, oldId, newId, new PacketRemapper() { @Override public void registerMap() { map(intType); // 0 - Entity id @@ -234,6 +234,14 @@ public abstract class EntityRewriterBase extends Re }); } + protected void registerExtraTracker(int packetId, EntityType entityType, Type intType) { + registerExtraTracker(packetId, packetId, entityType, intType); + } + + protected void registerExtraTracker(int oldId, int newId, EntityType entityType) { + registerExtraTracker(oldId, newId, entityType, Type.VAR_INT); + } + protected void registerExtraTracker(int packetId, EntityType entityType) { registerExtraTracker(packetId, entityType, Type.VAR_INT); } diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/Protocol1_15_2To1_16.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/Protocol1_15_2To1_16.java index 9732eead..10b7b363 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/Protocol1_15_2To1_16.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/Protocol1_15_2To1_16.java @@ -30,11 +30,11 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { executeAsyncAfterLoaded(Protocol1_16To1_15_2.class, BackwardsMappings::init); translatableRewriter = new TranslatableRewriter1_16(this); - translatableRewriter.registerBossBar(0x0D, 0x0D); - translatableRewriter.registerCombatEvent(0x33, 0x33); - translatableRewriter.registerDisconnect(0x1B, 0x1B); - translatableRewriter.registerPlayerList(0x54, 0x54); - translatableRewriter.registerTitle(0x50, 0x50); + translatableRewriter.registerBossBar(0x0C, 0x0D); + translatableRewriter.registerCombatEvent(0x32, 0x33); + translatableRewriter.registerDisconnect(0x1A, 0x1B); + translatableRewriter.registerPlayerList(0x53, 0x54); + translatableRewriter.registerTitle(0x4F, 0x50); translatableRewriter.registerPing(); (blockItemPackets = new BlockItemPackets1_16(this, translatableRewriter)).register(); @@ -42,7 +42,7 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { entityPackets.register(); // Chat Message - registerOutgoing(State.PLAY, 0x0F, 0x0F, new PacketRemapper() { + registerOutgoing(State.PLAY, 0x0E, 0x0F, new PacketRemapper() { @Override public void registerMap() { handler(wrapper -> wrapper.write(Type.STRING, translatableRewriter.processText(wrapper.read(Type.STRING)))); @@ -52,7 +52,7 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { }); // Open Window - registerOutgoing(State.PLAY, 0x2F, 0x2F, new PacketRemapper() { + registerOutgoing(State.PLAY, 0x2E, 0x2F, new PacketRemapper() { @Override public void registerMap() { map(Type.VAR_INT); // Window Id @@ -71,10 +71,10 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { SoundRewriter soundRewriter = new SoundRewriter(this, id -> BackwardsMappings.soundMappings.getNewId(id), stringId -> BackwardsMappings.soundMappings.getNewId(stringId)); - soundRewriter.registerSound(0x51, 0x51); - soundRewriter.registerSound(0x52, 0x52); - soundRewriter.registerNamedSound(0x1A, 0x1A); - soundRewriter.registerStopSound(0x53, 0x53); + soundRewriter.registerSound(0x50, 0x51); + soundRewriter.registerSound(0x51, 0x52); + soundRewriter.registerNamedSound(0x10, 0x1A); + soundRewriter.registerStopSound(0x52, 0x53); // Login success registerOutgoing(State.LOGIN, 0x02, 0x02, new PacketRemapper() { @@ -89,7 +89,7 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { }); // Advancements - registerOutgoing(State.PLAY, 0x58, 0x58, new PacketRemapper() { + registerOutgoing(State.PLAY, 0x57, 0x58, new PacketRemapper() { @Override public void registerMap() { handler(wrapper -> { @@ -129,18 +129,54 @@ public class Protocol1_15_2To1_16 extends BackwardsProtocol { new TagRewriter(this, id -> BackwardsMappings.blockMappings.getNewId(id), id -> { Integer oldId = MappingData.oldToNewItems.inverse().get(id); return oldId != null ? oldId : -1; - }, entityPackets::getOldEntityId).register(0x5C, 0x5C); + }, entityPackets::getOldEntityId).register(0x5B, 0x5C); - registerOutgoing(State.PLAY, 0x43, 0x4E); - registerOutgoing(State.PLAY, 0x44, 0x43); - registerOutgoing(State.PLAY, 0x46, 0x45); - registerOutgoing(State.PLAY, 0x47, 0x46); - registerOutgoing(State.PLAY, 0x49, 0x48); - registerOutgoing(State.PLAY, 0x4A, 0x49); - registerOutgoing(State.PLAY, 0x4B, 0x4A); - registerOutgoing(State.PLAY, 0x4C, 0x4B); - registerOutgoing(State.PLAY, 0x4D, 0x4C); - registerOutgoing(State.PLAY, 0x4E, 0x4D); + registerOutgoing(State.PLAY, 0x05, 0x06); + registerOutgoing(State.PLAY, 0x06, 0x07); + registerOutgoing(State.PLAY, 0x08, 0x09); + registerOutgoing(State.PLAY, 0x09, 0x0A); + registerOutgoing(State.PLAY, 0x0D, 0x0E); + registerOutgoing(State.PLAY, 0x11, 0x12); + registerOutgoing(State.PLAY, 0x12, 0x13); + registerOutgoing(State.PLAY, 0x13, 0x14); + registerOutgoing(State.PLAY, 0x18, 0x19); + registerOutgoing(State.PLAY, 0x19, 0x1A); + registerOutgoing(State.PLAY, 0x1B, 0x1C); + registerOutgoing(State.PLAY, 0x1C, 0x1D); + registerOutgoing(State.PLAY, 0x1D, 0x1E); + registerOutgoing(State.PLAY, 0x1E, 0x1F); + registerOutgoing(State.PLAY, 0x1F, 0x20); + registerOutgoing(State.PLAY, 0x20, 0x21); + registerOutgoing(State.PLAY, 0x24, 0x25); + registerOutgoing(State.PLAY, 0x26, 0x27); + registerOutgoing(State.PLAY, 0x28, 0x29); + registerOutgoing(State.PLAY, 0x29, 0x2A); + registerOutgoing(State.PLAY, 0x2A, 0x2B); + registerOutgoing(State.PLAY, 0x2B, 0x2C); + registerOutgoing(State.PLAY, 0x2C, 0x2D); + registerOutgoing(State.PLAY, 0x2D, 0x2E); + registerOutgoing(State.PLAY, 0x2F, 0x30); + registerOutgoing(State.PLAY, 0x30, 0x31); + registerOutgoing(State.PLAY, 0x31, 0x32); + registerOutgoing(State.PLAY, 0x33, 0x34); + registerOutgoing(State.PLAY, 0x34, 0x35); + registerOutgoing(State.PLAY, 0x35, 0x36); + registerOutgoing(State.PLAY, 0x36, 0x37); + registerOutgoing(State.PLAY, 0x38, 0x39); + registerOutgoing(State.PLAY, 0x39, 0x3A); + registerOutgoing(State.PLAY, 0x3B, 0x3C); + registerOutgoing(State.PLAY, 0x3C, 0x3D); + registerOutgoing(State.PLAY, 0x3D, 0x3E); + registerOutgoing(State.PLAY, 0x3E, 0x3F); + registerOutgoing(State.PLAY, 0x3F, 0x40); + registerOutgoing(State.PLAY, 0x40, 0x41); + registerOutgoing(State.PLAY, 0x41, 0x42); + registerOutgoing(State.PLAY, 0x42, 0x4E); + registerOutgoing(State.PLAY, 0x4E, 0x4F); + registerOutgoing(State.PLAY, 0x54, 0x55); + registerOutgoing(State.PLAY, 0x55, 0x56); + registerOutgoing(State.PLAY, 0x56, 0x57); + registerOutgoing(State.PLAY, 0x59, 0x5A); cancelIncoming(State.PLAY, 0x27); // Set jigsaw registerIncoming(State.PLAY, 0x10, 0x0F); diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/chat/TagSerializer.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/chat/TagSerializer.java index 92b386d7..1478e5e6 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/chat/TagSerializer.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/chat/TagSerializer.java @@ -1,8 +1,13 @@ package nl.matsv.viabackwards.protocol.protocol1_15_2to1_16.chat; import com.google.common.base.Preconditions; +import us.myles.viaversion.libs.gson.JsonArray; import us.myles.viaversion.libs.gson.JsonElement; import us.myles.viaversion.libs.gson.JsonObject; +import us.myles.viaversion.libs.gson.JsonPrimitive; +import us.myles.viaversion.libs.opennbt.tag.builtin.CompoundTag; +import us.myles.viaversion.libs.opennbt.tag.builtin.ListTag; +import us.myles.viaversion.libs.opennbt.tag.builtin.Tag; import java.util.Map; import java.util.regex.Pattern; @@ -28,6 +33,32 @@ public class TagSerializer { return builder.append('}').toString(); } + /** + * Utility method to convert a CompoundTag to a JsonObject, helpful for debugging. + */ + public static JsonObject toJson(CompoundTag tag) { + JsonObject object = new JsonObject(); + for (Map.Entry entry : tag.getValue().entrySet()) { + object.add(entry.getKey(), toJson(entry.getValue())); + } + return object; + } + + private static JsonElement toJson(Tag tag) { + if (tag instanceof CompoundTag) { + return toJson((CompoundTag) tag); + } else if (tag instanceof ListTag) { + ListTag list = (ListTag) tag; + JsonArray array = new JsonArray(); + for (Tag listEntry : list) { + array.add(toJson(listEntry)); + } + return array; + } else { + return new JsonPrimitive(tag.getValue().toString()); + } + } + public static String escape(String s) { if (PLAIN_TEXT.matcher(s).matches()) return s; diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/data/RecipeRewriter1_16.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/data/RecipeRewriter1_16.java new file mode 100644 index 00000000..8858954b --- /dev/null +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/data/RecipeRewriter1_16.java @@ -0,0 +1,84 @@ +package nl.matsv.viabackwards.protocol.protocol1_15_2to1_16.data; + +import nl.matsv.viabackwards.api.rewriters.ItemRewriterBase; +import nl.matsv.viabackwards.protocol.protocol1_14_4to1_15.data.RecipeRewriter1_15; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.minecraft.item.Item; +import us.myles.ViaVersion.api.remapper.PacketRemapper; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.packets.State; + +public class RecipeRewriter1_16 extends RecipeRewriter1_15 { + + public RecipeRewriter1_16(ItemRewriterBase rewriter) { + super(rewriter); + } + + public void register(int oldId, int newId) { + // Remove new smithing type, only in this handler + rewriter.getProtocol().registerOutgoing(State.PLAY, oldId, newId, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> { + int size = wrapper.passthrough(Type.VAR_INT); + int newSize = size; + for (int i = 0; i < size; i++) { + String originalType = wrapper.read(Type.STRING); + String type = originalType.replace("minecraft:", ""); + if (type.equals("smithing")) { + newSize--; + + wrapper.read(Type.STRING); + wrapper.read(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); + wrapper.read(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); + wrapper.read(Type.FLAT_VAR_INT_ITEM); + continue; + } + + wrapper.write(Type.STRING, originalType); + String id = wrapper.passthrough(Type.STRING); // Recipe Identifier + handle(wrapper, type); + } + + wrapper.set(Type.VAR_INT, 0, newSize); + }); + } + }); + } + + @Override + public void handle(PacketWrapper wrapper, String type) throws Exception { + switch (type) { + case "crafting_shapeless": + handleCraftingShapeless(wrapper); + break; + case "crafting_shaped": + handleCraftingShaped(wrapper); + break; + case "blasting": + case "smoking": + case "campfire_cooking": + case "smelting": + handleSmelting(wrapper); + break; + case "stonecutting": + handleStonecutting(wrapper); + break; + case "smithing": // new + handleSmithing(wrapper); + break; + } + } + + public void handleSmithing(PacketWrapper wrapper) throws Exception { + Item[] baseIngredients = wrapper.passthrough(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); + for (Item item : baseIngredients) { + rewriter.handleItemToClient(item); + } + Item[] ingredients = wrapper.passthrough(Type.FLAT_VAR_INT_ITEM_ARRAY_VAR_INT); + for (Item item : ingredients) { + rewriter.handleItemToClient(item); + } + rewriter.handleItemToClient(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM)); // Result + } +} diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/BlockItemPackets1_16.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/BlockItemPackets1_16.java index eee4da82..cda75099 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/BlockItemPackets1_16.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/BlockItemPackets1_16.java @@ -6,6 +6,7 @@ import nl.matsv.viabackwards.api.rewriters.TranslatableRewriter; import nl.matsv.viabackwards.protocol.protocol1_14_4to1_15.data.RecipeRewriter1_15; import nl.matsv.viabackwards.protocol.protocol1_15_2to1_16.Protocol1_15_2To1_16; import nl.matsv.viabackwards.protocol.protocol1_15_2to1_16.data.BackwardsMappings; +import nl.matsv.viabackwards.protocol.protocol1_15_2to1_16.data.RecipeRewriter1_16; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; import us.myles.ViaVersion.api.minecraft.item.Item; @@ -43,27 +44,19 @@ public class BlockItemPackets1_16 extends nl.matsv.viabackwards.api.rewriters.It BlockRewriter blockRewriter = new BlockRewriter(protocol, Type.POSITION1_14, Protocol1_15_2To1_16::getNewBlockStateId, Protocol1_15_2To1_16::getNewBlockId); // Declare Recipes - new RecipeRewriter1_15(this).registerDefaultHandler(0x5B, 0x5B); - - // Edit Book - protocol.registerIncoming(State.PLAY, 0x0C, 0x0C, new PacketRemapper() { - @Override - public void registerMap() { - handler(wrapper -> handleItemToServer(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM))); - } - }); + new RecipeRewriter1_16(this).register(0x5A, 0x5B); // Set cooldown - itemRewriter.registerSetCooldown(0x18, 0x18, BlockItemPackets1_16::getOldItemId); + itemRewriter.registerSetCooldown(0x17, 0x18, BlockItemPackets1_16::getOldItemId); // Window items packet - itemRewriter.registerWindowItems(Type.FLAT_VAR_INT_ITEM_ARRAY, 0x15, 0x15); + itemRewriter.registerWindowItems(Type.FLAT_VAR_INT_ITEM_ARRAY, 0x14, 0x15); // Set slot packet - itemRewriter.registerSetSlot(Type.FLAT_VAR_INT_ITEM, 0x17, 0x17); + itemRewriter.registerSetSlot(Type.FLAT_VAR_INT_ITEM, 0x16, 0x17); // Trade list - protocol.out(State.PLAY, 0x28, 0x28, new PacketRemapper() { + protocol.out(State.PLAY, 0x27, 0x28, new PacketRemapper() { @Override public void registerMap() { handler(wrapper -> { @@ -100,28 +93,22 @@ public class BlockItemPackets1_16 extends nl.matsv.viabackwards.api.rewriters.It }); // Entity Equipment Packet - itemRewriter.registerEntityEquipment(Type.FLAT_VAR_INT_ITEM, 0x48, 0x47); - - // Click window packet - itemRewriter.registerClickWindow(Type.FLAT_VAR_INT_ITEM, 0x09, 0x09); - - // Creative Inventory Action - itemRewriter.registerCreativeInvAction(Type.FLAT_VAR_INT_ITEM, 0x27, 0x26); + itemRewriter.registerEntityEquipment(Type.FLAT_VAR_INT_ITEM, 0x47, 0x47); // Acknowledge player digging - blockRewriter.registerAcknowledgePlayerDigging(0x08, 0x08); + blockRewriter.registerAcknowledgePlayerDigging(0x07, 0x08); // Block Action - blockRewriter.registerBlockAction(0x0B, 0x0B); + blockRewriter.registerBlockAction(0x0A, 0x0B); // Block Change - blockRewriter.registerBlockChange(0x0C, 0x0C); + blockRewriter.registerBlockChange(0x0B, 0x0C); // Multi Block Change - blockRewriter.registerMultiBlockChange(0x10, 0x10); + blockRewriter.registerMultiBlockChange(0x0F, 0x10); // Chunk - protocol.registerOutgoing(State.PLAY, 0x22, 0x22, new PacketRemapper() { + protocol.registerOutgoing(State.PLAY, 0x21, 0x22, new PacketRemapper() { @Override public void registerMap() { handler(wrapper -> { @@ -191,14 +178,14 @@ public class BlockItemPackets1_16 extends nl.matsv.viabackwards.api.rewriters.It }); // Effect packet - blockRewriter.registerEffect(0x23, 0x23, 1010, 2001, BlockItemPackets1_16::getOldItemId); + blockRewriter.registerEffect(0x22, 0x23, 1010, 2001, BlockItemPackets1_16::getOldItemId); // Spawn particle - blockRewriter.registerSpawnParticle(Type.DOUBLE, 0x24, 0x24, 3, 23, 32, + blockRewriter.registerSpawnParticle(Type.DOUBLE, 0x23, 0x24, 3, 23, 32, BlockItemPackets1_16::getNewParticleId, this::handleItemToClient, Type.FLAT_VAR_INT_ITEM); // Window Property - protocol.registerOutgoing(State.PLAY, 0x16, 0x16, new PacketRemapper() { + protocol.registerOutgoing(State.PLAY, 0x15, 0x16, new PacketRemapper() { @Override public void registerMap() { map(Type.UNSIGNED_BYTE); // Window id @@ -217,6 +204,20 @@ public class BlockItemPackets1_16 extends nl.matsv.viabackwards.api.rewriters.It }); } }); + + // Click window packet + itemRewriter.registerClickWindow(Type.FLAT_VAR_INT_ITEM, 0x09, 0x09); + + // Creative Inventory Action + itemRewriter.registerCreativeInvAction(Type.FLAT_VAR_INT_ITEM, 0x27, 0x26); + + // Edit Book + protocol.registerIncoming(State.PLAY, 0x0C, 0x0C, new PacketRemapper() { + @Override + public void registerMap() { + handler(wrapper -> handleItemToServer(wrapper.passthrough(Type.FLAT_VAR_INT_ITEM))); + } + }); } public static int getNewParticleId(int id) { diff --git a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/EntityPackets1_16.java b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/EntityPackets1_16.java index 687cfaa8..3df5793d 100644 --- a/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/EntityPackets1_16.java +++ b/core/src/main/java/nl/matsv/viabackwards/protocol/protocol1_15_2to1_16/packets/EntityPackets1_16.java @@ -47,10 +47,10 @@ public class EntityPackets1_16 extends EntityRewriter { registerSpawnTrackerWithData(0x00, 0x00, Entity1_16Types.EntityType.FALLING_BLOCK, Protocol1_15_2To1_16::getNewBlockStateId); // Spawn mob packet - registerSpawnTracker(0x03, 0x03); + registerSpawnTracker(0x02, 0x03); // Respawn - protocol.registerOutgoing(State.PLAY, 0x3B, 0x3B, new PacketRemapper() { + protocol.registerOutgoing(State.PLAY, 0x3A, 0x3B, new PacketRemapper() { @Override public void registerMap() { map(dimensionTransformer); // Dimension Type @@ -72,7 +72,7 @@ public class EntityPackets1_16 extends EntityRewriter { }); // Join Game - protocol.registerOutgoing(State.PLAY, 0x26, 0x26, new PacketRemapper() { + protocol.registerOutgoing(State.PLAY, 0x25, 0x26, new PacketRemapper() { @Override public void registerMap() { map(Type.INT); // Entity ID @@ -105,23 +105,22 @@ public class EntityPackets1_16 extends EntityRewriter { // Spawn Experience Orb registerExtraTracker(0x01, Entity1_16Types.EntityType.EXPERIENCE_ORB); - // Spawn Global Object - registerExtraTracker(0x02, Entity1_16Types.EntityType.LIGHTNING_BOLT); + // F Spawn Global Object, it is no longer with us :( // Spawn painting - registerExtraTracker(0x04, Entity1_16Types.EntityType.PAINTING); + registerExtraTracker(0x03, 0x04, Entity1_16Types.EntityType.PAINTING); // Spawn player packet - registerExtraTracker(0x05, Entity1_16Types.EntityType.PLAYER); + registerExtraTracker(0x04, 0x05, Entity1_16Types.EntityType.PLAYER); // Destroy entities - registerEntityDestroy(0x38, 0x38); + registerEntityDestroy(0x37, 0x38); // Entity Metadata packet - registerMetadataRewriter(0x45, 0x44, Types1_14.METADATA_LIST); + registerMetadataRewriter(0x44, 0x44, Types1_14.METADATA_LIST); // Entity Properties - protocol.out(State.PLAY, 0x59, 0x59, new PacketRemapper() { + protocol.out(State.PLAY, 0x58, 0x59, new PacketRemapper() { @Override public void registerMap() { handler(wrapper -> {