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