|
67 | 67 | import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5; |
68 | 68 | import com.viaversion.viaversion.api.type.types.version.VersionedTypes; |
69 | 69 | import com.viaversion.viaversion.data.item.ItemHasherBase; |
| 70 | +import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList; |
70 | 71 | import com.viaversion.viaversion.libs.fastutil.ints.IntLinkedOpenHashSet; |
| 72 | +import com.viaversion.viaversion.libs.fastutil.ints.IntList; |
71 | 73 | import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4; |
72 | 74 | import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4; |
73 | 75 | import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5; |
|
78 | 80 | import com.viaversion.viaversion.util.Either; |
79 | 81 | import com.viaversion.viaversion.util.Key; |
80 | 82 | import com.viaversion.viaversion.util.Limit; |
81 | | -import com.viaversion.viaversion.util.SerializerVersion; |
82 | 83 | import java.util.ArrayList; |
83 | 84 | import java.util.HashMap; |
84 | 85 | import java.util.List; |
@@ -182,20 +183,37 @@ public void registerPackets() { |
182 | 183 | protocol.registerClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> { |
183 | 184 | final int entityId = wrapper.passthrough(Types.VAR_INT); |
184 | 185 | final TrackedEntity trackedEntity = protocol.getEntityRewriter().tracker(wrapper.user()).entity(entityId); |
| 186 | + |
| 187 | + // Remove saddle equipment, keep the rest |
| 188 | + final IntList keptSlots = new IntArrayList(); |
| 189 | + final List<Item> keptItems = new ArrayList<>(); |
185 | 190 | byte value; |
186 | 191 | do { |
187 | | - value = wrapper.passthrough(Types.BYTE); |
| 192 | + value = wrapper.read(Types.BYTE); |
188 | 193 | final int equipmentSlot = value & 0x7F; |
| 194 | + final Item item = wrapper.read(itemType()); |
189 | 195 | if (equipmentSlot == SADDLE_EQUIPMENT_SLOT) { |
| 196 | + // Send saddle entity data for horses |
190 | 197 | if (trackedEntity != null && trackedEntity.entityType().isOrHasParent(EntityTypes1_21_5.ABSTRACT_HORSE)) { |
191 | | - final Item item = wrapper.read(itemType()); |
192 | 198 | sendSaddledEntityData(wrapper.user(), trackedEntity, entityId, item.identifier() == 800); |
193 | 199 | } |
194 | | - wrapper.cancel(); |
195 | | - return; |
| 200 | + } else { |
| 201 | + keptSlots.add(equipmentSlot); |
| 202 | + keptItems.add(handleItemToClient(wrapper.user(), item)); |
196 | 203 | } |
197 | | - passthroughClientboundItem(wrapper); |
198 | 204 | } while (value < 0); |
| 205 | + |
| 206 | + if (keptSlots.isEmpty()) { |
| 207 | + wrapper.cancel(); |
| 208 | + return; |
| 209 | + } |
| 210 | + |
| 211 | + for (int i = 0; i < keptSlots.size(); i++) { |
| 212 | + final int slot = keptSlots.getInt(i); |
| 213 | + final boolean more = i < keptSlots.size() - 1; |
| 214 | + wrapper.write(Types.BYTE, (byte) (more ? (slot | -128) : slot)); |
| 215 | + wrapper.write(mappedItemType(), keptItems.get(i)); |
| 216 | + } |
199 | 217 | }); |
200 | 218 |
|
201 | 219 | protocol.registerClientbound(ClientboundPackets1_21_5.UPDATE_ADVANCEMENTS, wrapper -> { |
|
0 commit comments