From 5650cbd1e23bd509d7fec95b74fa52ff827e3991 Mon Sep 17 00:00:00 2001 From: Jitse Boonstra Date: Tue, 29 Oct 2019 12:43:54 +0100 Subject: [PATCH] For 2.3-SNAPSHOT, text update method (#11)! --- api/pom.xml | 2 +- .../net/jitse/npclib/hologram/Hologram.java | 211 +++++++++++++++++- .../jitse/npclib/hologram/HologramBase.java | 58 ----- .../hologram/HologramPacketHandler.java | 12 - .../net/jitse/npclib/hologram/_Hologram.java | 179 --------------- .../net/jitse/npclib/internal/NPCBase.java | 5 +- nms/pom.xml | 22 +- nms/v1_10_R1/pom.xml | 2 +- .../npclib/nms/v1_10_R1/NPC_v1_10_R1.java | 12 +- nms/v1_11_R1/pom.xml | 2 +- .../npclib/nms/v1_11_R1/NPC_v1_11_R1.java | 12 +- nms/v1_12_R1/pom.xml | 2 +- .../npclib/nms/v1_12_R1/NPC_v1_12_R1.java | 12 +- nms/v1_13_R1/pom.xml | 2 +- .../npclib/nms/v1_13_R1/NPC_v1_13_R1.java | 11 +- nms/v1_13_R2/pom.xml | 2 +- .../npclib/nms/v1_13_R2/NPC_v1_13_R2.java | 12 +- nms/v1_14_R1/pom.xml | 2 +- .../npclib/nms/v1_14_R1/NPC_v1_14_R1.java | 12 +- nms/v1_8_R1/pom.xml | 2 +- .../jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java | 5 +- .../v1_8_R1/hologram/Hologram_v1_8_R1.java | 122 ---------- nms/v1_8_R2/pom.xml | 2 +- .../jitse/npclib/nms/v1_8_R2/NPC_v1_8_R2.java | 10 +- nms/v1_8_R3/pom.xml | 2 +- .../jitse/npclib/nms/v1_8_R3/NPC_v1_8_R3.java | 12 +- nms/v1_9_R1/pom.xml | 2 +- .../jitse/npclib/nms/v1_9_R1/NPC_v1_9_R1.java | 11 +- nms/v1_9_R2/pom.xml | 2 +- .../jitse/npclib/nms/v1_9_R2/NPC_v1_9_R2.java | 12 +- plugin/pom.xml | 2 +- pom.xml | 2 +- 32 files changed, 287 insertions(+), 471 deletions(-) delete mode 100644 api/src/main/java/net/jitse/npclib/hologram/HologramBase.java delete mode 100644 api/src/main/java/net/jitse/npclib/hologram/HologramPacketHandler.java delete mode 100644 api/src/main/java/net/jitse/npclib/hologram/_Hologram.java delete mode 100644 nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/hologram/Hologram_v1_8_R1.java diff --git a/api/pom.xml b/api/pom.xml index 7668eca..1c2ea57 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -8,7 +8,7 @@ npclib net.jitse - 2.2-SNAPSHOT + 2.3-SNAPSHOT npclib-api diff --git a/api/src/main/java/net/jitse/npclib/hologram/Hologram.java b/api/src/main/java/net/jitse/npclib/hologram/Hologram.java index 9e0b88c..feda77a 100644 --- a/api/src/main/java/net/jitse/npclib/hologram/Hologram.java +++ b/api/src/main/java/net/jitse/npclib/hologram/Hologram.java @@ -1,17 +1,216 @@ +/* + * Copyright (c) 2018 Jitse Boonstra + */ + package net.jitse.npclib.hologram; +import com.comphenix.tinyprotocol.Reflection; +import net.jitse.npclib.internal.MinecraftVersion; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.List; -import java.util.UUID; -public interface Hologram { +public class Hologram { + + private final List armorStands = new ArrayList<>(); + private final List showPackets = new ArrayList<>(); + private final List hidePackets = new ArrayList<>(); + + private static final double DELTA = 0.3; + + // Classes: + private static final Class CHAT_COMPONENT_TEXT_CLAZZ = Reflection.getMinecraftClass("ChatComponentText"); + private static final Class CHAT_BASE_COMPONENT_CLAZZ = Reflection.getMinecraftClass("IChatBaseComponent"); + private static final Class ENTITY_ARMOR_STAND_CLAZZ = Reflection.getMinecraftClass("EntityArmorStand"); + private static final Class ENTITY_LIVING_CLAZZ = Reflection.getMinecraftClass("EntityLiving"); + private static final Class ENTITY_CLAZZ = Reflection.getMinecraftClass("Entity"); + private static final Class CRAFT_BUKKIT_CLASS = Reflection.getCraftBukkitClass("CraftWorld"); + private static final Class CRAFT_PLAYER_CLAZZ = Reflection.getCraftBukkitClass("entity.CraftPlayer"); + private static final Class PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CLAZZ = Reflection.getMinecraftClass( + "PacketPlayOutSpawnEntityLiving"); + private static final Class PACKET_PLAY_OUT_ENTITY_DESTROY_CLAZZ = Reflection.getMinecraftClass( + "PacketPlayOutEntityDestroy"); + private static final Class PACKET_PLAY_OUT_ENTITY_METADATA_CLAZZ = Reflection.getMinecraftClass( + "PacketPlayOutEntityMetadata"); + private static final Class DATAWATCHER_CLAZZ = Reflection.getMinecraftClass("DataWatcher"); + private static final Class ENTITY_PLAYER_CLAZZ = Reflection.getMinecraftClass("EntityPlayer"); + private static final Class PLAYER_CONNECTION_CLAZZ = Reflection.getMinecraftClass("PlayerConnection"); + private static final Class PACKET_CLAZZ = Reflection.getMinecraftClass("Packet"); + + // Constructors: + private static final Reflection.ConstructorInvoker CHAT_COMPONENT_TEXT_CONSTRUCTOR = Reflection + .getConstructor(CHAT_COMPONENT_TEXT_CLAZZ, String.class); + private static final Reflection.ConstructorInvoker PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CONSTRUCTOR = Reflection + .getConstructor(PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CLAZZ, ENTITY_LIVING_CLAZZ); + private static final Reflection.ConstructorInvoker PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR = Reflection + .getConstructor(PACKET_PLAY_OUT_ENTITY_DESTROY_CLAZZ, int[].class); + private static final Reflection.ConstructorInvoker PACKET_PLAY_OUT_ENTITY_METADATA_CONSTRUCTOR = Reflection + .getConstructor(PACKET_PLAY_OUT_ENTITY_METADATA_CLAZZ, int.class, DATAWATCHER_CLAZZ, boolean.class); + + // Fields: + private static final Reflection.FieldAccessor playerConnectionField = Reflection.getField(ENTITY_PLAYER_CLAZZ, + "playerConnection", PLAYER_CONNECTION_CLAZZ); + + // Methods: + private static final Reflection.MethodInvoker SET_LOCATION_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "setLocation", double.class, double.class, double.class, float.class, float.class); + private static final Reflection.MethodInvoker SET_SMALL_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "setSmall", boolean.class); + private static final Reflection.MethodInvoker SET_INVISIBLE_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "setInvisible", boolean.class); + private static final Reflection.MethodInvoker SET_BASE_PLATE_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "setBasePlate", boolean.class); + private static final Reflection.MethodInvoker SET_ARMS_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "setArms", boolean.class); + private static final Reflection.MethodInvoker PLAYER_GET_HANDLE_METHOD = Reflection.getMethod(CRAFT_PLAYER_CLAZZ, + "getHandle"); + private static final Reflection.MethodInvoker SEND_PACKET_METHOD = Reflection.getMethod(PLAYER_CONNECTION_CLAZZ, + "sendPacket", PACKET_CLAZZ); + private static final Reflection.MethodInvoker GET_ID_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, + "getId"); + private static final Reflection.MethodInvoker GET_DATAWATCHER_METHOD = Reflection.getMethod(ENTITY_CLAZZ, + "getDataWatcher"); + + private final MinecraftVersion version; + private final Location start; + private final Object worldServer; + + private List text; + + public Hologram(MinecraftVersion version, Location location, List text) { + this.version = version; + this.start = location; + this.text = text; + + this.worldServer = Reflection.getMethod(CRAFT_BUKKIT_CLASS, "getHandle") + .invoke(CRAFT_BUKKIT_CLASS.cast(location.getWorld())); + + createPackets(); + } + + private void createPackets() { + // TODO: Check when this method was changed (1.9 R2 is giving an exception...) + Reflection.MethodInvoker gravityMethod = (version.isAboveOrEqual(MinecraftVersion.V1_9_R2) ? + Reflection.getMethod(ENTITY_CLAZZ, "setNoGravity", boolean.class) : + Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setGravity", boolean.class)); + + Reflection.MethodInvoker customNameMethod = (version.isAboveOrEqual(MinecraftVersion.V1_12_R1) + ? Reflection.getMethod(ENTITY_CLAZZ, "setCustomName", version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? CHAT_BASE_COMPONENT_CLAZZ : String.class) + : Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setCustomName", String.class)); + + Reflection.MethodInvoker customNameVisibilityMethod = (version.isAboveOrEqual(MinecraftVersion.V1_12_R1) ? + Reflection.getMethod(ENTITY_CLAZZ, "setCustomNameVisible", boolean.class) : + Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setCustomNameVisible", boolean.class)); + + Location location = start.clone().add(0, DELTA * text.size(), 0); + Class worldClass = worldServer.getClass().getSuperclass(); + + if (start.getWorld().getEnvironment() != World.Environment.NORMAL) { + worldClass = worldClass.getSuperclass(); + } + + Reflection.ConstructorInvoker entityArmorStandConstructor = (version.isAboveOrEqual(MinecraftVersion.V1_14_R1) ? + Reflection.getConstructor(ENTITY_ARMOR_STAND_CLAZZ, worldClass, double.class, double.class, double.class) : + Reflection.getConstructor(ENTITY_ARMOR_STAND_CLAZZ, worldClass)); - void show(Player player); + for (String line : text) { + Object entityArmorStand = (version.isAboveOrEqual(MinecraftVersion.V1_14_R1) ? + entityArmorStandConstructor.invoke(worldServer, location.getX(), location.getY(), location.getZ()) : + entityArmorStandConstructor.invoke(worldServer)); - void hide(Player player); + if (!version.isAboveOrEqual(MinecraftVersion.V1_14_R1)) { + SET_LOCATION_METHOD.invoke(entityArmorStand, location.getX(), location.getY(), location.getZ(), 0, 0); + } - void silentHide(UUID uuid); + customNameMethod.invoke(entityArmorStand, version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? + CHAT_COMPONENT_TEXT_CONSTRUCTOR.invoke(line) : line); + customNameVisibilityMethod.invoke(entityArmorStand, true); + gravityMethod.invoke(entityArmorStand, version.isAboveOrEqual(MinecraftVersion.V1_9_R2)); + SET_SMALL_METHOD.invoke(entityArmorStand, true); + SET_INVISIBLE_METHOD.invoke(entityArmorStand, true); + SET_BASE_PLATE_METHOD.invoke(entityArmorStand, false); + SET_ARMS_METHOD.invoke(entityArmorStand, false); - void updateText(List text); + armorStands.add(entityArmorStand); + + // Create and add the associated show and hide packets. + showPackets.add(PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CONSTRUCTOR.invoke(entityArmorStand)); + hidePackets.add(PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR + .invoke(new int[]{(int) GET_ID_METHOD.invoke(entityArmorStand)})); + + location.subtract(0, DELTA, 0); + } + } + + public List getUpdatePackets(List text) { + List updatePackets = new ArrayList<>(); + + if (this.text.size() != text.size()) { + throw new IllegalArgumentException("When updating the text, the old and new text should have the same amount of lines"); + } + + Reflection.MethodInvoker customNameMethod = (version.isAboveOrEqual(MinecraftVersion.V1_12_R1) + ? Reflection.getMethod(ENTITY_CLAZZ, "setCustomName", version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? CHAT_BASE_COMPONENT_CLAZZ : String.class) + : Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setCustomName", String.class)); + + for (int i = 0; i < text.size(); i++) { + Object entityArmorStand = armorStands.get(i); + String oldLine = this.text.get(i); + String newLine = text.get(i); + + customNameMethod.invoke(entityArmorStand, version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? + CHAT_COMPONENT_TEXT_CONSTRUCTOR.invoke(newLine) : newLine); // Update the DataWatcher object. + showPackets.set(i, PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CONSTRUCTOR.invoke(entityArmorStand)); + + if (newLine.isEmpty() && !oldLine.isEmpty()) { + updatePackets.add(hidePackets.get(i)); + } else if (!newLine.isEmpty() && oldLine.isEmpty()) { + updatePackets.add(showPackets.get(i)); + } else if (!oldLine.equals(newLine)) { + // Update the line for all players using a Metadata packet. + updatePackets.add(PACKET_PLAY_OUT_ENTITY_METADATA_CONSTRUCTOR.invoke( + GET_ID_METHOD.invoke(entityArmorStand), + GET_DATAWATCHER_METHOD.invoke(entityArmorStand), + true + )); + } + } + + this.text = text; + + return updatePackets; + } + + public void update(Player player, List updatePackets) { + Object playerConnection = playerConnectionField.get(PLAYER_GET_HANDLE_METHOD + .invoke(CRAFT_PLAYER_CLAZZ.cast(player))); + + for (Object packet : updatePackets) { + SEND_PACKET_METHOD.invoke(playerConnection, packet); + } + } + + public void show(Player player) { + Object playerConnection = playerConnectionField.get(PLAYER_GET_HANDLE_METHOD + .invoke(CRAFT_PLAYER_CLAZZ.cast(player))); + + for (int i = 0; i < text.size(); i++) { + if (text.get(i).isEmpty()) continue; // No need to spawn the line. + SEND_PACKET_METHOD.invoke(playerConnection, showPackets.get(i)); + } + } + + public void hide(Player player) { + Object playerConnection = playerConnectionField.get(PLAYER_GET_HANDLE_METHOD + .invoke(CRAFT_PLAYER_CLAZZ.cast(player))); + + for (int i = 0; i < text.size(); i++) { + if (text.get(i).isEmpty()) continue; // No need to hide the line (as it was never spawned). + SEND_PACKET_METHOD.invoke(playerConnection, hidePackets.get(i)); + } + } } + diff --git a/api/src/main/java/net/jitse/npclib/hologram/HologramBase.java b/api/src/main/java/net/jitse/npclib/hologram/HologramBase.java deleted file mode 100644 index 0863dbf..0000000 --- a/api/src/main/java/net/jitse/npclib/hologram/HologramBase.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.jitse.npclib.hologram; - -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.UUID; - -public abstract class HologramBase implements Hologram, HologramPacketHandler { - - protected final static double DELTA = 0.3; - - protected final Set shown = new HashSet<>(); - - protected final Location start; - - protected List text; - - public HologramBase(Location start, List text) { - this.start = start; - this.text = text; - - // Generate the necessary show and hide packets. - createPackets(); - } - - @Override - public void show(Player player) { - UUID uuid = player.getUniqueId(); - if (shown.contains(uuid)) - throw new IllegalArgumentException("Hologram is already shown to player"); - - sendShowPackets(player); - - this.shown.add(uuid); - } - - @Override - public void hide(Player player) { - UUID uuid = player.getUniqueId(); - if (!shown.contains(uuid)) - throw new IllegalArgumentException("Hologram is not shown to player"); - - sendHidePackets(player); - - this.shown.remove(uuid); - } - - @Override - public void silentHide(UUID uuid) { - if (!shown.contains(uuid)) - throw new IllegalArgumentException("Hologram is not shown to player"); - - this.shown.remove(uuid); - } -} diff --git a/api/src/main/java/net/jitse/npclib/hologram/HologramPacketHandler.java b/api/src/main/java/net/jitse/npclib/hologram/HologramPacketHandler.java deleted file mode 100644 index 5ec3216..0000000 --- a/api/src/main/java/net/jitse/npclib/hologram/HologramPacketHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.jitse.npclib.hologram; - -import org.bukkit.entity.Player; - -public interface HologramPacketHandler { - - void createPackets(); - - void sendShowPackets(Player player); - - void sendHidePackets(Player player); -} diff --git a/api/src/main/java/net/jitse/npclib/hologram/_Hologram.java b/api/src/main/java/net/jitse/npclib/hologram/_Hologram.java deleted file mode 100644 index ffe560f..0000000 --- a/api/src/main/java/net/jitse/npclib/hologram/_Hologram.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2018 Jitse Boonstra - */ - -package net.jitse.npclib.hologram; - -import com.comphenix.tinyprotocol.Reflection; -import net.jitse.npclib.internal.MinecraftVersion; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class _Hologram { - - private final double delta = 0.3; - - private List armorStands = new ArrayList<>(); - private Set spawnPackets = new HashSet<>(); - private Set destroyPackets = new HashSet<>(); - - // Classes: - private static final Class CHAT_COMPONENT_TEXT_CLAZZ = Reflection.getMinecraftClass("ChatComponentText"); - private static final Class CHAT_BASE_COMPONENT_CLAZZ = Reflection.getMinecraftClass("IChatBaseComponent"); - private static final Class ENTITY_ARMOR_STAND_CLAZZ = Reflection.getMinecraftClass("EntityArmorStand"); - private static final Class ENTITY_LIVING_CLAZZ = Reflection.getMinecraftClass("EntityLiving"); - private static final Class ENTITY_CLAZZ = Reflection.getMinecraftClass("Entity"); - private static final Class CRAFT_BUKKIT_CLASS = Reflection.getCraftBukkitClass("CraftWorld"); - private static final Class CRAFT_PLAYER_CLAZZ = Reflection.getCraftBukkitClass("entity.CraftPlayer"); - private static final Class PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CLAZZ = Reflection.getMinecraftClass( - "PacketPlayOutSpawnEntityLiving"); - private static final Class PACKET_PLAY_OUT_ENTITY_DESTROY_CLAZZ = Reflection.getMinecraftClass( - "PacketPlayOutEntityDestroy"); - private static final Class ENTITY_PLAYER_CLAZZ = Reflection.getMinecraftClass("EntityPlayer"); - private static final Class PLAYER_CONNECTION_CLAZZ = Reflection.getMinecraftClass("PlayerConnection"); - private static final Class PACKET_CLAZZ = Reflection.getMinecraftClass("Packet"); - - // Constructors: - private static final Reflection.ConstructorInvoker CHAT_COMPONENT_TEXT_CONSTRUCTOR = Reflection - .getConstructor(CHAT_COMPONENT_TEXT_CLAZZ, String.class); - private static final Reflection.ConstructorInvoker PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CONSTRUCTOR = Reflection - .getConstructor(PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CLAZZ, ENTITY_LIVING_CLAZZ); - private static final Reflection.ConstructorInvoker PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR = Reflection - .getConstructor(PACKET_PLAY_OUT_ENTITY_DESTROY_CLAZZ, int[].class); - - // Fields: - private static final Reflection.FieldAccessor playerConnectionField = Reflection.getField(ENTITY_PLAYER_CLAZZ, - "playerConnection", PLAYER_CONNECTION_CLAZZ); - - // Methods: - private static final Reflection.MethodInvoker SET_LOCATION_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "setLocation", double.class, double.class, double.class, float.class, float.class); - private static final Reflection.MethodInvoker SET_SMALL_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "setSmall", boolean.class); - private static final Reflection.MethodInvoker SET_INVISIBLE_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "setInvisible", boolean.class); - private static final Reflection.MethodInvoker SET_BASE_PLATE_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "setBasePlate", boolean.class); - private static final Reflection.MethodInvoker SET_ARMS_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "setArms", boolean.class); - private static final Reflection.MethodInvoker PLAYER_GET_HANDLE_METHOD = Reflection.getMethod(CRAFT_PLAYER_CLAZZ, - "getHandle"); - private static final Reflection.MethodInvoker SEND_PACKET_METHOD = Reflection.getMethod(PLAYER_CONNECTION_CLAZZ, - "sendPacket", PACKET_CLAZZ); - private static final Reflection.MethodInvoker GET_ID_METHOD = Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, - "getId"); - - private final Location start; - private final List lines; - private final Object worldServer; - - public _Hologram(Location location, List lines) { - this.start = location; - this.lines = lines; - - this.worldServer = Reflection.getMethod(CRAFT_BUKKIT_CLASS, "getHandle") - .invoke(CRAFT_BUKKIT_CLASS.cast(location.getWorld())); - - } - - public void generatePackets(MinecraftVersion version) { - // TODO: Check when this method was changed (1.9 R2 is giving an exception... - Reflection.MethodInvoker gravityMethod = (version.isAboveOrEqual(MinecraftVersion.V1_9_R2) ? - Reflection.getMethod(ENTITY_CLAZZ, "setNoGravity", boolean.class) : - Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setGravity", boolean.class)); - - Reflection.MethodInvoker customNameMethod = (version.isAboveOrEqual(MinecraftVersion.V1_12_R1) - ? Reflection.getMethod(ENTITY_CLAZZ, "setCustomName", version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? CHAT_BASE_COMPONENT_CLAZZ : String.class) - : Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setCustomName", String.class)); - - Reflection.MethodInvoker customNameVisibilityMethod = (version.isAboveOrEqual(MinecraftVersion.V1_12_R1) ? - Reflection.getMethod(ENTITY_CLAZZ, "setCustomNameVisible", boolean.class) : - Reflection.getMethod(ENTITY_ARMOR_STAND_CLAZZ, "setCustomNameVisible", boolean.class)); - - Location location = start.clone().add(0, delta * lines.size(), 0); - Class worldClass = worldServer.getClass().getSuperclass(); - - if (start.getWorld().getEnvironment() != World.Environment.NORMAL) { - worldClass = worldClass.getSuperclass(); - } - - Reflection.ConstructorInvoker entityArmorStandConstructor = (version.isAboveOrEqual(MinecraftVersion.V1_14_R1) ? - Reflection.getConstructor(ENTITY_ARMOR_STAND_CLAZZ, worldClass, double.class, double.class, double.class) : - Reflection.getConstructor(ENTITY_ARMOR_STAND_CLAZZ, worldClass)); - - for (String line : lines) { - Object entityArmorStand = (version.isAboveOrEqual(MinecraftVersion.V1_14_R1) ? - entityArmorStandConstructor.invoke(worldServer, location.getX(), location.getY(), location.getZ()) : - entityArmorStandConstructor.invoke(worldServer)); - - if (!version.isAboveOrEqual(MinecraftVersion.V1_14_R1)) { - SET_LOCATION_METHOD.invoke(entityArmorStand, location.getX(), location.getY(), location.getZ(), 0, 0); - } - - customNameMethod.invoke(entityArmorStand, version.isAboveOrEqual(MinecraftVersion.V1_13_R1) ? - CHAT_COMPONENT_TEXT_CONSTRUCTOR.invoke(line) : line); - customNameVisibilityMethod.invoke(entityArmorStand, true); - gravityMethod.invoke(entityArmorStand, version.isAboveOrEqual(MinecraftVersion.V1_9_R2)); - SET_SMALL_METHOD.invoke(entityArmorStand, true); - SET_INVISIBLE_METHOD.invoke(entityArmorStand, true); - SET_BASE_PLATE_METHOD.invoke(entityArmorStand, false); - SET_ARMS_METHOD.invoke(entityArmorStand, false); - - location.subtract(0, delta, 0); - - if (line.isEmpty()) { - continue; - } - - armorStands.add(entityArmorStand); - - Object spawnPacket = PACKET_PLAY_OUT_SPAWN_ENTITY_LIVING_CONSTRUCTOR.invoke(entityArmorStand); - spawnPackets.add(spawnPacket); - - Object destroyPacket = PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR - .invoke(new int[]{(int) GET_ID_METHOD.invoke(entityArmorStand)}); - destroyPackets.add(destroyPacket); - } - } - -// public void updateText(List newLines) { -// if (lines.size() != newLines.size()) { -// throw new IllegalArgumentException("New NPC text cannot differ in size from old text."); -// return; -// } -// -// int i = 0; -// for (String oldLine : lines) { -// if (oldLine.isEmpty() && !newLines.get(i).isEmpty()) { -// // Need to spawn -// } -// i++; -// } -// customNameMethod.invoke(entityArmorStand, above_1_12_r1 ? CHAT_COMPONENT_TEXT_CONSTRUCTOR.invoke(line) : line); -// } - - public void spawn(Player player) { - Object playerConnection = playerConnectionField.get(PLAYER_GET_HANDLE_METHOD - .invoke(CRAFT_PLAYER_CLAZZ.cast(player))); - - for (Object packet : spawnPackets) { - SEND_PACKET_METHOD.invoke(playerConnection, packet); - } - } - - public void destroy(Player player) { - Object playerConnection = playerConnectionField.get(PLAYER_GET_HANDLE_METHOD - .invoke(CRAFT_PLAYER_CLAZZ.cast(player))); - - for (Object packet : destroyPackets) { - SEND_PACKET_METHOD.invoke(playerConnection, packet); - } - } -} - 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 1511e02..ec86888 100644 --- a/api/src/main/java/net/jitse/npclib/internal/NPCBase.java +++ b/api/src/main/java/net/jitse/npclib/internal/NPCBase.java @@ -303,12 +303,15 @@ public abstract class NPCBase implements NPC, NPCPacketHandler { @Override public NPC setText(List text) { + List updatePackets = hologram.getUpdatePackets(text); + for (UUID shownUuid : shown) { Player player = Bukkit.getPlayer(shownUuid); if (player != null && isShown(player)) { - hologram.updateText(text); + hologram.update(player, updatePackets); } } + this.text = text; return this; } diff --git a/nms/pom.xml b/nms/pom.xml index ba69367..e6f4064 100644 --- a/nms/pom.xml +++ b/nms/pom.xml @@ -8,23 +8,23 @@ net.jitse npclib - 2.2-SNAPSHOT + 2.3-SNAPSHOT npclib-nms v1_8_R1 - - - - - - - - - - + v1_8_R2 + 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 3875bea..397295a 100755 --- a/nms/v1_10_R1/pom.xml +++ b/nms/v1_10_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 2783cdb..aafb4de 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 @@ -6,7 +6,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_10_R1.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_10_R1 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_10_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().subtract(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_10_R1); + this.hologram = new Hologram(MinecraftVersion.V1_10_R1, location.clone().subtract(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,8 +80,7 @@ public class NPC_v1_10_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -95,7 +92,8 @@ public class NPC_v1_10_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_11_R1/pom.xml b/nms/v1_11_R1/pom.xml index 921b854..1d94998 100755 --- a/nms/v1_11_R1/pom.xml +++ b/nms/v1_11_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 b0b01e8..e7ef942 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 @@ -6,7 +6,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_11_R1.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_11_R1 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_11_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_11_R1); + this.hologram = new Hologram(MinecraftVersion.V1_11_R1, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,8 +80,7 @@ public class NPC_v1_11_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -95,7 +92,8 @@ public class NPC_v1_11_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_12_R1/pom.xml b/nms/v1_12_R1/pom.xml index 76c88c8..9718c96 100755 --- a/nms/v1_12_R1/pom.xml +++ b/nms/v1_12_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 ca9bc15..097dc78 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 @@ -6,7 +6,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_12_R1.packets.*; @@ -26,7 +26,7 @@ import java.util.UUID; * @author Jitse Boonstra */ public class NPC_v1_12_R1 extends NPCBase { - private _Hologram hologram; + private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -40,8 +40,7 @@ public class NPC_v1_12_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_12_R1); + this.hologram = new Hologram(MinecraftVersion.V1_12_R1, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -81,7 +80,7 @@ public class NPC_v1_12_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -93,7 +92,8 @@ public class NPC_v1_12_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_13_R1/pom.xml b/nms/v1_13_R1/pom.xml index e88868b..0da3149 100755 --- a/nms/v1_13_R1/pom.xml +++ b/nms/v1_13_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 e041370..0784fc9 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 @@ -6,7 +6,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_13_R1.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_13_R1 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_13_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_13_R1); + this.hologram = new Hologram(MinecraftVersion.V1_13_R1, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,7 +80,7 @@ public class NPC_v1_13_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -94,7 +92,8 @@ public class NPC_v1_13_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_13_R2/pom.xml b/nms/v1_13_R2/pom.xml index 673ed6f..bafe109 100755 --- a/nms/v1_13_R2/pom.xml +++ b/nms/v1_13_R2/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 0280678..23d3f65 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 @@ -6,7 +6,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_13_R2.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_13_R2 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_13_R2 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_13_R2); + this.hologram = new Hologram(MinecraftVersion.V1_13_R2, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,8 +80,7 @@ public class NPC_v1_13_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -95,7 +92,8 @@ public class NPC_v1_13_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_14_R1/pom.xml b/nms/v1_14_R1/pom.xml index 1252a9b..7ba21bc 100755 --- a/nms/v1_14_R1/pom.xml +++ b/nms/v1_14_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 3b910c5..fc70d02 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 @@ -2,7 +2,7 @@ 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.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_14_R1.packets.*; @@ -23,7 +23,6 @@ import java.util.UUID; */ public class NPC_v1_14_R1 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -37,8 +36,7 @@ public class NPC_v1_14_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_14_R1); + this.hologram = new Hologram(MinecraftVersion.V1_14_R1, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -78,8 +76,7 @@ public class NPC_v1_14_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -91,7 +88,8 @@ public class NPC_v1_14_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_8_R1/pom.xml b/nms/v1_8_R1/pom.xml index 3221a7a..15eb5ef 100755 --- a/nms/v1_8_R1/pom.xml +++ b/nms/v1_8_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-SNAPSHOT npclib-nms-v1_8_R1 diff --git a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java b/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java index eb552a2..eb9698c 100755 --- a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java +++ b/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/NPC_v1_8_R1.java @@ -6,8 +6,9 @@ package net.jitse.npclib.nms.v1_8_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.NPCBase; -import net.jitse.npclib.nms.v1_8_R1.hologram.Hologram_v1_8_R1; import net.jitse.npclib.nms.v1_8_R1.packets.*; import net.minecraft.server.v1_8_R1.*; import org.bukkit.Bukkit; @@ -39,7 +40,7 @@ public class NPC_v1_8_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new Hologram_v1_8_R1(location.clone().add(0, 0.5, 0), text); + this.hologram = new Hologram(MinecraftVersion.V1_8_R1, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); diff --git a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/hologram/Hologram_v1_8_R1.java b/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/hologram/Hologram_v1_8_R1.java deleted file mode 100644 index f05387c..0000000 --- a/nms/v1_8_R1/src/main/java/net/jitse/npclib/nms/v1_8_R1/hologram/Hologram_v1_8_R1.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.jitse.npclib.nms.v1_8_R1.hologram; - -import net.jitse.npclib.hologram.HologramBase; -import net.minecraft.server.v1_8_R1.*; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class Hologram_v1_8_R1 extends HologramBase { - - private List nmsArmorStands; - private List showPackets; - private List hidePackets; - - public Hologram_v1_8_R1(Location start, List text) { - super(start, text); - } - - @Override - public void createPackets() { - Location top = start.clone().add(0, DELTA * text.size(), 0); - - List nmsArmorStands = new ArrayList<>(); - List showPackets = new ArrayList<>(); - List hidePackets = new ArrayList<>(); - - for (String line : text) { - EntityArmorStand armorStand = new EntityArmorStand(((CraftWorld) top.getWorld()).getHandle()); - armorStand.setLocation(top.getX(), top.getY(), top.getZ(), 0, 0); - armorStand.setCustomName(line); - armorStand.setCustomNameVisible(true); - armorStand.setGravity(false); - armorStand.setSmall(true); - armorStand.setInvisible(true); - armorStand.setBasePlate(false); - armorStand.setArms(false); - - nmsArmorStands.add(armorStand); - - PacketPlayOutSpawnEntityLiving lineShowPacket = new PacketPlayOutSpawnEntityLiving(armorStand); - PacketPlayOutEntityDestroy lineHidePacket = new PacketPlayOutEntityDestroy(armorStand.getId()); - - showPackets.add(lineShowPacket); - hidePackets.add(lineHidePacket); - - top.subtract(0, DELTA, 0); - } - - this.nmsArmorStands = nmsArmorStands; - this.showPackets = showPackets; - this.hidePackets = hidePackets; - } - - @Override - public void sendShowPackets(Player player) { - PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection; - for (int i = 0; i < text.size(); i++) { - if (text.get(i).isEmpty()) continue; // No need to spawn the line. - connection.sendPacket(showPackets.get(i)); - } - } - - @Override - public void sendHidePackets(Player player) { - PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection; - for (int i = 0; i < text.size(); i++) { - if (text.get(i).isEmpty()) continue; // No need to hide the line (as it was never spawned). - connection.sendPacket(hidePackets.get(i)); - } - } - - @Override - public void updateText(List text) { - List toSend = new ArrayList<>(); - - if (this.text.size() != text.size()) - throw new IllegalArgumentException("When updating the text, the old and new text should have the same amount of lines"); - - for (int i = 0; i < text.size(); i++) { - EntityArmorStand armorStand = nmsArmorStands.get(i); - String oldLine = this.text.get(i); - String newLine = text.get(i); - - armorStand.getDataWatcher().watch(2, newLine); // Update the DataWatcher object. - - if (oldLine.equals(newLine)) { - continue; // No need to update. - } else if (newLine.isEmpty() && !oldLine.isEmpty()) { - // Check if line was empty before, if not, remove the hologram line. - toSend.add(hidePackets.get(i)); - } else if (!newLine.isEmpty() && oldLine.isEmpty()) { - // Check if line was empty before, if it was, create the hologram line. - PacketPlayOutSpawnEntityLiving lineShowPacket = new PacketPlayOutSpawnEntityLiving(armorStand); - toSend.add(lineShowPacket); - } else { - // If the line was not empty before and it isn't now, update its text. - PacketPlayOutEntityMetadata metadataPacket = new PacketPlayOutEntityMetadata(armorStand.getId(), armorStand.getDataWatcher(), true); - toSend.add(metadataPacket); - } - } - - for (UUID uuid : shown) { - Player player = Bukkit.getPlayer(uuid); - if (player == null || !player.isOnline()) { - throw new IllegalStateException("Tried to update hologram for offline player"); - } - - PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection; - for (Packet packet : toSend) { - connection.sendPacket(packet); - } - } - - this.text = text; // At last, update the text in this hologram object. - } -} diff --git a/nms/v1_8_R2/pom.xml b/nms/v1_8_R2/pom.xml index f4dc630..925018e 100755 --- a/nms/v1_8_R2/pom.xml +++ b/nms/v1_8_R2/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 52a0d52..cb2fe39 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 @@ -6,7 +6,7 @@ package net.jitse.npclib.nms.v1_8_R2; import net.jitse.npclib.NPCLib; import net.jitse.npclib.api.state.NPCSlot; -import net.jitse.npclib.hologram._Hologram; +import net.jitse.npclib.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_8_R2.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_8_R2 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_8_R2 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_8_R2); + this.hologram = new Hologram(MinecraftVersion.V1_8_R2, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,7 +80,7 @@ public class NPC_v1_8_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -94,7 +92,7 @@ public class NPC_v1_8_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + hologram.hide(player); } @Override diff --git a/nms/v1_8_R3/pom.xml b/nms/v1_8_R3/pom.xml index 3ac8a63..223d9fe 100755 --- a/nms/v1_8_R3/pom.xml +++ b/nms/v1_8_R3/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 d538403..e981fd8 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 @@ -6,7 +6,7 @@ package net.jitse.npclib.nms.v1_8_R3; import net.jitse.npclib.NPCLib; import net.jitse.npclib.api.state.NPCSlot; -import net.jitse.npclib.hologram._Hologram; +import net.jitse.npclib.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_8_R3.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_8_R3 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_8_R3 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().add(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_8_R3); + this.hologram = new Hologram(MinecraftVersion.V1_8_R3, location.clone().add(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,8 +80,7 @@ public class NPC_v1_8_R3 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -95,7 +92,8 @@ public class NPC_v1_8_R3 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_9_R1/pom.xml b/nms/v1_9_R1/pom.xml index 092ab5c..6dd7ddf 100755 --- a/nms/v1_9_R1/pom.xml +++ b/nms/v1_9_R1/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 57639a3..7a818ff 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 @@ -6,7 +6,7 @@ package net.jitse.npclib.nms.v1_9_R1; import net.jitse.npclib.NPCLib; import net.jitse.npclib.api.state.NPCSlot; -import net.jitse.npclib.hologram._Hologram; +import net.jitse.npclib.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_9_R1.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_9_R1 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_9_R1 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().subtract(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_9_R1); + this.hologram = new Hologram(MinecraftVersion.V1_9_R1, location.clone().subtract(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,7 +80,7 @@ public class NPC_v1_9_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -94,7 +92,8 @@ public class NPC_v1_9_R1 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/nms/v1_9_R2/pom.xml b/nms/v1_9_R2/pom.xml index 297bc38..9c830e3 100755 --- a/nms/v1_9_R2/pom.xml +++ b/nms/v1_9_R2/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib-nms - 2.2-SNAPSHOT + 2.3-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 272f795..a8a43a2 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 @@ -6,7 +6,7 @@ package net.jitse.npclib.nms.v1_9_R2; import net.jitse.npclib.NPCLib; import net.jitse.npclib.api.state.NPCSlot; -import net.jitse.npclib.hologram._Hologram; +import net.jitse.npclib.hologram.Hologram; import net.jitse.npclib.internal.MinecraftVersion; import net.jitse.npclib.internal.NPCBase; import net.jitse.npclib.nms.v1_9_R2.packets.*; @@ -27,7 +27,6 @@ import java.util.UUID; */ public class NPC_v1_9_R2 extends NPCBase { - private _Hologram hologram; private PacketPlayOutNamedEntitySpawn packetPlayOutNamedEntitySpawn; private PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeamRegister; private PacketPlayOutPlayerInfo packetPlayOutPlayerInfoAdd, packetPlayOutPlayerInfoRemove; @@ -41,8 +40,7 @@ public class NPC_v1_9_R2 extends NPCBase { @Override public void createPackets() { - this.hologram = new _Hologram(location.clone().subtract(0, 0.5, 0), text); - hologram.generatePackets(MinecraftVersion.V1_9_R2); + this.hologram = new Hologram(MinecraftVersion.V1_9_R2, location.clone().subtract(0, 0.5, 0), text); PacketPlayOutPlayerInfoWrapper packetPlayOutPlayerInfoWrapper = new PacketPlayOutPlayerInfoWrapper(); @@ -82,8 +80,7 @@ public class NPC_v1_9_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutNamedEntitySpawn); playerConnection.sendPacket(packetPlayOutEntityHeadRotation); - hologram.spawn(player); - + hologram.show(player); Bukkit.getScheduler().runTaskLater(instance.getPlugin(), () -> playerConnection.sendPacket(packetPlayOutPlayerInfoRemove), 50); @@ -95,7 +92,8 @@ public class NPC_v1_9_R2 extends NPCBase { playerConnection.sendPacket(packetPlayOutEntityDestroy); playerConnection.sendPacket(packetPlayOutPlayerInfoRemove); - hologram.destroy(player); + + hologram.hide(player); } @Override diff --git a/plugin/pom.xml b/plugin/pom.xml index 7235077..3e2cbee 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -8,7 +8,7 @@ net.jitse npclib - 2.2-SNAPSHOT + 2.3-SNAPSHOT npclib-plugin diff --git a/pom.xml b/pom.xml index 94d321c..e864af6 100755 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ net.jitse npclib - 2.2-SNAPSHOT + 2.3-SNAPSHOT UTF-8