From 18cdef45275f90f53b1d9f0a783be771581f7b3a Mon Sep 17 00:00:00 2001
From: D3v1s0m <d3v1s0m@gmail.com>
Date: Mon, 1 Jul 2024 10:06:35 +0530
Subject: [PATCH 1/4] update hologram location on npc type change

---
 plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java | 1 +
 1 file changed, 1 insertion(+)

diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java
index e7a2b7f..5916218 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java
@@ -56,6 +56,7 @@ public class NpcImpl extends Viewable implements Npc {
         UNSAFE_hideAll();
         this.type = type;
         entity = new PacketEntity(packetFactory, this, type.getType(), entity.getLocation());
+        hologram.setLocation(location.withY(location.getY() + type.getHologramOffset()));
         UNSAFE_showAll();
     }
 

From 3248418464a452c97fb9c570718823bd8ac71895 Mon Sep 17 00:00:00 2001
From: D3v1s0m <d3v1s0m@gmail.com>
Date: Mon, 1 Jul 2024 10:08:01 +0530
Subject: [PATCH 2/4] fix base hologram offset for multiple npc types

---
 .../pyr/znpcsplus/npc/NpcTypeRegistryImpl.java | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

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 138bbd9..135638b 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
@@ -48,7 +48,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         // Most hologram offsets generated using Entity#getHeight() in 1.19.4
 
         register(builder(p, "armor_stand", EntityTypes.ARMOR_STAND)
-                .setHologramOffset(-0.15)
+                .setHologramOffset(0)
                 .addEquipmentProperties()
                 .addProperties("small", "arms", "base_plate", "head_rotation", "body_rotation", "left_arm_rotation", "right_arm_rotation", "left_leg_rotation", "right_leg_rotation"));
 
@@ -106,7 +106,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         register(builder(p, "iron_golem", EntityTypes.IRON_GOLEM)
                 .setHologramOffset(0.725));
 
-        register(builder(p, "magma_cube", EntityTypes.MAGMA_CUBE)); // TODO: Hologram offset scaling with size property
+        register(builder(p, "magma_cube", EntityTypes.MAGMA_CUBE)
+                .setHologramOffset(-1.455)); // TODO: Hologram offset scaling with size property
 
         register(builder(p, "mooshroom", EntityTypes.MOOSHROOM)
                 .setHologramOffset(-0.575)
@@ -137,7 +138,8 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         register(builder(p, "skeleton_horse", EntityTypes.SKELETON_HORSE)
                 .setHologramOffset(-0.375));
 
-        register(builder(p, "slime", EntityTypes.SLIME)); // TODO: Hologram offset scaling with size property
+        register(builder(p, "slime", EntityTypes.SLIME)
+                .setHologramOffset(-1.455)); // TODO: Hologram offset scaling with size property
 
         register(builder(p, "snow_golem", EntityTypes.SNOW_GOLEM)
                 .setHologramOffset(-0.075)
@@ -230,7 +232,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
                 .addEquipmentProperties());
 
         register(builder(p, "zombie_villager", EntityTypes.ZOMBIE_VILLAGER)
-                .setHologramOffset(-1.0)
+                .setHologramOffset(-0.025)
                 .addEquipmentProperties());
 
         if (!version.isNewerThanOrEquals(ServerVersion.V_1_12)) return;
@@ -315,7 +317,7 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
                 .addProperties("hoglin_immune_to_zombification"));
 
         register(builder(p, "piglin", EntityTypes.PIGLIN)
-                .setHologramOffset(-1.0)
+                .setHologramOffset(-0.025)
                 .addEquipmentProperties()
                 .addProperties("piglin_baby", "piglin_charging_crossbow", "piglin_dancing"));
 
@@ -363,17 +365,17 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         if (!version.isNewerThanOrEquals(ServerVersion.V_1_20)) return;
 
         register(builder(p, "sniffer", EntityTypes.SNIFFER)
-                .setHologramOffset(0.125)
+                .setHologramOffset(0.075)
                 .addProperties("sniffer_state"));
 
         register(builder(p, "camel", EntityTypes.CAMEL)
-                .setHologramOffset(0.25)
+                .setHologramOffset(0.4)
                 .addProperties("bashing", "camel_sitting"));
 
         if (!version.isNewerThanOrEquals(ServerVersion.V_1_20_5)) return;
 
         register(builder(p, "armadillo", EntityTypes.ARMADILLO)
-                .setHologramOffset(-1.475)
+                .setHologramOffset(-1.325)
                 .addProperties("armadillo_state"));
     }
 

