|
26 | 26 | import com.viaversion.viabackwards.protocol.v1_21_2to1_21.Protocol1_21_2To1_21; |
27 | 27 | import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.InventoryStateIdStorage; |
28 | 28 | import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.RecipeStorage; |
| 29 | +import com.viaversion.viabackwards.protocol.v1_21_2to1_21.storage.SignStorage; |
29 | 30 | import com.viaversion.viaversion.api.connection.UserConnection; |
30 | 31 | import com.viaversion.viaversion.api.data.MappingData; |
| 32 | +import com.viaversion.viaversion.api.data.entity.EntityTracker; |
| 33 | +import com.viaversion.viaversion.api.minecraft.BlockChangeRecord; |
| 34 | +import com.viaversion.viaversion.api.minecraft.BlockPosition; |
31 | 35 | import com.viaversion.viaversion.api.minecraft.Holder; |
32 | 36 | import com.viaversion.viaversion.api.minecraft.HolderSet; |
33 | 37 | import com.viaversion.viaversion.api.minecraft.Particle; |
34 | 38 | import com.viaversion.viaversion.api.minecraft.SoundEvent; |
| 39 | +import com.viaversion.viaversion.api.minecraft.chunks.Chunk; |
| 40 | +import com.viaversion.viaversion.api.minecraft.chunks.ChunkSection; |
| 41 | +import com.viaversion.viaversion.api.minecraft.chunks.DataPalette; |
| 42 | +import com.viaversion.viaversion.api.minecraft.chunks.PaletteType; |
35 | 43 | import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer; |
36 | 44 | import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; |
37 | 45 | import com.viaversion.viaversion.api.minecraft.item.Item; |
|
48 | 56 | import com.viaversion.viaversion.api.minecraft.item.data.Repairable; |
49 | 57 | import com.viaversion.viaversion.api.minecraft.item.data.UseCooldown; |
50 | 58 | import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; |
| 59 | +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion; |
51 | 60 | import com.viaversion.viaversion.api.type.Types; |
52 | 61 | import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; |
53 | 62 | import com.viaversion.viaversion.api.type.types.version.VersionedTypes; |
@@ -75,17 +84,117 @@ public BlockItemPacketRewriter1_21_2(final Protocol1_21_2To1_21 protocol) { |
75 | 84 | public void registerPackets() { |
76 | 85 | final BlockRewriter<ClientboundPacket1_21_2> blockRewriter = BlockRewriter.for1_20_2(protocol); |
77 | 86 | blockRewriter.registerBlockEvent(ClientboundPackets1_21_2.BLOCK_EVENT); |
78 | | - blockRewriter.registerBlockUpdate(ClientboundPackets1_21_2.BLOCK_UPDATE); |
79 | | - blockRewriter.registerSectionBlocksUpdate1_20(ClientboundPackets1_21_2.SECTION_BLOCKS_UPDATE); |
80 | 87 | blockRewriter.registerLevelEvent1_21(ClientboundPackets1_21_2.LEVEL_EVENT, 2001); |
81 | | - blockRewriter.registerLevelChunk1_19(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, ChunkType1_20_2::new); |
82 | 88 | blockRewriter.registerBlockEntityData(ClientboundPackets1_21_2.BLOCK_ENTITY_DATA); |
83 | 89 |
|
84 | 90 | registerAdvancements1_20_3(ClientboundPackets1_21_2.UPDATE_ADVANCEMENTS); |
85 | 91 | registerSetEquipment(ClientboundPackets1_21_2.SET_EQUIPMENT); |
86 | 92 | registerMerchantOffers1_20_5(ClientboundPackets1_21_2.MERCHANT_OFFERS); |
87 | 93 | registerSetCreativeModeSlot(ServerboundPackets1_20_5.SET_CREATIVE_MODE_SLOT); |
88 | 94 |
|
| 95 | + protocol.registerClientbound(ClientboundPackets1_21_2.LEVEL_CHUNK_WITH_LIGHT, wrapper -> { |
| 96 | + final Chunk chunk = blockRewriter.handleChunk1_19(wrapper, ChunkType1_20_2::new); |
| 97 | + blockRewriter.handleBlockEntities(null, chunk, wrapper.user()); |
| 98 | + |
| 99 | + if (!wrapper.user().getProtocolInfo().protocolVersion().equalTo(ProtocolVersion.v1_21)) { |
| 100 | + return; |
| 101 | + } |
| 102 | + |
| 103 | + final EntityTracker tracker = wrapper.user().getEntityTracker(Protocol1_21_2To1_21.class); |
| 104 | + |
| 105 | + final SignStorage storage = wrapper.user().get(SignStorage.class); |
| 106 | + storage.removeSigns(chunk.getX(), chunk.getZ()); |
| 107 | + |
| 108 | + for (int i = 0; i < chunk.getSections().length; i++) { |
| 109 | + final ChunkSection section = chunk.getSections()[i]; |
| 110 | + |
| 111 | + final DataPalette blockPalette = section.palette(PaletteType.BLOCKS); |
| 112 | + |
| 113 | + boolean containsSign = false; |
| 114 | + for (int idx = 0; idx < blockPalette.size(); idx++) { |
| 115 | + if (signBlockState(blockPalette.idByIndex(idx))) { |
| 116 | + containsSign = true; |
| 117 | + break; |
| 118 | + } |
| 119 | + } |
| 120 | + |
| 121 | + if (!containsSign) { |
| 122 | + continue; |
| 123 | + } |
| 124 | + |
| 125 | + for (int idx = 0; idx < ChunkSection.SIZE; idx++) { |
| 126 | + if (!signBlockState(blockPalette.idAt(idx))) { |
| 127 | + continue; |
| 128 | + } |
| 129 | + |
| 130 | + storage.addSign(new BlockPosition( |
| 131 | + ChunkSection.xFromIndex(idx) + (chunk.getX() << 4), |
| 132 | + ChunkSection.yFromIndex(idx) + tracker.currentMinY() + (i << 4), |
| 133 | + ChunkSection.zFromIndex(idx) + (chunk.getZ() << 4) |
| 134 | + )); |
| 135 | + } |
| 136 | + } |
| 137 | + }); |
| 138 | + |
| 139 | + protocol.registerClientbound(ClientboundPackets1_21_2.BLOCK_UPDATE, wrapper -> { |
| 140 | + final BlockPosition position = wrapper.passthrough(Types.BLOCK_POSITION1_14); |
| 141 | + |
| 142 | + final int blockId = wrapper.read(Types.VAR_INT); |
| 143 | + final int mappedBlockId = protocol.getMappingData().getNewBlockStateId(blockId); |
| 144 | + wrapper.write(Types.VAR_INT, mappedBlockId); |
| 145 | + |
| 146 | + if (!wrapper.user().getProtocolInfo().protocolVersion().equalTo(ProtocolVersion.v1_21)) { |
| 147 | + return; |
| 148 | + } |
| 149 | + |
| 150 | + final SignStorage storage = wrapper.user().get(SignStorage.class); |
| 151 | + storage.removeSign(position); |
| 152 | + if (signBlockState(mappedBlockId)) { |
| 153 | + storage.addSign(position); |
| 154 | + } |
| 155 | + }); |
| 156 | + |
| 157 | + protocol.registerClientbound(ClientboundPackets1_21_2.SECTION_BLOCKS_UPDATE, wrapper -> { |
| 158 | + final long position = wrapper.passthrough(Types.LONG); |
| 159 | + |
| 160 | + final int chunkX = (int) (position >> 42); |
| 161 | + final int chunkY = (int) (position << 44 >> 44); |
| 162 | + final int chunkZ = (int) (position << 22 >> 42); |
| 163 | + |
| 164 | + final SignStorage signStorage = wrapper.user().get(SignStorage.class); |
| 165 | + |
| 166 | + final boolean equalToV1_21 = wrapper.user().getProtocolInfo().protocolVersion().equalTo(ProtocolVersion.v1_21); |
| 167 | + |
| 168 | + for (final BlockChangeRecord record : wrapper.passthrough(Types.VAR_LONG_BLOCK_CHANGE_ARRAY)) { |
| 169 | + record.setBlockId(protocol.getMappingData().getNewBlockStateId(record.getBlockId())); |
| 170 | + |
| 171 | + if (!equalToV1_21) { |
| 172 | + continue; |
| 173 | + } |
| 174 | + |
| 175 | + final int x = record.getSectionX() + (chunkX << 4); |
| 176 | + final int y = record.getSectionY() + (chunkY << 4); |
| 177 | + final int z = record.getSectionZ() + (chunkZ << 4); |
| 178 | + final BlockPosition pos = new BlockPosition(x, y, z); |
| 179 | + if (signBlockState(record.getBlockId())) { |
| 180 | + signStorage.addSign(pos); |
| 181 | + } else { |
| 182 | + signStorage.removeSign(pos); |
| 183 | + } |
| 184 | + } |
| 185 | + }); |
| 186 | + |
| 187 | + protocol.registerClientbound(ClientboundPackets1_21_2.OPEN_SIGN_EDITOR, wrapper -> { |
| 188 | + if (!wrapper.user().getProtocolInfo().protocolVersion().equalTo(ProtocolVersion.v1_21)) { |
| 189 | + return; |
| 190 | + } |
| 191 | + |
| 192 | + final BlockPosition position = wrapper.passthrough(Types.BLOCK_POSITION1_14); |
| 193 | + if (!wrapper.user().get(SignStorage.class).isSign(position)) { |
| 194 | + wrapper.cancel(); |
| 195 | + } |
| 196 | + }); |
| 197 | + |
89 | 198 | protocol.registerClientbound(ClientboundPackets1_21_2.COOLDOWN, wrapper -> { |
90 | 199 | final MappingData mappingData = protocol.getMappingData(); |
91 | 200 | final String itemIdentifier = wrapper.read(Types.STRING); |
@@ -297,6 +406,10 @@ private void byteToVarInt(final PacketWrapper wrapper) { |
297 | 406 | wrapper.write(Types.VAR_INT, (int) containerId); |
298 | 407 | } |
299 | 408 |
|
| 409 | + private boolean signBlockState(final int blockStateId) { |
| 410 | + return (blockStateId >= 4302 && blockStateId <= 4589) || (blockStateId >= 4762 && blockStateId <= 5625); |
| 411 | + } |
| 412 | + |
300 | 413 | @Override |
301 | 414 | public Item handleItemToClient(final UserConnection connection, Item item) { |
302 | 415 | backupInconvertibleData(item); |
|
0 commit comments