Răsfoiți Sursa

Static Abuse Removal - ComatUtils -> CombatTools

nossr50 6 ani în urmă
părinte
comite
381eba8ddc
25 a modificat fișierele cu 203 adăugiri și 221 ștergeri
  1. 1 0
      Changelog.txt
  2. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java
  3. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java
  4. 10 10
      src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java
  5. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java
  6. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java
  7. 14 36
      src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java
  8. 6 0
      src/main/java/com/gmail/nossr50/datatypes/skills/behaviours/RepairBehaviour.java
  9. 18 23
      src/main/java/com/gmail/nossr50/listeners/BlockListener.java
  10. 9 12
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  11. 30 13
      src/main/java/com/gmail/nossr50/listeners/InventoryListener.java
  12. 36 49
      src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
  13. 2 2
      src/main/java/com/gmail/nossr50/listeners/SelfListener.java
  14. 9 0
      src/main/java/com/gmail/nossr50/mcMMO.java
  15. 1 1
      src/main/java/com/gmail/nossr50/party/PartyManager.java
  16. 2 3
      src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java
  17. 1 1
      src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
  18. 1 2
      src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java
  19. 1 2
      src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
  20. 2 3
      src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java
  21. 1 2
      src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java
  22. 1 2
      src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java
  23. 1 2
      src/main/java/com/gmail/nossr50/util/ChimaeraWing.java
  24. 1 2
      src/main/java/com/gmail/nossr50/util/EventManager.java
  25. 52 48
      src/main/java/com/gmail/nossr50/util/skills/CombatTools.java

+ 1 - 0
Changelog.txt

@@ -12,6 +12,7 @@ Version 2.2.0
     Parties no longer have a cap, you can level them forever for bragging rights
     You can now specify multiple repair-items for an item (such as specifying that a wooden sword can be repaired by all types of planks)
     Repair config has been rewritten and expanded to support much more complex settings
+    Fixed a bug where salvage anvil noises wouldn't play for a player that lacked repair permissions nodes
     Removed the following Repair/Salvage permissions
         mcmmo.ability.repair.stonerepair
         mcmmo.ability.repair.stringrepair

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java

@@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.archery.Archery;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
 
@@ -75,7 +74,7 @@ public class ArcheryCommand extends SkillCommand {
 
         if (canUseSubskill(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamage(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK))));
+                    String.valueOf(pluginRef.getCombatTools().getLimitBreakDamage(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK))));
         }
 
         return messages;

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java

@@ -5,7 +5,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.axes.Axes;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
@@ -95,7 +94,7 @@ public class AxesCommand extends SkillCommand {
 
         if (canUseSubskill(player, SubSkillType.AXES_AXES_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.AXES_AXES_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamage(player, SubSkillType.AXES_AXES_LIMIT_BREAK))));
+                    String.valueOf(pluginRef.getCombatTools().getLimitBreakDamage(player, SubSkillType.AXES_AXES_LIMIT_BREAK))));
         }
 
         return messages;

+ 10 - 10
src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java