From 71430afcc3163e65f0a89d26a88c0b7d554dfe86 Mon Sep 17 00:00:00 2001
From: D3v1s0m <d3v1s0m@gmail.com>
Date: Mon, 1 Jul 2024 10:09:11 +0530
Subject: [PATCH 3/4] fix force_body_rotation property to only apply it true

---
 .../entity/properties/ForceBodyRotationProperty.java        | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

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
index 4d568a7..8a6ca71 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/properties/ForceBodyRotationProperty.java
@@ -18,7 +18,9 @@ public class ForceBodyRotationProperty extends DummyProperty<Boolean> {
 
     @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);
+        if (entity.getProperty(this)) {
+            Bukkit.getScheduler().runTaskLater(plugin, () -> entity.swingHand(player, false), 2L);
+            Bukkit.getScheduler().runTaskLater(plugin, () -> entity.swingHand(player, false), 6L);
+        }
     }
 }

From aafdf0b3f9ffd2ddd9b10d1a82a3dda9336aa890 Mon Sep 17 00:00:00 2001
From: D3v1s0m <d3v1s0m@gmail.com>
Date: Mon, 1 Jul 2024 10:12:52 +0530
Subject: [PATCH 4/4] update to mc 1.21

---
 api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java    | 5 ++++-
 plugin/build.gradle                                      | 4 ++--
 .../pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java | 5 +++++
 .../java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java  | 9 +++++++++
 4 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java b/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java
index 4036e94..605702e 100644
--- a/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java
+++ b/api/src/main/java/lol/pyr/znpcsplus/util/NpcPose.java
@@ -20,5 +20,8 @@ public enum NpcPose {
     ROARING,
     SNIFFING,
     EMERGING,
-    DIGGING
+    DIGGING,
+    SLIDING,
+    SHOOTING,
+    INHALING,
 }
diff --git a/plugin/build.gradle b/plugin/build.gradle
index a4ae386..90a9e2a 100644
--- a/plugin/build.gradle
+++ b/plugin/build.gradle
@@ -8,7 +8,7 @@ runServer {
     javaLauncher = javaToolchains.launcherFor {
         languageVersion = JavaLanguageVersion.of(21)
     }
-    minecraftVersion "1.20.6"
+    minecraftVersion "1.21"
 }
 
 processResources {
@@ -20,7 +20,7 @@ dependencies {
     implementation "com.google.code.gson:gson:2.10.1" // JSON parsing
     implementation "org.bstats:bstats-bukkit:3.0.2" // Plugin stats
     implementation "me.robertlit:SpigotResourcesAPI:2.0" // Spigot API wrapper for update checker
-    implementation "com.github.retrooper.packetevents:spigot:2.3.0" // Packets
+    implementation "com.github.retrooper:packetevents-spigot:2.4.0" // Packets
     implementation "space.arim.dazzleconf:dazzleconf-ext-snakeyaml:1.2.1" // Configs
     implementation "lol.pyr:director-adventure:2.1.2" // Commands
 
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 ba70aa3..a7490c0 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
@@ -659,6 +659,11 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
 
         // Wolf
         register(new EncodedIntegerProperty<>("wolf_variant", WoldVariant.PALE, wolfIndex, WoldVariant::getId, EntityDataTypes.WOLF_VARIANT));
+
+        if (!ver.isNewerThanOrEquals(ServerVersion.V_1_21)) return;
+
+        // Bogged
+        register(new BooleanProperty("bogged_sheared", 16, false, legacyBooleans));
     }
 
     private void registerSerializer(PropertySerializer<?> serializer) {
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 135638b..39f52b7 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcTypeRegistryImpl.java
@@ -377,6 +377,15 @@ public class NpcTypeRegistryImpl implements NpcTypeRegistry {
         register(builder(p, "armadillo", EntityTypes.ARMADILLO)
                 .setHologramOffset(-1.325)
                 .addProperties("armadillo_state"));
+
+        if (!version.isNewerThanOrEquals(ServerVersion.V_1_21)) return;
+
+        register(builder(p, "bogged", EntityTypes.BOGGED)
+                .setHologramOffset(0.015)
+                .addProperties("bogged_sheared"));
+
+        register(builder(p, "breeze", EntityTypes.BREEZE)
+                .setHologramOffset(-0.205));
     }
 
     public Collection<NpcType> getAll() {