|
@@ -20,7 +20,9 @@ import com.gmail.nossr50.util.BlockUtils;
|
|
import com.gmail.nossr50.util.Misc;
|
|
import com.gmail.nossr50.util.Misc;
|
|
import com.gmail.nossr50.util.Permissions;
|
|
import com.gmail.nossr50.util.Permissions;
|
|
import com.gmail.nossr50.util.player.UserManager;
|
|
import com.gmail.nossr50.util.player.UserManager;
|
|
|
|
+import com.gmail.nossr50.util.random.RandomChanceUtil;
|
|
import com.gmail.nossr50.util.skills.CombatUtils;
|
|
import com.gmail.nossr50.util.skills.CombatUtils;
|
|
|
|
+import com.gmail.nossr50.util.skills.SkillActivationType;
|
|
import com.gmail.nossr50.worldguard.WorldGuardManager;
|
|
import com.gmail.nossr50.worldguard.WorldGuardManager;
|
|
import com.gmail.nossr50.worldguard.WorldGuardUtils;
|
|
import com.gmail.nossr50.worldguard.WorldGuardUtils;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.Material;
|
|
@@ -28,9 +30,7 @@ import org.bukkit.OfflinePlayer;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.enchantments.Enchantment;
|
|
import org.bukkit.enchantments.Enchantment;
|
|
import org.bukkit.entity.*;
|
|
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.*;
|
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
|
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
|
|
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
|
|
@@ -40,6 +40,7 @@ import org.bukkit.metadata.FixedMetadataValue;
|
|
import org.bukkit.potion.PotionEffect;
|
|
import org.bukkit.potion.PotionEffect;
|
|
import org.bukkit.potion.PotionEffectType;
|
|
import org.bukkit.potion.PotionEffectType;
|
|
import org.bukkit.projectiles.ProjectileSource;
|
|
import org.bukkit.projectiles.ProjectileSource;
|
|
|
|
+import sun.security.krb5.Config;
|
|
|
|
|
|
public class EntityListener implements Listener {
|
|
public class EntityListener implements Listener {
|
|
private final mcMMO plugin;
|
|
private final mcMMO plugin;
|
|
@@ -99,8 +100,9 @@ public class EntityListener implements Listener {
|
|
|
|
|
|
ItemStack bow = event.getBow();
|
|
ItemStack bow = event.getBow();
|
|
|
|
|
|
- if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) {
|
|
|
|
- projectile.setMetadata(MetadataConstants.INFINITE_ARROW_METAKEY, MetadataConstants.metadataValue);
|
|
|
|
|
|
+ if (bow != null
|
|
|
|
+ && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) {
|
|
|
|
+ projectile.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, MetadataConstants.metadataValue);
|
|
}
|
|
}
|
|
|
|
|
|
projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY,
|
|
projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY,
|
|
@@ -116,24 +118,36 @@ public class EntityListener implements Listener {
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
|
return;
|
|
return;
|
|
|
|
|
|
- if (event.getEntity() instanceof Player) {
|
|
|
|
- Player player = (Player) event.getEntity();
|
|
|
|
|
|
+ if(event.getEntity().getShooter() instanceof Player)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ Player player = (Player) event.getEntity().getShooter();
|
|
|
|
|
|
/* WORLD GUARD MAIN FLAG CHECK */
|
|
/* WORLD GUARD MAIN FLAG CHECK */
|
|
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
|
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
|
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
|
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
- Projectile projectile = event.getEntity();
|
|
|
|
|
|
+ Projectile projectile = event.getEntity();//Hacky stuff for 1.13/1.14 compat
|
|
|
|
|
|
- if (!(projectile instanceof Arrow) || projectile.hasMetadata(MetadataConstants.BOW_FORCE_METAKEY)) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ String itemKey = player.getInventory().getItemInMainHand().getType().getKey().toString();
|
|
|
|
|
|
- projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY, new FixedMetadataValue(plugin, 1.0));
|
|
|
|
- projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
|
|
|
|
|
|
+ if(!itemKey.equalsIgnoreCase("minecraft:bow") && !itemKey.equalsIgnoreCase("minecraft:crossbow"))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ projectile.setMetadata(MetadataConstants.BOW_FORCE_METAKEY, new FixedMetadataValue(plugin, 1.0));
|
|
|
|
+ projectile.setMetadata(MetadataConstants.ARROW_DISTANCE_METAKEY, new FixedMetadataValue(plugin, projectile.getLocation()));
|
|
|
|
+
|
|
|
|
+ for(Enchantment enchantment : player.getInventory().getItemInMainHand().getEnchantments().keySet()) {
|
|
|
|
+ if(enchantment.getName().equalsIgnoreCase("piercing"))
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) {
|
|
|
|
+ projectile.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, MetadataConstants.metadataValue);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -242,6 +256,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.
|
|
* Handle EntityDamageByEntity events that involve modifying the event.
|
|
*
|
|
*
|
|
@@ -253,6 +288,25 @@ public class EntityListener implements Listener {
|
|
Entity defender = event.getEntity();
|
|
Entity defender = event.getEntity();
|
|
Entity attacker = event.getDamager();
|
|
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 */
|
|
/* WORLD BLACKLIST CHECK */
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
|
return;
|
|
return;
|
|
@@ -270,41 +324,6 @@ public class EntityListener implements Listener {
|
|
return;
|
|
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 (!mcMMO.getConfigManager().getConfigParty().isPartyFriendlyFireEnabled())
|
|
|
|
- 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)) {
|
|
if (Misc.isNPCEntityExcludingVillagers(defender) || !defender.isValid() || !(defender instanceof LivingEntity)) {
|
|
return;
|
|
return;
|
|
@@ -320,26 +339,7 @@ public class EntityListener implements Listener {
|
|
return;
|
|
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();
|
|
AnimalTamer animalTamer = ((Tameable) attacker).getOwner();
|
|
|
|
|
|
if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
|
|
if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
|
|
@@ -351,27 +351,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 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 (!mcMMO.getConfigManager().getConfigParty().isPartyFriendlyFireEnabled())
|
|
|
|
- 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);
|
|
CombatUtils.processCombatAttack(event, attacker, target);
|
|
@@ -390,6 +413,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(!mcMMO.getConfigManager().getConfigParty().isPartyFriendlyFireEnabled())
|
|
|
|
+ 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.
|
|
* Handle EntityDamage events that involve modifying the event.
|
|
*
|
|
*
|
|
@@ -614,7 +660,7 @@ public class EntityListener implements Listener {
|
|
*
|
|
*
|
|
* @param event The event to watch
|
|
* @param event The event to watch
|
|
*/
|
|
*/
|
|
- @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
|
|
|
|
+ @EventHandler(priority = EventPriority.MONITOR)
|
|
public void onCreatureSpawn(CreatureSpawnEvent event) {
|
|
public void onCreatureSpawn(CreatureSpawnEvent event) {
|
|
/* WORLD BLACKLIST CHECK */
|
|
/* WORLD BLACKLIST CHECK */
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
|
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|