Răsfoiți Sursa

You can no longer set fire to party members

nossr50 6 ani în urmă
părinte
comite
fa6995b9fd
2 a modificat fișierele cu 107 adăugiri și 76 ștergeri
  1. 2 0
      Changelog.txt
  2. 105 76
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java

+ 2 - 0
Changelog.txt

@@ -1,6 +1,8 @@
 Version 2.1.83
     Updated hu_HU locale (thanks andris155)
     (FIX) Arrow Retrieval will no longer work with piercing enchant on crossbows
+    WG Flags should now correctly recognize when a projectile belongs to a player and respect flag settings
+    You can no longer set party members on fire with your bow
 
 Version 2.1.82
     Added new WG flag 'mcmmo-hardcore' if set to negative players will not be penalized by hardcore mode (if hardcore mode is enabled) it defaults to true

+ 105 - 76
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -32,9 +32,7 @@ import org.bukkit.OfflinePlayer;
 import org.bukkit.block.Block;
 import org.bukkit.enchantments.Enchantment;
 import org.bukkit.entity.*;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.Listener;
+import org.bukkit.event.*;
 import org.bukkit.event.entity.*;
 import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
 import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
@@ -275,6 +273,27 @@ public class EntityListener implements Listener {
         }
     }
 
+    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+    public void onEntityCombustByEntityEvent(EntityCombustByEntityEvent event) {
+        //Prevent players from setting fire to each other if they are in the same party
+        if(event.getEntity() instanceof Player) {
+            Player defender = (Player) event.getEntity();
+
+            if(event.getCombuster() instanceof Projectile) {
+                Projectile projectile = (Projectile) event.getCombuster();
+                if(projectile.getShooter() instanceof Player) {
+                    Player attacker = (Player) projectile.getShooter();
+                    if(checkParties(event, defender, attacker))
+                        return;
+                }
+            } else if(event.getCombuster() instanceof Player) {
+                Player attacker = (Player) event.getCombuster();
+                if(checkParties(event, defender, attacker))
+                    return;
+            }
+        }
+    }
+
     /**
      * Handle EntityDamageByEntity events that involve modifying the event.
      *
@@ -287,6 +306,26 @@ public class EntityListener implements Listener {
         Entity defender = event.getEntity();
         Entity attacker = event.getDamager();
 
+        if(WorldGuardUtils.isWorldGuardLoaded())
+        {
+            if(attacker instanceof Player) {
+
+                if(!WorldGuardManager.getInstance().hasMainFlag((Player) attacker))
+                    return;
+
+            } else if(attacker instanceof Projectile) {
+
+                Projectile projectile = (Projectile) attacker;
+
+                if(projectile.getShooter() instanceof Player) {
+                    if(!WorldGuardManager.getInstance().hasMainFlag((Player) projectile.getShooter()))
+                        return;
+                }
+
+            }
+        }
+
+
         /* WORLD BLACKLIST CHECK */
         if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
             return;
@@ -305,44 +344,6 @@ public class EntityListener implements Listener {
             return;
         }
 
-        if(attacker instanceof Player)
-        {
-            Player player = (Player) attacker;
-
-            /* WORLD GUARD MAIN FLAG CHECK */
-            if(WorldGuardUtils.isWorldGuardLoaded())
-            {
-                if(!WorldGuardManager.getInstance().hasMainFlag(player))
-                    return;
-            }
-        }
-
-        if (damage <= 0) {
-            if (defender instanceof Player && attacker instanceof Player) {
-                Player defendingPlayer = (Player) defender;
-                Player attackingPlayer = (Player) attacker;
-                if (event.getDamage(DamageModifier.ABSORPTION) > 0) {
-                    //If friendly fire is off don't allow players to hurt one another
-                    if(!Config.getInstance().getPartyFriendlyFire())
-                        if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer) || PartyManager.areAllies(defendingPlayer, attackingPlayer)) && !(Permissions.friendlyFire(attackingPlayer) && Permissions.friendlyFire(defendingPlayer))) {
-                            event.setCancelled(true);
-                            return;
-                        }
-                }
-            }
-            return;
-        }
-
-
-        /*
-        As far as I can tell at one point we registered meta-data about custom damage and we no longer do that.
-
-        if (defender.hasMetadata(mcMMO.customDamageKey)) {
-            defender.removeMetadata(mcMMO.customDamageKey, plugin);
-            return;
-        }
-        */
-
         if (Misc.isNPCEntityExcludingVillagers(defender) || !defender.isValid() || !(defender instanceof LivingEntity)) {
             return;
         }
