From fe2446b7575076fac090b3e125f0e00903771311 Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Thu, 5 May 2016 08:39:20 -0700 Subject: [PATCH] Update siege spoils feature. Previously transferred all items from defender to attacker if the defender was killed. Will now transfer only those which would have been dropped (other plugins can remove from and otherwise change the drop list before GP does anything with it). --- .../ryanhamshire/GriefPrevention/DataStore.java | 16 ++++++---------- .../GriefPrevention/EntityEventHandler.java | 5 +---- .../GriefPrevention/SiegeCheckupTask.java | 6 +++--- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/me/ryanhamshire/GriefPrevention/DataStore.java b/src/me/ryanhamshire/GriefPrevention/DataStore.java index b91412e..7d06957 100644 --- a/src/me/ryanhamshire/GriefPrevention/DataStore.java +++ b/src/me/ryanhamshire/GriefPrevention/DataStore.java @@ -957,7 +957,7 @@ public abstract class DataStore //ends a siege //either winnerName or loserName can be null, but not both - synchronized public void endSiege(SiegeData siegeData, String winnerName, String loserName, boolean death) + synchronized public void endSiege(SiegeData siegeData, String winnerName, String loserName, List drops) { boolean grantAccess = false; @@ -1043,7 +1043,7 @@ public abstract class DataStore } //if the siege ended due to death, transfer inventory to winner - if(death) + if(drops != null) { @SuppressWarnings("deprecation") Player winner = GriefPrevention.instance.getServer().getPlayer(winnerName); @@ -1051,16 +1051,12 @@ public abstract class DataStore Player loser = GriefPrevention.instance.getServer().getPlayer(loserName); if(winner != null && loser != null) { - //get loser's inventory, then clear it - ItemStack [] loserItems = loser.getInventory().getContents(); - loser.getInventory().clear(); - - //try to add it to the winner's inventory - for(int j = 0; j < loserItems.length; j++) + //try to add any drops to the winner's inventory + for(ItemStack stack : drops) { - if(loserItems[j] == null || loserItems[j].getType() == Material.AIR || loserItems[j].getAmount() == 0) continue; + if(stack == null || stack.getType() == Material.AIR || stack.getAmount() == 0) continue; - HashMap wontFitItems = winner.getInventory().addItem(loserItems[j]); + HashMap wontFitItems = winner.getInventory().addItem(stack); //drop any remainder on the ground at his feet Object [] keys = wontFitItems.keySet().toArray(); diff --git a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java index a08ce29..1a8b92e 100644 --- a/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/EntityEventHandler.java @@ -455,11 +455,8 @@ public class EntityEventHandler implements Listener //if involved in a siege if(playerData.siegeData != null) { - //don't drop items as usual, they will be sent to the siege winner - event.getDrops().clear(); - //end it, with the dieing player being the loser - this.dataStore.endSiege(playerData.siegeData, null, player.getName(), true /*ended due to death*/); + this.dataStore.endSiege(playerData.siegeData, null, player.getName(), event.getDrops()); } //FEATURE: lock dropped items to player who dropped them diff --git a/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java b/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java index 6a6c8fb..44ec1de 100644 --- a/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java +++ b/src/me/ryanhamshire/GriefPrevention/SiegeCheckupTask.java @@ -65,13 +65,13 @@ class SiegeCheckupTask implements Runnable //otherwise attacker wins if the defender runs away else if(attackerRemains && !defenderRemains) { - dataStore.endSiege(this.siegeData, attacker.getName(), defender.getName(), false); + dataStore.endSiege(this.siegeData, attacker.getName(), defender.getName(), null); } //or defender wins if the attacker leaves else if(!attackerRemains && defenderRemains) { - dataStore.endSiege(this.siegeData, defender.getName(), attacker.getName(), false); + dataStore.endSiege(this.siegeData, defender.getName(), attacker.getName(), null); } //if they both left, but are still close together, the battle continues (check again later) @@ -83,7 +83,7 @@ class SiegeCheckupTask implements Runnable //otherwise they both left and aren't close to each other, so call the attacker the winner (defender escaped, possibly after a chase) else { - dataStore.endSiege(this.siegeData, attacker.getName(), defender.getName(), false); + dataStore.endSiege(this.siegeData, attacker.getName(), defender.getName(), null); } }