Skip to content

Commit 4a559e4

Browse files
committed
Fix use animation breaking for 1.8 viewers when status updates
1 parent f2e2f18 commit 4a559e4

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/rewriter/EntityPacketRewriter1_9.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,9 @@ private void handleEntityData(EntityDataHandlerEvent event, EntityData entityDat
545545
final EntityTracker1_9 tracker = tracker(event.user());
546546
if (entityData.id() == EntityDataIndex1_9.ENTITY_STATUS.getIndex()) {
547547
tracker.getStatus().put(event.entityId(), (Byte) entityData.value());
548+
if (tracker.isHandActive(event.entityId())) {
549+
entityData.setValue((byte) ((byte) entityData.value() | 1 << STATUS_USE_BIT));
550+
}
548551
}
549552
final EntityDataIndex1_9 metaIndex = EntityDataIndex1_8.searchIndex(event.entityType(), entityData.id());
550553
if (metaIndex == null) {
@@ -554,8 +557,10 @@ private void handleEntityData(EntityDataHandlerEvent event, EntityData entityDat
554557
}
555558
if (metaIndex.getOldType() == null || metaIndex.getNewType() == null) {
556559
if (metaIndex == EntityDataIndex1_9.PLAYER_HAND) { // Player eating/aiming/drinking
560+
final boolean handActive = (((byte) entityData.value()) & 1 << HAND_ACTIVE_BIT) != 0;
561+
tracker.setHandActive(event.entityId(), handActive);
557562
byte status = (byte) tracker.getStatus().getOrDefault(event.entityId(), 0);
558-
if ((((byte) entityData.value()) & 1 << HAND_ACTIVE_BIT) != 0) {
563+
if (handActive) {
559564
status = (byte) (status | 1 << STATUS_USE_BIT);
560565
} else {
561566
status = (byte) (status & ~(1 << STATUS_USE_BIT));

common/src/main/java/com/viaversion/viarewind/protocol/v1_9to1_8/storage/EntityTracker1_9.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.viaversion.viaversion.libs.fastutil.ints.Int2ObjectOpenHashMap;
2828
import com.viaversion.viaversion.libs.fastutil.ints.IntArrayList;
2929
import com.viaversion.viaversion.libs.fastutil.ints.IntList;
30+
import com.viaversion.viaversion.libs.fastutil.ints.IntOpenHashSet;
31+
import com.viaversion.viaversion.libs.fastutil.ints.IntSet;
3032
import java.util.List;
3133
import java.util.Map;
3234

@@ -35,6 +37,7 @@ public class EntityTracker1_9 extends EntityTrackerBase {
3537
private final Int2ObjectMap<IntList> vehicles = new Int2ObjectOpenHashMap<>();
3638
private final Int2ObjectMap<Vector> offsets = new Int2ObjectOpenHashMap<>();
3739
private final Int2IntMap status = new Int2IntOpenHashMap();
40+
private final IntSet handActive = new IntOpenHashSet();
3841

3942
public EntityTracker1_9(UserConnection connection) {
4043
super(connection, EntityTypes1_9.EntityType.PLAYER);
@@ -45,6 +48,7 @@ public void removeEntity(int id) {
4548
vehicles.remove(id);
4649
offsets.remove(id);
4750
status.remove(id);
51+
handActive.remove(id);
4852

4953
vehicles.forEach((vehicle, passengers) -> passengers.rem(id));
5054
vehicles.int2ObjectEntrySet().removeIf(entry -> entry.getValue().isEmpty());
@@ -88,4 +92,16 @@ public Integer getVehicle(final int passenger) {
8892
public Int2IntMap getStatus() {
8993
return status;
9094
}
95+
96+
public boolean isHandActive(final int id) {
97+
return handActive.contains(id);
98+
}
99+
100+
public void setHandActive(final int id, final boolean active) {
101+
if (active) {
102+
handActive.add(id);
103+
} else {
104+
handActive.remove(id);
105+
}
106+
}
91107
}

0 commit comments

Comments
 (0)