浏览代码

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.

NuclearW 12 年之前
父节点
当前提交
911f036723
共有 1 个文件被更改,包括 19 次插入0 次删除
  1. 19 0
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java

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