From 3f91fb5de868b9dee74b30aace391bad7574f0f3 Mon Sep 17 00:00:00 2001 From: sky Date: Mon, 16 Mar 2020 22:21:25 +0800 Subject: [PATCH] Fix Hologram --- .../taboolib/module/hologram/Hologram.java | 44 ++++++++++++++----- .../module/hologram/THologramHandler.java | 14 ++++-- .../io/izzel/taboolib/module/nms/NMS.java | 6 +++ .../io/izzel/taboolib/module/nms/NMSImpl.java | 23 ++++++++++ .../izzel/taboolib/module/packet/Packet.java | 11 ++++- 5 files changed, 82 insertions(+), 16 deletions(-) diff --git a/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java b/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java index f1fbb3f..17a92d9 100644 --- a/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java +++ b/src/main/scala/io/izzel/taboolib/module/hologram/Hologram.java @@ -38,7 +38,7 @@ public class Hologram { public Hologram toAll() { this.viewAll = true; - return this; + return refresh(); } public Hologram autoDelete() { @@ -69,14 +69,18 @@ public class Hologram { viewer.setVisible(location.getWorld().equals(viewer.getPlayer().getWorld()) && location.distance(viewer.getPlayer().getLocation()) < viewDistance); if (viewer.isVisible()) { THologram.submit(() -> { - if (viewer.isSpawned()) { - NMS.handle().sendPacketEntityTeleport(viewer.getPlayer(), viewer.getId(), location); - } else { - viewer.setSpawned(true); - TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId(), location).get()); - TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId()).get()); + try { + if (viewer.isSpawned()) { + NMS.handle().sendPacketEntityTeleport(viewer.getPlayer(), viewer.getId(), location); + } else { + viewer.setSpawned(true); + TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId(), location).get()); + TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId()).get()); + } + TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId(), text).get()); + } catch (Throwable t) { + t.printStackTrace(); } - TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId(), text).get()); }); } else { destroy(viewer); @@ -97,7 +101,13 @@ public class Hologram { return this; } this.text = text; - THologram.submit(() -> viewers.forEach(v -> TPacketHandler.sendPacket(v.getPlayer(), THologramHandler.copy(v.getId(), text).get()))); + THologram.submit(() -> { + try { + viewers.forEach(v -> TPacketHandler.sendPacket(v.getPlayer(), THologramHandler.copy(v.getId(), text).get())); + } catch (Throwable t) { + t.printStackTrace(); + } + }); return this; } @@ -106,7 +116,13 @@ public class Hologram { return this; } this.location = location.clone(); - THologram.submit(() -> viewers.forEach(v -> NMS.handle().sendPacketEntityTeleport(v.getPlayer(), v.getId(), location))); + THologram.submit(() -> { + try { + viewers.forEach(v -> NMS.handle().sendPacketEntityTeleport(v.getPlayer(), v.getId(), location)); + } catch (Throwable t) { + t.printStackTrace(); + } + }); return this; } @@ -134,7 +150,13 @@ public class Hologram { return this; } viewer.setSpawned(false); - THologram.submit(() -> NMS.handle().sendPacketEntityDestroy(viewer.getPlayer(), viewer.getId())); + THologram.submit(() -> { + try { + NMS.handle().sendPacketEntityDestroy(viewer.getPlayer(), viewer.getId()); + } catch (Throwable t) { + t.printStackTrace(); + } + }); return this; } diff --git a/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java b/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java index 20e5df3..d50d562 100644 --- a/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java +++ b/src/main/scala/io/izzel/taboolib/module/hologram/THologramHandler.java @@ -20,6 +20,7 @@ import org.bukkit.event.player.*; import org.bukkit.scheduler.BukkitRunnable; import java.util.List; +import java.util.Optional; import java.util.Queue; import java.util.UUID; @@ -62,7 +63,7 @@ class THologramHandler implements Listener { if (learnTarget == null) { return true; } - if (packet.is("PacketPlayOutSpawnEntity") && packet.read("a", Integer.TYPE) == learnTarget.getEntityId()) { + if ((packet.is("PacketPlayOutSpawnEntity") || packet.is("PacketPlayOutSpawnEntityLiving")) && packet.read("a", Integer.TYPE) == learnTarget.getEntityId()) { packetSpawn = packet; return false; } @@ -82,8 +83,11 @@ class THologramHandler implements Listener { } public static Packet copy(int id, Location location) { - Packet packet = THologramHandler.getPacketSpawn().copy("e", "f", "j", "h", "i", "j", "k", "l"); + Packet packet = THologramHandler.getPacketSpawn().copy(NMS.handle().asNMS("PacketPlayOutSpawnEntity"), "e", "f", "j", "h", "i", "j", "k", "l"); packet.write("a", id); + if (Version.isAfter(Version.v1_14)) { + packet.write("k", NMS.handle().asEntityType("armor_stand")); + } if (Version.isAfter(Version.v1_9)) { packet.write("b", UUID.randomUUID()); packet.write("c", location.getX()); @@ -116,8 +120,12 @@ class THologramHandler implements Listener { try { Object i = Ref.getUnsafe().allocateInstance(element.getClass()); SimpleReflection.setFieldValue(element.getClass(), i, "a", a); - SimpleReflection.setFieldValue(element.getClass(), i, "b", name); SimpleReflection.setFieldValue(element.getClass(), i, "c", c); + if (Version.isAfter(Version.v1_14)) { + SimpleReflection.setFieldValue(element.getClass(), i, "b", Optional.of(NMS.handle().ofChatComponentText(name))); + } else { + SimpleReflection.setFieldValue(element.getClass(), i, "b", name); + } copy.add(i); } catch (InstantiationException e) { e.printStackTrace(); diff --git a/src/main/scala/io/izzel/taboolib/module/nms/NMS.java b/src/main/scala/io/izzel/taboolib/module/nms/NMS.java index 79a9750..854bec6 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/NMS.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/NMS.java @@ -93,4 +93,10 @@ public abstract class NMS { abstract public T spawn(Location location, Class entity, Consumer e); + abstract public Object ofChatComponentText(String source); + + abstract public Class asNMS(String name); + + abstract public Object asEntityType(String name); + } diff --git a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java index b7879e2..bd833dd 100644 --- a/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java +++ b/src/main/scala/io/izzel/taboolib/module/nms/NMSImpl.java @@ -479,4 +479,27 @@ public class NMSImpl extends NMS { return ((CraftWorld) location.getWorld()).addEntity((net.minecraft.server.v1_13_R2.Entity) createEntity, CreatureSpawnEvent.SpawnReason.CUSTOM); } } + + @Override + public Object ofChatComponentText(String source) { + return new net.minecraft.server.v1_12_R1.ChatComponentText(source); + } + + @Override + public Class asNMS(String name) { + try { + return Class.forName("net.minecraft.server." + Version.getBukkitVersion() + "." + name); + } catch (Throwable ignored) { + return null; + } + } + + @Override + public Object asEntityType(String name) { + if (Version.isAfter(Version.v1_14)) { + return net.minecraft.server.v1_14_R1.EntityTypes.a(name).orElse(null); + } else { + return net.minecraft.server.v1_13_R2.EntityTypes.a(name); + } + } } diff --git a/src/main/scala/io/izzel/taboolib/module/packet/Packet.java b/src/main/scala/io/izzel/taboolib/module/packet/Packet.java index 4fe44e7..b98432c 100644 --- a/src/main/scala/io/izzel/taboolib/module/packet/Packet.java +++ b/src/main/scala/io/izzel/taboolib/module/packet/Packet.java @@ -53,15 +53,22 @@ public class Packet { } public Packet copy(String... copyField) { + return copy(packetClass, copyField); + } + + public Packet copy(Class clazz, String... copyField) { + if (clazz == null) { + clazz = this.packetClass; + } Object packet; try { - packet = packetClass.newInstance(); + packet = clazz.newInstance(); } catch (Throwable t) { t.printStackTrace(); return null; } for (String field : copyField) { - SimpleReflection.setFieldValue(this.packetClass, packet, field, SimpleReflection.getFieldValue(this.packetClass, origin, field)); + SimpleReflection.setFieldValue(clazz, packet, field, SimpleReflection.getFieldValue(clazz, origin, field)); } return new Packet(packet); }