diff --git a/api/pom.xml b/api/pom.xml
index 9bd97cf..7668eca 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -8,7 +8,7 @@
npclib
net.jitse
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-api
diff --git a/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java b/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java
index db30d79..5b0bacf 100644
--- a/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java
+++ b/api/src/main/java/net/jitse/npclib/internal/SimpleNPC.java
@@ -284,6 +284,9 @@ public abstract class SimpleNPC implements NPC, PacketHandler {
case MAINHAND:
this.inHand = item;
break;
+ case OFFHAND:
+ this.offHand = item;
+ break;
default:
throw new IllegalArgumentException("Entered an invalid inventory slot");
}
diff --git a/nms/pom.xml b/nms/pom.xml
index 1ba2367..850a5ce 100644
--- a/nms/pom.xml
+++ b/nms/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms
@@ -19,12 +19,12 @@
v1_8_R3
v1_9_R1
v1_9_R2
-
-
-
-
-
-
+ v1_10_R1
+ v1_11_R1
+ v1_12_R1
+ v1_13_R1
+ v1_13_R2
+ v1_14_R1
diff --git a/nms/v1_10_R1/pom.xml b/nms/v1_10_R1/pom.xml
index ac4739a..3875bea 100755
--- a/nms/v1_10_R1/pom.xml
+++ b/nms/v1_10_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 cc1b3df..7a85dd8 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
@@ -5,17 +5,17 @@
package net.jitse.npclib.nms.v1_10_R1;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_10_R1.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_10_R1.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_10_R1.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_10_R1.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_10_R1.packets.*;
import net.minecraft.server.v1_10_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -97,4 +97,54 @@ public class NPC_v1_10_R1 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..3b90e73
--- /dev/null
+++ b/nms/v1_10_R1/src/main/java/net/jitse/npclib/nms/v1_10_R1/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,18 @@
+package net.jitse.npclib.nms.v1_10_R1.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_10_R1.DataWatcher;
+import net.minecraft.server.v1_10_R1.DataWatcherObject;
+import net.minecraft.server.v1_10_R1.DataWatcherRegistry;
+import net.minecraft.server.v1_10_R1.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_11_R1/pom.xml b/nms/v1_11_R1/pom.xml
index 1e85708..921b854 100755
--- a/nms/v1_11_R1/pom.xml
+++ b/nms/v1_11_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 31b0472..60c1717 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
@@ -5,17 +5,17 @@
package net.jitse.npclib.nms.v1_11_R1;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_11_R1.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_11_R1.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_11_R1.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_11_R1.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_11_R1.packets.*;
import net.minecraft.server.v1_11_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -97,4 +97,54 @@ public class NPC_v1_11_R1 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..4bea133
--- /dev/null
+++ b/nms/v1_11_R1/src/main/java/net/jitse/npclib/nms/v1_11_R1/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,18 @@
+package net.jitse.npclib.nms.v1_11_R1.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_11_R1.DataWatcher;
+import net.minecraft.server.v1_11_R1.DataWatcherObject;
+import net.minecraft.server.v1_11_R1.DataWatcherRegistry;
+import net.minecraft.server.v1_11_R1.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_12_R1/pom.xml b/nms/v1_12_R1/pom.xml
index 66ea4e8..76c88c8 100755
--- a/nms/v1_12_R1/pom.xml
+++ b/nms/v1_12_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 eebda05..17698a9 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
@@ -5,17 +5,17 @@
package net.jitse.npclib.nms.v1_12_R1;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_12_R1.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_12_R1.packets.*;
import net.minecraft.server.v1_12_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -95,4 +95,54 @@ public class NPC_v1_12_R1 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..580f201
--- /dev/null
+++ b/nms/v1_12_R1/src/main/java/net/jitse/npclib/nms/v1_12_R1/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,18 @@
+package net.jitse.npclib.nms.v1_12_R1.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_12_R1.DataWatcher;
+import net.minecraft.server.v1_12_R1.DataWatcherObject;
+import net.minecraft.server.v1_12_R1.DataWatcherRegistry;
+import net.minecraft.server.v1_12_R1.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_13_R1/pom.xml b/nms/v1_13_R1/pom.xml
index 9965842..e88868b 100755
--- a/nms/v1_13_R1/pom.xml
+++ b/nms/v1_13_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 e54bccf..99caaba 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
@@ -5,17 +5,17 @@
package net.jitse.npclib.nms.v1_13_R1;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_13_R1.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_13_R1.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_13_R1.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_13_R1.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_13_R1.packets.*;
import net.minecraft.server.v1_13_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -96,4 +96,54 @@ public class NPC_v1_13_R1 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..2049d4c
--- /dev/null
+++ b/nms/v1_13_R1/src/main/java/net/jitse/npclib/nms/v1_13_R1/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,18 @@
+package net.jitse.npclib.nms.v1_13_R1.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_13_R1.DataWatcher;
+import net.minecraft.server.v1_13_R1.DataWatcherObject;
+import net.minecraft.server.v1_13_R1.DataWatcherRegistry;
+import net.minecraft.server.v1_13_R1.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_13_R2/pom.xml b/nms/v1_13_R2/pom.xml
index adc35a1..673ed6f 100755
--- a/nms/v1_13_R2/pom.xml
+++ b/nms/v1_13_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 ef456e5..de3b0c2 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
@@ -5,17 +5,17 @@
package net.jitse.npclib.nms.v1_13_R2;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_13_R2.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_13_R2.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_13_R2.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_13_R2.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_13_R2.packets.*;
import net.minecraft.server.v1_13_R2.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -77,7 +77,7 @@ public class NPC_v1_13_R2 extends SimpleNPC {
PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
if (hasTeamRegistered.add(player.getUniqueId()))
- playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister);
+ playerConnection.sendPacket(packetPlayOutScoreboardTeamRegister);
playerConnection.sendPacket(packetPlayOutPlayerInfoAdd);
playerConnection.sendPacket(packetPlayOutNamedEntitySpawn);
playerConnection.sendPacket(packetPlayOutEntityHeadRotation);
@@ -97,4 +97,54 @@ public class NPC_v1_13_R2 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..ec0cd50
--- /dev/null
+++ b/nms/v1_13_R2/src/main/java/net/jitse/npclib/nms/v1_13_R2/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,18 @@
+package net.jitse.npclib.nms.v1_13_R2.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_13_R2.DataWatcher;
+import net.minecraft.server.v1_13_R2.DataWatcherObject;
+import net.minecraft.server.v1_13_R2.DataWatcherRegistry;
+import net.minecraft.server.v1_13_R2.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_14_R1/pom.xml b/nms/v1_14_R1/pom.xml
index 85eb2c4..1252a9b 100755
--- a/nms/v1_14_R1/pom.xml
+++ b/nms/v1_14_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-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 19125b5..fba7785 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
@@ -1,17 +1,17 @@
package net.jitse.npclib.nms.v1_14_R1;
import net.jitse.npclib.NPCLib;
+import net.jitse.npclib.api.state.NPCSlot;
import net.jitse.npclib.hologram.Hologram;
import net.jitse.npclib.internal.MinecraftVersion;
import net.jitse.npclib.internal.SimpleNPC;
-import net.jitse.npclib.nms.v1_14_R1.packets.PacketPlayOutEntityHeadRotationWrapper;
-import net.jitse.npclib.nms.v1_14_R1.packets.PacketPlayOutNamedEntitySpawnWrapper;
-import net.jitse.npclib.nms.v1_14_R1.packets.PacketPlayOutPlayerInfoWrapper;
-import net.jitse.npclib.nms.v1_14_R1.packets.PacketPlayOutScoreboardTeamWrapper;
+import net.jitse.npclib.nms.v1_14_R1.packets.*;
import net.minecraft.server.v1_14_R1.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.List;
@@ -93,4 +93,54 @@ public class NPC_v1_14_R1 extends SimpleNPC {
playerConnection.sendPacket(packetPlayOutPlayerInfoRemove);
hologram.destroy(player);
}
+
+ @Override
+ public void sendMetadataPacket(Player player) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+ PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadataWrapper().create(activeStates, entityId);
+
+ playerConnection.sendPacket(packet);
+ }
+
+ @Override
+ public void sendEquipmentPacket(Player player, NPCSlot slot, boolean auto) {
+ PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
+
+ EnumItemSlot nmsSlot;
+ ItemStack item;
+ switch (slot) {
+ case HELMET:
+ item = helmet;
+ nmsSlot = EnumItemSlot.HEAD;
+ break;
+ case CHESTPLATE:
+ item = chestplate;
+ nmsSlot = EnumItemSlot.CHEST;
+ break;
+ case LEGGINGS:
+ item = leggings;
+ nmsSlot = EnumItemSlot.LEGS;
+ break;
+ case BOOTS:
+ item = boots;
+ nmsSlot = EnumItemSlot.FEET;
+ break;
+ case MAINHAND:
+ item = inHand;
+ nmsSlot = EnumItemSlot.MAINHAND;
+ break;
+ case OFFHAND:
+ item = offHand;
+ nmsSlot = EnumItemSlot.OFFHAND;
+ break;
+ default:
+ if (!auto) {
+ throw new IllegalArgumentException(slot.toString() + " is not a supported slot for the version of your server");
+ }
+ return;
+ }
+
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment(entityId, nmsSlot, CraftItemStack.asNMSCopy(item));
+ playerConnection.sendPacket(packet);
+ }
}
diff --git a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutEntityMetadataWrapper.java b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutEntityMetadataWrapper.java
new file mode 100644
index 0000000..e22124b
--- /dev/null
+++ b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutEntityMetadataWrapper.java
@@ -0,0 +1,35 @@
+package net.jitse.npclib.nms.v1_14_R1.packets;
+
+import net.jitse.npclib.api.state.NPCState;
+import net.minecraft.server.v1_14_R1.DataWatcher;
+import net.minecraft.server.v1_14_R1.DataWatcherObject;
+import net.minecraft.server.v1_14_R1.DataWatcherRegistry;
+import net.minecraft.server.v1_14_R1.PacketPlayOutEntityMetadata;
+
+public class PacketPlayOutEntityMetadataWrapper {
+
+ public PacketPlayOutEntityMetadata create(NPCState[] activateStates, int entityId) {
+ DataWatcher dataWatcher = new DataWatcher(null);
+ byte masked = NPCState.getMasked(activateStates);
+ // TODO: Find out why NPCState#CROUCHED doesn't work.
+ dataWatcher.register(new DataWatcherObject<>(0, DataWatcherRegistry.a), masked);
+
+// for (Player online : Bukkit.getOnlinePlayers()) {
+// DataWatcher watcher = ((CraftPlayer) online).getHandle().getDataWatcher();
+// try {
+// Field entriesField = watcher.getClass().getDeclaredField("entries");
+// entriesField.setAccessible(true);
+//
+// Int2ObjectOpenHashMap> entries = (Int2ObjectOpenHashMap>) entriesField.get(watcher);
+// entries.forEach((integer, item) -> {
+// if (item.b() instanceof Boolean || item.b() instanceof Byte)
+// online.sendMessage(integer + ": " + item.b() + " type = " + item.b().getClass().toString());
+// });
+// } catch (NoSuchFieldException | IllegalAccessException e) {
+// e.printStackTrace();
+// }
+// }
+
+ return new PacketPlayOutEntityMetadata(entityId, dataWatcher, true);
+ }
+}
diff --git a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutNamedEntitySpawnWrapper.java b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutNamedEntitySpawnWrapper.java
index 15e4988..6c4925c 100755
--- a/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutNamedEntitySpawnWrapper.java
+++ b/nms/v1_14_R1/src/main/java/net/jitse/npclib/nms/v1_14_R1/packets/PacketPlayOutNamedEntitySpawnWrapper.java
@@ -37,7 +37,7 @@ public class PacketPlayOutNamedEntitySpawnWrapper {
.set(packetPlayOutNamedEntitySpawn, (byte) ((int) (location.getPitch() * 256.0F / 360.0F)));
DataWatcher dataWatcher = new DataWatcher(null);
- dataWatcher.register(new DataWatcherObject<>(13, DataWatcherRegistry.a), (byte) 127);
+ dataWatcher.register(new DataWatcherObject<>(15, DataWatcherRegistry.a), (byte) 127);
Reflection.getField(packetPlayOutNamedEntitySpawn.getClass(), "h", DataWatcher.class)
.set(packetPlayOutNamedEntitySpawn, dataWatcher);
diff --git a/nms/v1_8_R1/pom.xml b/nms/v1_8_R1/pom.xml
index 32c0703..3221a7a 100755
--- a/nms/v1_8_R1/pom.xml
+++ b/nms/v1_8_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms-v1_8_R1
diff --git a/nms/v1_8_R2/pom.xml b/nms/v1_8_R2/pom.xml
index 356a243..f4dc630 100755
--- a/nms/v1_8_R2/pom.xml
+++ b/nms/v1_8_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms-v1_8_R2
diff --git a/nms/v1_8_R3/pom.xml b/nms/v1_8_R3/pom.xml
index f5d53d4..3ac8a63 100755
--- a/nms/v1_8_R3/pom.xml
+++ b/nms/v1_8_R3/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms-v1_8_R3
diff --git a/nms/v1_9_R1/pom.xml b/nms/v1_9_R1/pom.xml
index f159ef3..092ab5c 100755
--- a/nms/v1_9_R1/pom.xml
+++ b/nms/v1_9_R1/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms-v1_9_R1
diff --git a/nms/v1_9_R2/pom.xml b/nms/v1_9_R2/pom.xml
index 2bbf60f..297bc38 100755
--- a/nms/v1_9_R2/pom.xml
+++ b/nms/v1_9_R2/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib-nms
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-nms-v1_9_R2
diff --git a/plugin/pom.xml b/plugin/pom.xml
index 7c1842c..7235077 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -8,7 +8,7 @@
net.jitse
npclib
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
npclib-plugin
diff --git a/pom.xml b/pom.xml
index d1909ec..94d321c 100755
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
net.jitse
npclib
- 2.1-SNAPSHOT
+ 2.2-SNAPSHOT
UTF-8