Fix Hologram
This commit is contained in:
		@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -93,4 +93,10 @@ public abstract class NMS {
 | 
			
		||||
 | 
			
		||||
    abstract public <T extends Entity> T spawn(Location location, Class<T> entity, Consumer<T> e);
 | 
			
		||||
 | 
			
		||||
    abstract public Object ofChatComponentText(String source);
 | 
			
		||||
 | 
			
		||||
    abstract public Class<?> asNMS(String name);
 | 
			
		||||
 | 
			
		||||
    abstract public Object asEntityType(String name);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user