Update for the new ProtocolLib.

This commit is contained in:
filoghost 2016-03-09 13:15:20 +01:00
parent 707268c0b5
commit e02f2ad7f4
17 changed files with 271 additions and 171 deletions

View File

@ -7,6 +7,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import com.gmail.filoghost.holographicdisplays.SimpleUpdater.ResponseHandler; import com.gmail.filoghost.holographicdisplays.SimpleUpdater.ResponseHandler;
import com.gmail.filoghost.holographicdisplays.bridge.bungeecord.BungeeServerTracker; import com.gmail.filoghost.holographicdisplays.bridge.bungeecord.BungeeServerTracker;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook;
import com.gmail.filoghost.holographicdisplays.commands.main.HologramsCommandHandler; import com.gmail.filoghost.holographicdisplays.commands.main.HologramsCommandHandler;
import com.gmail.filoghost.holographicdisplays.disk.Configuration; import com.gmail.filoghost.holographicdisplays.disk.Configuration;
import com.gmail.filoghost.holographicdisplays.disk.HologramDatabase; import com.gmail.filoghost.holographicdisplays.disk.HologramDatabase;
@ -46,12 +47,12 @@ public class HolographicDisplays extends JavaPlugin {
// Used for the server pinger. // Used for the server pinger.
private static boolean isPreNetty; private static boolean isPreNetty;
// True if ProtocolLib is installed and successfully loaded.
private static boolean useProtocolLib;
// The new version found by the updater, null if there is no new version. // The new version found by the updater, null if there is no new version.
private static String newVersion; private static String newVersion;
// Not null if ProtocolLib is installed and successfully loaded.
private static ProtocolLibHook protocolLibHook;
@Override @Override
public void onEnable() { public void onEnable() {
@ -172,10 +173,16 @@ public class HolographicDisplays extends JavaPlugin {
// ProtocolLib check. // ProtocolLib check.
try { try {
if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) {
ProtocolLibHook protocolLibHook;
if (is19orGreater) { if (is19orGreater) {
useProtocolLib = com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.ProtocolLibHook.load(nmsManager, this); protocolLibHook = new com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.ProtocolLibHookImpl();
} else { } else {
useProtocolLib = com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9.ProtocolLibHook.load(nmsManager, this, is18orGreater); protocolLibHook = new com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9.ProtocolLibHookImpl(is18orGreater);
}
if (protocolLibHook.hook(this, nmsManager)) {
HolographicDisplays.protocolLibHook = protocolLibHook;
} }
} }
} catch (Exception ex) { } catch (Exception ex) {
@ -295,8 +302,13 @@ public class HolographicDisplays extends JavaPlugin {
} }
public static boolean useProtocolLib() { public static boolean hasProtocolLibHook() {
return useProtocolLib; return protocolLibHook != null;
}
public static ProtocolLibHook getProtocolLibHook() {
return protocolLibHook;
} }
} }

View File

@ -0,0 +1,17 @@
package com.gmail.filoghost.holographicdisplays.bridge.protocollib;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import com.gmail.filoghost.holographicdisplays.object.CraftHologram;
public interface ProtocolLibHook {
public boolean hook(Plugin plugin, NMSManager nmsManager);
public void sendDestroyEntitiesPacket(Player player, CraftHologram hologram);
public void sendCreateEntitiesPacket(Player player, CraftHologram hologram);
}

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.bridge.protocollib.current; package com.gmail.filoghost.holographicdisplays.bridge.protocollib.current;
import java.util.List; import java.util.List;
import java.util.regex.Pattern;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -13,10 +14,16 @@ import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketAdapter.AdapterParameteters;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.utility.MinecraftReflection;
import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer;
import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject;
import com.comphenix.protocol.wrappers.WrappedWatchableObject; import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.WrapperPlayServerSpawnEntity.ObjectTypes; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.current.WrapperPlayServerSpawnEntity.ObjectTypes;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager; import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
@ -27,31 +34,50 @@ import com.gmail.filoghost.holographicdisplays.object.line.CraftTextLine;
import com.gmail.filoghost.holographicdisplays.object.line.CraftTouchSlimeLine; import com.gmail.filoghost.holographicdisplays.object.line.CraftTouchSlimeLine;
import com.gmail.filoghost.holographicdisplays.object.line.CraftTouchableLine; import com.gmail.filoghost.holographicdisplays.object.line.CraftTouchableLine;
import com.gmail.filoghost.holographicdisplays.util.Utils; import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.google.common.base.Optional;
public class ProtocolLibHook { public class ProtocolLibHookImpl implements ProtocolLibHook {
private static boolean hasProtocolLib; private NMSManager nmsManager;
private static NMSManager nmsManager;
public static boolean load(NMSManager nmsManager, Plugin plugin) { private Serializer
ProtocolLibHook.nmsManager = nmsManager; itemSerializer,
intSerializer,
byteSerializer;
@Override
public boolean hook(Plugin plugin, NMSManager nmsManager) {
this.nmsManager = nmsManager;
if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) {
//TODO String version = Bukkit.getPluginManager().getPlugin("ProtocolLib").getDescription().getVersion();
Bukkit.getConsoleSender().sendMessage( if (version.matches(Pattern.quote("3.7-SNAPSHOT") + ".+")) {
ChatColor.RED + "[Holographic Displays] Detected development version of ProtocolLib, support disabled. " + Bukkit.getConsoleSender().sendMessage(
"Related functions (the placeholders {player} {displayname} and the visibility API) will not work.\n" + ChatColor.RED + "[Holographic Displays] Detected development version of ProtocolLib, support disabled. " +
"The reason is that this version of ProtocolLib is unstable and partly broken. " + "Related functions (the placeholders {player} {displayname} and the visibility API) will not work.\n" +
"A new version of Holographic Displays will be out when ProtocolLib gets fixed."); "The reason is that this version of ProtocolLib is unstable and partly broken. " +
return false; "Please update ProtocolLib.");
return false;
}
/* itemSerializer = Registry.get(MinecraftReflection.getItemStackClass());
hasProtocolLib = true; intSerializer = Registry.get(Integer.class);
byteSerializer = Registry.get(Byte.class);
plugin.getLogger().info("Found ProtocolLib, adding support for player relative variables."); plugin.getLogger().info("Found ProtocolLib, adding support for player relative variables.");
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.SPAWN_ENTITY, PacketType.Play.Server.ENTITY_METADATA) { AdapterParameteters params = PacketAdapter
.params()
.plugin(plugin)
.types( PacketType.Play.Server.SPAWN_ENTITY_LIVING,
PacketType.Play.Server.SPAWN_ENTITY,
PacketType.Play.Server.ENTITY_METADATA)
.serverSide()
.listenerPriority(ListenerPriority.NORMAL);
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(params) {
@Override @Override
public void onPacketSending(PacketEvent event) { public void onPacketSending(PacketEvent event) {
@ -79,20 +105,14 @@ public class ProtocolLibHook {
return; return;
} }
WrappedDataWatcher dataWatcher = spawnEntityPacket.getMetadata(); WrappedWatchableObject customNameWatchableObject = spawnEntityPacket.getMetadata().getWatchableObject(2);
String customName = dataWatcher.getString(2); if (customNameWatchableObject == null || !(customNameWatchableObject.getValue() instanceof String)) {
if (customName == null) {
return; return;
} }
String customName = (String) customNameWatchableObject.getValue();
if (customName.contains("{player}") || customName.contains("{displayname}")) { if (customName.contains("{player}") || customName.contains("{displayname}")) {
customNameWatchableObject.setValue(customName.replace("{player}", player.getName()).replace("{displayname}", player.getDisplayName()));
WrappedDataWatcher dataWatcherClone = dataWatcher.deepClone();
dataWatcherClone.setObject(2, customName.replace("{player}", player.getName()).replace("{displayname}", player.getDisplayName()));
spawnEntityPacket.setMetadata(dataWatcherClone);
event.setPacket(spawnEntityPacket.getHandle());
} }
} else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) { } else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) {
@ -128,8 +148,7 @@ public class ProtocolLibHook {
return; return;
} }
if (entity.getType() != EntityType.ARMOR_STAND) { if (!isHologramType(entity.getType())) {
// Enough, only armorstands are used with custom names.
return; return;
} }
@ -145,28 +164,20 @@ public class ProtocolLibHook {
} }
List<WrappedWatchableObject> dataWatcherValues = entityMetadataPacket.getEntityMetadata(); List<WrappedWatchableObject> dataWatcherValues = entityMetadataPacket.getEntityMetadata();
for (int i = 0; i < dataWatcherValues.size(); i++) { for (int i = 0; i < dataWatcherValues.size(); i++) {
if (dataWatcherValues.get(i).getIndex() == 2 && dataWatcherValues.get(i).getValue() != null) { WrappedWatchableObject watchableObject = dataWatcherValues.get(i);
if (watchableObject.getIndex() == 2) {
Object customNameObject = dataWatcherValues.get(i).deepClone().getValue(); Object customNameObject = watchableObject.getValue();
if (customNameObject == null || customNameObject instanceof String == false) { if (!(customNameObject instanceof String)) {
return; return;
} }
String customName = (String) customNameObject; String customName = (String) customNameObject;
if (customName.contains("{player}") || customName.contains("{displayname}")) { if (customName.contains("{player}") || customName.contains("{displayname}")) {
watchableObject.setValue(customName.replace("{player}", player.getName()).replace("{displayname}", player.getDisplayName()));
entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet.deepClone());
List<WrappedWatchableObject> clonedList = entityMetadataPacket.getEntityMetadata();
WrappedWatchableObject clonedElement = clonedList.get(i);
clonedElement.setValue(customName.replace("{player}", player.getName()).replace("{displayname}", player.getDisplayName()));
entityMetadataPacket.setEntityMetadata(clonedList);
event.setPacket(entityMetadataPacket.getHandle());
return; return;
} }
} }
} }
@ -175,17 +186,14 @@ public class ProtocolLibHook {
}); });
return true; return true;
*/
} }
return false; return false;
} }
public static void sendDestroyEntitiesPacket(Player player, CraftHologram hologram) {
if (!hasProtocolLib) {
return;
}
@Override
public void sendDestroyEntitiesPacket(Player player, CraftHologram hologram) {
List<Integer> ids = Utils.newList(); List<Integer> ids = Utils.newList();
for (CraftHologramLine line : hologram.getLinesUnsafe()) { for (CraftHologramLine line : hologram.getLinesUnsafe()) {
if (line.isSpawned()) { if (line.isSpawned()) {
@ -202,11 +210,9 @@ public class ProtocolLibHook {
} }
} }
public static void sendCreateEntitiesPacket(Player player, CraftHologram hologram) {
if (!hasProtocolLib) {
return;
}
@Override
public void sendCreateEntitiesPacket(Player player, CraftHologram hologram) {
for (CraftHologramLine line : hologram.getLinesUnsafe()) { for (CraftHologramLine line : hologram.getLinesUnsafe()) {
if (line.isSpawned()) { if (line.isSpawned()) {
@ -217,7 +223,6 @@ public class ProtocolLibHook {
AbstractPacket nameablePacket = new WrapperPlayServerSpawnEntityLiving(textLine.getNmsNameble().getBukkitEntityNMS()); AbstractPacket nameablePacket = new WrapperPlayServerSpawnEntityLiving(textLine.getNmsNameble().getBukkitEntityNMS());
nameablePacket.sendPacket(player); nameablePacket.sendPacket(player);
} }
} else if (line instanceof CraftItemLine) { } else if (line instanceof CraftItemLine) {
@ -228,7 +233,6 @@ public class ProtocolLibHook {
itemPacket.sendPacket(player); itemPacket.sendPacket(player);
AbstractPacket vehiclePacket = new WrapperPlayServerSpawnEntityLiving(itemLine.getNmsVehicle().getBukkitEntityNMS()); AbstractPacket vehiclePacket = new WrapperPlayServerSpawnEntityLiving(itemLine.getNmsVehicle().getBukkitEntityNMS());
vehiclePacket.sendPacket(player); vehiclePacket.sendPacket(player);
WrapperPlayServerMount attachPacket = new WrapperPlayServerMount(); WrapperPlayServerMount attachPacket = new WrapperPlayServerMount();
@ -237,12 +241,13 @@ public class ProtocolLibHook {
attachPacket.sendPacket(player); attachPacket.sendPacket(player);
WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata(); WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata();
WrappedDataWatcher dataWatcher = new WrappedDataWatcher();
List<WrappedWatchableObject> metadata = Utils.newList(); dataWatcher.setObject(new WrappedDataWatcherObject(5, itemSerializer), Optional.of(itemLine.getNmsItem().getRawItemStack()));
metadata.add(new WrappedWatchableObject(10, itemLine.getItemStack())); dataWatcher.setObject(new WrappedDataWatcherObject(1, intSerializer), 300);
metadata.add(new WrappedWatchableObject(1, (short) 300)); dataWatcher.setObject(new WrappedDataWatcherObject(0, byteSerializer), (byte) 0);
metadata.add(new WrappedWatchableObject(0, (byte) 0));
itemDataPacket.setEntityMetadata(metadata); itemDataPacket.setEntityMetadata(dataWatcher.getWatchableObjects());
itemDataPacket.setEntityId(itemLine.getNmsItem().getIdNMS()); itemDataPacket.setEntityId(itemLine.getNmsItem().getIdNMS());
itemDataPacket.sendPacket(player); itemDataPacket.sendPacket(player);
} }
@ -272,11 +277,13 @@ public class ProtocolLibHook {
} }
} }
private static boolean isHologramType(EntityType type) {
private boolean isHologramType(EntityType type) {
return type == EntityType.ARMOR_STAND || type == EntityType.DROPPED_ITEM || type == EntityType.SLIME; return type == EntityType.ARMOR_STAND || type == EntityType.DROPPED_ITEM || type == EntityType.SLIME;
} }
private static CraftHologram getHologram(Entity bukkitEntity) {
private CraftHologram getHologram(Entity bukkitEntity) {
NMSEntityBase entity = nmsManager.getNMSEntityBase(bukkitEntity); NMSEntityBase entity = nmsManager.getNMSEntityBase(bukkitEntity);
if (entity != null) { if (entity != null) {
return entity.getHologramLine().getParent(); return entity.getHologramLine().getParent();

View File

@ -1,5 +1,6 @@
package com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9; package com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9;
import java.lang.reflect.Constructor;
import java.util.List; import java.util.List;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -17,6 +18,7 @@ import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedWatchableObject; import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import com.gmail.filoghost.holographicdisplays.HolographicDisplays; import com.gmail.filoghost.holographicdisplays.HolographicDisplays;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.ProtocolLibHook;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9.WrapperPlayServerSpawnEntity.ObjectTypes; import com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9.WrapperPlayServerSpawnEntity.ObjectTypes;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager; import com.gmail.filoghost.holographicdisplays.nms.interfaces.NMSManager;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
@ -29,20 +31,24 @@ import com.gmail.filoghost.holographicdisplays.object.line.CraftTouchableLine;
import com.gmail.filoghost.holographicdisplays.util.Utils; import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.VersionUtils; import com.gmail.filoghost.holographicdisplays.util.VersionUtils;
public class ProtocolLibHook { public class ProtocolLibHookImpl implements ProtocolLibHook {
private static boolean hasProtocolLib; private boolean is1_8;
private static NMSManager nmsManager;
private static int customNameWatcherIndex; private NMSManager nmsManager;
public static boolean load(NMSManager nmsManager, Plugin plugin, boolean is1_8) { private int customNameWatcherIndex;
ProtocolLibHook.nmsManager = nmsManager;
public ProtocolLibHookImpl(boolean is1_8) {
this.is1_8 = is1_8;
}
@Override
public boolean hook(Plugin plugin, NMSManager nmsManager) {
this.nmsManager = nmsManager;
if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) {
hasProtocolLib = true;
plugin.getLogger().info("Found ProtocolLib, adding support for player relative variables."); plugin.getLogger().info("Found ProtocolLib, adding support for player relative variables.");
if (is1_8) { if (is1_8) {
customNameWatcherIndex = 2; customNameWatcherIndex = 2;
@ -50,7 +56,6 @@ public class ProtocolLibHook {
customNameWatcherIndex = 10; customNameWatcherIndex = 10;
} }
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.SPAWN_ENTITY, PacketType.Play.Server.ENTITY_METADATA) { ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.SPAWN_ENTITY, PacketType.Play.Server.ENTITY_METADATA) {
@Override @Override
@ -150,7 +155,7 @@ public class ProtocolLibHook {
if (dataWatcherValues.get(i).getIndex() == customNameWatcherIndex && dataWatcherValues.get(i).getValue() != null) { if (dataWatcherValues.get(i).getIndex() == customNameWatcherIndex && dataWatcherValues.get(i).getValue() != null) {
Object customNameObject = dataWatcherValues.get(i).deepClone().getValue(); Object customNameObject = dataWatcherValues.get(i).getValue();
if (customNameObject == null || customNameObject instanceof String == false) { if (customNameObject == null || customNameObject instanceof String == false) {
return; return;
} }
@ -180,11 +185,7 @@ public class ProtocolLibHook {
return false; return false;
} }
public static void sendDestroyEntitiesPacket(Player player, CraftHologram hologram) { public void sendDestroyEntitiesPacket(Player player, CraftHologram hologram) {
if (!hasProtocolLib) {
return;
}
List<Integer> ids = Utils.newList(); List<Integer> ids = Utils.newList();
for (CraftHologramLine line : hologram.getLinesUnsafe()) { for (CraftHologramLine line : hologram.getLinesUnsafe()) {
if (line.isSpawned()) { if (line.isSpawned()) {
@ -201,11 +202,7 @@ public class ProtocolLibHook {
} }
} }
public static void sendCreateEntitiesPacket(Player player, CraftHologram hologram) { public void sendCreateEntitiesPacket(Player player, CraftHologram hologram) {
if (!hasProtocolLib) {
return;
}
for (CraftHologramLine line : hologram.getLinesUnsafe()) { for (CraftHologramLine line : hologram.getLinesUnsafe()) {
if (line.isSpawned()) { if (line.isSpawned()) {
@ -253,9 +250,9 @@ public class ProtocolLibHook {
WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata(); WrapperPlayServerEntityMetadata itemDataPacket = new WrapperPlayServerEntityMetadata();
List<WrappedWatchableObject> metadata = Utils.newList(); List<WrappedWatchableObject> metadata = Utils.newList();
metadata.add(new WrappedWatchableObject(10, itemLine.getItemStack())); metadata.add(createWrappedWatchableObject(10, itemLine.getItemStack()));
metadata.add(new WrappedWatchableObject(1, (short) 300)); metadata.add(createWrappedWatchableObject(1, (short) 300));
metadata.add(new WrappedWatchableObject(0, (byte) 0)); metadata.add(createWrappedWatchableObject(0, (byte) 0));
itemDataPacket.setEntityMetadata(metadata); itemDataPacket.setEntityMetadata(metadata);
itemDataPacket.setEntityId(itemLine.getNmsItem().getIdNMS()); itemDataPacket.setEntityId(itemLine.getNmsItem().getIdNMS());
itemDataPacket.sendPacket(player); itemDataPacket.sendPacket(player);
@ -294,11 +291,25 @@ public class ProtocolLibHook {
} }
} }
private static boolean isHologramType(EntityType type) { // This is just for compiling
private Constructor<?> wrappedWatchableObjectConstructor;
private WrappedWatchableObject createWrappedWatchableObject(int index, Object value) {
try {
if (wrappedWatchableObjectConstructor == null) {
wrappedWatchableObjectConstructor = WrappedWatchableObject.class.getConstructor(int.class, Object.class);
}
return (WrappedWatchableObject) wrappedWatchableObjectConstructor.newInstance(index, value);
} catch (Exception ex) {
throw new IllegalStateException("Could not invoke WrappedWatchableObject constructor", ex);
}
}
private boolean isHologramType(EntityType type) {
return type == EntityType.HORSE || type == EntityType.WITHER_SKULL || type == EntityType.DROPPED_ITEM || type == EntityType.SLIME || VersionUtils.isArmorstand(type); // To maintain backwards compatibility return type == EntityType.HORSE || type == EntityType.WITHER_SKULL || type == EntityType.DROPPED_ITEM || type == EntityType.SLIME || VersionUtils.isArmorstand(type); // To maintain backwards compatibility
} }
private static CraftHologram getHologram(Entity bukkitEntity) { private CraftHologram getHologram(Entity bukkitEntity) {
NMSEntityBase entity = nmsManager.getNMSEntityBase(bukkitEntity); NMSEntityBase entity = nmsManager.getNMSEntityBase(bukkitEntity);
if (entity != null) { if (entity != null) {
return entity.getHologramLine().getParent(); return entity.getHologramLine().getParent();

View File

@ -10,4 +10,7 @@ public interface NMSItem extends NMSEntityBase, NMSCanMount {
// Sets if this item can be picked up by players. // Sets if this item can be picked up by players.
public void allowPickup(boolean pickup); public void allowPickup(boolean pickup);
// The raw NMS ItemStack object.
public Object getRawItemStack();
} }

View File

@ -208,4 +208,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -208,4 +208,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -208,4 +208,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -208,4 +208,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -213,4 +213,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -219,4 +219,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -219,4 +219,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -219,4 +219,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
this.vehicle = entity; this.vehicle = entity;
entity.passenger = this; entity.passenger = this;
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -258,4 +258,9 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
DebugHandler.handleDebugException(ex); DebugHandler.handleDebugException(ex);
} }
} }
@Override
public Object getRawItemStack() {
return super.getItemStack();
}
} }

View File

@ -10,7 +10,6 @@ import org.bukkit.entity.Player;
import com.gmail.filoghost.holographicdisplays.HolographicDisplays; import com.gmail.filoghost.holographicdisplays.HolographicDisplays;
import com.gmail.filoghost.holographicdisplays.api.VisibilityManager; import com.gmail.filoghost.holographicdisplays.api.VisibilityManager;
import com.gmail.filoghost.holographicdisplays.bridge.protocollib.pre1_9.ProtocolLibHook;
import com.gmail.filoghost.holographicdisplays.util.Validator; import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.VersionUtils; import com.gmail.filoghost.holographicdisplays.util.VersionUtils;
@ -150,14 +149,14 @@ public class CraftVisibilityManager implements VisibilityManager {
} }
private static void sendCreatePacketIfNear(Player player, CraftHologram hologram) { private static void sendCreatePacketIfNear(Player player, CraftHologram hologram) {
if (HolographicDisplays.useProtocolLib() && isNear(player, hologram)) { if (HolographicDisplays.hasProtocolLibHook() && isNear(player, hologram)) {
ProtocolLibHook.sendCreateEntitiesPacket(player, hologram); HolographicDisplays.getProtocolLibHook().sendCreateEntitiesPacket(player, hologram);
} }
} }
private static void sendDestroyPacketIfNear(Player player, CraftHologram hologram) { private static void sendDestroyPacketIfNear(Player player, CraftHologram hologram) {
if (HolographicDisplays.useProtocolLib() && isNear(player, hologram)) { if (HolographicDisplays.hasProtocolLibHook() && isNear(player, hologram)) {
ProtocolLibHook.sendDestroyEntitiesPacket(player, hologram); HolographicDisplays.getProtocolLibHook().sendDestroyEntitiesPacket(player, hologram);
} }
} }

View File

@ -15,7 +15,8 @@ import com.google.common.collect.ImmutableList;
public class VersionUtils { public class VersionUtils {
private static Method oldGetOnlinePlayersMethod; private static Method getOnlinePlayersMethod;
private static boolean getOnlinePlayersUseReflection;
/** /**
* This method uses a regex to get the NMS package part that changes with every update. * This method uses a regex to get the NMS package part that changes with every update.
@ -63,20 +64,25 @@ public class VersionUtils {
public static Collection<? extends Player> getOnlinePlayers() { public static Collection<? extends Player> getOnlinePlayers() {
if (HolographicDisplays.is18orGreater()) { try {
return Bukkit.getOnlinePlayers();
} else {
try {
if (oldGetOnlinePlayersMethod == null) {
oldGetOnlinePlayersMethod = Bukkit.class.getDeclaredMethod("getOnlinePlayers");
}
Player[] playersArray = (Player[]) oldGetOnlinePlayersMethod.invoke(null); if (getOnlinePlayersMethod == null) {
return ImmutableList.copyOf(playersArray); getOnlinePlayersMethod = Bukkit.class.getDeclaredMethod("getOnlinePlayers");
} catch (Exception e) { if (getOnlinePlayersMethod.getReturnType() == Player[].class) {
e.printStackTrace(); getOnlinePlayersUseReflection = true;
return Collections.emptyList(); }
} }
if (!getOnlinePlayersUseReflection) {
return Bukkit.getOnlinePlayers();
} else {
Player[] playersArray = (Player[]) getOnlinePlayersMethod.invoke(null);
return ImmutableList.copyOf(playersArray);
}
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
} }
} }
} }

View File

@ -1,6 +1,6 @@
name: HolographicDisplays name: HolographicDisplays
main: com.gmail.filoghost.holographicdisplays.HolographicDisplays main: com.gmail.filoghost.holographicdisplays.HolographicDisplays
version: 2.1.11 version: 2.1.12
softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib] softdepend: [Multiverse-Core, MultiWorld, My Worlds, My_Worlds, ProtocolLib]