|
44 | 44 | import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey; |
45 | 45 | import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_21_5; |
46 | 46 | import com.viaversion.viaversion.api.minecraft.entitydata.EntityData; |
| 47 | +import com.viaversion.viaversion.api.minecraft.item.HashedItem; |
47 | 48 | import com.viaversion.viaversion.api.minecraft.item.Item; |
48 | 49 | import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimMaterial; |
49 | 50 | import com.viaversion.viaversion.api.minecraft.item.data.BlocksAttacks; |
|
65 | 66 | import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; |
66 | 67 | import com.viaversion.viaversion.api.type.types.version.VersionedTypes; |
67 | 68 | import com.viaversion.viaversion.data.item.ItemHasherBase; |
| 69 | +import com.viaversion.viaversion.data.item.OriginalHashedItem; |
68 | 70 | import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList; |
69 | 71 | import com.viaversion.viaversion.libs.fastutil.ints.IntLinkedOpenHashSet; |
70 | 72 | import com.viaversion.viaversion.libs.fastutil.ints.IntList; |
|
80 | 82 | import java.util.HashMap; |
81 | 83 | import java.util.List; |
82 | 84 | import java.util.Map; |
| 85 | +import org.checkerframework.checker.nullness.qual.Nullable; |
83 | 86 |
|
84 | 87 | import static com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5.downgradeItemData; |
85 | 88 | import static com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.BlockItemPacketRewriter1_21_5.updateItemData; |
@@ -151,12 +154,9 @@ public void registerPackets() { |
151 | 154 | final int affectedItems = Limit.max(wrapper.passthrough(Types.VAR_INT), 128); |
152 | 155 | for (int i = 0; i < affectedItems; i++) { |
153 | 156 | wrapper.passthrough(Types.SHORT); // Slot |
154 | | - final Item item = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType())); |
155 | | - wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), item)); |
| 157 | + itemToHashedItem(wrapper, hashedItemConverter); |
156 | 158 | } |
157 | | - |
158 | | - final Item carriedItem = handleItemToServer(wrapper.user(), wrapper.read(mappedItemType())); |
159 | | - wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), carriedItem)); |
| 159 | + itemToHashedItem(wrapper, hashedItemConverter); |
160 | 160 | }); |
161 | 161 |
|
162 | 162 | protocol.replaceClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> { |
@@ -248,7 +248,27 @@ public void registerPackets() { |
248 | 248 |
|
249 | 249 | wrapper.read(Types.BOOLEAN); // Show advancements |
250 | 250 | }); |
| 251 | + } |
251 | 252 |
|
| 253 | + private void itemToHashedItem(final PacketWrapper wrapper, final HashedItemConverterStorage hashedItemConverter) { |
| 254 | + final Item item = wrapper.read(mappedItemType()); |
| 255 | + final HashedItem originalHash = originalHashedItemFromBackup(item); |
| 256 | + if (originalHash != null) { |
| 257 | + // Will be restored in a later protocol |
| 258 | + wrapper.write(Types.HASHED_ITEM, originalHash); |
| 259 | + } else { |
| 260 | + final Item serverItem = handleItemToServer(wrapper.user(), item); |
| 261 | + wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), serverItem)); |
| 262 | + } |
| 263 | + } |
| 264 | + |
| 265 | + private @Nullable OriginalHashedItem originalHashedItemFromBackup(final Item item) { |
| 266 | + final CompoundTag customData = item.dataContainer().get(StructuredDataKey.CUSTOM_DATA); |
| 267 | + final CompoundTag originalHashes; |
| 268 | + if (customData == null || (originalHashes = customData.getCompoundTag("VV|original_hashes")) == null) { |
| 269 | + return null; |
| 270 | + } |
| 271 | + return backedUpOriginalHashes(originalHashes, item); |
252 | 272 | } |
253 | 273 |
|
254 | 274 | private void convertClientAsset(final PacketWrapper wrapper) { |
|
0 commit comments