diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/rewriter/EntityPacketRewriter1_9.java b/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/rewriter/EntityPacketRewriter1_9.java index 0b610f738..6a3c3b06a 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/rewriter/EntityPacketRewriter1_9.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/rewriter/EntityPacketRewriter1_9.java @@ -545,6 +545,9 @@ private void handleEntityData(EntityDataHandlerEvent event, EntityData entityDat final EntityTracker1_9 tracker = tracker(event.user()); if (entityData.id() == EntityDataIndex1_9.ENTITY_STATUS.getIndex()) { tracker.getStatus().put(event.entityId(), (Byte) entityData.value()); + if (tracker.isHandActive(event.entityId())) { + entityData.setValue((byte) ((byte) entityData.value() | 1 << STATUS_USE_BIT)); + } } final EntityDataIndex1_9 metaIndex = EntityDataIndex1_8.searchIndex(event.entityType(), entityData.id()); if (metaIndex == null) { @@ -554,8 +557,10 @@ private void handleEntityData(EntityDataHandlerEvent event, EntityData entityDat } if (metaIndex.getOldType() == null || metaIndex.getNewType() == null) { if (metaIndex == EntityDataIndex1_9.PLAYER_HAND) { // Player eating/aiming/drinking + final boolean handActive = (((byte) entityData.value()) & 1 << HAND_ACTIVE_BIT) != 0; + tracker.setHandActive(event.entityId(), handActive); byte status = (byte) tracker.getStatus().getOrDefault(event.entityId(), 0); - if ((((byte) entityData.value()) & 1 << HAND_ACTIVE_BIT) != 0) { + if (handActive) { status = (byte) (status | 1 << STATUS_USE_BIT); } else { status = (byte) (status & ~(1 << STATUS_USE_BIT)); diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/storage/EntityTracker1_9.java b/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/storage/EntityTracker1_9.java index 15d7d20ab..7134be330 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/storage/EntityTracker1_9.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/storage/EntityTracker1_9.java @@ -27,6 +27,8 @@ import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap; import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList; import com.viaversion.viaversion.libs.fastutil.ints.IntList; +import com.viaversion.viaversion.libs.fastutil.ints.IntOpenHashSet; +import com.viaversion.viaversion.libs.fastutil.ints.IntSet; import java.util.List; import java.util.Map; @@ -35,6 +37,7 @@ public class EntityTracker1_9 extends EntityTrackerBase { private final Int2ObjectMap vehicles = new Int2ObjectOpenHashMap<>(); private final Int2ObjectMap offsets = new Int2ObjectOpenHashMap<>(); private final Int2IntMap status = new Int2IntOpenHashMap(); + private final IntSet handActive = new IntOpenHashSet(); public EntityTracker1_9(UserConnection connection) { super(connection, EntityTypes1_9.EntityType.PLAYER); @@ -45,6 +48,7 @@ public void removeEntity(int id) { vehicles.remove(id); offsets.remove(id); status.remove(id); + handActive.remove(id); vehicles.forEach((vehicle, passengers) -> passengers.rem(id)); vehicles.int2ObjectEntrySet().removeIf(entry -> entry.getValue().isEmpty()); @@ -88,4 +92,16 @@ public Integer getVehicle(final int passenger) { public Int2IntMap getStatus() { return status; } + + public boolean isHandActive(final int id) { + return handActive.contains(id); + } + + public void setHandActive(final int id, final boolean active) { + if (active) { + handActive.add(id); + } else { + handActive.remove(id); + } + } }