From 8abdb8edb9a30abd7023b4c85c1cc4dfea580144 Mon Sep 17 00:00:00 2001
From: Yang Seong Mo <angryko@naver.com>
Date: Sat, 28 Dec 2024 20:07:15 +0900
Subject: [PATCH] Prevents item swap when running player animation.

---
 .../toxicity/model/api/tracker/PlayerTracker.java |  9 +++++++++
 .../kr/toxicity/model/nms/v1_20_R3/NMSImpl.kt     | 15 +++++++++++++++
 .../kr/toxicity/model/nms/v1_20_R4/NMSImpl.kt     | 15 +++++++++++++++
 .../kr/toxicity/model/nms/v1_21_R1/NMSImpl.kt     | 15 +++++++++++++++
 .../kr/toxicity/model/nms/v1_21_R2/NMSImpl.kt     | 15 +++++++++++++++
 .../kr/toxicity/model/nms/v1_21_R3/NMSImpl.kt     | 15 +++++++++++++++
 6 files changed, 84 insertions(+)

diff --git a/api/src/main/java/kr/toxicity/model/api/tracker/PlayerTracker.java b/api/src/main/java/kr/toxicity/model/api/tracker/PlayerTracker.java
index 07382ca..267cdf3 100644
--- a/api/src/main/java/kr/toxicity/model/api/tracker/PlayerTracker.java
+++ b/api/src/main/java/kr/toxicity/model/api/tracker/PlayerTracker.java
@@ -7,8 +7,11 @@
 
 public final class PlayerTracker extends EntityTracker {
 
+    private final Player player;
+
     public PlayerTracker(@NotNull Player entity, @NotNull RenderInstance instance) {
         super(entity, instance);
+        this.player = entity;
         instance.filter(p -> BetterModel.inst().playerManager().player(p).showPlayerLimb());
     }
 
@@ -16,4 +19,10 @@ public PlayerTracker(@NotNull Player entity, @NotNull RenderInstance instance) {
     public boolean isRunningSingleAnimation() {
         return false;
     }
+
+    @Override
+    public void close() throws Exception {
+        super.close();
+        player.updateInventory();
+    }
 }
diff --git a/nms/v1_20_R3/src/main/kotlin/kr/toxicity/model/nms/v1_20_R3/NMSImpl.kt b/nms/v1_20_R3/src/main/kotlin/kr/toxicity/model/nms/v1_20_R3/NMSImpl.kt
index 85e9b55..23051d7 100644
--- a/nms/v1_20_R3/src/main/kotlin/kr/toxicity/model/nms/v1_20_R3/NMSImpl.kt
+++ b/nms/v1_20_R3/src/main/kotlin/kr/toxicity/model/nms/v1_20_R3/NMSImpl.kt
@@ -209,6 +209,21 @@ class NMSImpl : NMS {
             super.write(ctx, msg, promise)
         }
 
+        override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
+            when (msg) {
+                is ServerboundSetCarriedItemPacket -> {
+                    if (connection.player.id.toTracker() != null) {
+                        connection.send(ClientboundSetCarriedItemPacket(player.inventory.heldItemSlot))
+                        return
+                    }
+                }
+                is ServerboundPlayerActionPacket -> {
+                    if (connection.player.id.toTracker() != null) return
+                }
+            }
+            super.channelRead(ctx, msg)
+        }
+
         private fun EntityTracker.remove() {
             entityUUIDMap.remove(uuid())
             remove(player)
diff --git a/nms/v1_20_R4/src/main/kotlin/kr/toxicity/model/nms/v1_20_R4/NMSImpl.kt b/nms/v1_20_R4/src/main/kotlin/kr/toxicity/model/nms/v1_20_R4/NMSImpl.kt
index cc95540..f58625b 100644
--- a/nms/v1_20_R4/src/main/kotlin/kr/toxicity/model/nms/v1_20_R4/NMSImpl.kt
+++ b/nms/v1_20_R4/src/main/kotlin/kr/toxicity/model/nms/v1_20_R4/NMSImpl.kt
@@ -196,6 +196,21 @@ class NMSImpl : NMS {
             super.write(ctx, msg, promise)
         }
 
+        override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
+            when (msg) {
+                is ServerboundSetCarriedItemPacket -> {
+                    if (connection.player.id.toTracker() != null) {
+                        connection.send(ClientboundSetCarriedItemPacket(player.inventory.heldItemSlot))
+                        return
+                    }
+                }
+                is ServerboundPlayerActionPacket -> {
+                    if (connection.player.id.toTracker() != null) return
+                }
+            }
+            super.channelRead(ctx, msg)
+        }
+
         private fun EntityTracker.remove() {
             entityUUIDMap.remove(uuid())
             remove(player)
diff --git a/nms/v1_21_R1/src/main/kotlin/kr/toxicity/model/nms/v1_21_R1/NMSImpl.kt b/nms/v1_21_R1/src/main/kotlin/kr/toxicity/model/nms/v1_21_R1/NMSImpl.kt
index 7576ed1..eefb8a7 100644
--- a/nms/v1_21_R1/src/main/kotlin/kr/toxicity/model/nms/v1_21_R1/NMSImpl.kt
+++ b/nms/v1_21_R1/src/main/kotlin/kr/toxicity/model/nms/v1_21_R1/NMSImpl.kt
@@ -199,6 +199,21 @@ class NMSImpl : NMS {
             super.write(ctx, msg, promise)
         }
 
+        override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
+            when (msg) {
+                is ServerboundSetCarriedItemPacket -> {
+                    if (connection.player.id.toTracker() != null) {
+                        connection.send(ClientboundSetCarriedItemPacket(player.inventory.heldItemSlot))
+                        return
+                    }
+                }
+                is ServerboundPlayerActionPacket -> {
+                    if (connection.player.id.toTracker() != null) return
+                }
+            }
+            super.channelRead(ctx, msg)
+        }
+
         private fun EntityTracker.remove() {
             entityUUIDMap.remove(uuid())
             remove(player)
diff --git a/nms/v1_21_R2/src/main/kotlin/kr/toxicity/model/nms/v1_21_R2/NMSImpl.kt b/nms/v1_21_R2/src/main/kotlin/kr/toxicity/model/nms/v1_21_R2/NMSImpl.kt
index 54bb0b1..a036d12 100644
--- a/nms/v1_21_R2/src/main/kotlin/kr/toxicity/model/nms/v1_21_R2/NMSImpl.kt
+++ b/nms/v1_21_R2/src/main/kotlin/kr/toxicity/model/nms/v1_21_R2/NMSImpl.kt
@@ -197,6 +197,21 @@ class NMSImpl : NMS {
             super.write(ctx, msg, promise)
         }
 
+        override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
+            when (msg) {
+                is ServerboundSetCarriedItemPacket -> {
+                    if (connection.player.id.toTracker() != null) {
+                        connection.send(ClientboundSetHeldSlotPacket(player.inventory.heldItemSlot))
+                        return
+                    }
+                }
+                is ServerboundPlayerActionPacket -> {
+                    if (connection.player.id.toTracker() != null) return
+                }
+            }
+            super.channelRead(ctx, msg)
+        }
+
         private fun EntityTracker.remove() {
             entityUUIDMap.remove(uuid())
             remove(player)
diff --git a/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/nms/v1_21_R3/NMSImpl.kt b/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/nms/v1_21_R3/NMSImpl.kt
index d2a537d..1495fce 100644
--- a/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/nms/v1_21_R3/NMSImpl.kt
+++ b/nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/nms/v1_21_R3/NMSImpl.kt
@@ -199,6 +199,21 @@ class NMSImpl : NMS {
             super.write(ctx, msg, promise)
         }
 
+        override fun channelRead(ctx: ChannelHandlerContext, msg: Any) {
+            when (msg) {
+                is ServerboundSetCarriedItemPacket -> {
+                    if (connection.player.id.toTracker() != null) {
+                        connection.send(ClientboundSetHeldSlotPacket(player.inventory.heldItemSlot))
+                        return
+                    }
+                }
+                is ServerboundPlayerActionPacket -> {
+                    if (connection.player.id.toTracker() != null) return
+                }
+            }
+            super.channelRead(ctx, msg)
+        }
+
         private fun EntityTracker.remove() {
             entityUUIDMap.remove(uuid())
             remove(player)