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; + } + } + } + } }