Compare commits

...
Author SHA1 Message Date
Nassim Jahnke 51b1715863 Add entity equipment read type 2025-12-14 10:07:34 +01:00
6 changed files with 41 additions and 79 deletions

No files matched your search

@@ -30,6 +30,7 @@ import com.viaversion.viabackwards.protocol.v1_16_2to1_16_1.storage.BiomeStorage
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.Protocol1_16To1_15_2;
import com.viaversion.viabackwards.protocol.v1_16to1_15_2.data.MapColorMappings1_15_2;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.EntityEquipment;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
@@ -47,7 +48,6 @@ import com.viaversion.viaversion.rewriter.RecipeRewriter;
import com.viaversion.viaversion.util.CompactArrayUtil;
import com.viaversion.viaversion.util.Key;
import com.viaversion.viaversion.util.UUIDUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -143,27 +143,21 @@ public class BlockItemPacketRewriter1_16 extends BackwardsItemRewriter<Clientbou
protocol.registerClientbound(ClientboundPackets1_16.SET_EQUIPMENT, ClientboundPackets1_15.SET_EQUIPPED_ITEM, wrapper -> {
int entityId = wrapper.passthrough(Types.VAR_INT);
List<EquipmentData> equipmentData = new ArrayList<>();
byte slot;
do {
slot = wrapper.read(Types.BYTE);
Item item = handleItemToClient(wrapper.user(), wrapper.read(Types.ITEM1_13_2));
int rawSlot = slot & 0x7F;
equipmentData.add(new EquipmentData(rawSlot, item));
} while ((slot & 0xFFFFFF80) != 0);
List<EntityEquipment> equipmentData = wrapper.read(equipmentType());
equipmentData.replaceAll(equipment -> equipment.rewrite(wrapper.user(), protocol, true));
// Send first data in the current packet
EquipmentData firstData = equipmentData.get(0);
wrapper.write(Types.VAR_INT, firstData.slot);
wrapper.write(Types.ITEM1_13_2, firstData.item);
EntityEquipment firstData = equipmentData.get(0);
wrapper.write(Types.VAR_INT, firstData.slot());
wrapper.write(Types.ITEM1_13_2, firstData.item());
// If there are more items, send new packets for them
for (int i = 1; i < equipmentData.size(); i++) {
PacketWrapper equipmentPacket = wrapper.create(ClientboundPackets1_15.SET_EQUIPPED_ITEM);
EquipmentData data = equipmentData.get(i);
EntityEquipment data = equipmentData.get(i);
equipmentPacket.write(Types.VAR_INT, entityId);
equipmentPacket.write(Types.VAR_INT, data.slot);
equipmentPacket.write(Types.ITEM1_13_2, data.item);
equipmentPacket.write(Types.VAR_INT, data.slot());
equipmentPacket.write(Types.ITEM1_13_2, data.item());
equipmentPacket.send(Protocol1_16To1_15_2.class);
}
});
@@ -315,7 +309,4 @@ public class BlockItemPacketRewriter1_16 extends BackwardsItemRewriter<Clientbou
enchantmentRewriter.handleToServer(item);
return item;
}
private record EquipmentData(int slot, Item item) {
}
}
@@ -28,6 +28,7 @@ import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.Protocol1_19_4To1_19
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.storage.EntityTracker1_19_4;
import com.viaversion.viabackwards.protocol.v1_19_4to1_19_3.storage.LinkedEntityStorage;
import com.viaversion.viaversion.api.data.entity.StoredEntityData;
import com.viaversion.viaversion.api.minecraft.EntityEquipment;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_3;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_19_4;
@@ -42,6 +43,8 @@ import com.viaversion.viaversion.api.type.types.version.Types1_19_4;
import com.viaversion.viaversion.protocols.v1_19_1to1_19_3.packet.ClientboundPackets1_19_3;
import com.viaversion.viaversion.protocols.v1_19_3to1_19_4.packet.ClientboundPackets1_19_4;
import com.viaversion.viaversion.util.TagUtil;
import java.util.ArrayList;
import java.util.List;
public final class EntityPacketRewriter1_19_4 extends EntityRewriter<ClientboundPackets1_19_4, Protocol1_19_4To1_19_3> {
@@ -284,9 +287,9 @@ public final class EntityPacketRewriter1_19_4 extends EntityRewriter<Clientbound
final PacketWrapper setEquipment = PacketWrapper.create(ClientboundPackets1_19_3.SET_EQUIPMENT, event.user());
setEquipment.write(Types.VAR_INT, event.entityId()); // Entity id
setEquipment.write(Types.BYTE, (byte) 5); // Slot - head
setEquipment.write(Types.ITEM1_13_2, value);
final List<EntityEquipment> equipmentList = new ArrayList<>(1);
equipmentList.add(new EntityEquipment(5, value)); // Slot - head
setEquipment.write(protocol.getItemRewriter().mappedEquipmentType(), equipmentList);
setEquipment.send(Protocol1_19_4To1_19_3.class);
});
filter().type(EntityTypes1_19_4.DISPLAY).handler((event, data) -> {
@@ -35,7 +35,6 @@ import com.viaversion.viaversion.api.minecraft.chunks.DataPalette;
import com.viaversion.viaversion.api.minecraft.chunks.PaletteType;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.Types;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_18;
@@ -182,19 +181,7 @@ public final class BlockItemPacketRewriter1_20_2 extends BackwardsItemRewriter<C
wrapper.passthrough(Types.BOOLEAN); // Send telemetry
}
});
protocol.registerClientbound(ClientboundPackets1_20_2.SET_EQUIPMENT, new PacketHandlers() {
@Override
public void register() {
map(Types.VAR_INT); // 0 - Entity ID
handler(wrapper -> {
byte slot;
do {
slot = wrapper.passthrough(Types.BYTE);
wrapper.write(Types.ITEM1_13_2, handleItemToClient(wrapper.user(), wrapper.read(Types.ITEM1_20_2)));
} while ((slot & 0xFFFFFF80) != 0);
});
}
});
registerSetEquipment(ClientboundPackets1_20_2.SET_EQUIPMENT);
new RecipeRewriter1_20_2<>(protocol) {
@Override
@@ -30,6 +30,7 @@ import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.RegistryData
import com.viaversion.viabackwards.protocol.v1_20_5to1_20_3.storage.SecureChatStorage;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.entity.DimensionData;
import com.viaversion.viaversion.api.minecraft.EntityEquipment;
import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
@@ -71,17 +72,14 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
registerRemoveEntities(ClientboundPackets1_20_5.REMOVE_ENTITIES);
protocol.registerClientbound(ClientboundPackets1_20_5.SET_EQUIPMENT, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT); // Entity id
final int entityId = wrapper.passthrough(Types.VAR_INT);
final EntityType type = tracker(wrapper.user()).entityType(entityId);
byte slot;
do {
slot = wrapper.read(Types.BYTE);
final Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), wrapper.read(VersionedTypes.V1_20_5.item()));
final int rawSlot = slot & 0x7F;
if (rawSlot == 6) {
final boolean lastSlot = (slot & 0xFFFFFF80) == 0;
slot = (byte) (lastSlot ? 4 : 4 | 0xFFFFFF80); // Map body slot index to chest slot index for horses, also wolves
final List<EntityEquipment> equipmentList = wrapper.read(protocol.getItemRewriter().equipmentType());
equipmentList.replaceAll(equipment -> {
int slot = equipment.slot();
Item item = protocol.getItemRewriter().handleItemToClient(wrapper.user(), equipment.item());
if (equipment.slot() == 6) {
slot = 4;
if (type != null && type.isOrHasParent(EntityTypes1_20_5.LLAMA)) {
// Cancel equipment and set correct entity data instead
@@ -89,10 +87,9 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
sendCarpetColorUpdate(wrapper.user(), entityId, item);
}
}
wrapper.write(Types.BYTE, slot);
wrapper.write(Types.ITEM1_20_2, item);
} while ((slot & 0xFFFFFF80) != 0);
return new EntityEquipment(slot, item);
});
wrapper.write(protocol.getItemRewriter().mappedEquipmentType(), equipmentList);
});
protocol.registerClientbound(ClientboundPackets1_20_5.HORSE_SCREEN_OPEN, wrapper -> {
@@ -32,6 +32,7 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.data.Mappings;
import com.viaversion.viaversion.api.data.entity.EntityTracker;
import com.viaversion.viaversion.api.data.entity.TrackedEntity;
import com.viaversion.viaversion.api.minecraft.EntityEquipment;
import com.viaversion.viaversion.api.minecraft.Holder;
import com.viaversion.viaversion.api.minecraft.HolderSet;
import com.viaversion.viaversion.api.minecraft.PaintingVariant;
@@ -67,9 +68,7 @@ import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_21_5;
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
import com.viaversion.viaversion.data.item.ItemHasherBase;
import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList;
import com.viaversion.viaversion.libs.fastutil.ints.IntLinkedOpenHashSet;
import com.viaversion.viaversion.libs.fastutil.ints.IntList;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPacket1_21_4;
import com.viaversion.viaversion.protocols.v1_21_2to1_21_4.packet.ServerboundPackets1_21_4;
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.packet.ClientboundPacket1_21_5;
@@ -90,6 +89,7 @@ import static com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.Block
import static com.viaversion.viaversion.util.MathUtil.ceilLog2;
public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItemRewriter<ClientboundPacket1_21_5, ServerboundPacket1_21_4, Protocol1_21_5To1_21_4> {
private static final int MAPPED_SADDLE_ID = 793;
private static final int SIGN_BOCK_ENTITY_ID = 7;
private static final int HANGING_SIGN_BOCK_ENTITY_ID = 8;
private static final int SADDLE_EQUIPMENT_SLOT = 7;
@@ -180,39 +180,23 @@ public final class BlockItemPacketRewriter1_21_5 extends BackwardsStructuredItem
wrapper.write(Types.HASHED_ITEM, ItemHasherBase.toHashedItem(hashedItemConverter.hasher(), carriedItem));
});
protocol.registerClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> {
final int entityId = wrapper.passthrough(Types.VAR_INT);
registerSetEquipment(ClientboundPackets1_21_5.SET_EQUIPMENT);
protocol.appendClientbound(ClientboundPackets1_21_5.SET_EQUIPMENT, wrapper -> {
final int entityId = wrapper.get(Types.VAR_INT, 0);
final TrackedEntity trackedEntity = protocol.getEntityRewriter().tracker(wrapper.user()).entity(entityId);
// Remove saddle equipment, keep the rest
final IntList keptSlots = new IntArrayList();
final List<Item> keptItems = new ArrayList<>();
byte value;
do {
value = wrapper.read(Types.BYTE);
final int equipmentSlot = value & 0x7F;
final Item item = wrapper.read(itemType());
if (equipmentSlot == SADDLE_EQUIPMENT_SLOT) {
final List<EntityEquipment> equipmentList = wrapper.get(protocol.getItemRewriter().mappedEquipmentType(), 0);
equipmentList.removeIf(equipment -> {
if (equipment.slot() == SADDLE_EQUIPMENT_SLOT) {
// Send saddle entity data for horses
if (trackedEntity != null && trackedEntity.entityType().isOrHasParent(EntityTypes1_21_5.ABSTRACT_HORSE)) {
sendSaddledEntityData(wrapper.user(), trackedEntity, entityId, item.identifier() == 800);
sendSaddledEntityData(wrapper.user(), trackedEntity, entityId, equipment.item().identifier() == MAPPED_SADDLE_ID);
}
} else {
keptSlots.add(equipmentSlot);
keptItems.add(handleItemToClient(wrapper.user(), item));
return true;
}
} while (value < 0);
if (keptSlots.isEmpty()) {
return false;
});
if (equipmentList.isEmpty()) {
wrapper.cancel();
return;
}
for (int i = 0; i < keptSlots.size(); i++) {
final int slot = keptSlots.getInt(i);
final boolean more = i < keptSlots.size() - 1;
wrapper.write(Types.BYTE, (byte) (more ? (slot | -128) : slot));
wrapper.write(mappedItemType(), keptItems.get(i));
}
});
+1 -1
View File
@@ -3,7 +3,7 @@ metadata.format.version = "1.1"
[versions]
# ViaVersion
viaver = "5.6.0"
viaver = "5.6.1-SNAPSHOT"
# Common provided
netty = "4.0.20.Final"