From 55a65cc4ae67ba63794ca5a647e001d30c64dd46 Mon Sep 17 00:00:00 2001 From: RoccoDev Date: Thu, 15 Oct 2026 05:09:22 +0200 Subject: [PATCH] Rewrite block and item IDs in legacy particles --- .../rewriters/LegacyBlockItemRewriter.java | 51 +++++++++++++++++++ .../rewriter/BlockItemPacketRewriter1_10.java | 25 ++------- .../rewriter/BlockItemPacketRewriter1_11.java | 1 + .../rewriter/BlockItemPacketRewriter1_12.java | 1 + 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyBlockItemRewriter.java b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyBlockItemRewriter.java index 738541402..fdfcfac4d 100644 --- a/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyBlockItemRewriter.java +++ b/common/src/main/java/com/viaversion/viabackwards/api/rewriters/LegacyBlockItemRewriter.java @@ -162,6 +162,57 @@ public void register() { }); } + public void registerLevelParticles(C packetType) { + protocol.registerClientbound(packetType, new PacketHandlers() { + @Override + public void register() { + map(Types.INT); + map(Types.BOOLEAN); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.FLOAT); + map(Types.INT); + + handler(wrapper -> { + final int id = wrapper.get(Types.INT, 0); + if (id != 46 && id != 37 && id != 38) { // falling_dust, block_crack, block_dust + return; + } + int data = wrapper.read(Types.VAR_INT); + final int blockId = data & 0xFFF; + final int blockData = data >> 12; + final IdAndData mapped = handleBlock(blockId, blockData); + if (mapped != null) { + data = mapped.getId() | (mapped.getData() << 12); + } + wrapper.write(Types.VAR_INT, data); + }); + + handler(wrapper -> { + final int id = wrapper.get(Types.INT, 0); + if (id != 36) { // iconcrack + return; + } + int itemId = wrapper.read(Types.VAR_INT); + int itemData = wrapper.read(Types.VAR_INT); + MappedLegacyBlockItem mapped = getMappedItem(itemId, itemData); + if (mapped != null) { + itemId = mapped.getId(); + if (mapped.getData() != -1) { + itemData = mapped.getData(); + } + } + wrapper.write(Types.VAR_INT, itemId); + wrapper.write(Types.VAR_INT, itemData); + }); + } + }); + } + @Override public @Nullable Item handleItemToClient(UserConnection connection, @Nullable Item item) { if (item == null) return null; diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/rewriter/BlockItemPacketRewriter1_10.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/rewriter/BlockItemPacketRewriter1_10.java index 30d5ee02b..a0ea4650f 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/rewriter/BlockItemPacketRewriter1_10.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_10to1_9_3/rewriter/BlockItemPacketRewriter1_10.java @@ -39,6 +39,7 @@ public BlockItemPacketRewriter1_10(Protocol1_10To1_9_3 protocol) { protected void registerPackets() { registerBlockChange(ClientboundPackets1_9_3.BLOCK_UPDATE); registerMultiBlockChange(ClientboundPackets1_9_3.CHUNK_BLOCKS_UPDATE); + registerLevelParticles(ClientboundPackets1_9_3.LEVEL_PARTICLES); registerSetSlot(ClientboundPackets1_9_3.CONTAINER_SET_SLOT); registerSetContent(ClientboundPackets1_9_3.CONTAINER_SET_CONTENT); @@ -65,26 +66,10 @@ protected void registerPackets() { }); // Particle - protocol.registerClientbound(ClientboundPackets1_9_3.LEVEL_PARTICLES, new PacketHandlers() { - @Override - public void register() { - map(Types.INT); - map(Types.BOOLEAN); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.FLOAT); - map(Types.INT); - - handler(wrapper -> { - int id = wrapper.get(Types.INT, 0); - if (id == 46) { // new falling_dust - wrapper.set(Types.INT, 0, 38); // -> block_dust - } - }); + protocol.appendClientbound(ClientboundPackets1_9_3.LEVEL_PARTICLES, wrapper -> { + final int id = wrapper.get(Types.INT, 0); + if (id == 46) { // new falling_dust + wrapper.set(Types.INT, 0, 38); // -> block_dust } }); } diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java index 76fdc7471..ffd37bc60 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_11to1_10/rewriter/BlockItemPacketRewriter1_11.java @@ -55,6 +55,7 @@ public BlockItemPacketRewriter1_11(Protocol1_11To1_10 protocol) { protected void registerPackets() { registerBlockChange(ClientboundPackets1_9_3.BLOCK_UPDATE); registerMultiBlockChange(ClientboundPackets1_9_3.CHUNK_BLOCKS_UPDATE); + registerLevelParticles(ClientboundPackets1_9_3.LEVEL_PARTICLES); protocol.registerClientbound(ClientboundPackets1_9_3.CONTAINER_SET_SLOT, new PacketHandlers() { @Override diff --git a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/BlockItemPacketRewriter1_12.java b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/BlockItemPacketRewriter1_12.java index 35a7c9be3..0c78b4393 100644 --- a/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/BlockItemPacketRewriter1_12.java +++ b/common/src/main/java/com/viaversion/viabackwards/protocol/v1_12to1_11_1/rewriter/BlockItemPacketRewriter1_12.java @@ -56,6 +56,7 @@ public BlockItemPacketRewriter1_12(Protocol1_12To1_11_1 protocol) { protected void registerPackets() { registerBlockChange(ClientboundPackets1_12.BLOCK_UPDATE); registerMultiBlockChange(ClientboundPackets1_12.CHUNK_BLOCKS_UPDATE); + registerLevelParticles(ClientboundPackets1_12.LEVEL_PARTICLES); protocol.registerClientbound(ClientboundPackets1_12.MAP_ITEM_DATA, new PacketHandlers() { @Override