Fix Hologram
This commit is contained in:
parent
6623ae5594
commit
3f91fb5de8
@ -38,7 +38,7 @@ public class Hologram {
|
|||||||
|
|
||||||
public Hologram toAll() {
|
public Hologram toAll() {
|
||||||
this.viewAll = true;
|
this.viewAll = true;
|
||||||
return this;
|
return refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Hologram autoDelete() {
|
public Hologram autoDelete() {
|
||||||
@ -69,14 +69,18 @@ public class Hologram {
|
|||||||
viewer.setVisible(location.getWorld().equals(viewer.getPlayer().getWorld()) && location.distance(viewer.getPlayer().getLocation()) < viewDistance);
|
viewer.setVisible(location.getWorld().equals(viewer.getPlayer().getWorld()) && location.distance(viewer.getPlayer().getLocation()) < viewDistance);
|
||||||
if (viewer.isVisible()) {
|
if (viewer.isVisible()) {
|
||||||
THologram.submit(() -> {
|
THologram.submit(() -> {
|
||||||
if (viewer.isSpawned()) {
|
try {
|
||||||
NMS.handle().sendPacketEntityTeleport(viewer.getPlayer(), viewer.getId(), location);
|
if (viewer.isSpawned()) {
|
||||||
} else {
|
NMS.handle().sendPacketEntityTeleport(viewer.getPlayer(), viewer.getId(), location);
|
||||||
viewer.setSpawned(true);
|
} else {
|
||||||
TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId(), location).get());
|
viewer.setSpawned(true);
|
||||||
TPacketHandler.sendPacket(viewer.getPlayer(), THologramHandler.copy(viewer.getId()).get());
|
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 {
|
} else {
|
||||||
destroy(viewer);
|
destroy(viewer);
|
||||||
@ -97,7 +101,13 @@ public class Hologram {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
this.text = text;
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +116,13 @@ public class Hologram {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
this.location = location.clone();
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +150,13 @@ public class Hologram {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
viewer.setSpawned(false);
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ import org.bukkit.event.player.*;
|
|||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ class THologramHandler implements Listener {
|
|||||||
if (learnTarget == null) {
|
if (learnTarget == null) {
|
||||||
return true;
|
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;
|
packetSpawn = packet;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -82,8 +83,11 @@ class THologramHandler implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Packet copy(int id, Location location) {
|
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);
|
packet.write("a", id);
|
||||||
|
if (Version.isAfter(Version.v1_14)) {
|
||||||
|
packet.write("k", NMS.handle().asEntityType("armor_stand"));
|
||||||
|
}
|
||||||
if (Version.isAfter(Version.v1_9)) {
|
if (Version.isAfter(Version.v1_9)) {
|
||||||
packet.write("b", UUID.randomUUID());
|
packet.write("b", UUID.randomUUID());
|
||||||
packet.write("c", location.getX());
|
packet.write("c", location.getX());
|
||||||
@ -116,8 +120,12 @@ class THologramHandler implements Listener {
|
|||||||
try {
|
try {
|
||||||
Object i = Ref.getUnsafe().allocateInstance(element.getClass());
|
Object i = Ref.getUnsafe().allocateInstance(element.getClass());
|
||||||
SimpleReflection.setFieldValue(element.getClass(), i, "a", a);
|
SimpleReflection.setFieldValue(element.getClass(), i, "a", a);
|
||||||
SimpleReflection.setFieldValue(element.getClass(), i, "b", name);
|
|
||||||
SimpleReflection.setFieldValue(element.getClass(), i, "c", c);
|
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);
|
copy.add(i);
|
||||||
} catch (InstantiationException e) {
|
} catch (InstantiationException e) {
|
||||||
e.printStackTrace();
|
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 <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);
|
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) {
|
public Packet copy(String... copyField) {
|
||||||
|
return copy(packetClass, copyField);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Packet copy(Class clazz, String... copyField) {
|
||||||
|
if (clazz == null) {
|
||||||
|
clazz = this.packetClass;
|
||||||
|
}
|
||||||
Object packet;
|
Object packet;
|
||||||
try {
|
try {
|
||||||
packet = packetClass.newInstance();
|
packet = clazz.newInstance();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
for (String field : copyField) {
|
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);
|
return new Packet(packet);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user