@@ -32,11 +32,11 @@ public abstract class SkillCommand implements TabExecutor {
     private CommandExecutor skillGuideCommand;
     protected mcMMO pluginRef;
 
-    public SkillCommand(PrimarySkillType skill, mcMMO pluginRef) {
+    public SkillCommand(PrimarySkillType primarySkillType, mcMMO pluginRef) {
         this.pluginRef = pluginRef;
-        this.skill = skill;
-        skillName = skill.getLocalizedSkillName();
-        skillGuideCommand = new SkillGuideCommand(skill, pluginRef);
+        this.skill = primarySkillType;
+        skillName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType);
+        skillGuideCommand = new SkillGuideCommand(primarySkillType, pluginRef);
     }
 
     public static String[] addItemToFirstPositionOfArray(String itemToAdd, String... existingArray) {
@@ -145,7 +145,7 @@ public abstract class SkillCommand implements TabExecutor {
 
         player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Overhaul.Header", skillName));
 
-        if (!skill.isChildSkill()) {
+        if (!pluginRef.getSkillTools().isChildSkill(skill)) {
             /*
              * NON-CHILD SKILLS
              */
@@ -173,10 +173,10 @@ public abstract class SkillCommand implements TabExecutor {
 
             for (int i = 0; i < parentList.size(); i++) {
                 if (i + 1 < parentList.size()) {
-                    parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", parentList.get(i).getLocalizedSkillName(), mcMMOPlayer.getSkillLevel(parentList.get(i))));
+                    parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", pluginRef.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
                     parentMessage.append(ChatColor.GRAY + ", ");
                 } else {
-                    parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", parentList.get(i).getLocalizedSkillName(), mcMMOPlayer.getSkillLevel(parentList.get(i))));
+                    parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", pluginRef.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
                 }
             }
 
@@ -210,9 +210,9 @@ public abstract class SkillCommand implements TabExecutor {
 
     protected String[] formatLengthDisplayValues(Player player, double skillValue) {
 
-        int length = pluginRef.getSkillTools().calculateAbilityLength(pluginRef.getUserManager().getPlayer(player), skill, skill.getSuperAbility());
+        int length = pluginRef.getSkillTools().calculateAbilityLength(pluginRef.getUserManager().getPlayer(player), skill, pluginRef.getSkillTools().getSuperAbility(skill));
 
-        int enduranceLength = pluginRef.getSkillTools().calculateAbilityLengthPerks(pluginRef.getUserManager().getPlayer(player), skill, skill.getSuperAbility());
+        int enduranceLength = pluginRef.getSkillTools().calculateAbilityLengthPerks(pluginRef.getUserManager().getPlayer(player), skill, pluginRef.getSkillTools().getSuperAbility(skill));
 
         return new String[]{String.valueOf(length), String.valueOf(enduranceLength)};
     }
@@ -223,7 +223,7 @@ public abstract class SkillCommand implements TabExecutor {
 
     protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) {
         String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
-        String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
+        String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription(pluginRef) : subSkillType.getLocaleKeyStatExtraDescription(pluginRef);
 
         if (isCustom)
             return pluginRef.getLocaleManager().getString(templateKey, pluginRef.getLocaleManager().getString(statDescriptionKey, vars));

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java

@@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
@@ -101,7 +100,7 @@ public class SwordsCommand extends SkillCommand {
 
         if (canUseSubskill(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.SWORDS_SWORDS_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamage(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK))));
+                    String.valueOf(pluginRef.getCombatTools().getLimitBreakDamage(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK))));
         }
 
         return messages;

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java

@@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
@@ -113,7 +112,7 @@ public class UnarmedCommand extends SkillCommand {
 
         if (canUseSubskill(player, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.UNARMED_UNARMED_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamage(player, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK))));
+                    String.valueOf(pluginRef.getCombatTools().getLimitBreakDamage(player, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK))));
         }
 
         return messages;

+ 14 - 36
src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java

@@ -131,30 +131,8 @@ public enum SubSkillType {
      *
      * @return
      */
-    public PrimarySkillType getParentSkill() {
-        return PrimarySkillType.getPrimarySkillBySubSkill(this);
-    }
-
-    /**
-     * Returns the root address for this skill in the advanced.yml file
-     *
-     * @return the root address for this skill in advanced.yml
-     */
-    public String[] getAdvConfigAddress() {
-        //return "Skills." + StringUtils.getCapitalized(getParentSkill().toString()) + "." + getConfigName(toString());
-        //TODO: Reduce string operations
-        return new String[]{"Skills", StringUtils.getCapitalized(getParentSkill().toString()), getConfigName(toString())};
-    }
-
-    /**
-     * Returns the root address for this skill in the rankskills.yml file
-     *
-     * @return the root address for this skill in rankskills.yml
-     */
-    public String[] getRankConfigAddress() {
-        //return StringUtils.getCapitalized(getParentSkill().toString()) + "." + getConfigName(toString());
-        //TODO: Reduce string operations
-        return new String[]{StringUtils.getCapitalized(getParentSkill().toString()), getConfigName(toString())};
+    public PrimarySkillType getParentSkill(mcMMO pluginRef) {
+        return pluginRef.getSkillTools().getPrimarySkillBySubSkill(this);
     }
 
     /**
@@ -162,9 +140,9 @@ public enum SubSkillType {
      *
      * @return the permission node for this subskill
      */
-    public String getPermissionNodeAddress() {
+    public String getPermissionNodeAddress(mcMMO pluginRef) {
         //TODO: This could be optimized
-        return "mcmmo.ability." + getParentSkill().toString().toLowerCase() + "." + getConfigName(toString()).toLowerCase();
+        return "mcmmo.ability." + getParentSkill(pluginRef).toString().toLowerCase() + "." + getConfigName(toString()).toLowerCase();
     }
 
     /**
@@ -270,7 +248,7 @@ public enum SubSkillType {
      * @return The parent skill as defined in the locale
      */
     public String getParentNiceNameLocale(mcMMO pluginRef) {
-        return pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(getParentSkill().toString()) + ".SkillName");
+        return pluginRef.getLocaleManager().getString(StringUtils.getCapitalized(getParentSkill(pluginRef).toString()) + ".SkillName");
     }
 
     /**
@@ -304,8 +282,8 @@ public enum SubSkillType {
         return subStringIndex;
     }
 
-    public String getLocaleKeyRoot() {
-        return StringUtils.getCapitalized(getParentSkill().toString()) + ".SubSkill." + getConfigName(toString());
+    public String getLocaleKeyRoot(mcMMO pluginRef) {
+        return StringUtils.getCapitalized(getParentSkill(pluginRef).toString()) + ".SubSkill." + getConfigName(toString());
     }
 
     public String getLocaleName(mcMMO pluginRef) {
@@ -320,16 +298,16 @@ public enum SubSkillType {
         return getFromLocaleSubAddress(pluginRef,".Stat");
     }
 
-    public String getLocaleKeyStatDescription() {
-        return getLocaleKeyFromSubAddress(".Stat");
+    public String getLocaleKeyStatDescription(mcMMO pluginRef) {
+        return getLocaleKeyFromSubAddress(pluginRef, ".Stat");
     }
 
     public String getLocaleStatExtraDescription(mcMMO pluginRef) {
         return getFromLocaleSubAddress(pluginRef,".Stat.Extra");
     }
 
-    public String getLocaleKeyStatExtraDescription() {
-        return getLocaleKeyFromSubAddress(".Stat.Extra");
+    public String getLocaleKeyStatExtraDescription(mcMMO pluginRef) {
+        return getLocaleKeyFromSubAddress(pluginRef, ".Stat.Extra");
     }
 
     public String getLocaleStat(mcMMO pluginRef, String... vars) {
@@ -343,10 +321,10 @@ public enum SubSkillType {
     }
 
     private String getFromLocaleSubAddress(mcMMO pluginRef, String s) {
-        return pluginRef.getLocaleManager().getString(getLocaleKeyRoot() + s);
+        return pluginRef.getLocaleManager().getString(getLocaleKeyRoot(pluginRef) + s);
     }
 
-    private String getLocaleKeyFromSubAddress(String s) {
-        return getLocaleKeyRoot() + s;
+    private String getLocaleKeyFromSubAddress(mcMMO pluginRef, String subAddress) {
+        return getLocaleKeyRoot(pluginRef) + subAddress;
     }
 }

+ 6 - 0
src/main/java/com/gmail/nossr50/datatypes/skills/behaviours/RepairBehaviour.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.datatypes.skills.behaviours;
 
 import com.gmail.nossr50.mcMMO;
+import org.bukkit.Material;
 
 /**
  * These behaviour classes are a band-aid fix for a larger problem
@@ -12,9 +13,14 @@ import com.gmail.nossr50.mcMMO;
 public class RepairBehaviour {
 
     private final mcMMO pluginRef;
+    private final Material anvilMaterial;
 
     public RepairBehaviour(mcMMO pluginRef) {
         this.pluginRef = pluginRef;
+        this.anvilMaterial = pluginRef.getConfigManager().getConfigRepair().getRepairGeneral().getRepairAnvilMaterial();
     }
 
+    public Material getAnvilMaterial() {
+        return anvilMaterial;
+    }
 }

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

@@ -10,11 +10,8 @@ import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
 import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.excavation.ExcavationManager;
-import com.gmail.nossr50.skills.herbalism.Herbalism;
 import com.gmail.nossr50.skills.herbalism.HerbalismManager;
 import com.gmail.nossr50.skills.mining.MiningManager;
-import com.gmail.nossr50.skills.repair.Repair;
-import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
 import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.ItemUtils;
@@ -166,10 +163,6 @@ public class BlockListener implements Listener {
 
         Player player = event.getPlayer();
 
-        if (!pluginRef.getUserManager().hasPlayerDataKey(player)) {
-            return;
-        }
-
         BlockState blockState = event.getBlock().getState();
 
         /* Check if the blocks placed should be monitored so they do not give out XP in the future */
@@ -181,18 +174,20 @@ public class BlockListener implements Listener {
 
         McMMOPlayer mcMMOPlayer = pluginRef.getUserManager().getPlayer(player);
 
-        if (blockState.getType() == Repair.getInstance().getAnvilMaterial()
-                && PrimarySkillType.REPAIR.doesPlayerHaveSkillPermission(player)) {
-            if (mcMMOPlayer == null)
-                return;
+        if (mcMMOPlayer == null)
+            return;
 
-            if (blockState.getType() == Repair.getInstance().getAnvilMaterial()
-                    && PrimarySkillType.REPAIR.doesPlayerHaveSkillPermission(player)) {
-                mcMMOPlayer.getRepairManager().placedAnvilCheck();
-            } else if (blockState.getType() == Salvage.anvilMaterial
-                    && PrimarySkillType.SALVAGE.doesPlayerHaveSkillPermission(player)) {
-                mcMMOPlayer.getSalvageManager().placedAnvilCheck();
-            }
+        Material repairAnvil = pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getRepairBehaviour().getAnvilMaterial();
+        Material salvageAnvil = pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getSalvageBehaviour().getAnvilMaterial();
+
+        if (blockState.getType() == repairAnvil
+                && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.REPAIR, player)) {
+            //Make some noise
+            mcMMOPlayer.getRepairManager().placedAnvilCheck();
+
+        } else if (blockState.getType() == salvageAnvil
+                && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.SALVAGE, player)) {
+            mcMMOPlayer.getSalvageManager().placedAnvilCheck();
         }
     }
 
@@ -297,19 +292,19 @@ public class BlockListener implements Listener {
              * We don't check the block store here because herbalism has too many unusual edge cases.
              * Instead, we check it inside the drops handler.
              */
-            if (PrimarySkillType.HERBALISM.doesPlayerHaveSkillPermission(player)) {
+            if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.HERBALISM, player)) {
                 herbalismManager.herbalismBlockCheck(blockState);
             }
         }
 
         /* MINING */
-        else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && PrimarySkillType.MINING.doesPlayerHaveSkillPermission(player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.MINING, player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
             MiningManager miningManager = mcMMOPlayer.getMiningManager();
             miningManager.miningBlockCheck(blockState);
         }
 
         /* WOOD CUTTING */
-        else if (BlockUtils.isLog(blockState) && ItemUtils.isAxe(heldItem) && PrimarySkillType.WOODCUTTING.doesPlayerHaveSkillPermission(player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.isLog(blockState) && ItemUtils.isAxe(heldItem) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.WOODCUTTING, player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
             WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
             if (woodcuttingManager.canUseTreeFeller(heldItem)) {
                 woodcuttingManager.processTreeFeller(blockState);
@@ -319,7 +314,7 @@ public class BlockListener implements Listener {
         }
 
         /* EXCAVATION */
-        else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && PrimarySkillType.EXCAVATION.doesPlayerHaveSkillPermission(player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.EXCAVATION, player) && !pluginRef.getPlaceStore().isTrue(blockState)) {
             ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
             excavationManager.excavationBlockCheck(blockState);
 
@@ -367,7 +362,7 @@ public class BlockListener implements Listener {
         BlockState blockState = event.getBlock().getState();
         ItemStack heldItem = player.getInventory().getItemInMainHand();
 
-        if (Herbalism.isRecentlyRegrown(blockState)) {
+        if (pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getHerbalismBehaviour().isRecentlyRegrown(blockState)) {
             event.setCancelled(true);
             return;
         }

+ 9 - 12
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -8,8 +8,6 @@ import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
 import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
 import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.skills.archery.Archery;
-import com.gmail.nossr50.skills.mining.BlastMining;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.skills.taming.Taming;
 import com.gmail.nossr50.skills.taming.TamingManager;
@@ -18,7 +16,6 @@ import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
 import org.bukkit.Material;
@@ -327,7 +324,7 @@ public class EntityListener implements Listener {
 
         LivingEntity target = (LivingEntity) defender;
 
-        if (CombatUtils.isInvincible(target, damage)) {
+        if (pluginRef.getCombatTools().isInvincible(target, damage)) {
             return;
         }
 
@@ -342,7 +339,7 @@ public class EntityListener implements Listener {
                 attacker = (Entity) animalTamer;
             }
         } else if (attacker instanceof TNTPrimed && defender instanceof Player) {
-            if (BlastMining.processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) {
+            if (pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getMiningBehaviour().processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) {
                 return;
             }
         }
@@ -406,18 +403,18 @@ public class EntityListener implements Listener {
             return;
         }
 
-        CombatUtils.processCombatAttack(event, attacker, target);
-        CombatUtils.handleHealthbars(attacker, target, event.getFinalDamage(), pluginRef);
+        pluginRef.getCombatTools().processCombatAttack(event, attacker, target);
+        pluginRef.getCombatTools().handleHealthbars(attacker, target, event.getFinalDamage(), pluginRef);
 
         /**
          * This sets entity names back to whatever they are supposed to be
          */
         if (event.getFinalDamage() >= target.getHealth()) {
             if (attacker instanceof LivingEntity) {
-                CombatUtils.fixNames((LivingEntity) attacker);
+                pluginRef.getCombatTools().fixNames((LivingEntity) attacker);
             }
 
-            CombatUtils.fixNames(target);
+            pluginRef.getCombatTools().fixNames(target);
         }
 
     }
@@ -501,7 +498,7 @@ public class EntityListener implements Listener {
 
         LivingEntity livingEntity = (LivingEntity) entity;
 
-        if (CombatUtils.isInvincible(livingEntity, damage)) {
+        if (pluginRef.getCombatTools().isInvincible(livingEntity, damage)) {
             return;
         }
 
@@ -661,7 +658,7 @@ public class EntityListener implements Listener {
             return;
         }
 
-        Archery.arrowRetrievalCheck(entity);
+        pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getArcheryBehaviour().arrowRetrievalCheck(entity);
     }
 
     /**
@@ -986,7 +983,7 @@ public class EntityListener implements Listener {
 
         Tameable tameable = (Tameable) entity;
 
-        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !CombatUtils.isFriendlyPet(player, tameable)) {
+        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !pluginRef.getCombatTools().isFriendlyPet(player, tameable)) {
             return;
         }
 

+ 30 - 13
src/main/java/com/gmail/nossr50/listeners/InventoryListener.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.listeners;
 
-import com.gmail.nossr50.config.MainConfig;
 import com.gmail.nossr50.core.MetadataConstants;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
@@ -9,7 +8,6 @@ import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
-import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.block.BlockState;
 import org.bukkit.block.BrewingStand;
@@ -135,7 +133,7 @@ public class InventoryListener implements Listener {
                 return;
         }
 
-        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.doesPlayerHaveSkillPermission(player)) {
+        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.SMELTING, player)) {
             return;
         }
 
@@ -401,16 +399,35 @@ public class InventoryListener implements Listener {
         }
 
         ItemStack item = event.getItem();
-
-        if (MainConfig.getInstance().getPreventHopperTransferIngredients() && item.getType() != Material.POTION && item.getType() != Material.SPLASH_POTION && item.getType() != Material.LINGERING_POTION) {
-            event.setCancelled(true);
-            return;
-        }
-
-        if (MainConfig.getInstance().getPreventHopperTransferBottles() && (item.getType() == Material.POTION || item.getType() == Material.SPLASH_POTION || item.getType() == Material.LINGERING_POTION)) {
-            event.setCancelled(true);
-            return;
-        }
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+        //TODO: Code here relating to preventing hoppers for Alchemy, needs to be replaced
+//        if (MainConfig.getInstance().getPreventHopperTransferIngredients() && item.getType() != Material.POTION && item.getType() != Material.SPLASH_POTION && item.getType() != Material.LINGERING_POTION) {
+//            event.setCancelled(true);
+//            return;
+//        }
+//
+//        if (MainConfig.getInstance().getPreventHopperTransferBottles() && (item.getType() == Material.POTION || item.getType() == Material.SPLASH_POTION || item.getType() == Material.LINGERING_POTION)) {
+//            event.setCancelled(true);
+//            return;
+//        }
 
 //        if (MainConfig.getInstance().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) {
 //            AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder);

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

@@ -14,9 +14,7 @@ import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
 import com.gmail.nossr50.skills.fishing.FishingManager;
 import com.gmail.nossr50.skills.herbalism.HerbalismManager;
 import com.gmail.nossr50.skills.mining.MiningManager;
-import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.RepairManager;
-import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.salvage.SalvageManager;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.util.*;
@@ -252,7 +250,7 @@ public class PlayerListener implements Listener {
                 return;
         }
 
-        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !PrimarySkillType.FISHING.doesPlayerHaveSkillPermission(player)) {
+        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.FISHING, player)) {
             return;
         }
 
@@ -327,7 +325,7 @@ public class PlayerListener implements Listener {
                 return;
         }
 
-        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !PrimarySkillType.FISHING.doesPlayerHaveSkillPermission(player)) {
+        if (!pluginRef.getUserManager().hasPlayerDataKey(player) || !pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.FISHING, player)) {
             return;
         }
 
@@ -592,8 +590,8 @@ public class PlayerListener implements Listener {
 
                 if (!pluginRef.getConfigManager().getConfigSuperAbilities().isMustSneakToActivate() || player.isSneaking()) {
                     /* REPAIR CHECKS */
-                    if (type == Repair.getInstance().getAnvilMaterial()
-                            && PrimarySkillType.REPAIR.doesPlayerHaveSkillPermission(player)
+                    if (type == pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getRepairBehaviour().getAnvilMaterial()
+                            && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.REPAIR, player)
                             && pluginRef.getRepairableManager().isRepairable(heldItem)
                             && heldItem.getAmount() <= 1) {
                         RepairManager repairManager = mcMMOPlayer.getRepairManager();
@@ -606,8 +604,8 @@ public class PlayerListener implements Listener {
                         }
                     }
                     /* SALVAGE CHECKS */
-                    else if (type == Salvage.anvilMaterial
-                            && PrimarySkillType.SALVAGE.doesPlayerHaveSkillPermission(player)
+                    else if (type == pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getSalvageBehaviour().getAnvilMaterial()
+                            && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.SALVAGE, player)
                             && RankUtils.hasUnlockedSubskill(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR)
                             && pluginRef.getSalvageableManager().isSalvageable(heldItem)
                             && heldItem.getAmount() <= 1) {
@@ -634,30 +632,32 @@ public class PlayerListener implements Listener {
                 break;
 
             case LEFT_CLICK_BLOCK:
-                type = block.getType();
-
-                if (!pluginRef.getConfigManager().getConfigSuperAbilities().isMustSneakToActivate() || player.isSneaking()) {
-                    /* REPAIR CHECKS */
-                    if (type == Repair.getInstance().getAnvilMaterial() && PrimarySkillType.REPAIR.doesPlayerHaveSkillPermission(player) && pluginRef.getRepairableManager().isRepairable(heldItem)) {
-                        RepairManager repairManager = mcMMOPlayer.getRepairManager();
-
-                        // Cancel repairing an enchanted item
-                        if (repairManager.checkConfirmation(false)) {
-                            repairManager.setLastAnvilUse(0);
-                            player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Cancelled", pluginRef.getLocaleManager().getString("Repair.Pretty.Name")));
-                        }
-                    }
-                    /* SALVAGE CHECKS */
-                    else if (type == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.doesPlayerHaveSkillPermission(player) && pluginRef.getSalvageableManager().isSalvageable(heldItem)) {
-                        SalvageManager salvageManager = mcMMOPlayer.getSalvageManager();
-
-                        // Cancel salvaging an enchanted item
-                        if (salvageManager.checkConfirmation(false)) {
-                            salvageManager.setLastAnvilUse(0);
-                            player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Cancelled", pluginRef.getLocaleManager().getString("Salvage.Pretty.Name")));
-                        }
-                    }
-                }
+                //TODO: Not sure why this code is here, I disabled it for now.
+                //TODO: Not sure why this code is here, I disabled it for now.
+                //TODO: Not sure why this code is here, I disabled it for now.
+//                type = block.getType();
+//                if (!pluginRef.getConfigManager().getConfigSuperAbilities().isMustSneakToActivate() || player.isSneaking()) {
+//                    /* REPAIR CHECKS */
+//                    if (type == Repair.getInstance().getAnvilMaterial() && PrimarySkillType.REPAIR.doesPlayerHaveSkillPermission(player) && pluginRef.getRepairableManager().isRepairable(heldItem)) {
+//                        RepairManager repairManager = mcMMOPlayer.getRepairManager();
+//
+//                        // Cancel repairing an enchanted item
+//                        if (repairManager.checkConfirmation(false)) {
+//                            repairManager.setLastAnvilUse(0);
+//                            player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Cancelled", pluginRef.getLocaleManager().getString("Repair.Pretty.Name")));
+//                        }
+//                    }
+//                    /* SALVAGE CHECKS */
+//                    else if (type == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.doesPlayerHaveSkillPermission(player) && pluginRef.getSalvageableManager().isSalvageable(heldItem)) {
+//                        SalvageManager salvageManager = mcMMOPlayer.getSalvageManager();
+//
+//                        // Cancel salvaging an enchanted item
+//                        if (salvageManager.checkConfirmation(false)) {
+//                            salvageManager.setLastAnvilUse(0);
+//                            player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Cancelled", pluginRef.getLocaleManager().getString("Salvage.Pretty.Name")));
+//                        }
+//                    }
+//                }
 
                 break;
 
@@ -880,11 +880,11 @@ public class PlayerListener implements Listener {
             String lowerCaseCommand = command.toLowerCase();
 
             // Do these ACTUALLY have to be lower case to work properly?
-            for (PrimarySkillType skill : PrimarySkillType.values()) {
-                String skillName = skill.toString().toLowerCase();
-                String localizedName = skill.getLocalizedSkillName().toLowerCase();
+            for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
+                String skillName = primarySkillType.toString().toLowerCase();
+                String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase();
 
-                if (lowerCaseCommand.equals(localizedName)) {
+                if (command.equalsIgnoreCase(localizedName)) {
                     event.setMessage(message.replace(command, skillName));
                     break;
                 }
@@ -895,17 +895,4 @@ public class PlayerListener implements Listener {
             }
         }
     }
-
-    /*@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
-    public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) {
-        *//* WORLD BLACKLIST CHECK *//*
-        if(pluginRef.getDynamicSettingsManager().isWorldBlacklisted(event.getPlayer().getWorld().getName()))
-            return;
-
-        if (!mcMMO.getHolidayManager().isAprilFirst()) {
-            return;
-        }
-
-        mcMMO.getHolidayManager().handleStatisticEvent(event);
-    }*/
 }

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

@@ -105,7 +105,7 @@ public class SelfListener implements Listener {
             return;
         }
 
-        if (primarySkillType.isChildSkill()) {
+        if (pluginRef.getSkillTools().isChildSkill(primarySkillType)) {
             return;
         }
 
@@ -113,7 +113,7 @@ public class SelfListener implements Listener {
 
         double guaranteedMinimum = pluginRef.getConfigManager().getConfigLeveling().getGuaranteedMinimums() * rawXp;
 
-        double modifiedThreshold = (double) (threshold / primarySkillType.getXpModifier() * pluginRef.getDynamicSettingsManager().getExperienceManager().getGlobalXpMult());
+        double modifiedThreshold = (double) (threshold / pluginRef.getSkillTools().getXpModifier(primarySkillType) * pluginRef.getDynamicSettingsManager().getExperienceManager().getGlobalXpMult());
         double difference = (mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) - modifiedThreshold) / modifiedThreshold;
 
         if (difference > 0) {

+ 9 - 0
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -39,6 +39,7 @@ import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.PlayerLevelUtils;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
+import com.gmail.nossr50.util.skills.CombatTools;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillTools;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
@@ -88,6 +89,7 @@ public class mcMMO extends JavaPlugin {
     private DatabaseManagerFactory databaseManagerFactory;
     private CommandTools commandTools;
     private SkillTools skillTools; //TODO: Remove once a new skill system is in place
+    private CombatTools combatTools; //TODO: Rewrite this garbo
     private TextComponentFactory textComponentFactory;
 
     /* Never-Ending tasks */
@@ -239,6 +241,9 @@ public class mcMMO extends JavaPlugin {
 
         //Init Skill Tools
         skillTools = new SkillTools(this);
+
+        //Init Combat Tools
+        combatTools = new CombatTools(this);
     }
 
     @Override
@@ -742,4 +747,8 @@ public class mcMMO extends JavaPlugin {
     public SkillTools getSkillTools() {
         return skillTools;
     }
+
+    public CombatTools getCombatTools() {
+        return combatTools;
+    }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/party/PartyManager.java

@@ -673,7 +673,7 @@ public final class PartyManager {
             ArrayList<Party> hasAlly = new ArrayList<Party>();
 
             for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
-                Party party = new Party(partyName);
+                Party party = new Party(partyName, pluginRef);
 
                 String[] leaderSplit = partiesFile.getString(partyName + ".Leader").split("[|]");
                 party.setLeader(new PartyLeader(UUID.fromString(leaderSplit[0]), leaderSplit[1]));

+ 2 - 3
src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java

@@ -3,7 +3,6 @@ package com.gmail.nossr50.runnables.skills;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.skills.BleedContainer;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
@@ -47,7 +46,7 @@ public class BleedTimerTask extends BukkitRunnable {
          */
 
         if (bleedList.containsKey(entity)) {
-            CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource);
+            pluginRef.getCombatTools().dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource);
         }
     }
 
@@ -155,7 +154,7 @@ public class BleedTimerTask extends BukkitRunnable {
 
 //            debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], ";
 
-            CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier);
+            pluginRef.getCombatTools().dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier);
 
             double victimHealthAftermath = target.getHealth();
 

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

@@ -71,7 +71,7 @@ public class AcrobaticsManager extends SkillManager {
                 return false;
             }*/
 
-            return skill.canCombatSkillsTrigger(damager);
+            return pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ACROBATICS, damager);
         }
 
         return false;

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java

@@ -12,7 +12,6 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
@@ -173,6 +172,6 @@ public class AxesManager extends SkillManager {
      * @param damage The amount of damage initially dealt by the event
      */
     public void skullSplitterCheck(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) {
-        CombatUtils.applyAbilityAoE(getPlayer(), target, damage / pluginRef.getConfigManager().getConfigAxes().getConfigAxesSkullSplitter().getSkullSplitterDamageDivisor(), modifiers, skill);
+        pluginRef.getCombatTools().applyAbilityAoE(getPlayer(), target, damage / pluginRef.getConfigManager().getConfigAxes().getConfigAxesSkullSplitter().getSkullSplitterDamageDivisor(), modifiers, skill);
     }
 }

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

@@ -23,7 +23,6 @@ import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
@@ -427,7 +426,7 @@ public class FishingManager extends SkillManager {
             }
 
             Misc.dropItem(target.getLocation(), drop);
-            CombatUtils.dealDamage(target, Math.min(Math.max(target.getMaxHealth() / 4, 1), 10), EntityDamageEvent.DamageCause.CUSTOM, getPlayer()); // Make it so you can shake a mob no more than 4 times.
+            pluginRef.getCombatTools().dealDamage(target, Math.min(Math.max(target.getMaxHealth() / 4, 1), 10), EntityDamageEvent.DamageCause.CUSTOM, getPlayer()); // Make it so you can shake a mob no more than 4 times.
             applyXpGain(pluginRef.getConfigManager().getConfigExperience().getShakeXP(), XPGainReason.PVE);
         }
     }

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

@@ -11,7 +11,6 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.entity.Entity;
@@ -121,7 +120,7 @@ public class SwordsManager extends SkillManager {
      */
     public void counterAttackChecks(LivingEntity attacker, double damage) {
         if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_COUNTER_ATTACK, getPlayer())) {
-            CombatUtils.dealDamage(attacker, damage / pluginRef.getConfigManager().getConfigSwords().getCounterAttackDamageModifier(), getPlayer());
+            pluginRef.getCombatTools().dealDamage(attacker, damage / pluginRef.getConfigManager().getConfigSwords().getCounterAttackDamageModifier(), getPlayer());
 
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Countered");
 
@@ -138,6 +137,6 @@ public class SwordsManager extends SkillManager {
      * @param damage The amount of damage initially dealt by the event
      */
     public void serratedStrikes(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) {
-        CombatUtils.applyAbilityAoE(getPlayer(), target, damage / pluginRef.getConfigManager().getConfigSwords().getSerratedStrikesDamageModifier(), modifiers, skill);
+        pluginRef.getCombatTools().applyAbilityAoE(getPlayer(), target, damage / pluginRef.getConfigManager().getConfigSwords().getSerratedStrikesDamageModifier(), modifiers, skill);
     }
 }

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/taming/TrackedTamingEntity.java

@@ -2,7 +2,6 @@ package com.gmail.nossr50.skills.taming;
 
 import com.gmail.nossr50.config.MainConfig;
 import com.gmail.nossr50.util.Misc;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import org.bukkit.Location;
 import org.bukkit.Sound;
@@ -35,7 +34,7 @@ public class TrackedTamingEntity extends BukkitRunnable {
             Location location = livingEntity.getLocation();
             location.getWorld().playSound(location, Sound.BLOCK_FIRE_EXTINGUISH, 0.8F, 0.8F);
             ParticleEffectUtils.playCallOfTheWildEffect(livingEntity);
-            CombatUtils.dealDamage(livingEntity, livingEntity.getMaxHealth(), DamageCause.SUICIDE, livingEntity);
+            pluginRef.getCombatTools().dealDamage(livingEntity, livingEntity.getMaxHealth(), DamageCause.SUICIDE, livingEntity);
         }
 
         TamingManager.removeFromTracker(this);

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java

@@ -14,7 +14,6 @@ import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.Material;
@@ -107,7 +106,7 @@ public class WoodcuttingManager extends SkillManager {
             double health = player.getHealth();
 
             if (health > 1) {
-                CombatUtils.dealDamage(player, Misc.getRandom().nextInt((int) (health - 1)));
+                pluginRef.getCombatTools().dealDamage(player, Misc.getRandom().nextInt((int) (health - 1)));
             }
 
             return;

+ 1 - 2
src/main/java/com/gmail/nossr50/util/ChimaeraWing.java

@@ -4,7 +4,6 @@ import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.items.ChimaeraWingWarmup;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import org.bukkit.Location;
@@ -84,7 +83,7 @@ public final class ChimaeraWing {
                 pluginRef.getNotificationManager().sendPlayerInformation(player, NotificationType.REQUIREMENTS_NOT_MET, "Item.ChimaeraWing.Fail");
                 player.updateInventory();
                 player.setVelocity(new Vector(0, 0.5D, 0));
-                CombatUtils.dealDamage(player, Misc.getRandom().nextInt((int) (player.getHealth() - 10)));
+                pluginRef.getCombatTools().dealDamage(player, Misc.getRandom().nextInt((int) (player.getHealth() - 10)));
                 mcMMOPlayer.actualizeChimeraWingLastUse();
                 return;
             }

+ 1 - 2
src/main/java/com/gmail/nossr50/util/EventManager.java

@@ -31,7 +31,6 @@ import com.gmail.nossr50.events.skills.salvage.McMMOPlayerSalvageCheckEvent;
 import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent;
 import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.skills.CombatUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.Bukkit;
 import org.bukkit.block.Block;
@@ -133,7 +132,7 @@ public class EventManager {
 
         LivingEntity livingEntity = (LivingEntity) entity;
 
-        if (CombatUtils.isInvincible(livingEntity, damage)) {
+        if (pluginRef.getCombatTools().isInvincible(livingEntity, damage)) {
             return false;
         }
 

+ 52 - 48
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java → src/main/java/com/gmail/nossr50/util/skills/CombatTools.java

@@ -39,11 +39,14 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public final class CombatUtils {
-    private CombatUtils() {
+public final class CombatTools {
+    private final mcMMO pluginRef;
+    
+    public CombatTools(mcMMO pluginRef) {
+        this.pluginRef = pluginRef;
     }
 
-    private static void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
+    private void processSwordCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
         if (event.getCause() == DamageCause.THORNS) {
             return;
         }
@@ -82,7 +85,7 @@ public final class CombatUtils {
         startGainXp(mcMMOPlayer, target, PrimarySkillType.SWORDS);
     }
 
-    private static void processAxeCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
+    private void processAxeCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
         if (event.getCause() == DamageCause.THORNS) {
             return;
         }
@@ -124,7 +127,7 @@ public final class CombatUtils {
         startGainXp(mcMMOPlayer, target, PrimarySkillType.AXES);
     }
 
-    private static void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
+    private void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
         if (event.getCause() == DamageCause.THORNS) {
             return;
         }
@@ -163,7 +166,7 @@ public final class CombatUtils {
         Unarmed.lastAttacked = System.currentTimeMillis(); //Track how often the player is punching
     }
 
-    private static void processTamingCombat(LivingEntity target, Player master, Wolf wolf, EntityDamageByEntityEvent event) {
+    private void processTamingCombat(LivingEntity target, Player master, Wolf wolf, EntityDamageByEntityEvent event) {
         double initialDamage = event.getDamage();
         double finalDamage = initialDamage;
 
@@ -188,7 +191,7 @@ public final class CombatUtils {
         startGainXp(mcMMOPlayer, target, PrimarySkillType.TAMING);
     }
 
-    private static void processArcheryCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event, Arrow arrow) {
+    private void processArcheryCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event, Arrow arrow) {
         double initialDamage = event.getDamage();
 
         McMMOPlayer mcMMOPlayer = pluginRef.getUserManager().getPlayer(player);
@@ -196,7 +199,8 @@ public final class CombatUtils {
 
         double finalDamage = event.getDamage();
 
-        if (target instanceof Player && PrimarySkillType.UNARMED.getPVPEnabled()) {
+        if (target instanceof Player
+                && pluginRef.getSkillTools().getPVPEnabled(PrimarySkillType.UNARMED)) {
             UnarmedManager unarmedManager = pluginRef.getUserManager().getPlayer((Player) target).getUnarmedManager();
 
             if (unarmedManager.canDeflect()) {
@@ -239,7 +243,7 @@ public final class CombatUtils {
      *
      * @param event The event to run the combat checks on.
      */
-    public static void processCombatAttack(EntityDamageByEntityEvent event, Entity attacker, LivingEntity target) {
+    public void processCombatAttack(EntityDamageByEntityEvent event, Entity attacker, LivingEntity target) {
         Entity damager = event.getDamager();
         EntityType entityType = damager.getType();
 
@@ -260,7 +264,7 @@ public final class CombatUtils {
             }
 
             if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) {
-                if (!PrimarySkillType.SWORDS.canCombatSkillsTrigger(target)) {
+                if (!pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) {
                     return;
                 }
 
@@ -298,27 +302,27 @@ public final class CombatUtils {
             }
 
             if (ItemUtils.isSword(heldItem)) {
-                if (!PrimarySkillType.SWORDS.canCombatSkillsTrigger(target)) {
+                if (!pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) {
                     return;
                 }
 
-                if (PrimarySkillType.SWORDS.doesPlayerHaveSkillPermission(player)) {
+                if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.SWORDS, player)) {
                     processSwordCombat(target, player, event);
                 }
             } else if (ItemUtils.isAxe(heldItem)) {
-                if (!PrimarySkillType.AXES.canCombatSkillsTrigger(target)) {
+                if (!pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.AXES, target)) {
                     return;
                 }
 
-                if (PrimarySkillType.AXES.doesPlayerHaveSkillPermission(player)) {
+                if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.AXES, player)) {
                     processAxeCombat(target, player, event);
                 }
             } else if (ItemUtils.isUnarmed(heldItem)) {
-                if (!PrimarySkillType.UNARMED.canCombatSkillsTrigger(target)) {
+                if (!pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.UNARMED, target)) {
                     return;
                 }
 
-                if (PrimarySkillType.UNARMED.doesPlayerHaveSkillPermission(player)) {
+                if (pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.UNARMED, player)) {
                     processUnarmedCombat(target, player, event);
                 }
             }
@@ -326,10 +330,10 @@ public final class CombatUtils {
             Wolf wolf = (Wolf) damager;
             AnimalTamer tamer = wolf.getOwner();
 
-            if (tamer instanceof Player && PrimarySkillType.TAMING.canCombatSkillsTrigger(target)) {
+            if (tamer instanceof Player && pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.TAMING, target)) {
                 Player master = (Player) tamer;
 
-                if (!Misc.isNPCEntityExcludingVillagers(master) && PrimarySkillType.TAMING.doesPlayerHaveSkillPermission(master)) {
+                if (!Misc.isNPCEntityExcludingVillagers(master) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.TAMING, master)) {
                     processTamingCombat(target, master, wolf, event);
                 }
             }
@@ -337,14 +341,14 @@ public final class CombatUtils {
             Arrow arrow = (Arrow) damager;
             ProjectileSource projectileSource = arrow.getShooter();
 
-            if (projectileSource instanceof Player && PrimarySkillType.ARCHERY.canCombatSkillsTrigger(target)) {
+            if (projectileSource instanceof Player && pluginRef.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) {
                 Player player = (Player) projectileSource;
 
-                if (!Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.ARCHERY.doesPlayerHaveSkillPermission(player)) {
+                if (!Misc.isNPCEntityExcludingVillagers(player) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.ARCHERY, player)) {
                     processArcheryCombat(target, player, event, arrow);
                 }
 
-                if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && PrimarySkillType.TAMING.doesPlayerHaveSkillPermission(player)) {
+                if (target.getType() != EntityType.CREEPER && !Misc.isNPCEntityExcludingVillagers(player) && pluginRef.getSkillTools().doesPlayerHaveSkillPermission(PrimarySkillType.TAMING, player)) {
                     McMMOPlayer mcMMOPlayer = pluginRef.getUserManager().getPlayer(player);
                     TamingManager tamingManager = mcMMOPlayer.getTamingManager();
                     tamingManager.attackTarget(target);
@@ -358,7 +362,7 @@ public final class CombatUtils {
      *
      * @param entity target entity
      */
-    public static void fixNames(LivingEntity entity) {
+    public void fixNames(LivingEntity entity) {
         List<MetadataValue> metadataValue = entity.getMetadata("mcMMO_oldName");
 
         if (metadataValue.size() <= 0)
@@ -371,7 +375,7 @@ public final class CombatUtils {
         }
     }
 
-    public static int getLimitBreakDamage(Player player, SubSkillType subSkillType) {
+    public int getLimitBreakDamage(Player player, SubSkillType subSkillType) {
         return RankUtils.getRank(player, subSkillType);
     }
 
@@ -381,7 +385,7 @@ public final class CombatUtils {
      * @param player target player
      * @return true if the player has access to the limit break
      */
-    public static boolean canUseLimitBreak(Player player, SubSkillType subSkillType) {
+    public boolean canUseLimitBreak(Player player, SubSkillType subSkillType) {
         return RankUtils.hasUnlockedSubskill(player, subSkillType)
                 && Permissions.isSubSkillEnabled(player, subSkillType);
     }
@@ -393,7 +397,7 @@ public final class CombatUtils {
      * @param damage Amount of damage to attempt to do
      */
     @Deprecated
-    public static void dealDamage(LivingEntity target, double damage) {
+    public void dealDamage(LivingEntity target, double damage) {
         dealDamage(target, damage, DamageCause.CUSTOM, null);
     }
 
@@ -405,7 +409,7 @@ public final class CombatUtils {
      * @param attacker Player to pass to event as damager
      */
     @Deprecated
-    public static void dealDamage(LivingEntity target, double damage, LivingEntity attacker) {
+    public void dealDamage(LivingEntity target, double damage, LivingEntity attacker) {
         dealDamage(target, damage, DamageCause.CUSTOM, attacker);
     }
 
@@ -416,7 +420,7 @@ public final class CombatUtils {
      * @param damage   Amount of damage to attempt to do
      * @param attacker Player to pass to event as damager
      */
-    public static void dealDamage(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers, LivingEntity attacker) {
+    public void dealDamage(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers, LivingEntity attacker) {
         if (target.isDead()) {
             return;
         }
@@ -433,7 +437,7 @@ public final class CombatUtils {
      * @param attacker Player to pass to event as damager
      */
     @Deprecated
-    public static void dealDamage(LivingEntity target, double damage, DamageCause cause, Entity attacker) {
+    public void dealDamage(LivingEntity target, double damage, DamageCause cause, Entity attacker) {
         if (target.isDead()) {
             return;
         }
@@ -442,7 +446,7 @@ public final class CombatUtils {
             target.damage(damage);
     }
 
-    public static void dealNoInvulnerabilityTickDamage(LivingEntity target, double damage, Entity attacker) {
+    public void dealNoInvulnerabilityTickDamage(LivingEntity target, double damage, Entity attacker) {
         if (target.isDead()) {
             return;
         }
@@ -457,7 +461,7 @@ public final class CombatUtils {
             target.setHealth(newHealth);
     }
 
-    public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) {
+    public void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) {
         if (target.isDead()) {
             return;
         }
@@ -474,7 +478,7 @@ public final class CombatUtils {
      * @param damage   The initial damage amount
      * @param type     The type of skill being used
      */
-    public static void applyAbilityAoE(Player attacker, LivingEntity target, double damage, Map<DamageModifier, Double> modifiers, PrimarySkillType type) {
+    public void applyAbilityAoE(Player attacker, LivingEntity target, double damage, Map<DamageModifier, Double> modifiers, PrimarySkillType type) {
         int numberOfTargets = getTier(attacker.getInventory().getItemInMainHand()); // The higher the weapon tier, the more targets you hit
         double damageAmount = Math.max(damage, 1);
 
@@ -515,7 +519,7 @@ public final class CombatUtils {
         }
     }
 
-    public static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) {
+    public void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) {
         startGainXp(mcMMOPlayer, target, primarySkillType, 1.0);
     }
 
@@ -526,7 +530,7 @@ public final class CombatUtils {
      * @param target           The defending entity
      * @param primarySkillType The skill being used
      */
-    private static void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
+    private void startGainXp(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
         double baseXPMultiplier = 0;
         XPGainReason xpGainReason;
 
@@ -595,7 +599,7 @@ public final class CombatUtils {
      * @param entity The defending Entity
      * @return true if the Entity should be damaged, false otherwise.
      */
-    private static boolean shouldBeAffected(Player player, Entity entity) {
+    private boolean shouldBeAffected(Player player, Entity entity) {
         if (entity instanceof Player) {
             Player defender = (Player) entity;
 
@@ -646,7 +650,7 @@ public final class CombatUtils {
      * @param eventDamage The damage from the event the entity is involved in
      * @return true if the entity is invincible, false otherwise
      */
-    public static boolean isInvincible(LivingEntity entity, double eventDamage) {
+    public boolean isInvincible(LivingEntity entity, double eventDamage) {
         /*
          * So apparently if you do more damage to a LivingEntity than its last damage int you bypass the invincibility.
          * So yeah, this is for that.
@@ -661,7 +665,7 @@ public final class CombatUtils {
      * @param pet      The entity to check.
      * @return true if the entity is friendly, false otherwise
      */
-    public static boolean isFriendlyPet(Player attacker, Tameable pet) {
+    public boolean isFriendlyPet(Player attacker, Tameable pet) {
         if (pet.isTamed()) {
             AnimalTamer tamer = pet.getOwner();
 
@@ -676,12 +680,12 @@ public final class CombatUtils {
     }
 
     @Deprecated
-    public static double getFakeDamageFinalResult(Entity attacker, Entity target, double damage) {
+    public double getFakeDamageFinalResult(Entity attacker, Entity target, double damage) {
         return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, new EnumMap<>(ImmutableMap.of(DamageModifier.BASE, damage)));
     }
 
     @Deprecated
-    public static double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause damageCause, double damage) {
+    public double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause damageCause, double damage) {
         EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage);
 
         if (damageEvent.isCancelled()) {
@@ -691,7 +695,7 @@ public final class CombatUtils {
         return damageEvent.getFinalDamage();
     }
 
-    public static boolean canDamage(Entity attacker, Entity target, DamageCause damageCause, double damage) {
+    public boolean canDamage(Entity attacker, Entity target, DamageCause damageCause, double damage) {
         EntityDamageEvent damageEvent = sendEntityDamageEvent(attacker, target, damageCause, damage);
 
         if (damageEvent.isCancelled()) {
@@ -701,21 +705,21 @@ public final class CombatUtils {
         return true;
     }
 
-    public static EntityDamageEvent sendEntityDamageEvent(Entity attacker, Entity target, DamageCause damageCause, double damage) {
+    public EntityDamageEvent sendEntityDamageEvent(Entity attacker, Entity target, DamageCause damageCause, double damage) {
         EntityDamageEvent damageEvent = attacker == null ? new FakeEntityDamageEvent(target, damageCause, damage) : new FakeEntityDamageByEntityEvent(attacker, target, damageCause, damage);
         pluginRef.getServer().getPluginManager().callEvent(damageEvent);
         return damageEvent;
     }
 
-    public static double getFakeDamageFinalResult(Entity attacker, Entity target, Map<DamageModifier, Double> modifiers) {
+    public double getFakeDamageFinalResult(Entity attacker, Entity target, Map<DamageModifier, Double> modifiers) {
         return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, modifiers);
     }
 
-    public static double getFakeDamageFinalResult(Entity attacker, Entity target, double damage, Map<DamageModifier, Double> modifiers) {
+    public double getFakeDamageFinalResult(Entity attacker, Entity target, double damage, Map<DamageModifier, Double> modifiers) {
         return getFakeDamageFinalResult(attacker, target, DamageCause.ENTITY_ATTACK, getScaledModifiers(damage, modifiers));
     }
 
-    public static double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause cause, Map<DamageModifier, Double> modifiers) {
+    public double getFakeDamageFinalResult(Entity attacker, Entity target, DamageCause cause, Map<DamageModifier, Double> modifiers) {
         EntityDamageEvent damageEvent = attacker == null ? new FakeEntityDamageEvent(target, cause, modifiers) : new FakeEntityDamageByEntityEvent(attacker, target, cause, modifiers);
         pluginRef.getServer().getPluginManager().callEvent(damageEvent);
 
@@ -726,7 +730,7 @@ public final class CombatUtils {
         return damageEvent.getFinalDamage();
     }
 
-    private static Map<DamageModifier, Double> getModifiers(EntityDamageEvent event) {
+    private Map<DamageModifier, Double> getModifiers(EntityDamageEvent event) {
         Map<DamageModifier, Double> modifiers = new HashMap<>();
         for (DamageModifier modifier : DamageModifier.values()) {
             modifiers.put(modifier, event.getDamage(modifier));
@@ -735,7 +739,7 @@ public final class CombatUtils {
         return modifiers;
     }
 
-    private static Map<DamageModifier, Double> getScaledModifiers(double damage, Map<DamageModifier, Double> modifiers) {
+    private Map<DamageModifier, Double> getScaledModifiers(double damage, Map<DamageModifier, Double> modifiers) {
         Map<DamageModifier, Double> scaledModifiers = new HashMap<>();
 
         for (DamageModifier modifier : modifiers.keySet()) {
@@ -750,7 +754,7 @@ public final class CombatUtils {
         return scaledModifiers;
     }
 
-    public static void applyScaledModifiers(double initialDamage, double finalDamage, EntityDamageByEntityEvent event) {
+    public void applyScaledModifiers(double initialDamage, double finalDamage, EntityDamageByEntityEvent event) {
         // No additional damage
         if (initialDamage == finalDamage) {
             return;
@@ -777,7 +781,7 @@ public final class CombatUtils {
      * @param inHand The item to check the tier of
      * @return the tier of the item
      */
-    private static int getTier(ItemStack inHand) {
+    private int getTier(ItemStack inHand) {
         int tier = 0;
 
         if (ItemUtils.isWoodTool(inHand)) {
@@ -798,7 +802,7 @@ public final class CombatUtils {
         return tier;
     }
 
-    public static void handleHealthbars(Entity attacker, LivingEntity target, double damage, mcMMO plugin) {
+    public void handleHealthbars(Entity attacker, LivingEntity target, double damage, mcMMO plugin) {
         if (!(attacker instanceof Player)) {
             return;
         }