Fix item stacking and handle exceptions in touch & pickup handlers.

This commit is contained in:
filoghost 2014-08-29 14:54:27 +02:00
parent 10bfead9e4
commit 6e86a803dc
10 changed files with 142 additions and 11 deletions

View File

@ -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<String> savedHolograms = HologramDatabase.getHolograms();
if (savedHolograms != null && savedHolograms.size() > 0) {

View File

@ -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;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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]";
}
}

View File

@ -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<String> lore, ChatColor defaultLoreColor) {
return getItem(Material.STONE, title, lore, defaultLoreColor);
}