Browse Source

Moved everything that could be moved from PlayerProfile to McMMOPlayer
PlayerProfile now only store stored (flatfile or MySQL) data

bm01 12 years ago
parent
commit
c0b7f8a323
24 changed files with 405 additions and 603 deletions
  1. 10 10
      src/main/java/com/gmail/nossr50/api/AbilityAPI.java
  2. 9 10
      src/main/java/com/gmail/nossr50/commands/McabilityCommand.java
  3. 10 11
      src/main/java/com/gmail/nossr50/commands/McgodCommand.java
  4. 4 4
      src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java
  5. 14 14
      src/main/java/com/gmail/nossr50/commands/McrefreshCommand.java
  6. 5 9
      src/main/java/com/gmail/nossr50/commands/party/PtpCommand.java
  7. 230 5
      src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
  8. 6 400
      src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java
  9. 20 23
      src/main/java/com/gmail/nossr50/listeners/BlockListener.java
  10. 2 4
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  11. 6 8
      src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
  12. 4 4
      src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java
  13. 2 5
      src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
  14. 2 2
      src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java
  15. 4 4
      src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java
  16. 4 8
      src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java
  17. 2 3
      src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java
  18. 3 3
      src/main/java/com/gmail/nossr50/skills/repair/Repair.java
  19. 4 4
      src/main/java/com/gmail/nossr50/skills/repair/Salvage.java
  20. 2 2
      src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java
  21. 3 3
      src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java
  22. 1 3
      src/main/java/com/gmail/nossr50/util/ChimaeraWing.java
  23. 9 13
      src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
  24. 49 51
      src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java

+ 10 - 10
src/main/java/com/gmail/nossr50/api/AbilityAPI.java

@@ -2,7 +2,7 @@ package com.gmail.nossr50.api;
 
 import org.bukkit.entity.Player;
 
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.util.player.UserManager;
 
