Переглянути джерело

More cleaning on listeners. Also fixes NPE with itemInHand, because
Bukkit is dumb.

GJ 12 роки тому
батько
коміт
7c59621c9e

+ 2 - 2
src/main/java/com/gmail/nossr50/listeners/BlockListener.java

@@ -103,7 +103,7 @@ public class BlockListener implements Listener {
     public void onBlockPlace(BlockPlaceEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -229,7 +229,7 @@ public class BlockListener implements Listener {
         Block block = event.getBlock();
         ItemStack inHand = player.getItemInHand();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 

+ 45 - 42
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -40,6 +40,7 @@ import com.gmail.nossr50.skills.SkillType;
 import com.gmail.nossr50.skills.Skills;
 import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager;
 import com.gmail.nossr50.skills.archery.Archery;
+import com.gmail.nossr50.skills.herbalism.Herbalism;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.util.Misc;
@@ -53,7 +54,12 @@ public class EntityListener implements Listener {
         this.plugin = plugin;
     }
 
-    @EventHandler(priority = EventPriority.MONITOR)
+    /**
+     * Monitor EntityChangeBlock events.
+     *
+     * @param event The event to watch
+     */
+    @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
     public void onEntityChangeBlockEvent(EntityChangeBlockEvent event) {
         Entity entity = event.getEntity();
 
@@ -74,7 +80,7 @@ public class EntityListener implements Listener {
     /**
      * Monitor EntityDamageByEntity events.
      *
-     * @param event The event to monitor
+     * @param event The event to watch
      */
     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
@@ -128,7 +134,7 @@ public class EntityListener implements Listener {
     /**
      * Monitor EntityDamage events.
      *
-     * @param event The event to monitor
+     * @param event The event to watch
      */
     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onEntityDamage(EntityDamageEvent event) {
@@ -194,46 +200,45 @@ public class EntityListener implements Listener {
     /**
      * Monitor EntityDeath events.
      *
-     * @param event The event to monitor
+     * @param event The event to watch
      */
     @EventHandler (priority = EventPriority.MONITOR)
     public void onEntityDeath(EntityDeathEvent event) {
         LivingEntity entity = event.getEntity();
 
-        if (entity.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
+        if (Misc.isNPCEntity(entity)) {
+            return;
+        }
 
         entity.setFireTicks(0);
         BleedTimer.remove(entity);
         Archery.arrowRetrievalCheck(entity);
         mcMMO.placeStore.removeSpawnedMob(entity);
-        mcMMO.placeStore.removeSpawnedPet(entity);
     }
 
     /**
      * Monitor CreatureSpawn events.
      *
-     * @param event The event to monitor
+     * @param event The event to watch
      */
-    @EventHandler (priority = EventPriority.MONITOR)
+    @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
     public void onCreatureSpawn(CreatureSpawnEvent event) {
         SpawnReason reason = event.getSpawnReason();
 
-        if ((reason.equals(SpawnReason.SPAWNER) || reason.equals(SpawnReason.SPAWNER_EGG)) && !Config.getInstance().getExperienceGainsMobspawnersEnabled()) {
+        if ((reason.equals(SpawnReason.SPAWNER) || reason.equals(SpawnReason.SPAWNER_EGG)) && Misc.isSpawnerXPEnabled) {
             mcMMO.placeStore.addSpawnedMob(event.getEntity());
         }
     }
 
     /**
-     * Monitor ExplosionPrime events.
+     * Handle ExplosionPrime events that involve modifying the event.
      *
-     * @param event The event to monitor
+     * @param event The event to modify
      */
     @EventHandler (priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onExplosionPrime(ExplosionPrimeEvent event) {
         Entity entity = event.getEntity();
 
-        if (entity.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
-
         if (entity instanceof TNTPrimed) {
             int id = entity.getEntityId();
 
@@ -249,25 +254,23 @@ public class EntityListener implements Listener {
     }
 
     /**
-     * Monitor EntityExplode events.
+     * Handle EntityExplode events that involve modifying the event.
      *
-     * @param event The event to monitor
+     * @param event The event to modify
      */
     @EventHandler (priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onEnitityExplode(EntityExplodeEvent event) {
         Entity entity = event.getEntity();
 
-        if (entity == null) return;
-
-        if (entity.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
-
         if (entity instanceof TNTPrimed) {
             int id = entity.getEntityId();
 
             if (plugin.tntIsTracked(id)) {
                 Player player = plugin.getTNTPlayer(id);
+
                 MiningManager miningManager = new MiningManager(player);
                 miningManager.blastMiningDropProcessing(event);
+
                 plugin.removeFromTNTTracker(id);
             }
         }
@@ -276,17 +279,20 @@ public class EntityListener implements Listener {
     /**
      * Monitor FoodLevelChange events.
      *
-     * @param event The event to monitor
+     * @param event The event to watch
      */
     @EventHandler (priority = EventPriority.LOW)
     public void onFoodLevelChange(FoodLevelChangeEvent event) {
-        AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
-        if (event.getEntity() instanceof Player) {
-            Player player = (Player) event.getEntity();
-
-            if (player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
+        Entity entity = event.getEntity();
 
+        if (entity instanceof Player) {
+            Player player = (Player) entity;
             PlayerProfile profile = Users.getProfile(player);
+
+            if (Misc.isNPCPlayer(player, profile)) {
+                return;
+            }
+
             int currentFoodLevel = player.getFoodLevel();
             int newFoodLevel = event.getFoodLevel();
 
@@ -305,72 +311,69 @@ public class EntityListener implements Listener {
                 int rankChange = 0;
                 boolean fish = false;
                 boolean herb = false;
-                int herbFoodRank1 = advancedConfig.getFarmerDietRankChange();
-                int herbFoodRank2 = advancedConfig.getFarmerDietRankChange() * 2;
-                int herbFoodRankMax = advancedConfig.getFarmerDietRankChange() * 5;
-                int fishFoodRank1 = advancedConfig.getFishermanDietRankChange();
-                int fishFoodRank2 = advancedConfig.getFishermanDietRankChange() * 2;
-                int fishFoodRankMax = advancedConfig.getFishermanDietRankChange() * 5;
+                int fishFoodRank1 = AdvancedConfig.getInstance().getFishermanDietRankChange();
+                int fishFoodRank2 = AdvancedConfig.getInstance().getFishermanDietRankChange() * 2;
+                int fishFoodRankMax = AdvancedConfig.getInstance().getFishermanDietRankChange() * 5;
 
                 switch (food) {
                 case BREAD:
                     /* BREAD RESTORES 2 1/2 HUNGER - RESTORES 5 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case COOKIE:
                     /* COOKIE RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank2;
+                    rankChange = Herbalism.farmersDietRankLevel2;
                     break;
 
                 case MELON:
                     /* MELON RESTORES  1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank2;
+                    rankChange = Herbalism.farmersDietRankLevel2;
                     break;
 
                 case MUSHROOM_SOUP:
                     /* MUSHROOM SOUP RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case CARROT_ITEM:
                     /* CARROT RESTORES 2 HUNGER - RESTORES 4 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case POTATO_ITEM:
                     /* POTATO RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank2;
+                    rankChange = Herbalism.farmersDietRankLevel2;
                     break;
 
                 case BAKED_POTATO:
                     /* BAKED POTATO RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case POISONOUS_POTATO:
                     /* POISONOUS POTATO RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank2;
+                    rankChange = Herbalism.farmersDietRankLevel2;
                     break;
 
                 case GOLDEN_CARROT:
                     /* GOLDEN CARROT RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case PUMPKIN_PIE:
                     /* PUMPKIN PIE RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @ 1000 */
                     herb = true;
-                    rankChange = herbFoodRank1;
+                    rankChange = Herbalism.farmersDietRankLevel1;
                     break;
 
                 case RAW_FISH:
@@ -394,7 +397,7 @@ public class EntityListener implements Listener {
                         return;
                     }
 
-                    for (int i = herbFoodRank1; i <= herbFoodRankMax; i += rankChange) {
+                    for (int i = Herbalism.farmersDietRankLevel1; i <= Herbalism.farmersDietMaxLevel; i += rankChange) {
                         if (herbLevel >= i) {
                             foodChange++;
                         }

+ 11 - 11
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -59,7 +59,7 @@ public class PlayerListener implements Listener {
         Player player = event.getPlayer();
         PlayerProfile profile = Users.getProfile(player);
 
-        if (Misc.isNPC(player, profile)) {
+        if (Misc.isNPCPlayer(player, profile)) {
             return;
         }
 
@@ -83,7 +83,7 @@ public class PlayerListener implements Listener {
     public void onPlayerFish(PlayerFishEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -131,7 +131,7 @@ public class PlayerListener implements Listener {
     public void onPlayerQuit(PlayerQuitEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -148,7 +148,7 @@ public class PlayerListener implements Listener {
     public void onPlayerJoin(PlayerJoinEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -179,7 +179,7 @@ public class PlayerListener implements Listener {
         Player player = event.getPlayer();
         PlayerProfile profile = Users.getProfile(player);
 
-        if (Misc.isNPC(player, profile)) {
+        if (Misc.isNPCPlayer(player, profile)) {
             return;
         }
 
@@ -189,18 +189,18 @@ public class PlayerListener implements Listener {
     /**
      * Handle PlayerInteract events that involve modifying the event.
      *
-     * @param event The event to watch
+     * @param event The event to modify
      */
     @EventHandler(priority = EventPriority.LOWEST)
     public void onPlayerInteractLowest(PlayerInteractEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
         Block block = event.getClickedBlock();
-        ItemStack heldItem = event.getItem();
+        ItemStack heldItem = player.getItemInHand();
 
         switch (event.getAction()) {
         case RIGHT_CLICK_BLOCK:
@@ -252,12 +252,12 @@ public class PlayerListener implements Listener {
     public void onPlayerInteract(PlayerInteractEvent event) {
         Player player = event.getPlayer();
 
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
         Block block = event.getClickedBlock();
-        ItemStack heldItem = event.getItem();
+        ItemStack heldItem = player.getItemInHand();
 
         switch (event.getAction()) {
         case RIGHT_CLICK_BLOCK:
@@ -339,7 +339,7 @@ public class PlayerListener implements Listener {
         Player player = event.getPlayer();
         PlayerProfile profile = Users.getProfile(player);
 
-        if (Misc.isNPC(player, profile)) {
+        if (Misc.isNPCPlayer(player, profile)) {
             return;
         }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/Combat.java

@@ -327,7 +327,7 @@ public class Combat {
 
         for (Entity entity : target.getNearbyEntities(2.5, 2.5, 2.5)) {
             if (entity instanceof Player) {
-                if (Misc.isNPC((Player) entity)) {
+                if (Misc.isNPCPlayer((Player) entity)) {
                     continue;
                 }
             }

+ 23 - 0
src/main/java/com/gmail/nossr50/skills/Skills.java

@@ -3,6 +3,7 @@ package com.gmail.nossr50.skills;
 import org.bukkit.block.Block;
 import org.bukkit.enchantments.Enchantment;
 import org.bukkit.entity.Player;
+import org.bukkit.event.entity.FoodLevelChangeEvent;
 import org.bukkit.inventory.ItemStack;
 import org.getspout.spoutapi.SpoutManager;
 import org.getspout.spoutapi.player.SpoutPlayer;
@@ -25,6 +26,28 @@ public class Skills {
     public static int abilityLengthIncreaseLevel = advancedConfig.getAbilityLength();
     public static boolean abilitiesEnabled = Config.getInstance().getAbilitiesEnabled();
 
+    public static void handleFoodSkills(Player player, SkillType skill, FoodLevelChangeEvent event, int baseLevel, int maxLevel, int rankChange) {
+        int skillLevel = Users.getProfile(player).getSkillLevel(skill);
+        int currentFoodLevel = player.getFoodLevel();
+        int newFoodLevel = event.getFoodLevel();
+        int foodChange = newFoodLevel - currentFoodLevel;
+
+        for (int i = baseLevel; i <= maxLevel; i+= rankChange) {
+            if (skillLevel >= i) {
+                foodChange++;
+            }
+        }
+
+        /* Make sure we don't go over the max value */
+        newFoodLevel = currentFoodLevel + foodChange;
+        if (newFoodLevel > 20) {
+            event.setFoodLevel(20);
+        }
+        else {
+            event.setFoodLevel(newFoodLevel);
+        }
+    }
+
     /**
      * Checks to see if the cooldown for an item or ability is expired.
      *

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsEventHandler.java

@@ -53,7 +53,7 @@ public abstract class AcrobaticsEventHandler {
      * @return true if the damage is fatal, false otherwise
      */
     protected boolean isFatal(int damage) {
-        if (Misc.isNPC(player) || player.getHealth() - damage < 1) {
+        if (Misc.isNPCPlayer(player) || player.getHealth() - damage < 1) {
             return true;
         }
 

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java

@@ -20,7 +20,7 @@ public class AcrobaticsManager extends SkillManager {
      * @param event The event to check
      */
     public void rollCheck(EntityDamageEvent event) {
-        if (Misc.isNPC(player) || !Permissions.roll(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.roll(player)) {
             return;
         }
 
@@ -55,7 +55,7 @@ public class AcrobaticsManager extends SkillManager {
      * @param event The event to check
      */
     public void dodgeCheck(EntityDamageEvent event) {
-        if (Misc.isNPC(player) || !Permissions.dodge(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.dodge(player)) {
             return;
         }
 

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java

@@ -20,7 +20,7 @@ public class ArcheryManager extends SkillManager {
      * @param livingEntity Entity damaged by the arrow
      */
     public void trackArrows(LivingEntity livingEntity) {
-        if (Misc.isNPC(player) || !Permissions.trackArrows(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.trackArrows(player)) {
             return;
         }
 
@@ -40,7 +40,7 @@ public class ArcheryManager extends SkillManager {
      * @param event The event to modify
      */
     public void dazeCheck(Player defender, EntityDamageEvent event) {
-        if (Misc.isNPC(player) || !Permissions.daze(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.daze(player)) {
             return;
         }
 
@@ -60,7 +60,7 @@ public class ArcheryManager extends SkillManager {
      * @param event The event to modify.
      */
     public void skillShot(EntityDamageEvent event) {
-        if (Misc.isNPC(player) || !Permissions.archeryBonus(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.archeryBonus(player)) {
             return;
         }
 

+ 4 - 4
src/main/java/com/gmail/nossr50/skills/axes/AxeManager.java

@@ -21,7 +21,7 @@ public class AxeManager extends SkillManager {
      * @param event The event to modify
      */
     public void bonusDamage(EntityDamageByEntityEvent event) {
-        if (Misc.isNPC(player) || !Permissions.axeBonus(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.axeBonus(player)) {
             return;
         }
 
@@ -37,7 +37,7 @@ public class AxeManager extends SkillManager {
      * @param event The event to modify
      */
     public void criticalHitCheck(EntityDamageByEntityEvent event) {
-        if (Misc.isNPC(player) || !Permissions.criticalHit(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.criticalHit(player)) {
             return;
         }
 
@@ -61,7 +61,7 @@ public class AxeManager extends SkillManager {
      * @param event The event to modify
      */
     public void impact(EntityDamageByEntityEvent event) {
-        if (Misc.isNPC(player) || !Permissions.impact(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.impact(player)) {
             return;
         }
 
@@ -85,7 +85,7 @@ public class AxeManager extends SkillManager {
      * @param event The event to process
      */
     public void skullSplitter(EntityDamageByEntityEvent event) {
-        if (Misc.isNPC(player) || !Permissions.skullSplitter(player) || !profile.getAbilityMode(AbilityType.SKULL_SPLIITER)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.skullSplitter(player) || !profile.getAbilityMode(AbilityType.SKULL_SPLIITER)) {
             return;
         }
 

+ 12 - 2
src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java

@@ -7,6 +7,7 @@ import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Player;
 import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.entity.FoodLevelChangeEvent;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.material.MaterialData;
@@ -28,8 +29,9 @@ import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Users;
 
 public class Herbalism {
-    public static int farmersDietRankChangeLevel = AdvancedConfig.getInstance().getFarmerDietRankChange();
-    public static int farmersDietMaxLevel = farmersDietRankChangeLevel * 5;
+    public static int farmersDietRankLevel1 = AdvancedConfig.getInstance().getFarmerDietRankChange();
+    public static int farmersDietRankLevel2 = farmersDietRankLevel1 * 2;
+    public static int farmersDietMaxLevel = farmersDietRankLevel1 * 5;
 
     public static int greenThumbStageChangeLevel = AdvancedConfig.getInstance().getGreenThumbStageChange();
     public static int greenThumbStageMaxLevel = greenThumbStageChangeLevel * 4;
@@ -44,6 +46,14 @@ public class Herbalism {
     public static double hylianLuckMaxChance = AdvancedConfig.getInstance().getHylianLuckChanceMax();
     public static int hylianLuckMaxLevel = AdvancedConfig.getInstance().getHylianLucksMaxLevel();
 
+    public static void farmersDiet(Player player, int rankChange, FoodLevelChangeEvent event) {
+        if (!Permissions.farmersDiet(player)) {
+            return;
+        }
+
+        Skills.handleFoodSkills(player, SkillType.HERBALISM, event, farmersDietRankLevel1, farmersDietMaxLevel, rankChange);
+    }
+
     /**
      * Activate the Green Terra ability.
      *

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismCommand.java

@@ -37,7 +37,7 @@ public class HerbalismCommand extends SkillCommand {
         greenTerraLengthEndurance = greenTerraStrings[1];
 
         //FARMERS DIET
-        farmersDietRank = calculateRank(Herbalism.farmersDietMaxLevel, Herbalism.farmersDietRankChangeLevel);
+        farmersDietRank = calculateRank(Herbalism.farmersDietMaxLevel, Herbalism.farmersDietRankLevel1);
 
         //GREEN THUMB
         greenThumbStage = calculateRank(Herbalism.greenThumbStageMaxLevel, Herbalism.greenThumbStageMaxLevel);

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java

@@ -58,7 +58,7 @@ public class MiningManager extends SkillManager{
      * @param event Event whose explosion is being processed
      */
     public void blastMiningDropProcessing(EntityExplodeEvent event) {
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -83,7 +83,7 @@ public class MiningManager extends SkillManager{
      * @param event Event whose explosion damage is being reduced
      */
     public void demolitionsExpertise(EntityDamageEvent event) {
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 
@@ -100,7 +100,7 @@ public class MiningManager extends SkillManager{
      * @param event Event whose explosion radius is being changed
      */
     public void biggerBombs(ExplosionPrimeEvent event) {
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java

@@ -23,7 +23,7 @@ public class SmeltingManager extends SkillManager {
      * @param event The {@link FurnaceBurnEvent} to modify.
      */
     public void fuelEfficiency(FurnaceBurnEvent event) {
-        if (Misc.isNPC(player) || !Permissions.fuelEfficiency(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.fuelEfficiency(player)) {
             return;
         }
 
@@ -33,7 +33,7 @@ public class SmeltingManager extends SkillManager {
     }
 
     public void smeltProcessing(FurnaceSmeltEvent event) {
-        if (Misc.isNPC(player)) {
+        if (Misc.isNPCPlayer(player)) {
             return;
         }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java

@@ -65,7 +65,7 @@ public class SwordsManager extends SkillManager {
     }
 
     public void serratedStrikes(LivingEntity target, int damage) {
-        if (Misc.isNPC(player) || !Permissions.serratedStrikes(player) || !profile.getAbilityMode(AbilityType.SERRATED_STRIKES)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.serratedStrikes(player) || !profile.getAbilityMode(AbilityType.SERRATED_STRIKES)) {
             return;
         }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java

@@ -19,7 +19,7 @@ public class UnarmedManager extends SkillManager {
      * @param defender The defending player
      */
     public void disarmCheck(Player defender) {
-        if (Misc.isNPC(player) || !Permissions.disarm(player)) {
+        if (Misc.isNPCPlayer(player) || !Permissions.disarm(player)) {
             return;
         }
 

+ 12 - 2
src/main/java/com/gmail/nossr50/util/Misc.java

@@ -6,6 +6,7 @@ import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.entity.AnimalTamer;
+import org.bukkit.entity.Entity;
 import org.bukkit.entity.Item;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
@@ -29,6 +30,7 @@ public class Misc {
 
     public static int toolDurabilityLoss = Config.getInstance().getAbilityToolDamage();
     public static int abilityLengthIncreaseLevel = AdvancedConfig.getInstance().getAbilityLength();
+    public static boolean isSpawnerXPEnabled = Config.getInstance().getExperienceGainsMobspawnersEnabled();
 
     public static final int PLAYER_RESPAWN_COOLDOWN_SECONDS = 5;
     public static final int TIME_CONVERSION_FACTOR = 1000;
@@ -82,7 +84,15 @@ public class Misc {
         return false;
     }
 
-    public static boolean isNPC(Player player) {
+    public static boolean isNPCEntity(Entity entity) {
+        if (entity == null || entity.hasMetadata("NPC")) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static boolean isNPCPlayer(Player player) {
         if (player == null || Users.getProfile(player) == null || player.hasMetadata("NPC")) {
             return true;
         }
@@ -90,7 +100,7 @@ public class Misc {
         return false;
     }
 
-    public static boolean isNPC(Player player, PlayerProfile profile) {
+    public static boolean isNPCPlayer(Player player, PlayerProfile profile) {
         if (player == null || profile == null || player.hasMetadata("NPC")) {
             return true;
         }