From c50e2fd0d4a42d9b6aca702bb6d77ff28141c943 Mon Sep 17 00:00:00 2001
From: D3v1s0m <d3v1s0m@gmail.com>
Date: Mon, 3 Jun 2024 13:39:00 +0530
Subject: [PATCH] added force_body_rotation property for player npc

---
 .../java/lol/pyr/znpcsplus/ZNpcsPlus.java     |  2 +-
 .../entity/EntityPropertyRegistryImpl.java    |  5 +++-
 .../properties/ForceBodyRotationProperty.java | 24 +++++++++++++++++++
 .../znpcsplus/npc/NpcTypeRegistryImpl.java    |  2 +-
 4 files changed, 30 insertions(+), 3 deletions(-)
 create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java

diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
index 00b0aa1..4729f6f 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java
@@ -115,7 +115,7 @@ public class ZNpcsPlus {
         MojangSkinCache skinCache = new MojangSkinCache(configManager);
         EntityPropertyRegistryImpl propertyRegistry = new EntityPropertyRegistryImpl(skinCache, configManager);
         PacketFactory packetFactory = setupPacketFactory(scheduler, propertyRegistry, configManager);
-        propertyRegistry.registerTypes(packetFactory, textSerializer);
+        propertyRegistry.registerTypes(bootstrap, packetFactory, textSerializer);
 
         ActionRegistry actionRegistry = new ActionRegistry();
         NpcTypeRegistryImpl typeRegistry = new NpcTypeRegistryImpl();
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
index 7cf0ef9..ba70aa3 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
@@ -9,6 +9,7 @@ import com.github.retrooper.packetevents.protocol.nbt.NBTInt;
 import com.github.retrooper.packetevents.protocol.nbt.NBTString;
 import com.github.retrooper.packetevents.protocol.player.EquipmentSlot;
 import com.github.retrooper.packetevents.protocol.world.BlockFace;
+import lol.pyr.znpcsplus.ZNpcsPlusBootstrap;
 import lol.pyr.znpcsplus.api.entity.EntityProperty;
 import lol.pyr.znpcsplus.api.entity.EntityPropertyRegistry;
 import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
@@ -103,7 +104,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
          */
     }
 
-    public void registerTypes(PacketFactory packetFactory, LegacyComponentSerializer textSerializer) {
+    public void registerTypes(ZNpcsPlusBootstrap plugin, PacketFactory packetFactory, LegacyComponentSerializer textSerializer) {
         ServerVersion ver = PacketEvents.getAPI().getServerManager().getVersion();
         boolean legacyBooleans = ver.isOlderThan(ServerVersion.V_1_9);
         boolean legacyNames = ver.isOlderThan(ServerVersion.V_1_9);
@@ -126,6 +127,8 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
 
         register(new DummyProperty<>("permission_required", false));
 
+        register(new ForceBodyRotationProperty(plugin));
+
         register(new DummyProperty<>("player_knockback", false));
         register(new DummyProperty<>("player_knockback_exempt_permission", String.class));
         register(new DummyProperty<>("player_knockback_distance", 0.4));
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java
new file mode 100644
index 0000000..4d568a7
--- /dev/null
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java
@@ -0,0 +1,24 @@
+package lol.pyr.znpcsplus.entity.properties;
+
+import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
+import lol.pyr.znpcsplus.ZNpcsPlusBootstrap;
+import lol.pyr.znpcsplus.entity.PacketEntity;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+
+import java.util.Map;
+
+public class ForceBodyRotationProperty extends DummyProperty<Boolean> {
+    private final ZNpcsPlusBootstrap plugin;
+
+    public ForceBodyRotationProperty(ZNpcsPlusBootstrap plugin) {
+        super("force_body_rotation", false);
+        this.plugin = plugin;
+    }
+
+    @Override
+    public void apply(Player player, PacketEntity entity, boolean isSpawned, Map<Integer, EntityData> properties) {
+        Bukkit.getScheduler().runTaskLater(plugin, () -> entity.swingHand(player, false), 2L);
+        Bukkit.getScheduler().runTaskLater(plugin, () -> entity.swingHand(player, false), 6L);
+    }
+}
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
index dec48bd..138bbd9 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
@@ -36,7 +36,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         register(builder(p, "player", EntityTypes.PLAYER)
                 .setHologramOffset(-0.15D)
                 .addEquipmentProperties()
-                .addProperties("skin_cape", "skin_jacket", "skin_left_sleeve", "skin_right_sleeve", "skin_left_leg", "skin_right_leg", "skin_hat", "shoulder_entity_left", "shoulder_entity_right")
+                .addProperties("skin_cape", "skin_jacket", "skin_left_sleeve", "skin_right_sleeve", "skin_left_leg", "skin_right_leg", "skin_hat", "shoulder_entity_left", "shoulder_entity_right", "force_body_rotation")
                 .addDefaultProperty("skin_cape", true)
                 .addDefaultProperty("skin_jacket", true)
                 .addDefaultProperty("skin_left_sleeve", true)