diff --git a/api/pom.xml b/api/pom.xml
index 04993c0..a0ce66b 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -8,7 +8,7 @@
npclib
net.jitse
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-api
diff --git a/api/src/main/java/net/jitse/npclib/api/NPC.java b/api/src/main/java/net/jitse/npclib/api/NPC.java
index 16b9fe0..3836644 100644
--- a/api/src/main/java/net/jitse/npclib/api/NPC.java
+++ b/api/src/main/java/net/jitse/npclib/api/NPC.java
@@ -5,6 +5,7 @@
package net.jitse.npclib.api;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.api.state.NPCState;
import org.bukkit.Location;
@@ -103,6 +104,13 @@ public interface NPC {
*/
NPC toggleState(NPCState state);
+ /**
+ * Plays an animation as the the NPC.
+ *
+ * @param animation The animation to play.
+ */
+ void playAnimation(NPCAnimation animation);
+
/**
* Get state of NPC.
*
diff --git a/api/src/main/java/net/jitse/npclib/api/state/NPCAnimation.java b/api/src/main/java/net/jitse/npclib/api/state/NPCAnimation.java
new file mode 100644
index 0000000..119f250
--- /dev/null
+++ b/api/src/main/java/net/jitse/npclib/api/state/NPCAnimation.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.api.state;
+
+public enum NPCAnimation {
+
+ SWING_MAINHAND(0),
+ TAKE_DAMAGE(1),
+ SWING_OFFHAND(3),
+ CRITICAL_DAMAGE(4),
+ MAGICAL_DAMAGE(5);
+
+ private int id;
+
+ NPCAnimation(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+}
diff --git a/api/src/main/java/net/jitse/npclib/internal/NPCBase.java b/api/src/main/java/net/jitse/npclib/internal/NPCBase.java
index 3bd2152..05b0856 100644
--- a/api/src/main/java/net/jitse/npclib/internal/NPCBase.java
+++ b/api/src/main/java/net/jitse/npclib/internal/NPCBase.java
@@ -11,6 +11,7 @@ import net.jitse.npclib.api.NPC;
import net.jitse.npclib.api.events.NPCHideEvent;
import net.jitse.npclib.api.events.NPCShowEvent;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.api.state.NPCState;
import net.jitse.npclib.hologram.Hologram;
@@ -268,6 +269,16 @@ public abstract class NPCBase implements NPC, NPCPacketHandler {
return this;
}
+ @Override
+ public void playAnimation(NPCAnimation animation) {
+ for (UUID shownUuid : shown) {
+ Player player = Bukkit.getPlayer(shownUuid);
+ if (player != null && isShown(player)) {
+ sendAnimationPacket(player, animation);
+ }
+ }
+ }
+
@Override
public ItemStack getItem(NPCSlot slot) {
Objects.requireNonNull(slot, "Slot cannot be null");
diff --git a/api/src/main/java/net/jitse/npclib/internal/NPCPacketHandler.java b/api/src/main/java/net/jitse/npclib/internal/NPCPacketHandler.java
index de51ea7..ab64479 100644
--- a/api/src/main/java/net/jitse/npclib/internal/NPCPacketHandler.java
+++ b/api/src/main/java/net/jitse/npclib/internal/NPCPacketHandler.java
@@ -4,6 +4,7 @@
package net.jitse.npclib.internal;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import org.bukkit.entity.Player;
@@ -22,6 +23,8 @@ interface NPCPacketHandler {
void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto);
+ void sendAnimationPacket(Player player, NPCAnimation animation);
+
default void sendEquipmentPackets(Player player) {
for (NPCSlot slot : NPCSlot.values())
sendEquipmentPacket(player, slot, true);
diff --git a/nms/pom.xml b/nms/pom.xml
index c073a82..286a9da 100644
--- a/nms/pom.xml
+++ b/nms/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms
diff --git a/nms/v1_10_R1/pom.xml b/nms/v1_10_R1/pom.xml
index 881bb41..7d18f5f 100755
--- a/nms/v1_10_R1/pom.xml
+++ b/nms/v1_10_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_10_R1
diff --git a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java
index 9d2c8ec..50485df 100755
--- a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java
+++ b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/NPC_v1_10_R1.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_10_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..90f9241
--- /dev/null
+++ b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_10_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_10_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_11_R1/pom.xml b/nms/v1_11_R1/pom.xml
index 3055261..5fa1c32 100755
--- a/nms/v1_11_R1/pom.xml
+++ b/nms/v1_11_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_11_R1
diff --git a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java
index dfb1151..9a85420 100755
--- a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java
+++ b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/NPC_v1_11_R1.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_11_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..092a96c
--- /dev/null
+++ b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_11_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_11_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_12_R1/pom.xml b/nms/v1_12_R1/pom.xml
index 2a69e05..aa9b953 100755
--- a/nms/v1_12_R1/pom.xml
+++ b/nms/v1_12_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_12_R1
diff --git a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java
index bd778f5..7cdfbf7 100755
--- a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java
+++ b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/NPC_v1_12_R1.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_12_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..d36d9d9
--- /dev/null
+++ b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_12_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_12_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_13_R1/pom.xml b/nms/v1_13_R1/pom.xml
index 1379b81..2c0742b 100755
--- a/nms/v1_13_R1/pom.xml
+++ b/nms/v1_13_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_13_R1
diff --git a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java
index af88de9..97b5465 100755
--- a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java
+++ b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/NPC_v1_13_R1.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_13_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..14b09dc
--- /dev/null
+++ b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_13_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_13_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_13_R2/pom.xml b/nms/v1_13_R2/pom.xml
index 95f2eaf..4c544ae 100755
--- a/nms/v1_13_R2/pom.xml
+++ b/nms/v1_13_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_13_R2
diff --git a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java
index b6fad8f..e22b612 100755
--- a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java
+++ b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/NPC_v1_13_R2.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_13_R2 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..63e1bd0
--- /dev/null
+++ b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_13_R2.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_13_R2.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_14_R1/pom.xml b/nms/v1_14_R1/pom.xml
index ab91ec7..6814941 100755
--- a/nms/v1_14_R1/pom.xml
+++ b/nms/v1_14_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_14_R1
diff --git a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java
index 8e36033..d4c9c44 100755
--- a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java
+++ b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/NPC_v1_14_R1.java
@@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -105,6 +106,14 @@ public class NPC_v1_14_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..14e708f
--- /dev/null
+++ b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_14_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_14_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_15_R1/pom.xml b/nms/v1_15_R1/pom.xml
index 71a04e6..0708d81 100644
--- a/nms/v1_15_R1/pom.xml
+++ b/nms/v1_15_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_15_R1
diff --git a/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/NPC_v1_15_R1.java b/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/NPC_v1_15_R1.java
index 044b54a..d0341ed 100644
--- a/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/NPC_v1_15_R1.java
+++ b/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/NPC_v1_15_R1.java
@@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -106,6 +107,14 @@ public class NPC_v1_15_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..3771340
--- /dev/null
+++ b/nms/v1_15_R1/src/main/java/net/jitse/npclib/nms/v1_15_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_15_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_15_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_16_R1/pom.xml b/nms/v1_16_R1/pom.xml
index 7c521e3..62cae7a 100644
--- a/nms/v1_16_R1/pom.xml
+++ b/nms/v1_16_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_16_R1
diff --git a/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/NPC_v1_16_R1.java b/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/NPC_v1_16_R1.java
index c7ee60c..667ac9a 100644
--- a/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/NPC_v1_16_R1.java
+++ b/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/NPC_v1_16_R1.java
@@ -5,6 +5,7 @@ import com.mojang.authlib.properties.Property;
import com.mojang.datafixers.util.Pair;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -30,6 +31,7 @@ public class NPC_v1_16_R1 extends NPCBase {
private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove;
private PacketPlayOutEntityHeadRotation packetPlayOutEntityHeadRotation;
private PacketPlayOutEntityDestroy packetPlayOutEntityDestroy;
+ private PacketPlayOutAnimation packetPlayOutAnimation;
public NPC_v1_16_R1(NPCLib instance, List lines) {
super(instance, lines);
@@ -109,6 +111,14 @@ public class NPC_v1_16_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..b2c8a37
--- /dev/null
+++ b/nms/v1_16_R1/src/main/java/net/jitse/npclib/nms/v1_16_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_16_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_16_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_8_R2/pom.xml b/nms/v1_8_R2/pom.xml
index d3a4a9e..1ff6d62 100755
--- a/nms/v1_8_R2/pom.xml
+++ b/nms/v1_8_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_8_R2
diff --git a/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java
index bfea259..42a44a1 100755
--- a/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java
+++ b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -114,6 +115,18 @@ public class NPC_v1_8_R2 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ if(animation == NPCAnimation.SWING_OFFHAND) {
+ throw new IllegalArgumentException("Offhand Swing Animations are only available on 1.9 and up.");
+ }
+
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..6e915b1
--- /dev/null
+++ b/nms/v1_8_R2/src/main/java/net/jitse/npclib/nms/v1_8_R2/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_8_R2.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_8_R2.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_8_R3/pom.xml b/nms/v1_8_R3/pom.xml
index abca64d..f79d2fd 100755
--- a/nms/v1_8_R3/pom.xml
+++ b/nms/v1_8_R3/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_8_R3
diff --git a/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java
index c1909e7..16fa1ae 100755
--- a/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java
+++ b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -115,6 +116,18 @@ public class NPC_v1_8_R3 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ if(animation == NPCAnimation.SWING_OFFHAND) {
+ throw new IllegalArgumentException("Offhand Swing Animations are only available on 1.9 and up.");
+ }
+
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..72ca110
--- /dev/null
+++ b/nms/v1_8_R3/src/main/java/net/jitse/npclib/nms/v1_8_R3/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_8_R3.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_8_R3.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_9_R1/pom.xml b/nms/v1_9_R1/pom.xml
index 855a828..6760a1f 100755
--- a/nms/v1_9_R1/pom.xml
+++ b/nms/v1_9_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_9_R1
diff --git a/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java
index 042e13f..9d04d92 100755
--- a/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java
+++ b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_9_R1 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..aa1fa07
--- /dev/null
+++ b/nms/v1_9_R1/src/main/java/net/jitse/npclib/nms/v1_9_R1/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_9_R1.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_9_R1.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/nms/v1_9_R2/pom.xml b/nms/v1_9_R2/pom.xml
index e593cd2..0a13be4 100755
--- a/nms/v1_9_R2/pom.xml
+++ b/nms/v1_9_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-nms-v1_9_R2
diff --git a/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java
index 8eb9dd4..fbf0309 100755
--- a/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java
+++ b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java
@@ -8,6 +8,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import net.jitse.npclib.NPCLib;
import net.jitse.npclib.api.skin.Skin;
+import net.jitse.npclib.api.state.NPCAnimation;
import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
@@ -109,6 +110,14 @@ public class NPC_v1_9_R2 extends NPCBase {
playerConnection.sendPacket(packet);
}
+ @Override
+ public void sendAnimationPacket(Player player, NPCAnimation animation) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ PacketPlayOutAnimation packet = new PacketPlayOutAnimationWrapper().create(animation, entityId);
+ playerConnection.sendPacket(packet);
+ }
+
@Override
public void updateSkin(Skin skin) {
GameProfile newProfile = new GameProfile(uuid, name);
diff --git a/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/packets/PacketPlayOutAnimationWrapper.java b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/packets/PacketPlayOutAnimationWrapper.java
new file mode 100644
index 0000000..553a20b
--- /dev/null
+++ b/nms/v1_9_R2/src/main/java/net/jitse/npclib/nms/v1_9_R2/packets/PacketPlayOutAnimationWrapper.java
@@ -0,0 +1,20 @@
+package net.jitse.npclib.nms.v1_9_R2.packets;
+
+import com.comphenix.tinyprotocol.Reflection;
+import net.jitse.npclib.api.state.NPCAnimation;
+import net.minecraft.server.v1_9_R2.PacketPlayOutAnimation;
+
+public class PacketPlayOutAnimationWrapper {
+
+ public PacketPlayOutAnimation create(NPCAnimation npcAnimation, int entityId) {
+ PacketPlayOutAnimation packetPlayOutAnimation = new PacketPlayOutAnimation();
+
+ Reflection.getField(packetPlayOutAnimation.getClass(), "a", int.class)
+ .set(packetPlayOutAnimation, entityId);
+ Reflection.getField(packetPlayOutAnimation.getClass(), "b", int.class)
+ .set(packetPlayOutAnimation, npcAnimation.getId());
+
+ return packetPlayOutAnimation;
+ }
+
+}
diff --git a/plugin/pom.xml b/plugin/pom.xml
index 113b733..e22133a 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
npclib-plugin
diff --git a/pom.xml b/pom.xml
index 07841be..f82abf4 100755
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
net.jitse
npclib
- 2.8-SNAPSHOT
+ 2.9-SNAPSHOT
UTF-8