@@ -10,38 +10,38 @@ public final class AbilityAPI {
     private AbilityAPI() {}
 
     public static boolean berserkEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.BERSERK);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.BERSERK);
     }
 
     public static boolean gigaDrillBreakerEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.GIGA_DRILL_BREAKER);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.GIGA_DRILL_BREAKER);
     }
 
     public static boolean greenTerraEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.GREEN_TERRA);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.GREEN_TERRA);
     }
 
     public static boolean serratedStrikesEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.SERRATED_STRIKES);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.SERRATED_STRIKES);
     }
 
     public static boolean skullSplitterEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.SKULL_SPLITTER);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.SKULL_SPLITTER);
     }
 
     public static boolean superBreakerEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.SUPER_BREAKER);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.SUPER_BREAKER);
     }
 
     public static boolean treeFellerEnabled(Player player) {
-        return UserManager.getPlayer(player).getProfile().getAbilityMode(AbilityType.TREE_FELLER);
+        return UserManager.getPlayer(player).getAbilityMode(AbilityType.TREE_FELLER);
     }
 
     public static boolean isAnyAbilityEnabled(Player player) {
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
         for (AbilityType ability : AbilityType.values()) {
-            if (profile.getAbilityMode(ability)) {
+            if (mcMMOPlayer.getAbilityMode(ability)) {
                 return true;
             }
         }

+ 9 - 10
src/main/java/com/gmail/nossr50/commands/McabilityCommand.java

@@ -14,7 +14,7 @@ import com.gmail.nossr50.util.player.UserManager;
 public class McabilityCommand implements CommandExecutor {
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-        PlayerProfile profile;
+        McMMOPlayer mcMMOPlayer;
 
         switch (args.length) {
             case 0:
@@ -23,16 +23,16 @@ public class McabilityCommand implements CommandExecutor {
                     return true;
                 }
 
-                profile = UserManager.getPlayer((Player) sender).getProfile();
+                mcMMOPlayer = UserManager.getPlayer((Player) sender);
 
-                if (profile.getAbilityUse()) {
+                if (mcMMOPlayer.getAbilityUse()) {
                     sender.sendMessage(LocaleLoader.getString("Commands.Ability.Off"));
                 }
                 else {
                     sender.sendMessage(LocaleLoader.getString("Commands.Ability.On"));
                 }
 
-                profile.toggleAbilityUse();
+                mcMMOPlayer.toggleAbilityUse();
                 return true;
 
             case 1:
@@ -41,12 +41,12 @@ public class McabilityCommand implements CommandExecutor {
                     return true;
                 }
 
-                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(args[0]);
+                mcMMOPlayer = UserManager.getPlayer(args[0]);
 
                 if (mcMMOPlayer == null) {
-                    profile = new PlayerProfile(args[0], false);
+                    PlayerProfile playerProfile = new PlayerProfile(args[0], false);
 
-                    if (!profile.isLoaded()) {
+                    if (!playerProfile.isLoaded()) {
                         sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
                         return true;
                     }
@@ -56,21 +56,20 @@ public class McabilityCommand implements CommandExecutor {
                 }
 
                 Player player = mcMMOPlayer.getPlayer();
-                profile = mcMMOPlayer.getProfile();
 
                 if (!player.isOnline()) {
                     sender.sendMessage(LocaleLoader.getString("Commands.Offline"));
                     return true;
                 }
 
-                if (profile.getAbilityUse()) {
+                if (mcMMOPlayer.getAbilityUse()) {
                     player.sendMessage(LocaleLoader.getString("Commands.Ability.Off"));
                 }
                 else {
                     player.sendMessage(LocaleLoader.getString("Commands.Ability.On"));
                 }
 
-                profile.toggleAbilityUse();
+                mcMMOPlayer.toggleAbilityUse();
                 return true;
 
             default:

+ 10 - 11
src/main/java/com/gmail/nossr50/commands/McgodCommand.java

@@ -14,7 +14,7 @@ import com.gmail.nossr50.util.player.UserManager;
 public class McgodCommand implements CommandExecutor {
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-        PlayerProfile profile;
+        McMMOPlayer mcMMOPlayer;
 
         switch (args.length) {
             case 0:
@@ -27,21 +27,21 @@ public class McgodCommand implements CommandExecutor {
                     return false;
                 }
 
-                profile = UserManager.getPlayer((Player) sender).getProfile();
+                mcMMOPlayer = UserManager.getPlayer((Player) sender);
 
-                if (profile == null) {
+                if (mcMMOPlayer == null) {
                     sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
                     return true;
                 }
 
-                if (profile.getGodMode()) {
+                if (mcMMOPlayer.getGodMode()) {
                     sender.sendMessage(LocaleLoader.getString("Commands.GodMode.Disabled"));
                 }
                 else {
                     sender.sendMessage(LocaleLoader.getString("Commands.GodMode.Enabled"));
                 }
 
-                profile.toggleGodMode();
+                mcMMOPlayer.toggleGodMode();
                 return true;
 
             case 1:
@@ -50,12 +50,12 @@ public class McgodCommand implements CommandExecutor {
                     return true;
                 }
 
-                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(args[0]);
+                mcMMOPlayer = UserManager.getPlayer(args[0]);
 
                 if (mcMMOPlayer == null) {
-                    profile = new PlayerProfile(args[0], false);
+                    PlayerProfile playerProfile = new PlayerProfile(args[0], false);
 
-                    if (!profile.isLoaded()) {
+                    if (!playerProfile.isLoaded()) {
                         sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
                         return true;
                     }
@@ -64,7 +64,6 @@ public class McgodCommand implements CommandExecutor {
                     return true;
                 }
 
-                profile = mcMMOPlayer.getProfile();
                 Player player = mcMMOPlayer.getPlayer();
 
                 if (!player.isOnline()) {
@@ -72,14 +71,14 @@ public class McgodCommand implements CommandExecutor {
                     return true;
                 }
 
-                if (profile.getGodMode()) {
+                if (mcMMOPlayer.getGodMode()) {
                     player.sendMessage(LocaleLoader.getString("Commands.GodMode.Disabled"));
                 }
                 else {
                     player.sendMessage(LocaleLoader.getString("Commands.GodMode.Enabled"));
                 }
 
-                profile.toggleGodMode();
+                mcMMOPlayer.toggleGodMode();
                 return true;
 
             default:

+ 4 - 4
src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java

@@ -5,7 +5,7 @@ import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.player.UserManager;
 
@@ -14,16 +14,16 @@ public class McnotifyCommand implements CommandExecutor {
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
         switch (args.length) {
             case 0:
-                PlayerProfile profile = UserManager.getPlayer((Player) sender).getProfile();
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender);
 
-                if (profile.useChatNotifications()) {
+                if (mcMMOPlayer.useChatNotifications()) {
                     sender.sendMessage(LocaleLoader.getString("Commands.Notifications.Off"));
                 }
                 else {
                     sender.sendMessage(LocaleLoader.getString("Commands.Notifications.On"));
                 }
 
-                profile.toggleChatNotifications();
+                mcMMOPlayer.toggleChatNotifications();
                 return true;
 
             default:

+ 14 - 14
src/main/java/com/gmail/nossr50/commands/McrefreshCommand.java

@@ -14,7 +14,7 @@ import com.gmail.nossr50.util.player.UserManager;
 public class McrefreshCommand implements CommandExecutor {
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-        PlayerProfile profile;
+        McMMOPlayer mcMMOPlayer;
 
         switch (args.length) {
             case 0:
@@ -27,12 +27,12 @@ public class McrefreshCommand implements CommandExecutor {
                     return false;
                 }
 
-                profile = UserManager.getPlayer(sender.getName()).getProfile();
+                mcMMOPlayer = UserManager.getPlayer(sender.getName());
 
-                profile.setRecentlyHurt(0);
-                profile.resetCooldowns();
-                profile.resetToolPrepMode();
-                profile.resetAbilityMode();
+                mcMMOPlayer.setRecentlyHurt(0);
+                mcMMOPlayer.getProfile().resetCooldowns();
+                mcMMOPlayer.resetToolPrepMode();
+                mcMMOPlayer.resetAbilityMode();
 
                 sender.sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
                 return true;
@@ -43,12 +43,12 @@ public class McrefreshCommand implements CommandExecutor {
                     return true;
                 }
 
-                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(args[0]);
+                mcMMOPlayer = UserManager.getPlayer(args[0]);
 
                 if (mcMMOPlayer == null) {
-                    profile = new PlayerProfile(args[0], false);
+                    PlayerProfile playerProfile = new PlayerProfile(args[0], false);
 
-                    if (!profile.isLoaded()) {
+                    if (!playerProfile.isLoaded()) {
                         sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
                         return true;
                     }
@@ -56,7 +56,7 @@ public class McrefreshCommand implements CommandExecutor {
                     sender.sendMessage(LocaleLoader.getString("Commands.Offline"));
                     return true;
                 }
-                profile = mcMMOPlayer.getProfile();
+
                 Player player = mcMMOPlayer.getPlayer();
 
                 if (!player.isOnline()) {
@@ -64,10 +64,10 @@ public class McrefreshCommand implements CommandExecutor {
                     return true;
                 }
 
-                profile.setRecentlyHurt(0);
-                profile.resetCooldowns();
-                profile.resetToolPrepMode();
-                profile.resetAbilityMode();
+                mcMMOPlayer.setRecentlyHurt(0);
+                mcMMOPlayer.getProfile().resetCooldowns();
+                mcMMOPlayer.resetToolPrepMode();
+                mcMMOPlayer.resetAbilityMode();
 
                 player.sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
                 sender.sendMessage(LocaleLoader.getString("Commands.mcrefresh.Success", args[0]));

+ 5 - 9
src/main/java/com/gmail/nossr50/commands/party/PtpCommand.java

@@ -9,7 +9,6 @@ import org.bukkit.entity.Player;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.party.PartyManager;
@@ -21,7 +20,6 @@ import com.gmail.nossr50.util.player.UserManager;
 public class PtpCommand implements CommandExecutor {
     private Player player;
     private McMMOPlayer mcMMOPlayer;
-    private PlayerProfile playerProfile;
 
     private Player target;
     private McMMOPlayer mcMMOTarget;
@@ -34,10 +32,6 @@ public class PtpCommand implements CommandExecutor {
 
         switch (args.length) {
             case 1:
-                player = (Player) sender;
-                mcMMOPlayer = UserManager.getPlayer(player);
-                playerProfile = mcMMOPlayer.getProfile();
-
                 if (args[0].equalsIgnoreCase("toggle")) {
                     if (!Permissions.partyTeleportToggle(sender)) {
                         sender.sendMessage(command.getPermissionMessage());
@@ -56,8 +50,9 @@ public class PtpCommand implements CommandExecutor {
                     return acceptAnyTeleportRequest();
                 }
 
+                player = (Player) sender;
                 int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
-                long recentlyHurt = playerProfile.getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
+                long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
 
                 if (System.currentTimeMillis() - recentlyHurt >= (ptpCooldown * Misc.TIME_CONVERSION_FACTOR)) {
                     player.sendMessage(LocaleLoader.getString("Party.Teleport.Hurt", ptpCooldown));
@@ -94,6 +89,7 @@ public class PtpCommand implements CommandExecutor {
         player.sendMessage(LocaleLoader.getString("Commands.Invite.Success"));
 
         int ptpRequestExpire = Config.getInstance().getPTPCommandTimeout();
+
         target.sendMessage(LocaleLoader.getString("Commands.ptp.Request1", player.getName()));
         target.sendMessage(LocaleLoader.getString("Commands.ptp.Request2", ptpRequestExpire));
         return true;
@@ -203,8 +199,8 @@ public class PtpCommand implements CommandExecutor {
 
     private boolean handlePartyTeleportEvent(Player player, Player target) {
         McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-
         McMMOPartyTeleportEvent event = new McMMOPartyTeleportEvent(player, target, mcMMOPlayer.getParty().getName());
+
         mcMMO.p.getServer().getPluginManager().callEvent(event);
 
         if (event.isCancelled()) {
@@ -214,7 +210,7 @@ public class PtpCommand implements CommandExecutor {
         player.teleport(target);
         player.sendMessage(LocaleLoader.getString("Party.Teleport.Player", target.getName()));
         target.sendMessage(LocaleLoader.getString("Party.Teleport.Target", player.getName()));
-        mcMMOPlayer.getProfile().actualizeRecentlyHurt();
+        mcMMOPlayer.actualizeRecentlyHurt();
         return true;
     }
 }

+ 230 - 5
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -12,7 +12,9 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.mods.CustomTool;
 import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
+import com.gmail.nossr50.datatypes.skills.ToolType;
 import com.gmail.nossr50.datatypes.spout.huds.McMMOHud;
 import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;
 import com.gmail.nossr50.party.PartyManager;
@@ -49,8 +51,9 @@ public class McMMOPlayer {
      */
     private Map<SkillType, SkillManager> skillManagers = new HashMap<SkillType, SkillManager>();
 
-    private Party party;
-    private Party invite;
+    private Party   party;
+    private Party   invite;
+    private int     itemShareModifier;
 
     private Player  ptpRequest;
     private boolean ptpEnabled = true;
@@ -59,8 +62,20 @@ public class McMMOPlayer {
 
     private boolean partyChatMode;
     private boolean adminChatMode;
+    private boolean displaySkillNotifications = true;
 
-    private int itemShareModifier;
+    private boolean abilityUse = true;
+    private boolean placedAnvil;
+    private boolean placedSalvageAnvil;
+    private boolean godMode;
+
+    private Map<AbilityType, Boolean> abilityMode = new HashMap<AbilityType, Boolean>();
+    private Map<AbilityType, Boolean> abilityInformed = new HashMap<AbilityType, Boolean>();
+    private Map<ToolType, Boolean> toolPreparationMode = new HashMap<ToolType, Boolean>();
+    private Map<ToolType, Integer> toolATS = new HashMap<ToolType, Integer>();
+
+    private int recentlyHurt;
+    private int respawnATS;
 
     public McMMOPlayer(Player player) {
         String playerName = player.getName();
@@ -88,6 +103,16 @@ public class McMMOPlayer {
             e.printStackTrace();
             mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
         }
+
+        for (AbilityType abilityType : AbilityType.values()) {
+            abilityMode.put(abilityType, false);
+            abilityInformed.put(abilityType, true); // This is intended
+        }
+
+        for (ToolType toolType : ToolType.values()) {
+            toolPreparationMode.put(toolType, false);
+            toolATS.put(toolType, 0);
+        }
     }
 
     public AcrobaticsManager getAcrobaticsManager() {
@@ -134,6 +159,198 @@ public class McMMOPlayer {
         return (UnarmedManager) skillManagers.get(SkillType.UNARMED);
     }
 
+    /*
+     * Abilities
+     */
+
+    /**
+     * Reset the mode of all abilities.
+     */
+    public void resetAbilityMode() {
+        for (AbilityType ability : AbilityType.values()) {
+            setAbilityMode(ability, false);
+        }
+    }
+
+    /**
+     * Get the mode of an ability.
+     *
+     * @param ability The ability to check
+     * @return true if the ability is enabled, false otherwise
+     */
+    public boolean getAbilityMode(AbilityType ability) {
+        return abilityMode.get(ability);
+    }
+
+    /**
+     * Set the mode of an ability.
+     *
+     * @param ability The ability to check
+     * @param bool True if the ability is active, false otherwise
+     */
+    public void setAbilityMode(AbilityType ability, boolean bool) {
+        abilityMode.put(ability, bool);
+    }
+
+    /**
+     * Get the informed state of an ability
+     *
+     * @param ability The ability to check
+     * @return true if the ability is informed, false otherwise
+     */
+    public boolean getAbilityInformed(AbilityType ability) {
+        return abilityInformed.get(ability);
+    }
+
+    /**
+     * Set the informed state of an ability.
+     *
+     * @param ability The ability to check
+     * @param bool True if the ability is informed, false otherwise
+     */
+    public void setAbilityInformed(AbilityType ability, boolean bool) {
+        abilityInformed.put(ability, bool);
+    }
+
+    /**
+     * Get the current prep mode of a tool.
+     *
+     * @param tool Tool to get the mode for
+     * @return true if the tool is prepped, false otherwise
+     */
+    public boolean getToolPreparationMode(ToolType tool) {
+        return toolPreparationMode.get(tool);
+    }
+
+    public boolean getAbilityUse() {
+        return abilityUse;
+    }
+
+    public void toggleAbilityUse() {
+        abilityUse = !abilityUse;
+    }
+
+    /*
+     * Tools
+     */
+
+    /**
+     * Reset the prep modes of all tools.
+     */
+    public void resetToolPrepMode() {
+        for (ToolType tool : ToolType.values()) {
+            setToolPreparationMode(tool, false);
+        }
+    }
+
+    /**
+     * Set the current prep mode of a tool.
+     *
+     * @param tool Tool to set the mode for
+     * @param bool true if the tool should be prepped, false otherwise
+     */
+    public void setToolPreparationMode(ToolType tool, boolean bool) {
+        toolPreparationMode.put(tool, bool);
+    }
+
+    /**
+     * Get the current prep ATS of a tool.
+     *
+     * @param tool Tool to get the ATS for
+     * @return the ATS for the tool
+     */
+    public long getToolPreparationATS(ToolType tool) {
+        return toolATS.get(tool);
+    }
+
+    /**
+     * Set the current prep ATS of a tool.
+     *
+     * @param tool Tool to set the ATS for
+     * @param ATS the ATS of the tool
+     */
+    public void setToolPreparationATS(ToolType tool, long ATS) {
+        int startTime = (int) (ATS / Misc.TIME_CONVERSION_FACTOR);
+
+        toolATS.put(tool, startTime);
+    }
+
+    /*
+     * Recently Hurt
+     */
+
+    public int getRecentlyHurt() {
+        return recentlyHurt;
+    }
+
+    public void setRecentlyHurt(int value) {
+        recentlyHurt = value;
+    }
+
+    public void actualizeRecentlyHurt() {
+        recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
+    }
+
+    /*
+     * Exploit Prevention
+     */
+
+    public int getRespawnATS() {
+        return respawnATS;
+    }
+
+    public void actualizeRespawnATS() {
+        respawnATS = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
+    }
+
+    /*
+     * Repair Anvil Placement
+     */
+
+    public void togglePlacedAnvil() {
+        placedAnvil = !placedAnvil;
+    }
+
+    public Boolean getPlacedAnvil() {
+        return placedAnvil;
+    }
+
+    /*
+     * Salvage Anvil Placement
+     */
+
+    public void togglePlacedSalvageAnvil() {
+        placedSalvageAnvil = !placedSalvageAnvil;
+    }
+
+    public Boolean getPlacedSalvageAnvil() {
+        return placedSalvageAnvil;
+    }
+
+    /*
+     * God Mode
+     */
+
+    public boolean getGodMode() {
+        return godMode;
+    }
+
+    public void toggleGodMode() {
+        godMode = !godMode;
+    }
+
+    /*
+     * Skill notifications
+     */
+
+    public boolean useChatNotifications() {
+        return displaySkillNotifications;
+    }
+
+    public void toggleChatNotifications() {
+        displaySkillNotifications = !displaySkillNotifications;
+    }
+
     /**
      * Gets the power level of this player.
      *
@@ -223,7 +440,9 @@ public class McMMOPlayer {
         SkillUtils.xpCheckSkill(skillType, player, profile);
     }
 
-    // Players & Profiles
+    /*
+     * Players & Profiles
+     */
 
     public Player getPlayer() {
         return player;
@@ -237,7 +456,9 @@ public class McMMOPlayer {
         return profile;
     }
 
-    // Party Stuff
+    /*
+     * Party Stuff
+     */
 
     public void setPartyInvite(Party invite) {
         this.invite = invite;
@@ -339,6 +560,10 @@ public class McMMOPlayer {
         itemShareModifier = modifier;
     }
 
+    /*
+     * Chat modes
+     */
+
     public boolean getAdminChatMode() {
         return adminChatMode;
     }

+ 6 - 400
src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java

@@ -6,6 +6,7 @@ import java.io.FileReader;
 import java.io.FileWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 import com.gmail.nossr50.mcMMO;
@@ -14,7 +15,6 @@ import com.gmail.nossr50.config.spout.SpoutConfig;
 import com.gmail.nossr50.database.DatabaseManager;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
-import com.gmail.nossr50.datatypes.skills.ToolType;
 import com.gmail.nossr50.datatypes.spout.huds.HudType;
 import com.gmail.nossr50.datatypes.spout.huds.McMMOHud;
 import com.gmail.nossr50.skills.child.FamilyTree;
@@ -28,51 +28,14 @@ public class PlayerProfile {
     private McMMOHud spoutHud;
     private HudType  hudType;
 
-    // Toggles
-    private boolean loaded;
-    private boolean godMode;
-
-    private boolean placedAnvil;
-    private boolean placedSalvageAnvil;
-
-    private boolean hoePreparationMode;
-    private boolean shovelPreparationMode;
-    private boolean swordsPreparationMode;
-    private boolean fistsPreparationMode;
-    private boolean pickaxePreparationMode;
-    private boolean axePreparationMode;
-
-    private boolean greenTerraMode;
-    private boolean treeFellerMode;
-    private boolean superBreakerMode;
-    private boolean gigaDrillBreakerMode;
-    private boolean serratedStrikesMode;
-    private boolean skullSplitterMode;
-    private boolean berserkMode;
-
-    private boolean greenTerraInformed       = true;
-    private boolean berserkInformed          = true;
-    private boolean skullSplitterInformed    = true;
-    private boolean gigaDrillBreakerInformed = true;
-    private boolean superBreakerInformed     = true;
-    private boolean blastMiningInformed      = true;
-    private boolean serratedStrikesInformed  = true;
-    private boolean treeFellerInformed       = true;
-
-    private boolean abilityUse = true;
-    private boolean displaySkillNotifications = true;
-
-    // Timestamps
-    private int recentlyHurt;
-    private int respawnATS;
-
     // mySQL Stuff
     private int userId;
 
-    private HashMap<SkillType, Integer>   skills     = new HashMap<SkillType, Integer>(); // Skills and Levels
-    private HashMap<SkillType, Integer>   skillsXp   = new HashMap<SkillType, Integer>(); // Skills and Xp
-    private HashMap<AbilityType, Integer> skillsDATS = new HashMap<AbilityType, Integer>();
-    private HashMap<ToolType, Integer>    toolATS    = new HashMap<ToolType, Integer>();
+    private boolean loaded;
+
+    private Map<SkillType, Integer>   skills     = new HashMap<SkillType, Integer>(); // Skills and Levels
+    private Map<SkillType, Integer>   skillsXp   = new HashMap<SkillType, Integer>(); // Skills and Xp
+    private Map<AbilityType, Integer> skillsDATS = new HashMap<AbilityType, Integer>();
 
     private final static String location = mcMMO.getUsersFilePath();
 
@@ -565,42 +528,6 @@ public class PlayerProfile {
         return loaded;
     }
 
-    /*
-     * God Mode
-     */
-
-    public boolean getGodMode() {
-        return godMode;
-    }
-
-    public void toggleGodMode() {
-        godMode = !godMode;
-    }
-
-    /*
-     * Repair Anvil Placement
-     */
-
-    public void togglePlacedAnvil() {
-        placedAnvil = !placedAnvil;
-    }
-
-    public Boolean getPlacedAnvil() {
-        return placedAnvil;
-    }
-
-    /*
-     * Salvage Anvil Placement
-     */
-
-    public void togglePlacedSalvageAnvil() {
-        placedSalvageAnvil = !placedSalvageAnvil;
-    }
-
-    public Boolean getPlacedSalvageAnvil() {
-        return placedSalvageAnvil;
-    }
-
     /*
      * HUD Stuff
      */
@@ -621,315 +548,6 @@ public class PlayerProfile {
         this.hudType = hudType;
     }
 
-    /*
-     * Tools
-     */
-
-    /**
-     * Reset the prep modes of all tools.
-     */
-    public void resetToolPrepMode() {
-        for (ToolType tool : ToolType.values()) {
-            setToolPreparationMode(tool, false);
-        }
-    }
-
-    /**
-     * Get the current prep mode of a tool.
-     *
-     * @param tool Tool to get the mode for
-     * @return true if the tool is prepped, false otherwise
-     */
-    public boolean getToolPreparationMode(ToolType tool) {
-        switch (tool) {
-            case AXE:
-                return axePreparationMode;
-
-            case FISTS:
-                return fistsPreparationMode;
-
-            case HOE:
-                return hoePreparationMode;
-
-            case PICKAXE:
-                return pickaxePreparationMode;
-
-            case SHOVEL:
-                return shovelPreparationMode;
-
-            case SWORD:
-                return swordsPreparationMode;
-
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Set the current prep mode of a tool.
-     *
-     * @param tool Tool to set the mode for
-     * @param bool true if the tool should be prepped, false otherwise
-     */
-    public void setToolPreparationMode(ToolType tool, boolean bool) {
-        switch (tool) {
-            case AXE:
-                axePreparationMode = bool;
-                break;
-
-            case FISTS:
-                fistsPreparationMode = bool;
-                break;
-
-            case HOE:
-                hoePreparationMode = bool;
-                break;
-
-            case PICKAXE:
-                pickaxePreparationMode = bool;
-                break;
-
-            case SHOVEL:
-                shovelPreparationMode = bool;
-                break;
-
-            case SWORD:
-                swordsPreparationMode = bool;
-                break;
-
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Get the current prep ATS of a tool.
-     *
-     * @param tool Tool to get the ATS for
-     * @return the ATS for the tool
-     */
-    public long getToolPreparationATS(ToolType tool) {
-        return toolATS.get(tool);
-    }
-
-    /**
-     * Set the current prep ATS of a tool.
-     *
-     * @param tool Tool to set the ATS for
-     * @param ATS the ATS of the tool
-     */
-    public void setToolPreparationATS(ToolType tool, long ATS) {
-        int startTime = (int) (ATS / Misc.TIME_CONVERSION_FACTOR);
-
-        toolATS.put(tool, startTime);
-    }
-
-    /*
-     * Abilities
-     */
-
-    /**
-     * Reset the prep modes of all tools.
-     */
-    public void resetAbilityMode() {
-        for (AbilityType ability : AbilityType.values()) {
-            setAbilityMode(ability, false);
-        }
-    }
-
-    /**
-     * Get the mode of an ability.
-     *
-     * @param ability The ability to check
-     * @return true if the ability is enabled, false otherwise
-     */
-    public boolean getAbilityMode(AbilityType ability) {
-        switch (ability) {
-            case BERSERK:
-                return berserkMode;
-
-            case SUPER_BREAKER:
-                return superBreakerMode;
-
-            case GIGA_DRILL_BREAKER:
-                return gigaDrillBreakerMode;
-
-            case GREEN_TERRA:
-                return greenTerraMode;
-
-            case SKULL_SPLITTER:
-                return skullSplitterMode;
-
-            case TREE_FELLER:
-                return treeFellerMode;
-
-            case SERRATED_STRIKES:
-                return serratedStrikesMode;
-
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Set the mode of an ability.
-     *
-     * @param ability The ability to check
-     * @param bool True if the ability is active, false otherwise
-     */
-    public void setAbilityMode(AbilityType ability, boolean bool) {
-        switch (ability) {
-            case BERSERK:
-                berserkMode = bool;
-                break;
-
-            case SUPER_BREAKER:
-                superBreakerMode = bool;
-                break;
-
-            case GIGA_DRILL_BREAKER:
-                gigaDrillBreakerMode = bool;
-                break;
-
-            case GREEN_TERRA:
-                greenTerraMode = bool;
-                break;
-
-            case SKULL_SPLITTER:
-                skullSplitterMode = bool;
-                break;
-
-            case TREE_FELLER:
-                treeFellerMode = bool;
-                break;
-
-            case SERRATED_STRIKES:
-                serratedStrikesMode = bool;
-                break;
-
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Get the informed state of an ability
-     *
-     * @param ability The ability to check
-     * @return true if the ability is informed, false otherwise
-     */
-    public boolean getAbilityInformed(AbilityType ability) {
-        switch (ability) {
-            case BERSERK:
-                return berserkInformed;
-
-            case BLAST_MINING:
-                return blastMiningInformed;
-
-            case SUPER_BREAKER:
-                return superBreakerInformed;
-
-            case GIGA_DRILL_BREAKER:
-                return gigaDrillBreakerInformed;
-
-            case GREEN_TERRA:
-                return greenTerraInformed;
-
-            case SKULL_SPLITTER:
-                return skullSplitterInformed;
-
-            case TREE_FELLER:
-                return treeFellerInformed;
-
-            case SERRATED_STRIKES:
-                return serratedStrikesInformed;
-
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Set the informed state of an ability.
-     *
-     * @param ability The ability to check
-     * @param bool True if the ability is informed, false otherwise
-     */
-    public void setAbilityInformed(AbilityType ability, boolean bool) {
-        switch (ability) {
-            case BERSERK:
-                berserkInformed = bool;
-                break;
-
-            case BLAST_MINING:
-                blastMiningInformed = bool;
-                break;
-
-            case SUPER_BREAKER:
-                superBreakerInformed = bool;
-                break;
-
-            case GIGA_DRILL_BREAKER:
-                gigaDrillBreakerInformed = bool;
-                break;
-
-            case GREEN_TERRA:
-                greenTerraInformed = bool;
-                break;
-
-            case SKULL_SPLITTER:
-                skullSplitterInformed = bool;
-                break;
-
-            case TREE_FELLER:
-                treeFellerInformed = bool;
-                break;
-
-            case SERRATED_STRIKES:
-                serratedStrikesInformed = bool;
-                break;
-
-            default:
-                break;
-        }
-    }
-
-    public boolean getAbilityUse() {
-        return abilityUse;
-    }
-
-    public void toggleAbilityUse() {
-        abilityUse = !abilityUse;
-    }
-
-    /*
-     * Recently Hurt
-     */
-
-    public int getRecentlyHurt() {
-        return recentlyHurt;
-    }
-
-    public void setRecentlyHurt(int value) {
-        recentlyHurt = value;
-    }
-
-    public void actualizeRecentlyHurt() {
-        recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
-    }
-
-    /*
-     * Ability Notifications
-     */
-
-    public boolean useChatNotifications() {
-        return displaySkillNotifications;
-    }
-
-    public void toggleChatNotifications() {
-        displaySkillNotifications = !displaySkillNotifications;
-    }
-
     /*
      * Cooldowns
      */
@@ -965,18 +583,6 @@ public class PlayerProfile {
         }
     }
 
-    /*
-     * Exploit Prevention
-     */
-
-    public int getRespawnATS() {
-        return respawnATS;
-    }
-
-    public void actualizeRespawnATS() {
-        respawnATS = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
-    }
-
     /*
      * Xp Functions
      */

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

@@ -23,7 +23,6 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.HiddenConfig;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.skills.ToolType;
@@ -145,7 +144,6 @@ public class BlockListener implements Listener {
         }
 
         McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-        PlayerProfile profile = mcMMOPlayer.getProfile();
         BlockState blockState = event.getBlock().getState();
 
         ItemStack heldItem = player.getItemInHand();
@@ -156,7 +154,7 @@ public class BlockListener implements Listener {
 
             /* Green Terra */
             if (herbalismManager.canActivateAbility()) {
-                SkillUtils.abilityCheck(player, SkillType.HERBALISM);
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.HERBALISM);
             }
 
             /*
@@ -180,14 +178,14 @@ public class BlockListener implements Listener {
             MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
             miningManager.miningBlockCheck(blockState);
 
-            if (profile.getAbilityMode(AbilityType.SUPER_BREAKER)) {
+            if (mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
                 miningManager.miningBlockCheck(blockState);
             }
         }
 
         /* WOOD CUTTING */
         else if (BlockUtils.isLog(blockState) && Permissions.skillEnabled(player, SkillType.WOODCUTTING) && !mcMMO.placeStore.isTrue(blockState)) {
-            if (profile.getAbilityMode(AbilityType.TREE_FELLER) && Permissions.treeFeller(player) && ItemUtils.isAxe(heldItem)) {
+            if (mcMMOPlayer.getAbilityMode(AbilityType.TREE_FELLER) && Permissions.treeFeller(player) && ItemUtils.isAxe(heldItem)) {
                 Woodcutting.beginTreeFeller(blockState, player);
             }
             else {
@@ -207,7 +205,7 @@ public class BlockListener implements Listener {
             ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager();
             excavationManager.excavationBlockCheck(blockState);
 
-            if (profile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
+            if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
                 excavationManager.gigaDrillBreaker(blockState);
             }
         }
@@ -271,7 +269,7 @@ public class BlockListener implements Listener {
             return;
         }
 
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
         BlockState blockState = event.getBlock().getState();
 
         /*
@@ -283,30 +281,30 @@ public class BlockListener implements Listener {
             ItemStack heldItem = player.getItemInHand();
 
             if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
-                if ((ItemUtils.isPickaxe(heldItem) && !profile.getAbilityMode(AbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !profile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER))) {
+                if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER))) {
                     SkillUtils.removeAbilityBuff(heldItem);
                 }
             }
             else {
-                if ((profile.getAbilityMode(AbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (profile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
+                if ((mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
                     SkillUtils.handleAbilitySpeedDecrease(player);
                 }
             }
 
-            if (profile.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
-                SkillUtils.abilityCheck(player, SkillType.HERBALISM);
+            if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.HERBALISM);
             }
-            else if (profile.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
-                SkillUtils.abilityCheck(player, SkillType.WOODCUTTING);
+            else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.WOODCUTTING);
             }
-            else if (profile.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
-                SkillUtils.abilityCheck(player, SkillType.MINING);
+            else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.MINING);
             }
-            else if (profile.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
-                SkillUtils.abilityCheck(player, SkillType.EXCAVATION);
+            else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.EXCAVATION);
             }
-            else if (profile.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
-                SkillUtils.abilityCheck(player, SkillType.UNARMED);
+            else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
+                SkillUtils.abilityCheck(mcMMOPlayer, SkillType.UNARMED);
             }
         }
 
@@ -315,7 +313,7 @@ public class BlockListener implements Listener {
          *
          * We don't need to check permissions here because they've already been checked for the ability to even activate.
          */
-        if (profile.getAbilityMode(AbilityType.TREE_FELLER) && BlockUtils.isLog(blockState)) {
+        if (mcMMOPlayer.getAbilityMode(AbilityType.TREE_FELLER) && BlockUtils.isLog(blockState)) {
             player.playSound(blockState.getLocation(), Sound.FIZZ, Misc.FIZZ_VOLUME, Misc.FIZZ_PITCH);
         }
     }
@@ -338,7 +336,6 @@ public class BlockListener implements Listener {
         }
 
         McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-        PlayerProfile profile = mcMMOPlayer.getProfile();
         ItemStack heldItem = player.getItemInHand();
         Block block = event.getBlock();
         BlockState blockState = block.getState();
@@ -354,7 +351,7 @@ public class BlockListener implements Listener {
                 blockState.update(true);
             }
         }
-        else if (profile.getAbilityMode(AbilityType.BERSERK)) {
+        else if (mcMMOPlayer.getAbilityMode(AbilityType.BERSERK)) {
             if (SkillUtils.triggerCheck(player, block, AbilityType.BERSERK)) {
                 if (heldItem.getType() == Material.AIR) {
                     plugin.getServer().getPluginManager().callEvent(new FakePlayerAnimationEvent(player));
@@ -370,7 +367,7 @@ public class BlockListener implements Listener {
                 }
             }
         }
-        else if ((profile.getSkillLevel(SkillType.WOODCUTTING) >= AdvancedConfig.getInstance().getLeafBlowUnlockLevel()) && BlockUtils.isLeaves(blockState)) {
+        else if ((mcMMOPlayer.getProfile().getSkillLevel(SkillType.WOODCUTTING) >= AdvancedConfig.getInstance().getLeafBlowUnlockLevel()) && BlockUtils.isLeaves(blockState)) {
             if (SkillUtils.triggerCheck(player, block, AbilityType.LEAF_BLOWER)) {
                 if (Config.getInstance().getWoodcuttingRequiresTool()) {
                     if (ItemUtils.isAxe(heldItem)) {

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

@@ -28,7 +28,6 @@ import org.bukkit.event.entity.FoodLevelChangeEvent;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
 import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
 import com.gmail.nossr50.party.PartyManager;
@@ -161,10 +160,9 @@ public class EntityListener implements Listener {
             }
 
             McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-            PlayerProfile profile = mcMMOPlayer.getProfile();
 
             /* Check for invincibility */
-            if (profile.getGodMode()) {
+            if (mcMMOPlayer.getGodMode()) {
                 event.setCancelled(true);
                 return;
             }
@@ -201,7 +199,7 @@ public class EntityListener implements Listener {
             }
 
             if (event.getDamage() >= 1) {
-                profile.actualizeRecentlyHurt();
+                mcMMOPlayer.actualizeRecentlyHurt();
             }
         }
         else if (livingEntity instanceof Tameable) {

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

@@ -30,7 +30,6 @@ import com.gmail.nossr50.chat.ChatManager;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
@@ -101,10 +100,9 @@ public class PlayerListener implements Listener {
         }
 
         McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-        PlayerProfile profile = mcMMOPlayer.getProfile();
 
-        if (profile.getGodMode() && !Permissions.mcgod(player)) {
-            profile.toggleGodMode();
+        if (mcMMOPlayer.getGodMode() && !Permissions.mcgod(player)) {
+            mcMMOPlayer.toggleGodMode();
             player.sendMessage(LocaleLoader.getString("Commands.GodMode.Forbidden"));
         }
 
@@ -128,7 +126,7 @@ public class PlayerListener implements Listener {
                 return;
             }
 
-            UserManager.addUser(player).getProfile().actualizeRespawnATS();
+            UserManager.addUser(player).actualizeRespawnATS();
         }
     }
 
@@ -140,9 +138,9 @@ public class PlayerListener implements Listener {
     @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
     public void onPlayerDropItemEvent(PlayerDropItemEvent event) {
         Player player = event.getPlayer();
-        PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-        if (playerProfile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) || playerProfile.getAbilityMode(AbilityType.SUPER_BREAKER)) {
+        if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) || mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
             event.setCancelled(true);
             return;
         }
@@ -261,7 +259,7 @@ public class PlayerListener implements Listener {
             return;
         }
 
-        UserManager.getPlayer(player).getProfile().actualizeRespawnATS();
+        UserManager.getPlayer(player).actualizeRespawnATS();
     }
 
     /**

+ 4 - 4
src/main/java/com/gmail/nossr50/runnables/skills/SkillMonitorTask.java

@@ -3,7 +3,7 @@ package com.gmail.nossr50.runnables.skills;
 import org.bukkit.entity.Player;
 
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.util.Misc;
@@ -20,14 +20,14 @@ public class SkillMonitorTask implements Runnable {
                 continue;
             }
 
-            PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
             /*
              * MONITOR SKILLS
              */
             for (SkillType skill : SkillType.values()) {
                 if (skill.getTool() != null && skill.getAbility() != null) {
-                    SkillUtils.monitorSkill(player, profile, curTime, skill);
+                    SkillUtils.monitorSkill(mcMMOPlayer, curTime, skill);
                 }
             }
 
@@ -36,7 +36,7 @@ public class SkillMonitorTask implements Runnable {
              */
             for (AbilityType ability : AbilityType.values()) {
                 if (ability.getCooldown() > 0) {
-                    SkillUtils.watchCooldown(player, profile, ability);
+                    SkillUtils.watchCooldown(mcMMOPlayer, ability);
                 }
             }
         }

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

@@ -6,7 +6,6 @@ import org.bukkit.entity.LightningStrike;
 import org.bukkit.entity.Player;
 
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.SkillManager;
@@ -52,14 +51,12 @@ public class AcrobaticsManager extends SkillManager {
         if (!isFatal(modifiedDamage) && SkillUtils.activationSuccessful(player, skill, Acrobatics.dodgeMaxChance, Acrobatics.dodgeMaxBonusLevel)) {
             ParticleEffectUtils.playDodgeEffect(player);
 
-            PlayerProfile playerProfile = getProfile();
-
-            if (playerProfile.useChatNotifications()) {
+            if (mcMMOPlayer.useChatNotifications()) {
                 player.sendMessage(LocaleLoader.getString("Acrobatics.Combat.Proc"));
             }
 
             // Why do we check respawn cooldown here?
-            if (System.currentTimeMillis() >= playerProfile.getRespawnATS() + Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS) {
+            if (System.currentTimeMillis() >= mcMMOPlayer.getRespawnATS() + Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS) {
                 applyXpGain(damage * Acrobatics.dodgeXpModifier);
             }
 

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

@@ -86,11 +86,11 @@ public class ArcheryManager extends SkillManager {
             defender.teleport(dazedLocation);
             defender.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20 * 10, 10));
 
-            if (UserManager.getPlayer(defender).getProfile().useChatNotifications()) {
+            if (UserManager.getPlayer(defender).useChatNotifications()) {
                 defender.sendMessage(LocaleLoader.getString("Combat.TouchedFuzzy"));
             }
 
-            if (getProfile().useChatNotifications()) {
+            if (mcMMOPlayer.useChatNotifications()) {
                 attacker.sendMessage(LocaleLoader.getString("Combat.TargetDazed"));
             }
 

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

@@ -41,11 +41,11 @@ public class AxesManager extends SkillManager {
     }
 
     public boolean canUseSkullSplitter(LivingEntity target) {
-        return target.isValid() && getProfile().getAbilityMode(AbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer());
+        return target.isValid() && mcMMOPlayer.getAbilityMode(AbilityType.SKULL_SPLITTER) && Permissions.skullSplitter(getPlayer());
     }
 
     public boolean canActivateAbility() {
-        return getProfile().getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer());
+        return mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && Permissions.skullSplitter(getPlayer());
     }
 
     /**
@@ -118,14 +118,14 @@ public class AxesManager extends SkillManager {
             ParticleEffectUtils.playGreaterImpactEffect(target);
             target.setVelocity(player.getLocation().getDirection().normalize().multiply(Axes.greaterImpactKnockbackMultiplier));
 
-            if (getProfile().useChatNotifications()) {
+            if (mcMMOPlayer.useChatNotifications()) {
                 player.sendMessage(LocaleLoader.getString("Axes.Combat.GI.Proc"));
             }
 
             if (target instanceof Player) {
                 Player defender = (Player) target;
 
-                if (UserManager.getPlayer(defender).getProfile().useChatNotifications()) {
+                if (UserManager.getPlayer(defender).useChatNotifications()) {
                     defender.sendMessage(LocaleLoader.getString("Axes.Combat.GI.Struck"));
                 }
             }

+ 4 - 8
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java

@@ -15,7 +15,6 @@ import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.treasure.TreasureConfig;
 import com.gmail.nossr50.datatypes.mods.CustomBlock;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.skills.ToolType;
@@ -30,7 +29,6 @@ import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.ModUtils;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
-import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.SkillUtils;
 
 public class HerbalismManager extends SkillManager {
@@ -62,15 +60,15 @@ public class HerbalismManager extends SkillManager {
     }
 
     public boolean canGreenTerraBlock(BlockState blockState) {
-        return getProfile().getAbilityMode(AbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState);
+        return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState);
     }
 
     public boolean canActivateAbility() {
-        return getProfile().getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer());
+        return mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(getPlayer());
     }
 
     public boolean canGreenTerraPlant() {
-        return getProfile().getAbilityMode(AbilityType.GREEN_TERRA);
+        return mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA);
     }
 
     /**
@@ -288,9 +286,7 @@ public class HerbalismManager extends SkillManager {
             return;
         }
 
-        PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
-
-        if (playerProfile.getAbilityMode(AbilityType.GREEN_TERRA)) {
+        if (mcMMOPlayer.getAbilityMode(AbilityType.GREEN_TERRA)) {
             playerInventory.removeItem(seed);
             player.updateInventory(); // Needed until replacement available
 

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

@@ -86,7 +86,6 @@ public class MiningManager extends SkillManager{
             return;
         }
 
-        PlayerProfile profile = getProfile();
         TNTPrimed tnt = player.getWorld().spawn(targetBlock.getLocation(), TNTPrimed.class);
 
         SkillUtils.sendSkillMessage(player, AbilityType.BLAST_MINING.getAbilityPlayer(player));
@@ -97,8 +96,8 @@ public class MiningManager extends SkillManager{
         targetBlock.setData((byte) 0x0);
         targetBlock.setType(Material.AIR);
 
-        profile.setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis());
-        profile.setAbilityInformed(AbilityType.BLAST_MINING, false);
+        getProfile().setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis());
+        mcMMOPlayer.setAbilityInformed(AbilityType.BLAST_MINING, false);
     }
 
     /**

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/repair/Repair.java

@@ -204,9 +204,9 @@ public class Repair {
      * @param anvilID The item ID of the anvil block
      */
     public static void placedAnvilCheck(Player player, int anvilID) {
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-        if (!profile.getPlacedAnvil()) {
+        if (!mcMMOPlayer.getPlacedAnvil()) {
             if (mcMMO.spoutEnabled) {
                 SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player);
 
@@ -219,7 +219,7 @@ public class Repair {
             }
 
             player.playSound(player.getLocation(), Sound.ANVIL_LAND, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
-            profile.togglePlacedAnvil();
+            mcMMOPlayer.togglePlacedAnvil();
         }
     }
 

+ 4 - 4
src/main/java/com/gmail/nossr50/skills/repair/Salvage.java

@@ -11,7 +11,7 @@ import org.getspout.spoutapi.player.SpoutPlayer;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.ItemUtils;
@@ -59,9 +59,9 @@ public class Salvage {
      * @param anvilID The item ID of the anvil block
      */
     public static void placedAnvilCheck(final Player player, final int anvilID) {
-        final PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-        if (!profile.getPlacedSalvageAnvil()) {
+        if (!mcMMOPlayer.getPlacedSalvageAnvil()) {
             if (mcMMO.spoutEnabled) {
                 final SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player);
 
@@ -74,7 +74,7 @@ public class Salvage {
             }
 
             player.playSound(player.getLocation(), Sound.ANVIL_LAND, Misc.ANVIL_USE_VOLUME, Misc.ANVIL_USE_PITCH);
-            profile.togglePlacedSalvageAnvil();
+            mcMMOPlayer.togglePlacedSalvageAnvil();
         }
     }
 

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

@@ -34,14 +34,14 @@ public class SwordsManager extends SkillManager {
                 BleedTimerTask.add(target, Swords.bleedBaseTicks);
             }
 
-            if (getProfile().useChatNotifications()) {
+            if (mcMMOPlayer.useChatNotifications()) {
                 player.sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding"));
             }
 
             if (target instanceof Player) {
                 Player defender = (Player) target;
 
-                if (UserManager.getPlayer(defender).getProfile().useChatNotifications()) {
+                if (UserManager.getPlayer(defender).useChatNotifications()) {
                     defender.sendMessage(LocaleLoader.getString("Swords.Combat.Bleeding.Started"));
                 }
             }

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java

@@ -108,7 +108,7 @@ public class TamingManager extends SkillManager {
      * @param livingEntity The entity to examine
      */
     public void beastLore(LivingEntity livingEntity) {
-        BeastLoreEventHandler eventHandler = new BeastLoreEventHandler(mcMMOPlayer.getPlayer(), livingEntity);
+        BeastLoreEventHandler eventHandler = new BeastLoreEventHandler(getPlayer(), livingEntity);
         eventHandler.sendInspectMessage();
     }
 
@@ -119,11 +119,11 @@ public class TamingManager extends SkillManager {
      * @param summonAmount The amount of material needed to summon the entity
      */
     private void callOfTheWild(EntityType type, int summonAmount) {
-        if (!Permissions.callOfTheWild(mcMMOPlayer.getPlayer())) {
+        if (!Permissions.callOfTheWild(getPlayer())) {
             return;
         }
 
-        CallOfTheWildEventHandler eventHandler = new CallOfTheWildEventHandler(mcMMOPlayer.getPlayer(), type, summonAmount);
+        CallOfTheWildEventHandler eventHandler = new CallOfTheWildEventHandler(getPlayer(), type, summonAmount);
 
         ItemStack inHand = eventHandler.inHand;
         int inHandAmount = inHand.getAmount();

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

@@ -6,7 +6,6 @@ import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.metrics.MetricsManager;
 import com.gmail.nossr50.util.player.UserManager;
@@ -27,10 +26,9 @@ public final class ChimaeraWing {
             return;
         }
 
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
         Block block = player.getLocation().getBlock();
         int amount = inHand.getAmount();
-        long recentlyHurt = profile.getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
+        long recentlyHurt = UserManager.getPlayer(player).getRecentlyHurt() * Misc.TIME_CONVERSION_FACTOR;
 
         if (Permissions.chimaeraWing(player) && inHand.getTypeId() == Config.getInstance().getChimaeraItemId()) {
             if (SkillUtils.cooldownOver(recentlyHurt, 60, player) && amount >= Config.getInstance().getChimaeraCost()) {

+ 9 - 13
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java

@@ -21,7 +21,6 @@ import org.bukkit.inventory.ItemStack;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.skills.ToolType;
@@ -90,11 +89,10 @@ public final class CombatUtils {
                 }
 
                 if (Permissions.skillEnabled(player, SkillType.SWORDS)) {
-                    PlayerProfile profile = mcMMOPlayer.getProfile();
                     boolean canSerratedStrike = Permissions.serratedStrikes(player); // So we don't have to check the same permission twice
 
-                    if (profile.getToolPreparationMode(ToolType.SWORD) && canSerratedStrike) {
-                        SkillUtils.abilityCheck(player, SkillType.SWORDS);
+                    if (mcMMOPlayer.getToolPreparationMode(ToolType.SWORD) && canSerratedStrike) {
+                        SkillUtils.abilityCheck(mcMMOPlayer, SkillType.SWORDS);
                     }
 
                     SwordsManager swordsManager = mcMMOPlayer.getSwordsManager();
@@ -103,7 +101,7 @@ public final class CombatUtils {
                         swordsManager.bleedCheck(target);
                     }
 
-                    if (profile.getAbilityMode(AbilityType.SERRATED_STRIKES) && canSerratedStrike) {
+                    if (mcMMOPlayer.getAbilityMode(AbilityType.SERRATED_STRIKES) && canSerratedStrike) {
                         swordsManager.serratedStrikes(target, event.getDamage());
                     }
 
@@ -119,7 +117,7 @@ public final class CombatUtils {
                     AxesManager axesManager = mcMMOPlayer.getAxesManager();
 
                     if (axesManager.canActivateAbility()) {
-                        SkillUtils.abilityCheck(player, SkillType.AXES);
+                        SkillUtils.abilityCheck(mcMMOPlayer, SkillType.AXES);
                     }
 
                     if (axesManager.canUseAxeMastery()) {
@@ -155,12 +153,10 @@ public final class CombatUtils {
                 }
 
                 if (Permissions.skillEnabled(player, SkillType.UNARMED)) {
-                    PlayerProfile profile = mcMMOPlayer.getProfile();
-
                     boolean canBerserk = Permissions.berserk(player); // So we don't have to check the same permission twice
 
-                    if (profile.getToolPreparationMode(ToolType.FISTS) && canBerserk) {
-                        SkillUtils.abilityCheck(player, SkillType.UNARMED);
+                    if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && canBerserk) {
+                        SkillUtils.abilityCheck(mcMMOPlayer, SkillType.UNARMED);
                     }
 
                     UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager();
@@ -169,7 +165,7 @@ public final class CombatUtils {
                         event.setDamage(unarmedManager.ironArmCheck(event.getDamage()));
                     }
 
-                    if (profile.getAbilityMode(AbilityType.BERSERK) && canBerserk) {
+                    if (mcMMOPlayer.getAbilityMode(AbilityType.BERSERK) && canBerserk) {
                         event.setDamage(unarmedManager.berserkDamage(event.getDamage()));
                     }
 
@@ -450,7 +446,7 @@ public final class CombatUtils {
 
             Player defender = (Player) target;
 
-            if (System.currentTimeMillis() >= UserManager.getPlayer(defender).getProfile().getRespawnATS() + 5) {
+            if (System.currentTimeMillis() >= UserManager.getPlayer(defender).getRespawnATS() + 5) {
                 baseXP = 20 * Config.getInstance().getPlayerVersusPlayerXP();
             }
         }
@@ -538,7 +534,7 @@ public final class CombatUtils {
         if (entity instanceof Player) {
             Player defender = (Player) entity;
 
-            if (!defender.getWorld().getPVP() || defender == player || UserManager.getPlayer(defender).getProfile().getGodMode()) {
+            if (!defender.getWorld().getPVP() || defender == player || UserManager.getPlayer(defender).getGodMode()) {
                 return false;
             }
 

+ 49 - 51
src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java

@@ -21,6 +21,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.HiddenConfig;
 import com.gmail.nossr50.config.spout.SpoutConfig;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
@@ -87,17 +88,18 @@ public class SkillUtils {
     /**
      * Sends a message to the player when the cooldown expires.
      *
-     * @param player The player to send a message to
-     * @param profile The profile of the player
+     * @param mcMMOPlayer The player to send a message to
      * @param ability The ability to watch cooldowns for
      */
-    public static void watchCooldown(Player player, PlayerProfile profile, AbilityType ability) {
-        if (player == null || profile == null || ability == null) {
+    public static void watchCooldown(McMMOPlayer mcMMOPlayer, AbilityType ability) {
+        if (mcMMOPlayer == null || ability == null) {
             return;
         }
 
-        if (!profile.getAbilityInformed(ability) && cooldownOver(profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
-            profile.setAbilityInformed(ability, true);
+        Player player = mcMMOPlayer.getPlayer();
+
+        if (!mcMMOPlayer.getAbilityInformed(ability) && cooldownOver(mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
+            mcMMOPlayer.setAbilityInformed(ability, true);
             player.sendMessage(ability.getAbilityRefresh());
         }
     }
@@ -113,7 +115,7 @@ public class SkillUtils {
             return;
         }
 
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
         AbilityType ability = skill.getAbility();
         ToolType tool = skill.getTool();
         ItemStack inHand = player.getItemInHand();
@@ -122,29 +124,26 @@ public class SkillUtils {
             return;
         }
 
-        /* Check if any abilities are active */
-        if (profile == null) {
+        if (!mcMMOPlayer.getAbilityUse()) {
             return;
         }
 
-        if (!profile.getAbilityUse()) {
-            return;
-        }
-
-        for (AbilityType x : AbilityType.values()) {
-            if (profile.getAbilityMode(x)) {
+        for (AbilityType abilityType : AbilityType.values()) {
+            if (mcMMOPlayer.getAbilityMode(abilityType)) {
                 return;
             }
         }
 
+        PlayerProfile playerProfile = mcMMOPlayer.getProfile();
+
         /*
          * Woodcutting & Axes need to be treated differently.
          * Basically the tool always needs to ready and we check to see if the cooldown is over when the user takes action
          */
-        if (ability.getPermissions(player) && tool.inHand(inHand) && !profile.getToolPreparationMode(tool)) {
+        if (ability.getPermissions(player) && tool.inHand(inHand) && !mcMMOPlayer.getToolPreparationMode(tool)) {
             if (skill != SkillType.WOODCUTTING && skill != SkillType.AXES) {
-                if (!profile.getAbilityMode(ability) && !cooldownOver(profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
-                    player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
+                if (!mcMMOPlayer.getAbilityMode(ability) && !cooldownOver(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
+                    player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
                     return;
                 }
             }
@@ -153,39 +152,36 @@ public class SkillUtils {
                 player.sendMessage(tool.getRaiseTool());
             }
 
-            profile.setToolPreparationATS(tool, System.currentTimeMillis());
-            profile.setToolPreparationMode(tool, true);
+            mcMMOPlayer.setToolPreparationATS(tool, System.currentTimeMillis());
+            mcMMOPlayer.setToolPreparationMode(tool, true);
         }
     }
 
     /**
      * Monitors various things relating to skill abilities.
      *
-     * @param player The player using the skill
+     * @param mcMMOPlayer The player using the skill
      * @param profile The profile of the player
      * @param curTime The current system time
      * @param skill The skill being monitored
      */
-    public static void monitorSkill(Player player, PlayerProfile profile, long curTime, SkillType skill) {
+    public static void monitorSkill(McMMOPlayer mcMMOPlayer, long curTime, SkillType skill) {
         final int FOUR_SECONDS = 4000;
-
         ToolType tool = skill.getTool();
-        AbilityType ability = skill.getAbility();
-
-        if (profile == null) {
-            return;
-        }
 
-        if (profile.getToolPreparationMode(tool) && curTime - (profile.getToolPreparationATS(tool) * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
-            profile.setToolPreparationMode(tool, false);
+        if (mcMMOPlayer.getToolPreparationMode(tool) && curTime - (mcMMOPlayer.getToolPreparationATS(tool) * Misc.TIME_CONVERSION_FACTOR) >= FOUR_SECONDS) {
+            mcMMOPlayer.setToolPreparationMode(tool, false);
 
             if (Config.getInstance().getAbilityMessagesEnabled()) {
-                player.sendMessage(tool.getLowerTool());
+                mcMMOPlayer.getPlayer().sendMessage(tool.getLowerTool());
             }
         }
 
+        AbilityType ability = skill.getAbility();
+        Player player = mcMMOPlayer.getPlayer();
+
         if (ability.getPermissions(player)) {
-            if (profile.getAbilityMode(ability) && (profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
+            if (mcMMOPlayer.getAbilityMode(ability) && (mcMMOPlayer.getProfile().getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR) <= curTime) {
                 if (ability == AbilityType.BERSERK) {
                     player.setCanPickupItems(true);
                 }
@@ -193,12 +189,12 @@ public class SkillUtils {
                     handleAbilitySpeedDecrease(player);
                 }
 
-                profile.setAbilityMode(ability, false);
-                profile.setAbilityInformed(ability, false);
+                mcMMOPlayer.setAbilityMode(ability, false);
+                mcMMOPlayer.setAbilityInformed(ability, false);
 
                 ParticleEffectUtils.playAbilityDisabledEffect(player);
 
-                if (profile.useChatNotifications()) {
+                if (mcMMOPlayer.useChatNotifications()) {
                     player.sendMessage(ability.getAbilityOff());
                 }
 
@@ -368,40 +364,42 @@ public class SkillUtils {
     /**
      * Check to see if an ability can be activated.
      *
-     * @param player The player activating the ability
+     * @param mcMMOPlayer The player activating the ability
      * @param type The skill the ability is based on
      */
-    public static void abilityCheck(Player player, SkillType type) {
-        PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+    public static void abilityCheck(McMMOPlayer mcMMOPlayer, SkillType type) {
         ToolType tool = type.getTool();
         AbilityType ability = type.getAbility();
 
-        profile.setToolPreparationMode(tool, false);
+        mcMMOPlayer.setToolPreparationMode(tool, false);
+
+        Player player = mcMMOPlayer.getPlayer();
+        PlayerProfile playerProfile = mcMMOPlayer.getProfile();
 
         /*
          * Axes and Woodcutting are odd because they share the same tool.
          * We show them the too tired message when they take action.
          */
         if (type == SkillType.WOODCUTTING || type == SkillType.AXES) {
-            if (!profile.getAbilityMode(ability) && !cooldownOver(profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
-                player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(profile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
+            if (!mcMMOPlayer.getAbilityMode(ability) && !cooldownOver(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)) {
+                player.sendMessage(LocaleLoader.getString("Skills.TooTired", calculateTimeLeft(playerProfile.getSkillDATS(ability) * Misc.TIME_CONVERSION_FACTOR, ability.getCooldown(), player)));
                 return;
             }
         }
 
-        if (!profile.getAbilityMode(ability) && cooldownOver(profile.getSkillDATS(ability), ability.getCooldown(), player)) {
-            int ticks = PerksUtils.handleActivationPerks(player, 2 + (profile.getSkillLevel(type) / AdvancedConfig.getInstance().getAbilityLength()), ability.getMaxTicks());
+        if (!mcMMOPlayer.getAbilityMode(ability) && cooldownOver(playerProfile.getSkillDATS(ability), ability.getCooldown(), player)) {
+            int ticks = PerksUtils.handleActivationPerks(player, 2 + (playerProfile.getSkillLevel(type) / AdvancedConfig.getInstance().getAbilityLength()), ability.getMaxTicks());
 
             ParticleEffectUtils.playAbilityEnabledEffect(player);
 
-            if (profile.useChatNotifications()) {
+            if (mcMMOPlayer.useChatNotifications()) {
                 player.sendMessage(ability.getAbilityOn());
             }
 
             SkillUtils.sendSkillMessage(player, ability.getAbilityPlayer(player));
 
-            profile.setSkillDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
-            profile.setAbilityMode(ability, true);
+            playerProfile.setSkillDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
+            mcMMOPlayer.setAbilityMode(ability, true);
 
             if (ability == AbilityType.BERSERK) {
                 player.setCanPickupItems(false);
@@ -514,14 +512,14 @@ public class SkillUtils {
                 }
             }
 
-            PlayerProfile profile = UserManager.getPlayer(player).getProfile();
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
             int ticks = 0;
 
-            if (profile.getAbilityMode(AbilityType.SUPER_BREAKER)) {
-                ticks = ((int) (profile.getSkillDATS(AbilityType.SUPER_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
+            if (mcMMOPlayer.getAbilityMode(AbilityType.SUPER_BREAKER)) {
+                ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.SUPER_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
             }
-            else if (profile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
-                ticks = ((int) (profile.getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
+            else if (mcMMOPlayer.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER)) {
+                ticks = ((int) (mcMMOPlayer.getProfile().getSkillDATS(AbilityType.GIGA_DRILL_BREAKER) - System.currentTimeMillis())) / Misc.TIME_CONVERSION_FACTOR;
             }
 
             PotionEffect abilityBuff = new PotionEffect(PotionEffectType.FAST_DIGGING, duration + ticks, amplifier + 10);