From 2d94e6fdc7eb48c941acbce7deb0bbc3c55316fd Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Mon, 15 Dec 2014 21:00:45 -0800 Subject: [PATCH] Fixed overzealous protection of death drops. Hash overlaps are to blame, I think. Limiting protections to the immediate area where the player died. --- .../GriefPrevention/EntityEventHandler.java | 2 +- .../GriefPrevention/GriefPrevention.java | 2 +- .../GriefPrevention/ItemStackOwnerInfo.java | 17 ++++++++++++++++ .../GriefPrevention/PlayerEventHandler.java | 20 ++++++++++++------- 4 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 src/me/ryanhamshire/GriefPrevention/ItemStackOwnerInfo.java diff --git a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index 128cdab..049d446 100644 --- a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -240,7 +240,7 @@ class EntityEventHandler implements Listener List drops = event.getDrops(); for(ItemStack stack : drops) { - GriefPrevention.instance.itemStackOwnerMap.put(stack, player.getUniqueId()); + GriefPrevention.instance.itemStackOwnerMap.put(stack, new ItemStackOwnerInfo(player.getUniqueId(), player.getLocation())); } //allow the player to receive a message about how to unlock any drops diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index 2266504..24aa449 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -61,7 +61,7 @@ public class GriefPrevention extends JavaPlugin public DataStore dataStore; //this remembers which item stacks dropped in the world belong to which players - ConcurrentHashMap itemStackOwnerMap = new ConcurrentHashMap(); + ConcurrentHashMap itemStackOwnerMap = new ConcurrentHashMap(); //configuration variables, loaded/saved from a config.yml diff --git a/src/me/ryanhamshire/GriefPrevention/ItemStackOwnerInfo.java b/src/me/ryanhamshire/GriefPrevention/ItemStackOwnerInfo.java new file mode 100644 index 0000000..13d33e1 --- /dev/null +++ b/src/me/ryanhamshire/GriefPrevention/ItemStackOwnerInfo.java @@ -0,0 +1,17 @@ +package me.ryanhamshire.GriefPrevention; + +import java.util.UUID; +import org.bukkit.Location; + +//tracks an item stack's owner. ownership is limited to a locality due to problems with hash overlaps overprotecting item stacks +class ItemStackOwnerInfo +{ + public UUID ownerID; + public Location locality; + + public ItemStackOwnerInfo(UUID ownerID, Location location) + { + this.ownerID = ownerID; + this.locality = location; + } +} diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index 6fe6655..aea963d 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -929,18 +929,24 @@ class PlayerEventHandler implements Listener //who owns this stack? ItemStack stack = event.getItem().getItemStack(); - UUID ownerID = GriefPrevention.instance.itemStackOwnerMap.get(stack); - if(ownerID != null) + ItemStackOwnerInfo ownerInfo = GriefPrevention.instance.itemStackOwnerMap.get(stack); + if(ownerInfo != null) { //has that player unlocked his drops? - OfflinePlayer owner = GriefPrevention.instance.getServer().getOfflinePlayer(ownerID); - String ownerName = GriefPrevention.lookupPlayerName(ownerID); + OfflinePlayer owner = GriefPrevention.instance.getServer().getOfflinePlayer(ownerInfo.ownerID); + String ownerName = GriefPrevention.lookupPlayerName(ownerInfo.ownerID); if(owner.isOnline() && !player.equals(owner)) { - PlayerData playerData = this.dataStore.getPlayerData(ownerID); + PlayerData playerData = this.dataStore.getPlayerData(ownerInfo.ownerID); + Location location = event.getItem().getLocation(); - //if locked, don't allow pickup - if(!playerData.dropsAreUnlocked) + //if locked and in locality of protection, don't allow pickup + if(!playerData.dropsAreUnlocked + && location.getX() > ownerInfo.locality.getX() - 10 + && location.getX() < ownerInfo.locality.getX() + 10 + && location.getZ() < ownerInfo.locality.getZ() + 10 + && location.getZ() > ownerInfo.locality.getZ() - 10 + && location.getY() < ownerInfo.locality.getY() + 5) { event.setCancelled(true);