@@ -357,26 +358,7 @@ public class EntityListener implements Listener {
             return;
         }
 
-        if (attacker instanceof Projectile) {
-            ProjectileSource projectileSource = ((Projectile) attacker).getShooter();
-
-            if (projectileSource instanceof LivingEntity) {
-                attacker = (LivingEntity) projectileSource;
-            }
-
-            if(defender instanceof Player) {
-                Player playerDefender = (Player) defender;
-                UnarmedManager unarmedManager = UserManager.getPlayer(playerDefender).getUnarmedManager();
-
-                if (unarmedManager.canDeflect()) {
-                    if(unarmedManager.deflectCheck()) {
-                        event.setCancelled(true);
-                        return;
-                    }
-                }
-            }
-        }
-        else if (attacker instanceof Tameable) {
+        if (attacker instanceof Tameable) {
             AnimalTamer animalTamer = ((Tameable) attacker).getOwner();
 
             if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
@@ -389,26 +371,50 @@ public class EntityListener implements Listener {
             }
         }
 
-        if (defender instanceof Player && attacker instanceof Player) {
+        //Friendly fire checks
+        if (defender instanceof Player) {
             Player defendingPlayer = (Player) defender;
-            Player attackingPlayer = (Player) attacker;
+            Player attackingPlayer;
+
+            //If the attacker is a Player or a projectile beloning to a player
+            if(attacker instanceof Projectile || attacker instanceof Player) {
+                if(attacker instanceof Projectile) {
+                    Projectile projectile = (Projectile) attacker;
+                    if(((Projectile) attacker).getShooter() instanceof Player) {
+                        attackingPlayer = (Player) projectile.getShooter();
+
+                        //Check for party friendly fire and cancel the event
+                        if (checkParties(event, defendingPlayer, attackingPlayer))
+                        {
+                            return;
+                        }
 
-            if (!UserManager.hasPlayerDataKey(defendingPlayer) || !UserManager.hasPlayerDataKey(attackingPlayer)) {
-                return;
-            }
+                    }
 
-            // We want to make sure we're not gaining XP or applying abilities
-            // when we hit ourselves
-            if (defendingPlayer.equals(attackingPlayer)) {
-                return;
-            }
+                    //Deflect checks
+                    UnarmedManager unarmedManager = UserManager.getPlayer(defendingPlayer).getUnarmedManager();
 
-            //Party Friendly Fire
-            if(!Config.getInstance().getPartyFriendlyFire())
-                if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer) || PartyManager.areAllies(defendingPlayer, attackingPlayer)) && !(Permissions.friendlyFire(attackingPlayer) && Permissions.friendlyFire(defendingPlayer))) {
-                    event.setCancelled(true);
-                    return;
+                    if (unarmedManager.canDeflect()) {
+                        if(unarmedManager.deflectCheck()) {
+                            event.setCancelled(true);
+                            return;
+                        }
+                    }
+                } else {
+                    attackingPlayer = (Player) attacker;
+                    //Check for party friendly fire and cancel the event
+                    if (checkParties(event, defendingPlayer, attackingPlayer))
+                        return;
                 }
+            }
+        }
+
+        //Required setup for processCombatAttack
+        if(attacker instanceof Projectile) {
+            ProjectileSource shooter = ((Projectile) attacker).getShooter();
+            if(shooter instanceof LivingEntity) {
+                attacker = (LivingEntity) shooter;
+            }
         }
 
         CombatUtils.processCombatAttack(event, attacker, target);
@@ -429,6 +435,29 @@ public class EntityListener implements Listener {
 
     }
 
+    public boolean checkParties(Cancellable event, Player defendingPlayer, Player attackingPlayer) {
+        if (!UserManager.hasPlayerDataKey(defendingPlayer) || !UserManager.hasPlayerDataKey(attackingPlayer)) {
+            return true;
+        }
+
+        // We want to make sure we're not gaining XP or applying abilities
+        // when we hit ourselves
+        if (defendingPlayer.equals(attackingPlayer)) {
+            return true;
+        }
+
+        //Party Friendly Fire
+        if(!Config.getInstance().getPartyFriendlyFire())
+            if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer)
+                    || PartyManager.areAllies(defendingPlayer, attackingPlayer))
+                    && !(Permissions.friendlyFire(attackingPlayer)
+                    && Permissions.friendlyFire(defendingPlayer))) {
+                event.setCancelled(true);
+                return true;
+            }
+        return false;
+    }
+
     /**
      * Handle EntityDamage events that involve modifying the event.
      *