From 6e86a803dc81e701a5d9b8fb841210abcdff4b09 Mon Sep 17 00:00:00 2001 From: filoghost Date: Fri, 29 Aug 2014 14:54:27 +0200 Subject: [PATCH] Fix item stacking and handle exceptions in touch & pickup handlers. --- .../holograms/HolographicDisplays.java | 2 +- .../holograms/listener/MainListener.java | 8 +++++- .../nms/v1_6_R3/EntityCustomItem.java | 25 ++++++++++++++++++- .../nms/v1_7_R1/EntityCustomItem.java | 25 ++++++++++++++++++- .../nms/v1_7_R2/EntityCustomItem.java | 25 ++++++++++++++++++- .../nms/v1_7_R3/EntityCustomItem.java | 25 ++++++++++++++++++- .../nms/v1_7_R4/EntityCustomItem.java | 25 ++++++++++++++++++- .../holograms/protocol/ProtocolLibHook.java | 14 ++++++++--- .../tasks/WorldPlayerCounterTask.java | 2 +- .../filoghost/holograms/utils/ItemUtils.java | 2 ++ 10 files changed, 142 insertions(+), 11 deletions(-) diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java index 0c623c54..7bc237a1 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/HolographicDisplays.java @@ -196,7 +196,7 @@ public class HolographicDisplays extends JavaPlugin { ServerInfoTimer.setRefreshSeconds(Configuration.bungeeRefreshSeconds); ServerInfoTimer.startTask(); BungeeCleanupTask.start(); - Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new WorldPlayerCounterTask(), 3 * 20L, 3 * 20L); + Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new WorldPlayerCounterTask(), 0L, 3 * 20L); Set savedHolograms = HologramDatabase.getHolograms(); if (savedHolograms != null && savedHolograms.size() > 0) { diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java index 7a239a4b..e71cf84e 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/listener/MainListener.java @@ -15,6 +15,7 @@ import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; import com.gmail.filoghost.holograms.Configuration; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.api.Hologram; import com.gmail.filoghost.holograms.commands.Messages; @@ -89,7 +90,12 @@ public class MainListener implements Listener { if (base instanceof Hologram) { Hologram textHologram = (Hologram) base; if (textHologram.hasTouchHandler()) { - textHologram.getTouchHandler().onTouch(textHologram, event.getPlayer()); + try { + textHologram.getTouchHandler().onTouch(textHologram, event.getPlayer()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occured while a player was touching a hologram. It's probably caused by another plugin using Holographic Displays as library."); + } } } else if (base instanceof FloatingItem) { FloatingItem floatingItem = (FloatingItem) base; diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java index f723295a..800592dd 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_6_R3/EntityCustomItem.java @@ -6,15 +6,19 @@ import net.minecraft.server.v1_6_R3.NBTTagCompound; import net.minecraft.server.v1_6_R3.World; import net.minecraft.server.v1_6_R3.EntityHuman; import net.minecraft.server.v1_6_R3.EntityPlayer; +import net.minecraft.server.v1_6_R3.NBTTagList; +import net.minecraft.server.v1_6_R3.NBTTagString; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftItemStack; import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.HologramBase; +import com.gmail.filoghost.holograms.utils.ItemUtils; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { @@ -60,7 +64,12 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt FloatingItem floatingItemParent = (FloatingItem) parent; if (floatingItemParent.hasPickupHandler()) { - floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + try { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occurred while a player was picking up a floating item. It's probably caused by another plugin using Holographic Displays as library."); + } } // It is never added to the inventory. @@ -136,6 +145,20 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { ItemStack newItem = CraftItemStack.asNMSCopy(stack); + + if (newItem.tag == null) { + newItem.tag = new NBTTagCompound(); + } + NBTTagCompound display = newItem.tag.getCompound("display"); + + if (!newItem.tag.hasKey("display")) { + newItem.tag.set("display", display); + } + + NBTTagList tagList = new NBTTagList(); + tagList.add(new NBTTagString(ItemUtils.ANTISTACK_LORE)); // Antistack lore + + display.set("Lore", tagList); newItem.count = 0; setItemStack(newItem); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java index 1a42e274..598fa812 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R1/EntityCustomItem.java @@ -4,10 +4,12 @@ import org.bukkit.craftbukkit.v1_7_R1.entity.CraftEntity; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.HologramBase; +import com.gmail.filoghost.holograms.utils.ItemUtils; import net.minecraft.server.v1_7_R1.EntityItem; import net.minecraft.server.v1_7_R1.ItemStack; @@ -15,6 +17,8 @@ import net.minecraft.server.v1_7_R1.NBTTagCompound; import net.minecraft.server.v1_7_R1.World; import net.minecraft.server.v1_7_R1.EntityHuman; import net.minecraft.server.v1_7_R1.EntityPlayer; +import net.minecraft.server.v1_7_R1.NBTTagList; +import net.minecraft.server.v1_7_R1.NBTTagString; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { @@ -60,7 +64,12 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt FloatingItem floatingItemParent = (FloatingItem) parent; if (floatingItemParent.hasPickupHandler()) { - floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + try { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occurred while a player was picking up a floating item. It's probably caused by another plugin using Holographic Displays as library."); + } } // It is never added to the inventory. @@ -136,6 +145,20 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { ItemStack newItem = CraftItemStack.asNMSCopy(stack); + + if (newItem.tag == null) { + newItem.tag = new NBTTagCompound(); + } + NBTTagCompound display = newItem.tag.getCompound("display"); + + if (!newItem.tag.hasKey("display")) { + newItem.tag.set("display", display); + } + + NBTTagList tagList = new NBTTagList(); + tagList.add(new NBTTagString(ItemUtils.ANTISTACK_LORE)); // Antistack lore + + display.set("Lore", tagList); newItem.count = 0; setItemStack(newItem); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java index 24531b70..de5e03fd 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R2/EntityCustomItem.java @@ -4,10 +4,12 @@ import org.bukkit.craftbukkit.v1_7_R2.entity.CraftEntity; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftItemStack; import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.HologramBase; +import com.gmail.filoghost.holograms.utils.ItemUtils; import net.minecraft.server.v1_7_R2.EntityItem; import net.minecraft.server.v1_7_R2.ItemStack; @@ -15,6 +17,8 @@ import net.minecraft.server.v1_7_R2.NBTTagCompound; import net.minecraft.server.v1_7_R2.World; import net.minecraft.server.v1_7_R2.EntityHuman; import net.minecraft.server.v1_7_R2.EntityPlayer; +import net.minecraft.server.v1_7_R2.NBTTagList; +import net.minecraft.server.v1_7_R2.NBTTagString; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { @@ -60,7 +64,12 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt FloatingItem floatingItemParent = (FloatingItem) parent; if (floatingItemParent.hasPickupHandler()) { - floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + try { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occurred while a player was picking up a floating item. It's probably caused by another plugin using Holographic Displays as library."); + } } // It is never added to the inventory. @@ -136,6 +145,20 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { ItemStack newItem = CraftItemStack.asNMSCopy(stack); + + if (newItem.tag == null) { + newItem.tag = new NBTTagCompound(); + } + NBTTagCompound display = newItem.tag.getCompound("display"); + + if (!newItem.tag.hasKey("display")) { + newItem.tag.set("display", display); + } + + NBTTagList tagList = new NBTTagList(); + tagList.add(new NBTTagString(ItemUtils.ANTISTACK_LORE)); // Antistack lore + + display.set("Lore", tagList); newItem.count = 0; setItemStack(newItem); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java index ce83554a..98424dfa 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R3/EntityCustomItem.java @@ -4,14 +4,18 @@ import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity; import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.HologramBase; +import com.gmail.filoghost.holograms.utils.ItemUtils; +import net.minecraft.server.v1_7_R3.NBTTagList; import net.minecraft.server.v1_7_R3.EntityItem; import net.minecraft.server.v1_7_R3.ItemStack; import net.minecraft.server.v1_7_R3.NBTTagCompound; +import net.minecraft.server.v1_7_R3.NBTTagString; import net.minecraft.server.v1_7_R3.World; import net.minecraft.server.v1_7_R3.EntityHuman; import net.minecraft.server.v1_7_R3.EntityPlayer; @@ -59,7 +63,12 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt FloatingItem floatingItemParent = (FloatingItem) parent; if (floatingItemParent.hasPickupHandler()) { - floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + try { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occurred while a player was picking up a floating item. It's probably caused by another plugin using Holographic Displays as library."); + } } // It is never added to the inventory. @@ -135,6 +144,20 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { ItemStack newItem = CraftItemStack.asNMSCopy(stack); + + if (newItem.tag == null) { + newItem.tag = new NBTTagCompound(); + } + NBTTagCompound display = newItem.tag.getCompound("display"); + + if (!newItem.tag.hasKey("display")) { + newItem.tag.set("display", display); + } + + NBTTagList tagList = new NBTTagList(); + tagList.add(new NBTTagString(ItemUtils.ANTISTACK_LORE)); // Antistack lore + + display.set("Lore", tagList); newItem.count = 0; setItemStack(newItem); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java index ba5605ca..43e72ba4 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/nms/v1_7_R4/EntityCustomItem.java @@ -1,5 +1,7 @@ package com.gmail.filoghost.holograms.nms.v1_7_R4; +import net.minecraft.server.v1_7_R4.NBTTagList; +import net.minecraft.server.v1_7_R4.NBTTagString; import net.minecraft.server.v1_7_R4.EntityHuman; import net.minecraft.server.v1_7_R4.EntityItem; import net.minecraft.server.v1_7_R4.EntityPlayer; @@ -11,10 +13,12 @@ import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; import org.bukkit.entity.Player; +import com.gmail.filoghost.holograms.HolographicDisplays; import com.gmail.filoghost.holograms.api.FloatingItem; import com.gmail.filoghost.holograms.nms.interfaces.BasicEntityNMS; import com.gmail.filoghost.holograms.nms.interfaces.CustomItem; import com.gmail.filoghost.holograms.object.HologramBase; +import com.gmail.filoghost.holograms.utils.ItemUtils; public class EntityCustomItem extends EntityItem implements CustomItem, BasicEntityNMS { @@ -60,7 +64,12 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt FloatingItem floatingItemParent = (FloatingItem) parent; if (floatingItemParent.hasPickupHandler()) { - floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + try { + floatingItemParent.getPickupHandler().onPickup(floatingItemParent, (Player) human.getBukkitEntity()); + } catch (Exception ex) { + ex.printStackTrace(); + HolographicDisplays.getInstance().getLogger().warning("An exception occurred while a player picking up a floating item. It's probably caused by another plugin using Holographic Displays as library."); + } } // It is never added to the inventory. @@ -136,6 +145,20 @@ public class EntityCustomItem extends EntityItem implements CustomItem, BasicEnt @Override public void setItemStackNMS(org.bukkit.inventory.ItemStack stack) { ItemStack newItem = CraftItemStack.asNMSCopy(stack); + + if (newItem.tag == null) { + newItem.tag = new NBTTagCompound(); + } + NBTTagCompound display = newItem.tag.getCompound("display"); + + if (!newItem.tag.hasKey("display")) { + newItem.tag.set("display", display); + } + + NBTTagList tagList = new NBTTagList(); + tagList.add(new NBTTagString(ItemUtils.ANTISTACK_LORE)); // Antistack lore + + display.set("Lore", tagList); newItem.count = 0; setItemStack(newItem); } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java index 1bc0ee31..a19095af 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/protocol/ProtocolLibHook.java @@ -28,7 +28,7 @@ public class ProtocolLibHook { HolographicDisplays.getInstance().getLogger().info("Found ProtocolLib, adding support for player relative variables."); - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HolographicDisplays.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.ENTITY_METADATA) { + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HolographicDisplays.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.SPAWN_ENTITY_LIVING, PacketType.Play.Server.SPAWN_ENTITY, PacketType.Play.Server.ENTITY_METADATA) { @Override @@ -74,8 +74,16 @@ public class ProtocolLibHook { } - // Entity metadata packet - } else { + } else if (packet.getType() == PacketType.Play.Server.SPAWN_ENTITY) { + + WrapperPlayServerSpawnEntity spawnEntityPacket = new WrapperPlayServerSpawnEntity(packet); + + if (spawnEntityPacket.getType() == WrapperPlayServerSpawnEntity.ObjectTypes.ITEM_STACK) { + //TODO + } + + + } else { // Entity metadata packet WrapperPlayServerEntityMetadata entityMetadataPacket = new WrapperPlayServerEntityMetadata(packet); Entity entity = entityMetadataPacket.getEntity(event); diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/tasks/WorldPlayerCounterTask.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/tasks/WorldPlayerCounterTask.java index ad958bfb..07151245 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/tasks/WorldPlayerCounterTask.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/tasks/WorldPlayerCounterTask.java @@ -22,6 +22,6 @@ public class WorldPlayerCounterTask implements Runnable { public static String getCount(String world) { Integer count = worlds.get(world); - return count != null ? count.toString() : "world not found"; + return count != null ? count.toString() : "[World \"" + world + "\" not found]"; } } diff --git a/HolographicDisplays/src/com/gmail/filoghost/holograms/utils/ItemUtils.java b/HolographicDisplays/src/com/gmail/filoghost/holograms/utils/ItemUtils.java index fed49684..03954466 100644 --- a/HolographicDisplays/src/com/gmail/filoghost/holograms/utils/ItemUtils.java +++ b/HolographicDisplays/src/com/gmail/filoghost/holograms/utils/ItemUtils.java @@ -9,6 +9,8 @@ import org.bukkit.inventory.meta.ItemMeta; public class ItemUtils { + public static final String ANTISTACK_LORE = ChatColor.BLACK + "" + Math.random(); + public static ItemStack getStone(String title, List lore, ChatColor defaultLoreColor) { return getItem(Material.STONE, title, lore, defaultLoreColor); }