diff --git a/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarTownyEventListener.java b/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarTownyEventListener.java index d7b9be73a..3430dbcd1 100644 --- a/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarTownyEventListener.java +++ b/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarTownyEventListener.java @@ -13,6 +13,7 @@ import com.gmail.goosius.siegewar.utils.SiegeWarBlockUtil; import com.gmail.goosius.siegewar.utils.SiegeWarDistanceUtil; import com.gmail.goosius.siegewar.utils.SiegeWarImmunityUtil; +import com.gmail.goosius.siegewar.utils.SiegeWarInventoryUtil; import com.gmail.goosius.siegewar.utils.SiegeWarMoneyUtil; import com.gmail.goosius.siegewar.utils.SiegeWarNationUtil; import com.gmail.goosius.siegewar.utils.SiegeWarTownPeacefulnessUtil; @@ -30,6 +31,7 @@ import com.palmergames.bukkit.towny.event.damage.TownyExplosionDamagesEntityEvent; import com.palmergames.bukkit.towny.event.damage.TownyFriendlyFireTestEvent; import com.palmergames.bukkit.towny.event.nation.NationRankRemoveEvent; +import com.palmergames.bukkit.towny.event.player.PlayerKeepsInventoryEvent; import com.palmergames.bukkit.towny.event.teleport.OutlawTeleportEvent; import com.palmergames.bukkit.towny.event.time.NewHourEvent; import com.palmergames.bukkit.towny.event.time.NewShortTimeEvent; @@ -466,4 +468,29 @@ private Siege siegeAtPlayerLocation(Resident resident) { return SiegeController.getActiveSiegeAtLocation(resident.getPlayer().getLocation()); return null; } + + /** + * Have SiegeWar have the ultimate say on whether siege zones have inventory + * keeping. + * + * @param event {@link PlayerKeepsInventoryEvent} internal to Towny. + */ + @EventHandler(priority = EventPriority.HIGHEST) + public void onTownyKeepInventoryEvent(PlayerKeepsInventoryEvent event) { + if (!SiegeWarDistanceUtil.isLocationInActiveSiegeZone(event.getPlayer().getLocation())) + return; + + // Towny is already going to keep the inventory, but we dont want inventories + // saved. + if (!event.isCancelled() && !SiegeWarSettings.isKeepInventoryOnSiegeZoneDeathEnabled()) { + event.setCancelled(true); + return; + } + + // Towny is going to drop the inventory, but we want inventories saved. + if (event.isCancelled() && SiegeWarSettings.isKeepInventoryOnSiegeZoneDeathEnabled()) { + SiegeWarInventoryUtil.degradeInventory(event.getPlayer()); + event.setCancelled(false); + } + } } diff --git a/src/main/java/com/gmail/goosius/siegewar/playeractions/PlayerDeath.java b/src/main/java/com/gmail/goosius/siegewar/playeractions/PlayerDeath.java index 5511f5118..af41af49c 100644 --- a/src/main/java/com/gmail/goosius/siegewar/playeractions/PlayerDeath.java +++ b/src/main/java/com/gmail/goosius/siegewar/playeractions/PlayerDeath.java @@ -12,7 +12,6 @@ import com.gmail.goosius.siegewar.utils.CosmeticUtil; import com.gmail.goosius.siegewar.utils.SiegeWarBlockUtil; import com.gmail.goosius.siegewar.utils.SiegeWarDistanceUtil; -import com.gmail.goosius.siegewar.utils.SiegeWarInventoryUtil; import com.gmail.goosius.siegewar.utils.SiegeWarScoringUtil; import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.object.Resident; @@ -43,8 +42,6 @@ public class PlayerDeath { /** * Evaluates a siege death event. *
- * Any player who dies in an active SiegeZone keeps inventory (with degrade) - *
* If the dead player is officially involved in a nearby siege, * - The opposing team gains battle points * - Their inventory items degrade a little (e.g. 20%) @@ -61,11 +58,6 @@ public class PlayerDeath { * @param playerDeathEvent The player death event */ public static void evaluateSiegePlayerDeath(Player deadPlayer, PlayerDeathEvent playerDeathEvent) { - //Keep inventory - if (SiegeWarSettings.isKeepInventoryOnSiegeZoneDeathEnabled() && SiegeWarDistanceUtil.isLocationInActiveSiegeZone(deadPlayer.getLocation())) { - SiegeWarInventoryUtil.degradeInventory(playerDeathEvent); - SiegeWarInventoryUtil.keepInventory(playerDeathEvent); - } //Battle-points & banner-control-sessions try { Resident deadResident = TownyUniverse.getInstance().getResident(deadPlayer.getUniqueId()); diff --git a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarInventoryUtil.java b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarInventoryUtil.java index 6410628eb..96a6e00b0 100644 --- a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarInventoryUtil.java +++ b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarInventoryUtil.java @@ -3,18 +3,19 @@ import com.gmail.goosius.siegewar.Messaging; import com.gmail.goosius.siegewar.settings.SiegeWarSettings; import com.palmergames.bukkit.towny.object.Translatable; -import org.bukkit.event.entity.PlayerDeathEvent; + +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; public class SiegeWarInventoryUtil { - public static void degradeInventory(PlayerDeathEvent playerDeathEvent) { + public static void degradeInventory(Player player) { Damageable damageable; double maxDurability; int currentDurability, damageToInflict, newDurability, durabilityWarning; boolean closeToBreaking = false; - for (ItemStack itemStack : playerDeathEvent.getEntity().getInventory().getContents()) { + for (ItemStack itemStack : player.getInventory().getContents()) { if (itemStack != null && itemStack.getType().getMaxDurability() != 0 && !itemStack.getItemMeta().isUnbreakable()) { damageable = ((Damageable) itemStack.getItemMeta()); maxDurability = itemStack.getType().getMaxDurability(); @@ -35,11 +36,6 @@ public static void degradeInventory(PlayerDeathEvent playerDeathEvent) { } } if (closeToBreaking) //One or more items are close to breaking, send warning. - Messaging.sendMsg(playerDeathEvent.getEntity(), Translatable.of("msg_inventory_degrade_warning")); - } - - public static void keepInventory(PlayerDeathEvent playerDeathEvent) { - playerDeathEvent.setKeepInventory(true); - playerDeathEvent.getDrops().clear(); + Messaging.sendMsg(player, Translatable.of("msg_inventory_degrade_warning")); } }