Skip to content

Commit d499918

Browse files
committed
Don't cancel full equipment containing saddle in 1.21.5->1.21.4
Plugins manually sending equipment packets may include saddles for entities that shouldn't have saddle equipment, though the client will ignore them Closes #1140
1 parent 17d7b48 commit d499918

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

common/src/main/java/com/viaversion/viabackwards/protocol/v1_21_5to1_21_4/rewriter/BlockItemPacketRewriter1_21_5.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@
6767
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
6868
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
6969
import com.viaversion.viaversion.data.item.ItemHasherBase;
70+
import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList;
7071
import com.viaversion.viaversion.libs.fastutil.ints.IntLinkedOpenHashSet;
72+
import com.viaversion.viaversion.libs.fastutil.ints.IntList;
7173
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
7274
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
7375
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
@@ -78,7 +80,6 @@
7880
import com.viaversion.viaversion.util.Either;
7981
import com.viaversion.viaversion.util.Key;
8082
import com.viaversion.viaversion.util.Limit;
81-
import com.viaversion.viaversion.util.SerializerVersion;
8283
import java.util.ArrayList;
8384
import java.util.HashMap;
8485
import java.util.List;
@@ -182,20 +183,37 @@ public void registerPackets() {
182183
protocol.registerClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> {
183184
final int entityId = wrapper.passthrough(Types.VAR_INT);
184185
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<>();
185190
byte value;
186191
do {
187-
value = wrapper.passthrough(Types.BYTE);
192+
value = wrapper.read(Types.BYTE);
188193
final int equipmentSlot = value & 0x7F;
194+
final Item item = wrapper.read(itemType());
189195
if (equipmentSlot == SADDLE_EQUIPMENT_SLOT) {
196+
// Send saddle entity data for horses
190197
if (trackedEntity != null && trackedEntity.entityType().isOrHasParent(EntityTypes1_21_5.ABSTRACT_HORSE)) {
191-
final Item item = wrapper.read(itemType());
192198
sendSaddledEntityData(wrapper.user(), trackedEntity, entityId, item.identifier() == 800);
193199
}
194-
wrapper.cancel();
195-
return;
200+
} else {
201+
keptSlots.add(equipmentSlot);
202+
keptItems.add(handleItemToClient(wrapper.user(), item));
196203
}
197-
passthroughClientboundItem(wrapper);
198204
} 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+
}
199217
});
200218

201219
protocol.registerClientbound(ClientboundPackets1_21_5.UPDATE_ADVANCEMENTS, wrapper -> {

0 commit comments

Comments
 (0)