From 911f036723dc461dfc62fe4249b76e17327cd09c Mon Sep 17 00:00:00 2001 From: NuclearW Date: Thu, 7 Feb 2013 18:56:38 -0500 Subject: [PATCH] Cancel EntityTargetEvent for when an entity wishes to target a party member without the friendly fire permission being enabled for both. Not sure this can happen except for when an entity is made agressive to a player, then friendly fire is removed later and the player returns in range of the agressive tamed entity. Thought: Move the permissions check for friendly fire into isFriendlyPet? Not sure where else this is used, but if we always do a permissions check for friendly fire afterwards, it would make sense to move that check. --- .../nossr50/listeners/EntityListener.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 9212d639b..b0cdd6239 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -23,6 +23,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityTameEvent; +import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; @@ -350,4 +351,22 @@ public class EntityListener implements Listener { TamingManager tamingManager = new TamingManager(Users.getPlayer(player)); tamingManager.awardTamingXP(event); } + + @EventHandler (ignoreCancelled = true) + public void onEntityTarget(EntityTargetEvent event) { + if (event.getEntity() instanceof Tameable && event.getTarget() instanceof Player) { + Player player = (Player) event.getTarget(); + Tameable tameable = (Tameable) event.getEntity(); + + if (Misc.isFriendlyPet(player, tameable)) { + // isFriendlyPet ensures that the Tameable is: Tamed, owned by a player, and the owner is in the same party + // So we can make some assumptions here, about our casting and our check + Player owner = (Player) tameable.getOwner(); + if (!(Permissions.friendlyFire(player) && Permissions.friendlyFire(owner))) { + event.setCancelled(true); + return; + } + } + } + } }