Browse Source

Rollback command classes to master versions

nossr50 4 years ago
parent
commit
e958baf720
65 changed files with 1200 additions and 812 deletions
  1. 0 30
      src/main/java/com/gmail/nossr50/commands/AbilityToggleCommand.java
  2. 4 3
      src/main/java/com/gmail/nossr50/commands/CommandManager.java
  3. 6 5
      src/main/java/com/gmail/nossr50/commands/MHDCommand.java
  4. 336 0
      src/main/java/com/gmail/nossr50/commands/McImportCommand.java
  5. 29 0
      src/main/java/com/gmail/nossr50/commands/McabilityCommand.java
  6. 7 8
      src/main/java/com/gmail/nossr50/commands/McgodCommand.java
  7. 1 2
      src/main/java/com/gmail/nossr50/commands/McmmoCommand.java
  8. 6 6
      src/main/java/com/gmail/nossr50/commands/McnotifyCommand.java
  9. 10 11
      src/main/java/com/gmail/nossr50/commands/McrefreshCommand.java
  10. 12 23
      src/main/java/com/gmail/nossr50/commands/ToggleCommand.java
  11. 5 12
      src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java
  12. 3 3
      src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java
  13. 7 8
      src/main/java/com/gmail/nossr50/commands/chat/McChatSpy.java
  14. 8 8
      src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java
  15. 7 12
      src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java
  16. 5 9
      src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java
  17. 8 7
      src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java
  18. 10 7
      src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java
  19. 3 2
      src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java
  20. 8 8
      src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java
  21. 12 12
      src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java
  22. 7 7
      src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java
  23. 12 12
      src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java
  24. 8 7
      src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java
  25. 7 11
      src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java
  26. 8 8
      src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java
  27. 33 18
      src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java
  28. 8 8
      src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java
  29. 9 8
      src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java
  30. 32 13
      src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java
  31. 12 11
      src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java
  32. 88 0
      src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java
  33. 9 7
      src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java
  34. 9 7
      src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java
  35. 15 15
      src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java
  36. 7 6
      src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java
  37. 3 36
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java
  38. 6 5
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java
  39. 27 27
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java
  40. 3 4
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java
  41. 5 4
      src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java
  42. 12 11
      src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java
  43. 5 8
      src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java
  44. 21 23
      src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java
  45. 22 19
      src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java
  46. 1 1
      src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java
  47. 13 15
      src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java
  48. 15 24
      src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java
  49. 1 1
      src/main/java/com/gmail/nossr50/commands/skills/AprilCommand.java
  50. 16 16
      src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java
  51. 19 18
      src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java
  52. 13 14
      src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java
  53. 18 18
      src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
  54. 21 33
      src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java
  55. 16 15
      src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java
  56. 7 19
      src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java
  57. 22 21
      src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java
  58. 12 11
      src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java
  59. 76 59
      src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java
  60. 6 10
      src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java
  61. 14 13
      src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java
  62. 22 21
      src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java
  63. 17 17
      src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java
  64. 20 19
      src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java
  65. 16 16
      src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java

+ 0 - 30
src/main/java/com/gmail/nossr50/commands/AbilityToggleCommand.java

@@ -1,30 +0,0 @@
-package com.gmail.nossr50.commands;
-
-import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
-import org.bukkit.command.CommandSender;
-import org.jetbrains.annotations.NotNull;
-
-public class AbilityToggleCommand extends ToggleCommand {
-    @Override
-    protected boolean hasOtherPermission(@NotNull CommandSender sender) {
-        return Permissions.mcabilityOthers(sender);
-    }
-
-    @Override
-    protected boolean hasSelfPermission(@NotNull CommandSender sender) {
-        return Permissions.mcability(sender);
-    }
-
-    @Override
-    protected void applyCommandAction(@NotNull OnlineMMOPlayer mmoPlayer) {
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.Ability." + (mmoPlayer.getSuperAbilityManager().getAbilityActivationPermission() ? "Off" : "On")));
-        mmoPlayer.getSuperAbilityManager().toggleAbilityActivationPermission();
-    }
-
-    @Override
-    protected void sendSuccessMessage(@NotNull CommandSender sender, @NotNull String playerName) {
-        sender.sendMessage(LocaleLoader.getString("Commands.Ability.Toggle", playerName));
-    }
-}

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

@@ -7,10 +7,11 @@ import com.gmail.nossr50.commands.chat.AdminChatCommand;
 import com.gmail.nossr50.commands.chat.PartyChatCommand;
 import com.gmail.nossr50.config.ChatConfig;
 import com.gmail.nossr50.datatypes.chat.ChatChannel;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.entity.Player;
 import org.bukkit.permissions.Permissible;
 import org.jetbrains.annotations.NotNull;
@@ -96,13 +97,13 @@ public class CommandManager {
     }
 
     public void validateLoadedData(@NotNull Player player) {
-        if(mcMMO.getUserManager().queryPlayer(player) == null) {
+        if(UserManager.getPlayer(player) == null) {
             throw new ConditionFailedException(LocaleLoader.getString("Profile.PendingLoad"));
         }
     }
 
     public void validatePlayerParty(@NotNull Player player) {
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+        McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
 
         if(mmoPlayer.getParty() == null) {
             throw new ConditionFailedException(LocaleLoader.getString("Commands.Party.None"));

+ 6 - 5
src/main/java/com/gmail/nossr50/commands/MHDCommand.java

@@ -3,9 +3,10 @@ package com.gmail.nossr50.commands;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.database.FlatFileDatabaseManager;
 import com.gmail.nossr50.database.SQLDatabaseManager;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -20,8 +21,8 @@ public class MHDCommand implements TabExecutor {
         if (mcMMO.getDatabaseManager() instanceof SQLDatabaseManager) {
             SQLDatabaseManager m = (SQLDatabaseManager) mcMMO.getDatabaseManager();
             m.resetMobHealthSettings();
-            for (OnlineMMOPlayer mmoPlayer : mcMMO.getUserManager().getPlayers()) {
-                mmoPlayer.setMobHealthBarType(Config.getInstance().getMobHealthbarDefault());
+            for (McMMOPlayer player : UserManager.getPlayers()) {
+                player.getProfile().setMobHealthbarType(Config.getInstance().getMobHealthbarDefault());
             }
             sender.sendMessage("Mob health reset");
             return true;
@@ -29,8 +30,8 @@ public class MHDCommand implements TabExecutor {
         if (mcMMO.getDatabaseManager() instanceof FlatFileDatabaseManager) {
             FlatFileDatabaseManager m = (FlatFileDatabaseManager) mcMMO.getDatabaseManager();
             m.resetMobHealthSettings();
-            for (OnlineMMOPlayer mmoPlayer : mcMMO.getUserManager().getPlayers()) {
-                mmoPlayer.setMobHealthBarType(Config.getInstance().getMobHealthbarDefault());
+            for (McMMOPlayer player : UserManager.getPlayers()) {
+                player.getProfile().setMobHealthbarType(Config.getInstance().getMobHealthbarDefault());
             }
             sender.sendMessage("Mob health reset");
             return true;

+ 336 - 0
src/main/java/com/gmail/nossr50/commands/McImportCommand.java

@@ -0,0 +1,336 @@
+package com.gmail.nossr50.commands;
+
+import com.gmail.nossr50.datatypes.skills.ModConfigType;
+import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.util.Misc;
+import org.bukkit.Material;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Locale;
+
+public class McImportCommand implements CommandExecutor {
+    int fileAmount;
+
+    @Override
+    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+        if (args.length == 0) {
+            importModConfig();
+            return true;
+        }
+        return false;
+    }
+
+    public boolean importModConfig() {
+        String importFilePath = mcMMO.getModDirectory() + File.separator + "import";
+        File importFile = new File(importFilePath, "import.log");
+        mcMMO.p.getLogger().info("Starting import of mod materials...");
+        fileAmount = 0;
+
+        HashMap<ModConfigType, ArrayList<String>> materialNames = new HashMap<>();
+
+        BufferedReader in = null;
+
+        try {
+            // Open the file
+            in = new BufferedReader(new FileReader(importFile));
+
+            String line;
+            String materialName;
+            String modName;
+
+            // While not at the end of the file
+            while ((line = in.readLine()) != null) {
+                String[] split1 = line.split("material ");
+
+                if (split1.length != 2) {
+                    continue;
+                }
+
+                String[] split2 = split1[1].split(" with");
+
+                if (split2.length != 2) {
+                    continue;
+                }
+
+                materialName = split2[0];
+
+                // Categorise each material under a mod config type
+                ModConfigType type = ModConfigType.getModConfigType(materialName);
+
+                if (!materialNames.containsKey(type)) {
+                    materialNames.put(type, new ArrayList<>());
+                }
+
+                materialNames.get(type).add(materialName);
+            }
+        }
+        catch (FileNotFoundException e) {
+            mcMMO.p.getLogger().warning("Could not find " + importFile.getAbsolutePath() + " ! (No such file or directory)");
+            mcMMO.p.getLogger().warning("Copy and paste latest.log to " + importFile.getParentFile().getAbsolutePath() + " and rename it to import.log");
+            return false;
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        finally {
+            tryClose(in);
+        }
+
+        createOutput(materialNames);
+
+        mcMMO.p.getLogger().info("Import finished! Created " + fileAmount + " files!");
+        return true;
+    }
+
+    private void createOutput(HashMap<ModConfigType, ArrayList<String>> materialNames) {
+        for (ModConfigType modConfigType : materialNames.keySet()) {
+            HashMap<String, ArrayList<String>> materialNamesType = new HashMap<>();
+
+            for (String materialName : materialNames.get(modConfigType)) {
+                String modName = Misc.getModName(materialName);
+
+                if (!materialNamesType.containsKey(modName)) {
+                    materialNamesType.put(modName, new ArrayList<>());
+                }
+
+                materialNamesType.get(modName).add(materialName);
+            }
+
+            createOutput(modConfigType, materialNamesType);
+        }
+
+    }
+
+    private void tryClose(Closeable c) {
+        if (c == null) {
+            return;
+        }
+        try {
+            c.close();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void createOutput(ModConfigType modConfigType, HashMap<String, ArrayList<String>> materialNames) {
+        File outputFilePath = new File(mcMMO.getModDirectory() + File.separator + "output");
+        if (!outputFilePath.exists() && !outputFilePath.mkdirs()) {
+            mcMMO.p.getLogger().severe("Could not create output directory! " + outputFilePath.getAbsolutePath());
+        }
+
+        FileWriter out = null;
+        String type = modConfigType.name().toLowerCase(Locale.ENGLISH);
+
+        for (String modName : materialNames.keySet()) {
+            File outputFile = new File(outputFilePath, modName + "." + type + ".yml");
+            mcMMO.p.getLogger().info("Creating " + outputFile.getName());
+            try {
+                if (outputFile.exists() && !outputFile.delete()) {
+                    mcMMO.p.getLogger().severe("Not able to delete old output file! " + outputFile.getAbsolutePath());
+                }
+
+                if (!outputFile.createNewFile()) {
+                    mcMMO.p.getLogger().severe("Could not create output file! " + outputFile.getAbsolutePath());
+                    continue;
+                }
+
+                StringBuilder writer = new StringBuilder();
+                HashMap<String, ArrayList<String>> configSections = getConfigSections(modConfigType, modName, materialNames);
+
+                if (configSections == null) {
+                    mcMMO.p.getLogger().severe("Something went wrong!! type is " + type);
+                    return;
+                }
+
+                // Write the file, go through each skill and write all the materials
+                for (String configSection : configSections.keySet()) {
+                    if (configSection.equals("UNIDENTIFIED")) {
+                        writer.append("# This isn't a valid config section and all materials in this category need to be").append("\r\n");
+                        writer.append("# copy and pasted to a valid section of this config file.").append("\r\n");
+                    }
+                    writer.append(configSection).append(":").append("\r\n");
+
+                    for (String line : configSections.get(configSection)) {
+                        writer.append(line).append("\r\n");
+                    }
+
+                    writer.append("\r\n");
+                }
+
+                out = new FileWriter(outputFile);
+                out.write(writer.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+                return;
+            } finally {
+                tryClose(out);
+                fileAmount++;
+            }
+        }
+    }
+
+    private HashMap<String, ArrayList<String>> getConfigSections(ModConfigType type, String modName, HashMap<String, ArrayList<String>> materialNames) {
+        switch (type) {
+            case BLOCKS:
+                return getConfigSectionsBlocks(modName, materialNames);
+            case TOOLS:
+                return getConfigSectionsTools(modName, materialNames);
+            case ARMOR:
+                return getConfigSectionsArmor(modName, materialNames);
+            case UNKNOWN:
+                return getConfigSectionsUnknown(modName, materialNames);
+        }
+
+        return null;
+    }
+
+    private HashMap<String, ArrayList<String>> getConfigSectionsBlocks(String modName, HashMap<String, ArrayList<String>> materialNames) {
+        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
+
+        // Go through all the materials and categorise them under a skill
+        for (String materialName : materialNames.get(modName)) {
+            String skillName = "UNIDENTIFIED";
+            if (materialName.contains("ORE")) {
+                skillName = "Mining";
+            }
+            else if (materialName.contains("LOG") || materialName.contains("LEAVES")) {
+                skillName = "Woodcutting";
+            }
+            else if (materialName.contains("GRASS") || materialName.contains("FLOWER") || materialName.contains("CROP")) {
+                skillName = "Herbalism";
+            }
+            else if (materialName.contains("DIRT") || materialName.contains("SAND")) {
+                skillName = "Excavation";
+            }
+
+            if (!configSections.containsKey(skillName)) {
+                configSections.put(skillName, new ArrayList<>());
+            }
+
+            ArrayList<String> skillContents = configSections.get(skillName);
+            skillContents.add("    " + materialName + "|0:");
+            skillContents.add("    " + "    " + "XP_Gain: 99");
+            skillContents.add("    " + "    " + "Double_Drops_Enabled: true");
+
+            if (skillName.equals("Mining")) {
+                skillContents.add("    " + "    " + "Smelting_XP_Gain: 9");
+            }
+            else if (skillName.equals("Woodcutting")) {
+                skillContents.add("    " + "    " + "Is_Log: " + materialName.contains("LOG"));
+            }
+        }
+
+        return configSections;
+    }
+
+    private HashMap<String, ArrayList<String>> getConfigSectionsTools(String modName, HashMap<String, ArrayList<String>> materialNames) {
+        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
+
+        // Go through all the materials and categorise them under a tool type
+        for (String materialName : materialNames.get(modName)) {
+            String toolType = "UNIDENTIFIED";
+            if (materialName.contains("PICKAXE")) {
+                toolType = "Pickaxes";
+            }
+            else if (materialName.contains("AXE")) {
+                toolType = "Axes";
+            }
+            else if (materialName.contains("BOW")) {
+                toolType = "Bows";
+            }
+            else if (materialName.contains("HOE")) {
+                toolType = "Hoes";
+            }
+            else if (materialName.contains("SHOVEL") || materialName.contains("SPADE")) {
+                toolType = "Shovels";
+            }
+            else if (materialName.contains("SWORD")) {
+                toolType = "Swords";
+            }
+
+            if (!configSections.containsKey(toolType)) {
+                configSections.put(toolType, new ArrayList<>());
+            }
+
+            ArrayList<String> skillContents = configSections.get(toolType);
+            skillContents.add("    " + materialName + ":");
+            skillContents.add("    " + "    " + "XP_Modifier: 1.0");
+            skillContents.add("    " + "    " + "Tier: 1");
+            skillContents.add("    " + "    " + "Ability_Enabled: true");
+            addRepairableLines(materialName, skillContents);
+        }
+
+        return configSections;
+    }
+
+    private HashMap<String, ArrayList<String>> getConfigSectionsArmor(String modName, HashMap<String, ArrayList<String>> materialNames) {
+        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
+
+        // Go through all the materials and categorise them under an armor type
+        for (String materialName : materialNames.get(modName)) {
+            String toolType = "UNIDENTIFIED";
+            if (materialName.contains("BOOT") || materialName.contains("SHOE")) {
+                toolType = "Boots";
+            }
+            else if (materialName.contains("CHESTPLATE") || materialName.contains("CHEST")) {
+                toolType = "Chestplates";
+            }
+            else if (materialName.contains("HELM") || materialName.contains("HAT")) {
+                toolType = "Helmets";
+            }
+            else if (materialName.contains("LEGGINGS") || materialName.contains("LEGS") || materialName.contains("PANTS")) {
+                toolType = "Leggings";
+            }
+
+            if (!configSections.containsKey(toolType)) {
+                configSections.put(toolType, new ArrayList<>());
+            }
+
+            ArrayList<String> skillContents = configSections.get(toolType);
+            skillContents.add("    " + materialName + ":");
+            addRepairableLines(materialName, skillContents);
+        }
+
+        return configSections;
+    }
+
+    private void addRepairableLines(String materialName, ArrayList<String> skillContents) {
+        skillContents.add("    " + "    " + "Repairable: true");
+        skillContents.add("    " + "    " + "Repair_Material: REPAIR_MATERIAL_NAME");
+        skillContents.add("    " + "    " + "Repair_Material_Data_Value: 0");
+        skillContents.add("    " + "    " + "Repair_Material_Quantity: 9");
+        skillContents.add("    " + "    " + "Repair_Material_Pretty_Name: Repair Item Name");
+        skillContents.add("    " + "    " + "Repair_MinimumLevel: 0");
+        skillContents.add("    " + "    " + "Repair_XpMultiplier: 1.0");
+
+        Material material = Material.matchMaterial(materialName);
+        short durability = (material == null) ? (short) 9999 : material.getMaxDurability();
+        skillContents.add("    " + "    " + "Durability: " + ((durability > 0) ? durability : (short) 9999));
+    }
+
+    private HashMap<String, ArrayList<String>> getConfigSectionsUnknown(String modName, HashMap<String, ArrayList<String>> materialNames) {
+        HashMap<String, ArrayList<String>> configSections = new HashMap<>();
+
+        // Go through all the materials and print them
+        for (String materialName : materialNames.get(modName)) {
+            String configKey = "UNIDENTIFIED";
+
+            if (!configSections.containsKey(configKey)) {
+                configSections.put(configKey, new ArrayList<>());
+            }
+
+            ArrayList<String> skillContents = configSections.get(configKey);
+            skillContents.add("    " + materialName);
+        }
+
+        return configSections;
+    }
+}

+ 29 - 0
src/main/java/com/gmail/nossr50/commands/McabilityCommand.java

@@ -0,0 +1,29 @@
+package com.gmail.nossr50.commands;
+
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
+import org.bukkit.command.CommandSender;
+
+public class McabilityCommand extends ToggleCommand {
+    @Override
+    protected boolean hasOtherPermission(CommandSender sender) {
+        return Permissions.mcabilityOthers(sender);
+    }
+
+    @Override
+    protected boolean hasSelfPermission(CommandSender sender) {
+        return Permissions.mcability(sender);
+    }
+
+    @Override
+    protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
+        mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.Ability." + (mcMMOPlayer.getAbilityUse() ? "Off" : "On")));
+        mcMMOPlayer.toggleAbilityUse();
+    }
+
+    @Override
+    protected void sendSuccessMessage(CommandSender sender, String playerName) {
+        sender.sendMessage(LocaleLoader.getString("Commands.Ability.Toggle", playerName));
+    }
+}

+ 7 - 8
src/main/java/com/gmail/nossr50/commands/McgodCommand.java

@@ -1,30 +1,29 @@
 package com.gmail.nossr50.commands;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.CommandSender;
-import org.jetbrains.annotations.NotNull;
 
 public class McgodCommand extends ToggleCommand {
     @Override
-    protected boolean hasOtherPermission(@NotNull CommandSender sender) {
+    protected boolean hasOtherPermission(CommandSender sender) {
         return Permissions.mcgodOthers(sender);
     }
 
     @Override
-    protected boolean hasSelfPermission(@NotNull CommandSender sender) {
+    protected boolean hasSelfPermission(CommandSender sender) {
         return Permissions.mcgod(sender);
     }
 
     @Override
-    protected void applyCommandAction(@NotNull OnlineMMOPlayer mmoPlayer) {
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.GodMode." + (mmoPlayer.getGodMode() ? "Disabled" : "Enabled")));
-        mmoPlayer.toggleGodMode();
+    protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
+        mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.GodMode." + (mcMMOPlayer.getGodMode() ? "Disabled" : "Enabled")));
+        mcMMOPlayer.toggleGodMode();
     }
 
     @Override
-    protected void sendSuccessMessage(@NotNull CommandSender sender, @NotNull String playerName) {
+    protected void sendSuccessMessage(CommandSender sender, String playerName) {
         sender.sendMessage(LocaleLoader.getString("Commands.GodMode.Toggle", playerName));
     }
 }

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

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.commands;
 
-import com.gmail.nossr50.commands.party.PartySubCommandType;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
@@ -109,7 +108,7 @@ public class McmmoCommand implements CommandExecutor {
             sender.sendMessage(ChatColor.DARK_AQUA + " /party invite <" + LocaleLoader.getString("Commands.Usage.Player") + "> " + LocaleLoader.getString("Commands.Party.Invite"));
             sender.sendMessage(ChatColor.DARK_AQUA + " /party accept " + LocaleLoader.getString("Commands.Party.Accept"));
 
-            if (Permissions.partySubcommand(sender, PartySubCommandType.TELEPORT)) {
+            if (Permissions.partySubcommand(sender, PartySubcommandType.TELEPORT)) {
                 sender.sendMessage(ChatColor.DARK_AQUA + " /party teleport <" + LocaleLoader.getString("Commands.Usage.Player") + "> " + LocaleLoader.getString("Commands.Party.Teleport"));
             }
         }

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

@@ -1,10 +1,10 @@
 package com.gmail.nossr50.commands;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -21,14 +21,14 @@ public class McnotifyCommand implements TabExecutor {
         }
 
         if (args.length == 0) {
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer((Player) sender);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender);
 
             //Not Loaded yet
-            if (mmoPlayer == null)
+            if (mcMMOPlayer == null)
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
 
-            sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mmoPlayer.hasSkillChatNotifications() ? "Off" : "On")));
-            mmoPlayer.toggleSkillChatNotifications();
+            sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mcMMOPlayer.useChatNotifications() ? "Off" : "On")));
+            mcMMOPlayer.toggleChatNotifications();
             return true;
         }
         return false;

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

@@ -1,34 +1,33 @@
 package com.gmail.nossr50.commands;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.CommandSender;
-import org.jetbrains.annotations.NotNull;
 
 public class McrefreshCommand extends ToggleCommand {
     @Override
-    protected boolean hasOtherPermission(@NotNull CommandSender sender) {
+    protected boolean hasOtherPermission(CommandSender sender) {
         return Permissions.mcrefreshOthers(sender);
     }
 
     @Override
-    protected boolean hasSelfPermission(@NotNull CommandSender sender) {
+    protected boolean hasSelfPermission(CommandSender sender) {
         return Permissions.mcrefresh(sender);
     }
 
     @Override
-    protected void applyCommandAction(@NotNull OnlineMMOPlayer mmoPlayer) {
-        mmoPlayer.setRecentlyHurtTimestamp(0);
-        mmoPlayer.getSuperAbilityManager().resetCooldowns();
-        mmoPlayer.getSuperAbilityManager().unprimeAllAbilityTools();
-        mmoPlayer.getSuperAbilityManager().disableSuperAbilities();
+    protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
+        mcMMOPlayer.setRecentlyHurt(0);
+        mcMMOPlayer.resetCooldowns();
+        mcMMOPlayer.resetToolPrepMode();
+        mcMMOPlayer.resetAbilityMode();
 
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
+        mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
     }
 
     @Override
-    protected void sendSuccessMessage(@NotNull CommandSender sender, @NotNull String playerName) {
+    protected void sendSuccessMessage(CommandSender sender, String playerName) {
         sender.sendMessage(LocaleLoader.getString("Commands.mcrefresh.Success", playerName));
     }
 }

+ 12 - 23
src/main/java/com/gmail/nossr50/commands/ToggleCommand.java

@@ -1,15 +1,12 @@
 package com.gmail.nossr50.commands;
 
-import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
-import org.bukkit.Bukkit;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
-import org.bukkit.entity.Player;
 import org.bukkit.util.StringUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -34,14 +31,7 @@ public abstract class ToggleCommand implements TabExecutor {
                     return true;
                 }
 
-                OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer((Player) sender);
-
-                if(mmoPlayer != null) {
-                    applyCommandAction(mmoPlayer);
-                } else {
-                    Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.NotLoaded"));
-                }
-
+                applyCommandAction(UserManager.getPlayer(sender.getName()));
                 return true;
 
             case 1:
@@ -51,18 +41,17 @@ public abstract class ToggleCommand implements TabExecutor {
                 }
 
                 String playerName = CommandUtils.getMatchedPlayerName(args[0]);
-                Player otherPlayer = Bukkit.getPlayer(playerName);
-                OnlineMMOPlayer mmoOther = mcMMO.getUserManager().queryPlayer(otherPlayer);
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName);
 
-                if (!CommandUtils.checkPlayerExistence(sender, playerName, mmoOther)) {
+                if (!CommandUtils.checkPlayerExistence(sender, playerName, mcMMOPlayer)) {
                     return true;
                 }
 
-                if(mmoOther.getPlayer().isOnline()) {
-                    return false;
+                if (CommandUtils.isOffline(sender, mcMMOPlayer.getPlayer())) {
+                    return true;
                 }
 
-                applyCommandAction(mmoOther);
+                applyCommandAction(mcMMOPlayer);
                 sendSuccessMessage(sender, playerName);
                 return true;
 
@@ -80,8 +69,8 @@ public abstract class ToggleCommand implements TabExecutor {
         return ImmutableList.of();
     }
 
-    protected abstract boolean hasOtherPermission(@NotNull CommandSender sender);
-    protected abstract boolean hasSelfPermission(@NotNull CommandSender sender);
-    protected abstract void applyCommandAction(@NotNull OnlineMMOPlayer mmoPlayer);
-    protected abstract void sendSuccessMessage(@NotNull CommandSender sender, @NotNull String playerName);
+    protected abstract boolean hasOtherPermission(CommandSender sender);
+    protected abstract boolean hasSelfPermission(CommandSender sender);
+    protected abstract void applyCommandAction(McMMOPlayer mcMMOPlayer);
+    protected abstract void sendSuccessMessage(CommandSender sender, String playerName);
 }

+ 5 - 12
src/main/java/com/gmail/nossr50/commands/admin/PlayerDebugCommand.java

@@ -1,9 +1,8 @@
 package com.gmail.nossr50.commands.admin;
 
-import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.util.player.NotificationManager;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -15,15 +14,9 @@ public class PlayerDebugCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if(sender instanceof Player) {
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer((Player) sender);
-
-            if(mmoPlayer == null) {
-                sender.sendMessage(LocaleLoader.getString("Commands.NotLoaded"));
-                return true;
-            }
-
-            mmoPlayer.toggleDebugMode(); //Toggle debug mode
-            NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Commands.Mmodebug.Toggle", String.valueOf(mmoPlayer.isDebugMode()));
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender);
+            mcMMOPlayer.toggleDebugMode(); //Toggle debug mode
+            NotificationManager.sendPlayerInformationChatOnlyPrefixed(mcMMOPlayer.getPlayer(), "Commands.Mmodebug.Toggle", String.valueOf(mcMMOPlayer.isDebugMode()));
             return true;
         } else {
             return false;

+ 3 - 3
src/main/java/com/gmail/nossr50/commands/chat/AdminChatCommand.java

@@ -8,9 +8,9 @@ import co.aikar.commands.annotation.Conditions;
 import co.aikar.commands.annotation.Default;
 import com.gmail.nossr50.commands.CommandManager;
 import com.gmail.nossr50.datatypes.chat.ChatChannel;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.player.UserManager;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.jetbrains.annotations.NotNull;
 
 @CommandPermission("mcmmo.chat.adminchat")
@@ -28,7 +28,7 @@ public class AdminChatCommand extends BaseCommand {
         if(args == null || args.length == 0) {
             //Process with no arguments
             if(bukkitCommandIssuer.isPlayer()) {
-                OnlineMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
+                McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
                 pluginRef.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.ADMIN);
             } else {
                 //Not support for console
@@ -36,7 +36,7 @@ public class AdminChatCommand extends BaseCommand {
             }
         } else {
             if(bukkitCommandIssuer.isPlayer()) {
-                OnlineMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
+                McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
 
                 if(mmoPlayer == null)
                     return;

+ 7 - 8
src/main/java/com/gmail/nossr50/commands/chat/McChatSpy.java

@@ -1,31 +1,30 @@
 package com.gmail.nossr50.commands.chat;
 
 import com.gmail.nossr50.commands.ToggleCommand;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.CommandSender;
-import org.jetbrains.annotations.NotNull;
 
 public class McChatSpy extends ToggleCommand {
     @Override
-    protected boolean hasOtherPermission(@NotNull CommandSender sender) {
+    protected boolean hasOtherPermission(CommandSender sender) {
         return Permissions.adminChatSpyOthers(sender);
     }
 
     @Override
-    protected boolean hasSelfPermission(@NotNull CommandSender sender) {
+    protected boolean hasSelfPermission(CommandSender sender) {
         return Permissions.adminChatSpy(sender);
     }
 
     @Override
-    protected void applyCommandAction(@NotNull OnlineMMOPlayer mmoPlayer) {
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.AdminChatSpy." + (mmoPlayer.isPartyChatSpying() ? "Disabled" : "Enabled")));
-        mmoPlayer.togglePartyChatSpying();
+    protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
+        mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.AdminChatSpy." + (mcMMOPlayer.isPartyChatSpying() ? "Disabled" : "Enabled")));
+        mcMMOPlayer.togglePartyChatSpying();
     }
 
     @Override
-    protected void sendSuccessMessage(@NotNull CommandSender sender, @NotNull String playerName) {
+    protected void sendSuccessMessage(CommandSender sender, String playerName) {
         sender.sendMessage(LocaleLoader.getString("Commands.AdminChatSpy.Toggle", playerName));
     }
 }

+ 8 - 8
src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java

@@ -8,12 +8,12 @@ import co.aikar.commands.annotation.Conditions;
 import co.aikar.commands.annotation.Default;
 import com.gmail.nossr50.commands.CommandManager;
 import com.gmail.nossr50.datatypes.chat.ChatChannel;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.party.PartyManagerImpl;
+import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.text.StringUtils;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 
@@ -34,7 +34,7 @@ public class PartyChatCommand extends BaseCommand {
         if(args == null || args.length == 0) {
             //Process with no arguments
             if(bukkitCommandIssuer.isPlayer()) {
-                OnlineMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
+                McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
                 pluginRef.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.PARTY);
             } else {
                 //Not support for console
@@ -47,7 +47,7 @@ public class PartyChatCommand extends BaseCommand {
              * Player Logic
              */
             if(bukkitCommandIssuer.getIssuer() instanceof Player) {
-                OnlineMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
+                McMMOPlayer mmoPlayer = UserManager.getPlayer(bukkitCommandIssuer.getPlayer());
                 processCommandArgsPlayer(mmoPlayer, args);
             /*
              * Console Logic
@@ -59,11 +59,11 @@ public class PartyChatCommand extends BaseCommand {
     }
 
     /**
-     * Processes the command with arguments for a {@link OnlineMMOPlayer}
+     * Processes the command with arguments for a {@link McMMOPlayer}
      * @param mmoPlayer target player
      * @param args command arguments
      */
-    private void processCommandArgsPlayer(@NotNull OnlineMMOPlayer mmoPlayer, @NotNull String[] args) {
+    private void processCommandArgsPlayer(@NotNull McMMOPlayer mmoPlayer, @NotNull String[] args) {
         //Player is not toggling and is chatting directly to party
         pluginRef.getChatManager().processPlayerMessage(mmoPlayer, args, ChatChannel.PARTY);
     }
@@ -78,7 +78,7 @@ public class PartyChatCommand extends BaseCommand {
             mcMMO.p.getLogger().severe("You need to specify a party name and then write a message afterwards.");
         } else {
             //Grab party
-            Party targetParty = PartyManagerImpl.getParty(args[0]);
+            Party targetParty = PartyManager.getParty(args[0]);
 
             if(targetParty != null) {
                 pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty);

+ 7 - 12
src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.database.DatabaseConversionTask;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -49,21 +50,15 @@ public class ConvertDatabaseCommand implements CommandExecutor {
 
             sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Start", previousType.toString(), newType.toString()));
 
-            mcMMO.getUserManager().saveAllSync();
-            mcMMO.getUserManager().clearAll();
-
-            if(oldDatabase == null) {
-                sender.sendMessage("Could not load the other database, failed to convert users.");
-                return true;
-            }
+            UserManager.saveAll();
+            UserManager.clearAll();
 
             for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
-                PlayerProfile profile = oldDatabase.queryPlayerDataByUUID(player.getUniqueId(), null);
+                PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId(), null);
 
-                if(profile == null)
-                    continue;
-
-                mcMMO.getUserManager().saveUserImmediately(profile.getPersistentPlayerData(), true);
+                if (profile.isLoaded()) {
+                    mcMMO.getDatabaseManager().saveUser(profile);
+                }
 
                 new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
             }

+ 5 - 9
src/main/java/com/gmail/nossr50/commands/database/DatabaseRemovePlayerCommand.java → src/main/java/com/gmail/nossr50/commands/database/McremoveCommand.java

@@ -3,12 +3,12 @@ package com.gmail.nossr50.commands.database;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
 import org.bukkit.Bukkit;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
-import org.bukkit.entity.Player;
 import org.bukkit.util.StringUtil;
 import org.jetbrains.annotations.NotNull;
 
@@ -16,24 +16,20 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
-public class DatabaseRemovePlayerCommand implements TabExecutor {
+public class McremoveCommand implements TabExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 1) {
             String playerName = CommandUtils.getMatchedPlayerName(args[0]);
 
-            if (mcMMO.getUserManager().queryPlayer(playerName) == null
-                    && CommandUtils.hasNoProfile(sender, mcMMO.getDatabaseManager().queryPlayerDataByUUID(playerName))) {
-                sender.sendMessage(LocaleLoader.getString("Commands.Offline"));
+            if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName))) {
                 return true;
             }
 
             UUID uuid = null;
 
-            Player targetPlayer = Bukkit.getPlayer(playerName);
-
-            if (targetPlayer != null) {
-                uuid = targetPlayer.getUniqueId();
+            if (Bukkit.getPlayer(playerName) != null) {
+                uuid = Bukkit.getPlayer(playerName).getUniqueId();
             }
 
             if (mcMMO.getDatabaseManager().removeUser(playerName, uuid)) {

+ 8 - 7
src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java

@@ -3,10 +3,10 @@ package com.gmail.nossr50.commands.experience;
 import com.gmail.nossr50.datatypes.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.skill.RootSkill;
 import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
@@ -23,9 +23,9 @@ public class AddlevelsCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handleCommand(Player player, PlayerProfile profile, RootSkill rootSkill, int value) {
-        float xpRemoved = profile.getSkillXpLevelRaw(rootSkill);
-        profile.addLevels(rootSkill, value);
+    protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
+        float xpRemoved = profile.getSkillXpLevelRaw(skill);
+        profile.addLevels(skill, value);
 
         if (player == null) {
             profile.scheduleAsyncSave();
@@ -35,10 +35,11 @@ public class AddlevelsCommand extends ExperienceCommand {
         McMMOPlayer mmoPlayer = UserManager.getPlayer(player);
 
         if(mmoPlayer == null) {
-            EventUtils.tryLevelChangeEvent(player, rootSkill, value, xpRemoved, true, XPGainReason.COMMAND);
+            EventUtils.tryLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND);
         } else {
             EventUtils.tryLevelChangeEvent(mmoPlayer, skill, value, xpRemoved, true, XPGainReason.COMMAND);
         }
+
     }
 
     @Override
@@ -50,10 +51,10 @@ public class AddlevelsCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handlePlayerMessageSkill(Player player, int value, RootSkill rootSkill, boolean isSilent) {
+    protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) {
         if(isSilent)
             return;
 
-        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, rootSkill.getName()));
+        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName()));
     }
 }

+ 10 - 7
src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java

@@ -1,9 +1,12 @@
 package com.gmail.nossr50.commands.experience;
 
+import com.gmail.nossr50.datatypes.experience.XPGainReason;
+import com.gmail.nossr50.datatypes.experience.XPGainSource;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.skill.RootSkill;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
@@ -19,16 +22,16 @@ public class AddxpCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handleCommand(Player player, PlayerProfile profile, RootSkill rootSkill, int value) {
+    protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
         if (player != null) {
             //Check if player profile is loaded
-            if(mcMMO.getUserManager().getPlayer(player) == null)
+            if(UserManager.getPlayer(player) == null)
                 return;
 
-            mcMMO.getUserManager().getPlayer(player).applyXpGain(rootSkill, value, XPGainReason.COMMAND, XPGainSource.COMMAND);
+            UserManager.getPlayer(player).applyXpGain(skill, value, XPGainReason.COMMAND, XPGainSource.COMMAND);
         }
         else {
-            profile.addXp(rootSkill, value);
+            profile.addXp(skill, value);
             profile.scheduleAsyncSave();
         }
     }
@@ -42,10 +45,10 @@ public class AddxpCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handlePlayerMessageSkill(Player player, int value, RootSkill rootSkill, boolean isSilent) {
+    protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) {
         if(isSilent)
             return;
 
-        player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, rootSkill.getName()));
+        player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName()));
     }
 }

+ 3 - 2
src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java

@@ -5,6 +5,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.database.FormulaConversionTask;
 import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -32,8 +33,8 @@ public class ConvertExperienceCommand implements CommandExecutor {
 
             sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Start", previousType.toString(), newType.toString()));
 
-            mcMMO.getUserManager().saveAllSync();
-            mcMMO.getUserManager().clearAll();
+            UserManager.saveAll();
+            UserManager.clearAll();
 
             new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1);
 

+ 8 - 8
src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java

@@ -3,10 +3,10 @@ package com.gmail.nossr50.commands.experience;
 import com.gmail.nossr50.datatypes.experience.XPGainReason;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.skill.RootSkill;
 import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
@@ -23,11 +23,11 @@ public class MmoeditCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handleCommand(Player player, PlayerProfile profile, RootSkill rootSkill, int value) {
-        int skillLevel = profile.getSkillLevel(rootSkill);
-        float xpRemoved = profile.getSkillXpLevelRaw(rootSkill);
+    protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
+        int skillLevel = profile.getSkillLevel(skill);
+        float xpRemoved = profile.getSkillXpLevelRaw(skill);
 
-        profile.modifySkill(rootSkill, value);
+        profile.modifySkill(skill, value);
 
         if (player == null) {
             profile.scheduleAsyncSave();
@@ -43,7 +43,7 @@ public class MmoeditCommand extends ExperienceCommand {
         if(mmoPlayer != null) {
             EventUtils.tryLevelEditEvent(mmoPlayer, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel);
         } else {
-            EventUtils.tryLevelEditEvent(player, rootSkill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel);
+            EventUtils.tryLevelEditEvent(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND, skillLevel);
         }
 
     }
@@ -57,10 +57,10 @@ public class MmoeditCommand extends ExperienceCommand {
     }
 
     @Override
-    protected void handlePlayerMessageSkill(Player player, int value, RootSkill rootSkill, boolean isSilent) {
+    protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill, boolean isSilent) {
         if(isSilent)
             return;
 
-        player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", rootSkill.getName(), value));
+        player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value));
     }
 }

+ 12 - 12
src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreCommand.java

@@ -1,10 +1,10 @@
 package com.gmail.nossr50.commands.hardcore;
 
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.skill.RootSkill;
 import org.bukkit.command.CommandSender;
 
 public class HardcoreCommand extends HardcoreModeCommand {
@@ -19,9 +19,9 @@ public class HardcoreCommand extends HardcoreModeCommand {
     }
 
     @Override
-    protected boolean checkEnabled(RootSkill rootSkill) {
-        if (rootSkill == null) {
-            for (RootSkill rootSkill : PrimarySkillType.values()) {
+    protected boolean checkEnabled(PrimarySkillType skill) {
+        if (skill == null) {
+            for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
                 if (!primarySkillType.getHardcoreStatLossEnabled()) {
                     return false;
                 }
@@ -30,16 +30,16 @@ public class HardcoreCommand extends HardcoreModeCommand {
             return true;
         }
 
-        return rootSkill.getHardcoreStatLossEnabled();
+        return skill.getHardcoreStatLossEnabled();
     }
 
     @Override
-    protected void enable(RootSkill rootSkill) {
+    protected void enable(PrimarySkillType skill) {
         toggle(true, skill);
     }
 
     @Override
-    protected void disable(RootSkill rootSkill) {
+    protected void disable(PrimarySkillType skill) {
         toggle(false, skill);
     }
 
@@ -49,16 +49,16 @@ public class HardcoreCommand extends HardcoreModeCommand {
         sender.sendMessage(LocaleLoader.getString("Hardcore.DeathStatLoss.PercentageChanged", percent.format(newPercentage / 100.0D)));
     }
 
-    private void toggle(boolean enable, RootSkill rootSkill) {
-        if (rootSkill == null) {
-            for (RootSkill rootSkill : PrimarySkillType.NON_CHILD_SKILLS) {
+    private void toggle(boolean enable, PrimarySkillType skill) {
+        if (skill == null) {
+            for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
                 primarySkillType.setHardcoreStatLossEnabled(enable);
             }
         }
         else {
-            rootSkill.setHardcoreStatLossEnabled(enable);
+            skill.setHardcoreStatLossEnabled(enable);
         }
 
-        mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (rootSkill == null ? "all skills" : rootSkill.getName())));
+        mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : skill.getName())));
     }
 }

+ 7 - 7
src/main/java/com/gmail/nossr50/commands/hardcore/HardcoreModeCommand.java

@@ -1,10 +1,10 @@
 package com.gmail.nossr50.commands.hardcore;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.skill.RootSkill;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -75,7 +75,7 @@ public abstract class HardcoreModeCommand implements TabExecutor {
                     return true;
                 }
 
-                RootSkill rootSkill = mcMMO.p.getSkillRegister().getSkill(args[0]);
+                PrimarySkillType skill = PrimarySkillType.getSkill(args[0]);
 
                 if (!CommandUtils.isChildSkill(sender, skill)) {
                     return true;
@@ -87,7 +87,7 @@ public abstract class HardcoreModeCommand implements TabExecutor {
                         return true;
                     }
 
-                    enable(rootSkill);
+                    enable(skill);
                     return true;
                 }
 
@@ -97,7 +97,7 @@ public abstract class HardcoreModeCommand implements TabExecutor {
                         return true;
                     }
 
-                    enable(rootSkill);
+                    enable(skill);
                     return true;
                 }
 
@@ -122,8 +122,8 @@ public abstract class HardcoreModeCommand implements TabExecutor {
 
     protected abstract boolean checkTogglePermissions(CommandSender sender);
     protected abstract boolean checkModifyPermissions(CommandSender sender);
-    protected abstract boolean checkEnabled(RootSkill rootSkill);
-    protected abstract void enable(RootSkill rootSkill);
-    protected abstract void disable(RootSkill rootSkill);
+    protected abstract boolean checkEnabled(PrimarySkillType skill);
+    protected abstract void enable(PrimarySkillType skill);
+    protected abstract void disable(PrimarySkillType skill);
     protected abstract void modify(CommandSender sender, double newPercentage);
 }

+ 12 - 12
src/main/java/com/gmail/nossr50/commands/hardcore/VampirismCommand.java

@@ -1,10 +1,10 @@
 package com.gmail.nossr50.commands.hardcore;
 
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.skill.RootSkill;
 import org.bukkit.command.CommandSender;
 
 public class VampirismCommand extends HardcoreModeCommand {
@@ -19,9 +19,9 @@ public class VampirismCommand extends HardcoreModeCommand {
     }
 
     @Override
-    protected boolean checkEnabled(RootSkill rootSkill) {
-        if (rootSkill == null) {
-            for (RootSkill rootSkill : PrimarySkillType.values()) {
+    protected boolean checkEnabled(PrimarySkillType skill) {
+        if (skill == null) {
+            for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
                 if (!primarySkillType.getHardcoreVampirismEnabled()) {
                     return false;
                 }
@@ -30,16 +30,16 @@ public class VampirismCommand extends HardcoreModeCommand {
             return true;
         }
 
-        return rootSkill.getHardcoreVampirismEnabled();
+        return skill.getHardcoreVampirismEnabled();
     }
 
     @Override
-    protected void enable(RootSkill rootSkill) {
+    protected void enable(PrimarySkillType skill) {
         toggle(true, skill);
     }
 
     @Override
-    protected void disable(RootSkill rootSkill) {
+    protected void disable(PrimarySkillType skill) {
         toggle(false, skill);
     }
 
@@ -49,16 +49,16 @@ public class VampirismCommand extends HardcoreModeCommand {
         sender.sendMessage(LocaleLoader.getString("Hardcore.Vampirism.PercentageChanged", percent.format(newPercentage / 100.0D)));
     }
 
-    private void toggle(boolean enable, RootSkill rootSkill) {
-        if (rootSkill == null) {
-            for (RootSkill rootSkill : PrimarySkillType.NON_CHILD_SKILLS) {
+    private void toggle(boolean enable, PrimarySkillType skill) {
+        if (skill == null) {
+            for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
                 primarySkillType.setHardcoreVampirismEnabled(enable);
             }
         }
         else {
-            rootSkill.setHardcoreVampirismEnabled(enable);
+            skill.setHardcoreVampirismEnabled(enable);
         }
 
-        mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.Vampirism.Name"), (rootSkill == null ? "all skills" : skill)));
+        mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.Vampirism.Name"), (skill == null ? "all skills" : skill)));
     }
 }

+ 8 - 7
src/main/java/com/gmail/nossr50/commands/party/PartyAcceptCommand.java

@@ -1,8 +1,9 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -16,25 +17,25 @@ public class PartyAcceptCommand implements CommandExecutor {
             Player player = (Player) sender;
 
             //Check if player profile is loaded
-            if (mcMMO.getUserManager().queryPlayer(player) == null) {
+            if (UserManager.getPlayer(player) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
 
-            if (!mmoPlayer.hasPartyInvite()) {
+            if (!mcMMOPlayer.hasPartyInvite()) {
                 sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites"));
                 return true;
             }
 
             // Changing parties
-            if (!mcMMO.getPartyManager().changeOrJoinParty(mmoPlayer, mmoPlayer.getPartyInvite().getName())) {
+            if (!PartyManager.changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) {
                 return true;
             }
 
-            mcMMO.getPartyManager().joinInvitedParty(mmoPlayer);
+            PartyManager.joinInvitedParty(mcMMOPlayer);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "accept"));

+ 7 - 11
src/main/java/com/gmail/nossr50/commands/party/PartyChangeOwnerCommand.java

@@ -1,9 +1,11 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.commands.CommandUtils;
-import com.neetgames.mcmmo.party.Party;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
@@ -15,27 +17,21 @@ public class PartyChangeOwnerCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 2) {//Check if player profile is loaded
-            if (mcMMO.getUserManager().queryMcMMOPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            Party playerParty = mcMMO.getUserManager().queryMcMMOPlayer((Player) sender).getParty();
+            Party playerParty = UserManager.getPlayer((Player) sender).getParty();
             String targetName = CommandUtils.getMatchedPlayerName(args[1]);
             OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName);
 
-            if(playerParty == null) {
-                //TODO: Localize
-                sender.sendMessage("Party is null!");
-                return true;
-            }
-
-            if (!playerParty.getPartyMemberManager().hasMember(target.getUniqueId())) {
+            if (!playerParty.hasMember(target.getUniqueId())) {
                 sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
                 return true;
             }
 
-            mcMMO.getPartyManager().setPartyLeader(target.getUniqueId(), playerParty);
+            PartyManager.setPartyLeader(target.getUniqueId(), playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "owner", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));

+ 8 - 8
src/main/java/com/gmail/nossr50/commands/party/PartyChangePasswordCommand.java

@@ -1,8 +1,8 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.party.Party;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -12,13 +12,13 @@ import org.jetbrains.annotations.NotNull;
 public class PartyChangePasswordCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
-        if(mcMMO.getUserManager().queryPlayer((Player) sender) == null)
+        if(UserManager.getPlayer((Player) sender) == null)
         {
             sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
-        Party party = mcMMO.getUserManager().queryPlayer((Player) sender).getParty();
+        Party party = UserManager.getPlayer((Player) sender).getParty();
 
         switch (args.length) {
             case 1:
@@ -42,14 +42,14 @@ public class PartyChangePasswordCommand implements CommandExecutor {
     }
 
     private void unprotectParty(Party party, CommandSender sender) {
-        party.setPartyLock(true);
-        party.setPartyPassword(null);
+        party.setLocked(true);
+        party.setPassword(null);
         sender.sendMessage(LocaleLoader.getString("Party.Password.Removed"));
     }
 
     private void protectParty(Party party, CommandSender sender, String password) {
-        party.setPartyLock(true);
-        party.setPartyPassword(password);
+        party.setLocked(true);
+        party.setPassword(password);
         sender.sendMessage(LocaleLoader.getString("Party.Password.Set", password));
     }
 }

+ 33 - 18
src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java

@@ -1,14 +1,14 @@
 package com.gmail.nossr50.commands.party;
 
-import com.gmail.nossr50.commands.chat.PartyChatCommand;
+import com.gmail.nossr50.commands.party.alliance.PartyAllianceCommand;
 import com.gmail.nossr50.commands.party.teleport.PtpCommand;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -30,7 +30,7 @@ public class PartyCommand implements TabExecutor {
     static {
         ArrayList<String> subcommands = new ArrayList<>();
 
-        for (PartySubCommandType subcommand : PartySubCommandType.values()) {
+        for (PartySubcommandType subcommand : PartySubcommandType.values()) {
             subcommands.add(subcommand.toString());
         }
 
@@ -38,19 +38,23 @@ public class PartyCommand implements TabExecutor {
         PARTY_SUBCOMMANDS = ImmutableList.copyOf(subcommands);
     }
 
+    private final CommandExecutor partyJoinCommand           = new PartyJoinCommand();
     private final CommandExecutor partyAcceptCommand         = new PartyAcceptCommand();
     private final CommandExecutor partyCreateCommand         = new PartyCreateCommand();
     private final CommandExecutor partyQuitCommand           = new PartyQuitCommand();
     private final CommandExecutor partyXpShareCommand        = new PartyXpShareCommand();
+    private final CommandExecutor partyItemShareCommand      = new PartyItemShareCommand();
     private final CommandExecutor partyInviteCommand         = new PartyInviteCommand();
     private final CommandExecutor partyKickCommand           = new PartyKickCommand();
     private final CommandExecutor partyDisbandCommand        = new PartyDisbandCommand();
     private final CommandExecutor partyChangeOwnerCommand    = new PartyChangeOwnerCommand();
+    private final CommandExecutor partyLockCommand           = new PartyLockCommand();
+    private final CommandExecutor partyChangePasswordCommand = new PartyChangePasswordCommand();
     private final CommandExecutor partyRenameCommand         = new PartyRenameCommand();
     private final CommandExecutor partyInfoCommand           = new PartyInfoCommand();
     private final CommandExecutor partyHelpCommand           = new PartyHelpCommand();
     private final CommandExecutor partyTeleportCommand       = new PtpCommand();
-    private final CommandExecutor partyChatCommand           = new PartyChatCommand();
+    private final CommandExecutor partyAllianceCommand       = new PartyAllianceCommand();
 
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
@@ -65,20 +69,20 @@ public class PartyCommand implements TabExecutor {
 
         Player player = (Player) sender;
 
-        if (!mcMMO.getUserManager().hasPlayerDataKey(player)) {
+        if (!UserManager.hasPlayerDataKey(player)) {
             return true;
         }
 
-        if(mcMMO.getUserManager().queryPlayer(player) == null)
+        if(UserManager.getPlayer(player) == null)
         {
             player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
         if (args.length < 1) {
-            if (!mcMMO.getPartyManager().mmoPlayer.inParty()) {
+            if (!mcMMOPlayer.inParty()) {
                 sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
                 return printUsage(player);
             }
@@ -86,19 +90,21 @@ public class PartyCommand implements TabExecutor {
             return partyInfoCommand.onCommand(sender, command, label, args);
         }
 
-        PartySubCommandType subcommand = PartySubCommandType.getSubcommand(args[0]);
+        PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]);
 
         if (subcommand == null) {
             return printUsage(player);
         }
 
         // Can't use this for lock/unlock since they're handled by the same command
-        if (!Permissions.partySubcommand(sender, subcommand)) {
+        if (subcommand != PartySubcommandType.LOCK && subcommand != PartySubcommandType.UNLOCK && !Permissions.partySubcommand(sender, subcommand)) {
             sender.sendMessage(command.getPermissionMessage());
             return true;
         }
 
         switch (subcommand) {
+            case JOIN:
+                return partyJoinCommand.onCommand(sender, command, label, args);
             case ACCEPT:
                 return partyAcceptCommand.onCommand(sender, command, label, args);
             case CREATE:
@@ -110,7 +116,7 @@ public class PartyCommand implements TabExecutor {
         }
 
         // Party member commands
-        if (!mmoPlayer.inParty()) {
+        if (!mcMMOPlayer.inParty()) {
             sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
             return printUsage(player);
         }
@@ -129,7 +135,7 @@ public class PartyCommand implements TabExecutor {
         }
 
         // Party leader commands
-        if (!mmoPlayer.getParty().getLeader().getUniqueId().equals(player.getUniqueId())) {
+        if (!mcMMOPlayer.getParty().getLeader().getUniqueId().equals(player.getUniqueId())) {
             sender.sendMessage(LocaleLoader.getString("Party.NotOwner"));
             return true;
         }
@@ -137,14 +143,23 @@ public class PartyCommand implements TabExecutor {
         switch (subcommand) {
             case XPSHARE:
                 return partyXpShareCommand.onCommand(sender, command, label, args);
+            case ITEMSHARE:
+                return partyItemShareCommand.onCommand(sender, command, label, args);
             case KICK:
                 return partyKickCommand.onCommand(sender, command, label, args);
             case DISBAND:
                 return partyDisbandCommand.onCommand(sender, command, label, args);
             case OWNER:
                 return partyChangeOwnerCommand.onCommand(sender, command, label, args);
+            case LOCK:
+            case UNLOCK:
+                return partyLockCommand.onCommand(sender, command, label, args);
+            case PASSWORD:
+                return partyChangePasswordCommand.onCommand(sender, command, label, args);
             case RENAME:
                 return partyRenameCommand.onCommand(sender, command, label, args);
+            case ALLIANCE:
+                return partyAllianceCommand.onCommand(sender, command, label, args);
             default:
                 break;
         }
@@ -158,7 +173,7 @@ public class PartyCommand implements TabExecutor {
             case 1:
                 return StringUtil.copyPartialMatches(args[0], PARTY_SUBCOMMANDS, new ArrayList<>(PARTY_SUBCOMMANDS.size()));
             case 2:
-                PartySubCommandType subcommand = PartySubCommandType.getSubcommand(args[0]);
+                PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]);
 
                 if (subcommand == null) {
                     return ImmutableList.of();
@@ -187,13 +202,13 @@ public class PartyCommand implements TabExecutor {
                             Player player = (Player) sender;
 
                             //Not Loaded
-                            if(mcMMO.getUserManager().queryPlayer(player) == null)
+                            if(UserManager.getPlayer(player) == null)
                             {
                                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                                 return ImmutableList.of();
                             }
 
-                            Party party = mcMMO.getUserManager().queryPlayer(player).getParty();
+                            Party party = UserManager.getPlayer(player).getParty();
 
                             playerNames = party.getOnlinePlayerNames(player);
                             return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size()));
@@ -204,7 +219,7 @@ public class PartyCommand implements TabExecutor {
                         return ImmutableList.of();
                 }
             case 3:
-                if (PartySubCommandType.getSubcommand(args[0]) == PartySubCommandType.ITEMSHARE && isItemShareCategory(args[1])) {
+                if (PartySubcommandType.getSubcommand(args[0]) == PartySubcommandType.ITEMSHARE && isItemShareCategory(args[1])) {
                     return StringUtil.copyPartialMatches(args[2], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
                 }
 

+ 8 - 8
src/main/java/com/gmail/nossr50/commands/party/PartyCreateCommand.java

@@ -1,8 +1,9 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -16,26 +17,25 @@ public class PartyCreateCommand implements CommandExecutor {
             case 2:
             case 3:
                 Player player = (Player) sender;
-                OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-                if(mcMMO.getUserManager().queryPlayer(player) == null)
+                if(UserManager.getPlayer(player) == null)
                 {
                     player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                     return true;
                 }
 
                 // Check to see if the party exists, and if it does cancel creating a new party
-                if (mcMMO.getPartyManager().isParty(args[1])) {
-                    player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", args[1]));
+                if (PartyManager.checkPartyExistence(player, args[1])) {
                     return true;
                 }
 
                 // Changing parties
-                if (!mcMMO.getPartyManager().changeOrJoinParty(mmoPlayer, args[1])) {
+                if (!PartyManager.changeOrJoinParty(mcMMOPlayer, args[1])) {
                     return true;
                 }
 
-                mcMMO.getPartyManager().createParty(mmoPlayer, args[1], getPassword(args));
+                PartyManager.createParty(mcMMOPlayer, args[1], getPassword(args));
                 return true;
 
             default:

+ 9 - 8
src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java

@@ -1,9 +1,10 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.party.Party;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -14,23 +15,23 @@ public class PartyDisbandCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 1) {
-            if (mcMMO.getUserManager().queryPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            Party playerParty = mcMMO.getUserManager().queryPlayer((Player) sender).getParty();
-            String partyName = playerParty.getPartyName();
+            Party playerParty = UserManager.getPlayer((Player) sender).getParty();
+            String partyName = playerParty.getName();
 
-            for (PartyMember member : playerParty.getPartyMembers()) {
-                if (!mcMMO.getPartyManager().handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) {
+            for (Player member : playerParty.getOnlineMembers()) {
+                if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) {
                     return true;
                 }
 
                 member.sendMessage(LocaleLoader.getString("Party.Disband"));
             }
 
-            mcMMO.getPartyManager().disbandParty(playerParty);
+            PartyManager.disbandParty(playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband"));

+ 32 - 13
src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java

@@ -1,11 +1,14 @@
 package com.gmail.nossr50.commands.party;
 
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.party.PartyFeature;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.datatypes.party.ShareMode;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
+import org.bukkit.ChatColor;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -21,19 +24,19 @@ public class PartyInfoCommand implements CommandExecutor {
         switch (args.length) {
             case 0:
             case 1:
-                if(mcMMO.getUserManager().queryPlayer((Player) sender) == null)
+                if(UserManager.getPlayer((Player) sender) == null)
                 {
                     sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                     return true;
                 }
                 Player player = (Player) sender;
-                OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-                Party party = mmoPlayer.getParty();
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+                Party party = mcMMOPlayer.getParty();
 
                 displayPartyHeader(player, party);
                 displayShareModeInfo(player, party);
                 displayPartyFeatures(player, party);
-                displayMemberInfo(player, mmoPlayer, party);
+                displayMemberInfo(player, mcMMOPlayer, party);
                 return true;
 
             default:
@@ -46,7 +49,7 @@ public class PartyInfoCommand implements CommandExecutor {
         player.sendMessage(LocaleLoader.getString("Commands.Party.Header"));
 
         StringBuilder status = new StringBuilder();
-        status.append(LocaleLoader.getString("Commands.Party.Status", party.getPartyName(), LocaleLoader.getString("Party.Status." + (party.isLocked() ? "Locked" : "Unlocked")), party.getLevel()));
+        status.append(LocaleLoader.getString("Commands.Party.Status", party.getName(), LocaleLoader.getString("Party.Status." + (party.isLocked() ? "Locked" : "Unlocked")), party.getLevel()));
 
         if (!party.hasReachedLevelCap()) {
             status.append(" (").append(party.getXpToLevelPercentage()).append(")");
@@ -87,26 +90,42 @@ public class PartyInfoCommand implements CommandExecutor {
 
     private void displayShareModeInfo(Player player, Party party) {
         boolean xpShareEnabled = isUnlockedFeature(party, PartyFeature.XP_SHARE);
+        boolean itemShareEnabled = isUnlockedFeature(party, PartyFeature.ITEM_SHARE);
+        boolean itemSharingActive = (party.getItemShareMode() != ShareMode.NONE);
 
-        if (!xpShareEnabled) {
+        if (!xpShareEnabled && !itemShareEnabled) {
             return;
         }
 
         String expShareInfo = "";
+        String itemShareInfo = "";
+        String separator = "";
 
         if (xpShareEnabled) {
             expShareInfo = LocaleLoader.getString("Commands.Party.ExpShare", party.getXpShareMode().toString());
         }
 
-        player.sendMessage(LocaleLoader.getString("Commands.Party.ShareMode") + expShareInfo);
+        if (itemShareEnabled) {
+            itemShareInfo = LocaleLoader.getString("Commands.Party.ItemShare", party.getItemShareMode().toString());
+        }
+
+        if (xpShareEnabled && itemShareEnabled) {
+            separator = ChatColor.DARK_GRAY + " || ";
+        }
+
+        player.sendMessage(LocaleLoader.getString("Commands.Party.ShareMode") + expShareInfo + separator + itemShareInfo);
+
+        if (itemSharingActive) {
+            player.sendMessage(LocaleLoader.getString("Commands.Party.ItemShareCategories", party.getItemShareCategories()));
+        }
     }
 
-    private void displayMemberInfo(Player player, OnlineMMOPlayer mmoPlayer, Party party) {
+    private void displayMemberInfo(Player player, McMMOPlayer mcMMOPlayer, Party party) {
         /*
          * Only show members of the party that this member can see
          */
 
-        List<Player> nearMembers = mcMMO.getPartyManager().getNearVisibleMembers(mmoPlayer);
+        List<Player> nearMembers = PartyManager.getNearVisibleMembers(mcMMOPlayer);
         int membersOnline = party.getVisibleMembers(player).size();
 
         player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header"));

+ 12 - 11
src/main/java/com/gmail/nossr50/commands/party/PartyInviteCommand.java

@@ -1,11 +1,12 @@
 package com.gmail.nossr50.commands.party;
 
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.commands.CommandUtils;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -17,7 +18,7 @@ public class PartyInviteCommand implements CommandExecutor {
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 2) {
             String targetName = CommandUtils.getMatchedPlayerName(args[1]);
-            OnlineMMOPlayer mcMMOTarget = mcMMO.getUserManager().queryPlayer(targetName);
+            McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName);
 
             if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
                 return false;
@@ -25,13 +26,13 @@ public class PartyInviteCommand implements CommandExecutor {
 
             Player target = mcMMOTarget.getPlayer();
 
-            if (mcMMO.getUserManager().queryPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
             Player player = (Player) sender;
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
             String playerName = player.getName();
 
             if (player.equals(target)) {
@@ -39,19 +40,19 @@ public class PartyInviteCommand implements CommandExecutor {
                 return true;
             }
 
-            if (mcMMO.getPartyManager().inSameParty(player, target)) {
+            if (PartyManager.inSameParty(player, target)) {
                 sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName));
                 return true;
             }
 
-            if (!mcMMO.getPartyManager().canInvite(mmoPlayer)) {
+            if (!PartyManager.canInvite(mcMMOPlayer)) {
                 player.sendMessage(LocaleLoader.getString("Party.Locked"));
                 return true;
             }
 
-            Party playerParty = mmoPlayer.getParty();
+            Party playerParty = mcMMOPlayer.getParty();
 
-            if (mcMMO.getPartyManager().isPartyFull(target, playerParty)) {
+            if (PartyManager.isPartyFull(target, playerParty)) {
                 player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), Config.getInstance().getPartyMaxSize()));
                 return true;
             }
@@ -59,7 +60,7 @@ public class PartyInviteCommand implements CommandExecutor {
             mcMMOTarget.setPartyInvite(playerParty);
 
             sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success"));
-            target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", playerParty.getPartyName(), playerName));
+            target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", playerParty.getName(), playerName));
             target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1"));
             return true;
         }

+ 88 - 0
src/main/java/com/gmail/nossr50/commands/party/PartyJoinCommand.java

@@ -0,0 +1,88 @@
+package com.gmail.nossr50.commands.party;
+
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+public class PartyJoinCommand implements CommandExecutor {
+    @Override
+    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+        switch (args.length) {
+            case 2:
+            case 3:
+                String targetName = CommandUtils.getMatchedPlayerName(args[1]);
+                McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
+
+                if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
+                    return true;
+                }
+
+                Player target = mcMMOTarget.getPlayer();
+
+                if (!mcMMOTarget.inParty()) {
+                    sender.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", targetName));
+                    return true;
+                }
+
+                Player player = (Player) sender;
+
+                if(UserManager.getPlayer((Player) sender) == null)
+                {
+                    sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
+                    return true;
+                }
+
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+                Party targetParty = mcMMOTarget.getParty();
+
+                if (player.equals(target) || (mcMMOPlayer.inParty() && mcMMOPlayer.getParty().equals(targetParty))) {
+                    sender.sendMessage(LocaleLoader.getString("Party.Join.Self"));
+                    return true;
+                }
+
+                String password = getPassword(args);
+
+                // Make sure party passwords match
+                if (!PartyManager.checkPartyPassword(player, targetParty, password)) {
+                    return true;
+                }
+
+                String partyName = targetParty.getName();
+
+                // Changing parties
+                if (!PartyManager.changeOrJoinParty(mcMMOPlayer, partyName)) {
+                    return true;
+                }
+
+                if(PartyManager.isPartyFull(player, targetParty))
+                {
+                    player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull", targetParty.toString()));
+                    return true;
+                }
+
+                player.sendMessage(LocaleLoader.getString("Commands.Party.Join", partyName));
+                PartyManager.addToParty(mcMMOPlayer, targetParty);
+                return true;
+
+            default:
+                sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "join", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">", "[" + LocaleLoader.getString("Commands.Usage.Password") + "]"));
+                return true;
+        }
+    }
+
+    private String getPassword(String[] args) {
+        if (args.length == 3) {
+            return args[2];
+        }
+
+        return null;
+    }
+}

+ 9 - 7
src/main/java/com/gmail/nossr50/commands/party/PartyKickCommand.java

@@ -1,10 +1,12 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.commands.CommandUtils;
-import com.neetgames.mcmmo.party.Party;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
@@ -16,12 +18,12 @@ public class PartyKickCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 2) {
-            if (mcMMO.getUserManager().queryPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            Party playerParty = mcMMO.getUserManager().queryPlayer((Player) sender).getParty();
+            Party playerParty = UserManager.getPlayer((Player) sender).getParty();
             String targetName = CommandUtils.getMatchedPlayerName(args[1]);
 
             if (!playerParty.hasMember(targetName)) {
@@ -33,17 +35,17 @@ public class PartyKickCommand implements CommandExecutor {
 
             if (target.isOnline()) {
                 Player onlineTarget = target.getPlayer();
-                String partyName = playerParty.getPartyName();
+                String partyName = playerParty.getName();
 
-                if (!mcMMO.getPartyManager().handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) {
+                if (!PartyManager.handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) {
                     return true;
                 }
 
-                mcMMO.getPartyManager().processPartyLeaving(mcMMO.getUserManager().queryPlayer(onlineTarget));
+                PartyManager.processPartyLeaving(UserManager.getPlayer(onlineTarget));
                 onlineTarget.sendMessage(LocaleLoader.getString("Commands.Party.Kick", partyName));
             }
 
-            mcMMO.getPartyManager().removeFromParty(target, playerParty);
+            PartyManager.removeFromParty(target, playerParty);
             return true;
         }
         sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "kick", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));

+ 9 - 7
src/main/java/com/gmail/nossr50/commands/party/PartyQuitCommand.java

@@ -1,9 +1,11 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -16,19 +18,19 @@ public class PartyQuitCommand implements CommandExecutor {
         if (args.length == 1) {
             Player player = (Player) sender;
 
-            if (mcMMO.getUserManager().getPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().getPlayer(player);
-            Party playerParty = mmoPlayer.getParty();
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+            Party playerParty = mcMMOPlayer.getParty();
 
-            if (!mcMMO.getPartyManager().handlePartyChangeEvent(player, playerParty.getPartyName(), null, EventReason.LEFT_PARTY)) {
+            if (!PartyManager.handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) {
                 return true;
             }
 
-            mcMMO.getPartyManager().removeFromParty(mmoPlayer);
+            PartyManager.removeFromParty(mcMMOPlayer);
             sender.sendMessage(LocaleLoader.getString("Commands.Party.Leave"));
             return true;
         }

+ 15 - 15
src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java

@@ -1,10 +1,11 @@
 package com.gmail.nossr50.commands.party;
 
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -15,15 +16,15 @@ public class PartyRenameCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
         if (args.length == 2) {
-            if (mcMMO.getUserManager().queryPlayer((Player) sender) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer((Player) sender);
-            Party playerParty = mmoPlayer.getParty();
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender);
+            Party playerParty = mcMMOPlayer.getParty();
 
-            String oldPartyName = playerParty.getPartyName();
+            String oldPartyName = playerParty.getName();
             String newPartyName = args[1];
 
             // This is to prevent party leaders from spamming other players with the rename message
@@ -32,27 +33,26 @@ public class PartyRenameCommand implements CommandExecutor {
                 return true;
             }
 
-            Player player = Misc.adaptPlayer(mmoPlayer);
+            Player player = mcMMOPlayer.getPlayer();
 
             // Check to see if the party exists, and if it does cancel renaming the party
-            if (mcMMO.getPartyManager().isParty(newPartyName)) {
-                player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", newPartyName));
+            if (PartyManager.checkPartyExistence(player, newPartyName)) {
                 return true;
             }
 
             String leaderName = playerParty.getLeader().getPlayerName();
 
-            for (PartyMember partyMember : playerParty.getPartyMembers()) {
-                if (!mcMMO.getPartyManager().handlePartyChangeEvent(partyMember, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) {
+            for (Player member : playerParty.getOnlineMembers()) {
+                if (!PartyManager.handlePartyChangeEvent(member, oldPartyName, newPartyName, EventReason.CHANGED_PARTIES)) {
                     return true;
                 }
 
-                if (!partyMember.getName().equalsIgnoreCase(leaderName)) {
-                    partyMember.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName));
+                if (!member.getName().equalsIgnoreCase(leaderName)) {
+                    member.sendMessage(LocaleLoader.getString("Party.InformedOnNameChange", leaderName, newPartyName));
                 }
             }
 
-            playerParty.setPartyName(newPartyName);
+            playerParty.setName(newPartyName);
 
             sender.sendMessage(LocaleLoader.getString("Commands.Party.Rename", newPartyName));
             return true;

+ 7 - 6
src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java

@@ -1,12 +1,13 @@
 package com.gmail.nossr50.commands.party;
 
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.party.PartyFeature;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.datatypes.party.ShareMode;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.text.StringUtils;
-import com.neetgames.mcmmo.party.Party;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -16,13 +17,13 @@ import org.jetbrains.annotations.NotNull;
 public class PartyXpShareCommand implements CommandExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
-        if(mcMMO.getUserManager().queryPlayer((Player) sender) == null)
+        if(UserManager.getPlayer((Player) sender) == null)
         {
             sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
-        Party party = mcMMO.getUserManager().queryPlayer((Player) sender).getParty();
+        Party party = UserManager.getPlayer((Player) sender).getParty();
 
         if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.XP_SHARE)) {
             sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.5"));
@@ -49,7 +50,7 @@ public class PartyXpShareCommand implements CommandExecutor {
 
         String changeModeMessage = LocaleLoader.getString("Commands.Party.SetSharing", LocaleLoader.getString("Party.ShareType.Xp"), LocaleLoader.getString("Party.ShareMode." + StringUtils.getCapitalized(mode.toString())));
 
-        for (Player member : party.getPartyMembers()) {
+        for (Player member : party.getOnlineMembers()) {
             member.sendMessage(changeModeMessage);
         }
     }

+ 3 - 36
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java

@@ -1,16 +1,12 @@
 package com.gmail.nossr50.commands.party.teleport;
 
-import com.gmail.nossr50.party.PartyTeleportRecord;
+import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
-import org.bukkit.command.ConsoleCommandSender;
-import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 
 public class PtpAcceptAnyCommand implements CommandExecutor {
@@ -21,36 +17,7 @@ public class PtpAcceptAnyCommand implements CommandExecutor {
             return true;
         }
 
-        if(sender instanceof ConsoleCommandSender)
-            return false;
-
-        Player playerSender = (Player) sender;
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(playerSender);
-
-        if(mmoPlayer == null) {
-            playerSender.sendMessage(LocaleLoader.getString("Commands.NotLoaded"));
-            return false;
-        }
-
-        Party party = mcMMO.getPartyManager().getParty(playerSender);
-        if(party == null) {
-            //TODO: Localize error message
-            playerSender.sendMessage("You don't have a party!");
-            return false;
-        }
-
-        PartyMember partyMember = party.getPartyMember(playerSender.getUniqueId());
-
-        if(partyMember == null) {
-            mcMMO.p.getLogger().severe("PartyMember ref didn't exist for player named "+playerSender.getName() + ", this should never happen!");
-            return false;
-        }
-
-        PartyTeleportRecord ptpRecord = partyMember.getPartyTeleportRecord();
-
-        if(ptpRecord == null) {
-
-        }
+        PartyTeleportRecord ptpRecord = UserManager.getPlayer(sender.getName()).getPartyTeleportRecord();
 
         if (ptpRecord.isConfirmRequired()) {
             sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Disabled"));

+ 6 - 5
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java

@@ -1,10 +1,11 @@
 package com.gmail.nossr50.commands.party.teleport;
 
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.party.PartyTeleportRecord;
+import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
+import com.gmail.nossr50.util.skills.SkillUtils;
 import org.bukkit.World;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
@@ -20,21 +21,21 @@ public class PtpAcceptCommand implements CommandExecutor {
             return true;
         }
 
-        if(mcMMO.getUserManager().queryPlayer((Player) sender) == null)
+        if(UserManager.getPlayer((Player) sender) == null)
         {
             sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
         Player player = (Player) sender;
-        PartyTeleportRecord ptpRecord = mcMMO.getUserManager().queryPlayer(player).getPartyTeleportRecord();
+        PartyTeleportRecord ptpRecord = UserManager.getPlayer(player).getPartyTeleportRecord();
 
         if (!ptpRecord.hasRequest()) {
             player.sendMessage(LocaleLoader.getString("Commands.ptp.NoRequests"));
             return true;
         }
 
-        if (rootSkillUtils.cooldownExpired(ptpRecord.getTimeout(), Config.getInstance().getPTPCommandTimeout())) {
+        if (SkillUtils.cooldownExpired(ptpRecord.getTimeout(), Config.getInstance().getPTPCommandTimeout())) {
             ptpRecord.removeRequest();
             player.sendMessage(LocaleLoader.getString("Commands.ptp.RequestExpired"));
             return true;

+ 27 - 27
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java

@@ -2,22 +2,23 @@ package com.gmail.nossr50.commands.party.teleport;
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.WorldBlacklist;
-import com.gmail.nossr50.party.PartyFeature;
-import com.gmail.nossr50.party.PartyTeleportRecord;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.runnables.items.TeleportationWarmup;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.World;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
@@ -56,24 +57,24 @@ public class PtpCommand implements TabExecutor {
         if(WorldBlacklist.isWorldBlacklisted(player.getWorld()))
             return true;
 
-        if (!mcMMO.getUserManager().hasPlayerDataKey(player)) {
+        if (!UserManager.hasPlayerDataKey(player)) {
             return true;
         }
 
-        if(mcMMO.getUserManager().queryPlayer((Player) sender) == null)
+        if(UserManager.getPlayer((Player) sender) == null)
         {
             sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-        if (!mmoPlayer.inParty()) {
+        if (!mcMMOPlayer.inParty()) {
             sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
             return true;
         }
 
-        Party party = mmoPlayer.getParty();
+        Party party = mcMMOPlayer.getParty();
 
         if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.TELEPORT)) {
             sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.2"));
@@ -89,7 +90,7 @@ public class PtpCommand implements TabExecutor {
                 return ptpAcceptAnyCommand.onCommand(sender, command, label, args);
             }
 
-            long recentlyHurt = mmoPlayer.getRecentlyHurtTimestamp();
+            long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
             int hurtCooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown();
 
             if (hurtCooldown > 0) {
@@ -111,7 +112,7 @@ public class PtpCommand implements TabExecutor {
             }
 
             int ptpCooldown = Config.getInstance().getPTPCommandCooldown();
-            long ptpLastUse = mmoPlayer.getPartyTeleportRecord().getLastUse();
+            long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse();
 
             if (ptpCooldown > 0) {
                 int timeRemaining = SkillUtils.calculateTimeLeft(ptpLastUse * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player);
@@ -134,19 +135,19 @@ public class PtpCommand implements TabExecutor {
             List<String> matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList<>(TELEPORT_SUBCOMMANDS.size()));
 
             if (matches.size() == 0) {
-                if (mcMMO.getUserManager().queryPlayer((Player) sender) == null) {
+                if (UserManager.getPlayer((Player) sender) == null) {
                     sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                     return ImmutableList.of();
                 }
 
                 Player player = (Player) sender;
-                OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+                McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-                if (!mmoPlayer.inParty()) {
+                if (!mcMMOPlayer.inParty()) {
                     return ImmutableList.of();
                 }
 
-                List<String> playerNames = mmoPlayer.getParty().getOnlinePlayerNames(player);
+                List<String> playerNames = mcMMOPlayer.getParty().getOnlinePlayerNames(player);
                 return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<>(playerNames.size()));
             }
 
@@ -160,7 +161,7 @@ public class PtpCommand implements TabExecutor {
             return;
         }
 
-        OnlineMMOPlayer mcMMOTarget = mcMMO.getUserManager().getPlayer(targetName);
+        McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
         Player target = mcMMOTarget.getPlayer();
 
 
@@ -197,7 +198,7 @@ public class PtpCommand implements TabExecutor {
     }
 
     protected static boolean canTeleport(CommandSender sender, Player player, String targetName) {
-        OnlineMMOPlayer mcMMOTarget = mcMMO.getUserManager().queryPlayer(targetName);
+        McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
 
         if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
             return false;
@@ -210,7 +211,7 @@ public class PtpCommand implements TabExecutor {
             return false;
         }
 
-        if (!mcMMO.getPartyManager().inSameParty(player, target)) {
+        if (!PartyManager.inSameParty(player, target)) {
             player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
             return false;
         }
@@ -229,29 +230,28 @@ public class PtpCommand implements TabExecutor {
     }
 
     protected static void handleTeleportWarmup(Player teleportingPlayer, Player targetPlayer) {
-        if(mcMMO.getUserManager().queryPlayer(targetPlayer) == null) {
+        if(UserManager.getPlayer(targetPlayer) == null)
+        {
             targetPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return;
         }
 
-        if(mcMMO.getUserManager().queryPlayer(teleportingPlayer) == null) {
+        if(UserManager.getPlayer(teleportingPlayer) == null)
+        {
             teleportingPlayer.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return;
         }
 
-        McMMOPlayer mmoPlayer = (McMMOPlayer) mcMMO.getUserManager().queryPlayer(teleportingPlayer);
-        McMMOPlayer mmoTargetPlayer = (McMMOPlayer) mcMMO.getUserManager().queryPlayer(targetPlayer);
-
-        if(mmoPlayer == null || mmoTargetPlayer == null)
-            return;
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer);
+        McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetPlayer);
 
         long warmup = Config.getInstance().getPTPCommandWarmup();
 
-        mmoPlayer.actualizeTeleportCommenceLocation();
+        mcMMOPlayer.actualizeTeleportCommenceLocation(teleportingPlayer);
 
         if (warmup > 0) {
             teleportingPlayer.sendMessage(LocaleLoader.getString("Teleport.Commencing", warmup));
-            new TeleportationWarmup(mmoPlayer, mmoTargetPlayer).runTaskLater(mcMMO.p, 20 * warmup);
+            new TeleportationWarmup(mcMMOPlayer, mcMMOTarget).runTaskLater(mcMMO.p, 20 * warmup);
         }
         else {
             EventUtils.handlePartyTeleportEvent(teleportingPlayer, targetPlayer);

+ 3 - 4
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java

@@ -1,9 +1,9 @@
 package com.gmail.nossr50.commands.party.teleport;
 
-import com.gmail.nossr50.party.PartyTeleportRecord;
+import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -17,8 +17,7 @@ public class PtpToggleCommand implements CommandExecutor {
             return true;
         }
 
-        PartyTeleportRecord ptpRecord = mcMMO.getUserManager().queryPlayer(player)
-.getPartyTeleportRecord();
+        PartyTeleportRecord ptpRecord = UserManager.getPlayer(sender.getName()).getPartyTeleportRecord();
 
         if (ptpRecord.isEnabled()) {
             sender.sendMessage(LocaleLoader.getString("Commands.ptp.Disabled"));

+ 5 - 4
src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java

@@ -1,12 +1,13 @@
 package com.gmail.nossr50.commands.player;
 
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -37,12 +38,12 @@ public class MccooldownCommand implements TabExecutor {
                 }
             }
 
-            if (mcMMO.getUserManager().getPlayer(player) == null) {
+            if (UserManager.getPlayer(player) == null) {
                 player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().getPlayer(player);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
             player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Header"));
             player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
@@ -52,7 +53,7 @@ public class MccooldownCommand implements TabExecutor {
                     continue;
                 }
 
-                int seconds = mmoPlayer.getCooldownSeconds(ability);
+                int seconds = mcMMOPlayer.calculateTimeRemaining(ability);
 
                 if (seconds <= 0) {
                     player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getLocalizedName()));

+ 12 - 11
src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java

@@ -1,13 +1,14 @@
 package com.gmail.nossr50.commands.player;
 
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.commands.McrankCommandAsyncTask;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -52,10 +53,10 @@ public class McrankCommand implements TabExecutor {
                 }
 
                 String playerName = CommandUtils.getMatchedPlayerName(args[0]);
-                OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(playerName);
+                McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName);
 
-                if (mmoPlayer != null) {
-                    Player player = Misc.adaptPlayer(mmoPlayer);
+                if (mcMMOPlayer != null) {
+                    Player player = mcMMOPlayer.getPlayer();
                     playerName = player.getName();
 
                     if (CommandUtils.tooFar(sender, player, Permissions.mcrankFar(sender))) {
@@ -82,9 +83,9 @@ public class McrankCommand implements TabExecutor {
 
     private void display(CommandSender sender, String playerName) {
         if (sender instanceof Player) {
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
 
-            if(mmoPlayer == null)
+            if(mcMMOPlayer == null)
             {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return;
@@ -92,8 +93,8 @@ public class McrankCommand implements TabExecutor {
 
             long cooldownMillis = Math.min(Config.getInstance().getDatabasePlayerCooldown(), 1750);
 
-            if (mmoPlayer.getDatabaseCommandATS() + cooldownMillis > System.currentTimeMillis()) {
-                sender.sendMessage(LocaleLoader.getString("Commands.Database.CooldownMS", getCDSeconds(mmoPlayer, cooldownMillis)));
+            if (mcMMOPlayer.getDatabaseATS() + cooldownMillis > System.currentTimeMillis()) {
+                sender.sendMessage(LocaleLoader.getString("Commands.Database.CooldownMS", getCDSeconds(mcMMOPlayer, cooldownMillis)));
                 return;
             }
 
@@ -104,7 +105,7 @@ public class McrankCommand implements TabExecutor {
                 ((Player) sender).setMetadata(mcMMO.databaseCommandKey, new FixedMetadataValue(mcMMO.p, null));
             }
 
-            mmoPlayer.actualizeDatabaseCommandATS();
+            mcMMOPlayer.actualizeDatabaseATS();
         }
 
         boolean useBoard = Config.getInstance().getScoreboardsEnabled() && (sender instanceof Player) && (Config.getInstance().getRankUseBoard());
@@ -113,7 +114,7 @@ public class McrankCommand implements TabExecutor {
         new McrankCommandAsyncTask(playerName, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
     }
 
-    private long getCDSeconds(OnlineMMOPlayer mmoPlayer, long cooldownMillis) {
-        return ((mmoPlayer.getDatabaseCommandATS() + cooldownMillis) - System.currentTimeMillis());
+    private long getCDSeconds(McMMOPlayer mcMMOPlayer, long cooldownMillis) {
+        return ((mcMMOPlayer.getDatabaseATS() + cooldownMillis) - System.currentTimeMillis());
     }
 }

+ 5 - 8
src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java

@@ -2,11 +2,10 @@ package com.gmail.nossr50.commands.player;
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -27,14 +26,12 @@ public class McstatsCommand implements TabExecutor {
         }
 
         if (args.length == 0) {
-            Player player = (Player) sender;
-
-            if (mcMMO.getUserManager().queryPlayer(player) == null) {
+            if (UserManager.getPlayer((Player) sender) == null) {
                 sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
                 return true;
             }
 
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+            Player player = (Player) sender;
 
             if (Config.getInstance().getStatsUseBoard() && Config.getInstance().getScoreboardsEnabled()) {
                 ScoreboardManager.enablePlayerStatsScoreboard(player);
@@ -54,9 +51,9 @@ public class McstatsCommand implements TabExecutor {
             int powerLevelCap = Config.getInstance().getPowerLevelCap();
 
             if (powerLevelCap != Integer.MAX_VALUE) {
-                player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", mmoPlayer.getPowerLevel(), powerLevelCap));
+                player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap));
             } else {
-                player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", mmoPlayer.getPowerLevel()));
+                player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", UserManager.getPlayer(player).getPowerLevel()));
             }
 
             return true;

+ 21 - 23
src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java

@@ -2,15 +2,15 @@ package com.gmail.nossr50.commands.player;
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.commands.MctopCommandAsyncTask;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.skill.RootSkill;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -25,26 +25,26 @@ import java.util.List;
 public class MctopCommand implements TabExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
-        RootSkill rootSkill = null;
+        PrimarySkillType skill = null;
 
         switch (args.length) {
             case 0:
-                display(1, rootSkill, sender, command);
+                display(1, skill, sender, command);
                 return true;
 
             case 1:
                 if (StringUtils.isInt(args[0])) {
-                    display(Math.abs(Integer.parseInt(args[0])), rootSkill, sender, command);
+                    display(Math.abs(Integer.parseInt(args[0])), skill, sender, command);
                     return true;
                 }
 
-                rootSkill = extractSkill(sender, args[0]);
+                skill = extractSkill(sender, args[0]);
 
-                if (rootSkill == null) {
+                if (skill == null) {
                     return true;
                 }
 
-                display(1, rootSkill, sender, command);
+                display(1, skill, sender, command);
                 return true;
 
             case 2:
@@ -52,13 +52,13 @@ public class MctopCommand implements TabExecutor {
                     return true;
                 }
 
-                rootSkill = extractSkill(sender, args[0]);
+                skill = extractSkill(sender, args[0]);
 
-                if (rootSkill == null) {
+                if (skill == null) {
                     return true;
                 }
 
-                display(Math.abs(Integer.parseInt(args[1])), rootSkill, sender, command);
+                display(Math.abs(Integer.parseInt(args[1])), skill, sender, command);
                 return true;
 
             default:
@@ -74,8 +74,8 @@ public class MctopCommand implements TabExecutor {
         return ImmutableList.of();
     }
 
-    private void display(int page, @NotNull RootSkill rootSkill, @NotNull CommandSender sender, @NotNull Command command) {
-        if (rootSkill != null && !Permissions.mctop(sender, PrimarySkillType.getSkill(rootSkill))) {
+    private void display(int page, PrimarySkillType skill, CommandSender sender, Command command) {
+        if (skill != null && !Permissions.mctop(sender, skill)) {
             sender.sendMessage(command.getPermissionMessage());
             return;
         }
@@ -85,13 +85,11 @@ public class MctopCommand implements TabExecutor {
                 return;
             }
 
-            Player player = (Player) sender;
-
-            McMMOPlayer mmoPlayer = (McMMOPlayer) mcMMO.getUserManager().queryPlayer(player);
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
             long cooldownMillis = Math.max(Config.getInstance().getDatabasePlayerCooldown(), 1750);
 
-            if (mmoPlayer.getDatabaseCommandATS() + cooldownMillis > System.currentTimeMillis()) {
-                double seconds = ((mmoPlayer.getDatabaseCommandATS() + cooldownMillis) - System.currentTimeMillis()) / 1000.0D;
+            if (mcMMOPlayer.getDatabaseATS() + cooldownMillis > System.currentTimeMillis()) {
+                double seconds = ((mcMMOPlayer.getDatabaseATS() + cooldownMillis) - System.currentTimeMillis()) / 1000.0D;
                 if (seconds < 1) {
                     seconds = 1;
                 }
@@ -107,17 +105,17 @@ public class MctopCommand implements TabExecutor {
                 ((Player) sender).setMetadata(mcMMO.databaseCommandKey, new FixedMetadataValue(mcMMO.p, null));
             }
 
-            mmoPlayer.actualizeDatabaseCommandATS();
+            mcMMOPlayer.actualizeDatabaseATS();
         }
 
-        display(page, rootSkill, sender);
+        display(page, skill, sender);
     }
 
-    private void display(int page, @NotNull RootSkill rootSkill, @NotNull CommandSender sender) {
+    private void display(int page, PrimarySkillType skill, CommandSender sender) {
         boolean useBoard = (sender instanceof Player) && (Config.getInstance().getTopUseBoard());
         boolean useChat = !useBoard || Config.getInstance().getTopUseChat();
 
-        new MctopCommandAsyncTask(page, rootSkill, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
+        new MctopCommandAsyncTask(page, skill, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
     }
 
     private PrimarySkillType extractSkill(CommandSender sender, String skillName) {
@@ -125,7 +123,7 @@ public class MctopCommand implements TabExecutor {
             return null;
         }
 
-        RootSkill rootSkill = mcMMO.p.getSkillRegister().getSkill(rootSkillName);
+        PrimarySkillType skill = PrimarySkillType.getSkill(skillName);
 
         if (CommandUtils.isChildSkill(sender, skill)) {
             return null;

+ 22 - 19
src/main/java/com/gmail/nossr50/commands/player/XPBarCommand.java

@@ -1,10 +1,13 @@
 package com.gmail.nossr50.commands.player;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
+import com.gmail.nossr50.util.experience.ExperienceBarManager;
 import com.gmail.nossr50.util.player.NotificationManager;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -21,9 +24,9 @@ public class XPBarCommand implements TabExecutor {
     @Override
     public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
         if(sender instanceof Player) {
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().getPlayer((Player) sender);
+            McMMOPlayer mmoPlayer = UserManager.getPlayer((Player) sender);
             if(mmoPlayer == null) {
-                NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Profile.PendingLoad");
+                NotificationManager.sendPlayerInformationChatOnlyPrefixed(mmoPlayer.getPlayer(), "Profile.PendingLoad");
                 return false;
             }
 
@@ -32,29 +35,29 @@ public class XPBarCommand implements TabExecutor {
             } else if(args.length < 2) {
               String option = args[0];
 
-              if(option.equalsIgnoreCase(rootSkillBossBarSetting.RESET.toString())) {
-                  mmoPlayer.getExperienceBarManager().xpBarSettingToggle(rootSkillBossBarSetting.RESET, null);
+              if(option.equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.RESET.toString())) {
+                  mmoPlayer.getExperienceBarManager().xpBarSettingToggle(ExperienceBarManager.XPBarSettingTarget.RESET, null);
                   return true;
-              } else if(option.equalsIgnoreCase(rootSkillBossBarSetting.DISABLE.toString())) {
+              } else if(option.equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.DISABLE.toString())) {
                   mmoPlayer.getExperienceBarManager().disableAllBars();
                   return true;
               } else {
                   return false;
               }
 
-              //Per rootSkillSettings path
+              //Per skill Settings path
             } else if (args.length == 2) {
                 String skillName = args[1];
 
-                if(rootSkillUtils.isSkill(rootSkillName)) {
+                if(SkillUtils.isSkill(skillName)) {
 
-                    PrimarySkillType targetSkill = mcMMO.p.getSkillRegister().getSkill(rootSkillName);
+                    PrimarySkillType targetSkill = PrimarySkillType.getSkill(skillName);
 
                     //Target setting
                     String option = args[0].toLowerCase();
 
-                    SkillBossBarSetting settingTarget = getSettingTarget(option);
-                    if(settingTarget != null && settingTarget != SkillBossBarSetting.RESET) {
+                    ExperienceBarManager.XPBarSettingTarget settingTarget = getSettingTarget(option);
+                    if(settingTarget != null && settingTarget != ExperienceBarManager.XPBarSettingTarget.RESET) {
                         //Change setting
                         mmoPlayer.getExperienceBarManager().xpBarSettingToggle(settingTarget, targetSkill);
                         return true;
@@ -72,16 +75,16 @@ public class XPBarCommand implements TabExecutor {
         }
     }
 
-    private @Nullable SkillBossBarSetting getSettingTarget(String string) {
+    private @Nullable ExperienceBarManager.XPBarSettingTarget getSettingTarget(String string) {
         switch (string.toLowerCase()) {
             case "hide":
-                return SkillBossBarSetting.HIDE;
+                return ExperienceBarManager.XPBarSettingTarget.HIDE;
             case "show":
-                return SkillBossBarSetting.SHOW;
+                return ExperienceBarManager.XPBarSettingTarget.SHOW;
             case "reset":
-                return SkillBossBarSetting.RESET;
+                return ExperienceBarManager.XPBarSettingTarget.RESET;
             case "disable":
-                return SkillBossBarSetting.DISABLE;
+                return ExperienceBarManager.XPBarSettingTarget.DISABLE;
         }
 
         return null;
@@ -93,13 +96,13 @@ public class XPBarCommand implements TabExecutor {
             case 1:
                 List<String> options = new ArrayList<>();
 
-                for(rootSkillBossBarSetting settingTarget : SkillBossBarSetting.values()) {
+                for(ExperienceBarManager.XPBarSettingTarget settingTarget : ExperienceBarManager.XPBarSettingTarget.values()) {
                     options.add(StringUtils.getCapitalized(settingTarget.toString()));
                 }
 
-                return StringUtil.copyPartialMatches(args[0], options, new ArrayList<>(rootSkillBossBarSetting.values().length));
+                return StringUtil.copyPartialMatches(args[0], options, new ArrayList<>(ExperienceBarManager.XPBarSettingTarget.values().length));
             case 2:
-                if(!args[0].equalsIgnoreCase(rootSkillBossBarSetting.RESET.toString()))
+                if(!args[0].equalsIgnoreCase(ExperienceBarManager.XPBarSettingTarget.RESET.toString()))
                     return StringUtil.copyPartialMatches(args[1], PrimarySkillType.SKILL_NAMES, new ArrayList<>(PrimarySkillType.SKILL_NAMES.size()));
             default:
                 return ImmutableList.of();

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/server/Mcmmoupgrade.java

@@ -6,7 +6,7 @@ import org.bukkit.command.CommandSender;
 import org.jetbrains.annotations.NotNull;
 
 /**
- * This command facilitates switching the rootSkillsystem scale between classic and modern scale
+ * This command facilitates switching the skill system scale between classic and modern scale
  */
 public class Mcmmoupgrade implements CommandExecutor {
     @Override

+ 13 - 15
src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java

@@ -1,18 +1,16 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
 import com.gmail.nossr50.listeners.InteractionManager;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -29,23 +27,23 @@ public class AcrobaticsCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // ACROBATICS_DODGE
         if (canDodge) {
-            String[] dodgeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.ACROBATICS_DODGE);
+            String[] dodgeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_DODGE);
             dodgeChance = dodgeStrings[0];
             dodgeChanceLucky = dodgeStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canDodge = canUseSubskill(mmoPlayer, SubSkillType.ACROBATICS_DODGE);
-        canRoll = canUseSubskill(mmoPlayer, SubSkillType.ACROBATICS_ROLL);
+    protected void permissionsCheck(Player player) {
+        canDodge = canUseSubskill(player, SubSkillType.ACROBATICS_DODGE);
+        canRoll = canUseSubskill(player, SubSkillType.ACROBATICS_ROLL);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canDodge) {
@@ -62,10 +60,10 @@ public class AcrobaticsCommand extends SkillCommand {
                 double rollChance, graceChance;
 
                 //Chance to roll at half
-                RandomChanceSkill roll_rcs  = new RandomChanceSkill(Misc.adaptPlayer(mmoPlayer), SubSkillType.ACROBATICS_ROLL);
+                RandomChanceSkill roll_rcs  = new RandomChanceSkill(player, SubSkillType.ACROBATICS_ROLL);
 
                 //Chance to graceful roll
-                RandomChanceSkill grace_rcs = new RandomChanceSkill(Misc.adaptPlayer(mmoPlayer), SubSkillType.ACROBATICS_ROLL);
+                RandomChanceSkill grace_rcs = new RandomChanceSkill(player, SubSkillType.ACROBATICS_ROLL);
                 grace_rcs.setSkillLevel(grace_rcs.getSkillLevel() * 2); //Double Odds
 
                 //Chance Stat Calculations
@@ -73,7 +71,7 @@ public class AcrobaticsCommand extends SkillCommand {
                 graceChance      = RandomChanceUtil.getRandomChanceExecutionChance(grace_rcs);
                 //damageThreshold  = AdvancedConfig.getInstance().getRollDamageThreshold();
 
-                String[] rollStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.ACROBATICS_ROLL);
+                String[] rollStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL);
 
                 //Format
                 double rollChanceLucky  = rollChance * 1.333D;
@@ -91,10 +89,10 @@ public class AcrobaticsCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.ACROBATICS);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ACROBATICS);
 
         return textComponents;
     }

+ 15 - 24
src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java

@@ -1,18 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.alchemy.AlchemyManager;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
 import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -32,23 +29,18 @@ public class AlchemyCommand extends SkillCommand {
         super(PrimarySkillType.ALCHEMY);
     }
 
-    protected String[] calculateAbilityDisplayValues(@NotNull Player player) {
+    protected String[] calculateAbilityDisplayValues(Player player) {
         //TODO: Needed?
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-        if(mmoPlayer == null)
+        if(UserManager.getPlayer(player) == null)
         {
             player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return new String[] {"DATA NOT LOADED", "DATA NOT LOADED"};
         }
 
-        return calculateAbilityDisplayValues(mmoPlayer);
-    }
-
-    protected String[] calculateAbilityDisplayValues(@NotNull OnlineMMOPlayer mmoPlayer) {
-        AlchemyManager alchemyManager = ((McMMOPlayer) (mmoPlayer)).getAlchemyManager();
+        AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
         String[] displayValues = new String[2];
 
-        boolean isLucky = Permissions.lucky(Misc.adaptPlayer(mmoPlayer), PrimarySkillType.ALCHEMY);
+        boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY);
 
         displayValues[0] = decimal.format(alchemyManager.calculateBrewSpeed(false)) + "x";
         displayValues[1] = isLucky ? decimal.format(alchemyManager.calculateBrewSpeed(true)) + "x" : null;
@@ -56,19 +48,18 @@ public class AlchemyCommand extends SkillCommand {
         return displayValues;
     }
 
-
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // ALCHEMY_CATALYSIS
         if (canCatalysis) {
-            String[] catalysisStrings = calculateAbilityDisplayValues(mmoPlayer.getPlayer());
+            String[] catalysisStrings = calculateAbilityDisplayValues(player);
             brewSpeed = catalysisStrings[0];
             brewSpeedLucky = catalysisStrings[1];
         }
 
         // ALCHEMY_CONCOCTIONS
         if (canConcoctions) {
-            AlchemyManager alchemyManager = mmoPlayer.getAlchemyManager();
+            AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
             tier = alchemyManager.getTier();
             ingredientCount = alchemyManager.getIngredients().size();
             ingredientList = alchemyManager.getIngredientList();
@@ -76,13 +67,13 @@ public class AlchemyCommand extends SkillCommand {
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canCatalysis = canUseSubskill(mmoPlayer, SubSkillType.ALCHEMY_CATALYSIS);
-        canConcoctions = canUseSubskill(mmoPlayer, SubSkillType.ALCHEMY_CONCOCTIONS);
+    protected void permissionsCheck(Player player) {
+        canCatalysis = canUseSubskill(player, SubSkillType.ALCHEMY_CATALYSIS);
+        canConcoctions = canUseSubskill(player, SubSkillType.ALCHEMY_CONCOCTIONS);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canCatalysis) {
@@ -102,10 +93,10 @@ public class AlchemyCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.ALCHEMY);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY);
 
         return textComponents;
     }

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

@@ -32,7 +32,7 @@ public class AprilCommand implements TabExecutor {
 
         if (args.length == 0) {
             Player player = (Player) sender;
-            FakeSkillType fakeSkillType = FakeSkillType.getByName(rootSkillName);
+            FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName);
 
             float skillValue = Misc.getRandom().nextInt(99);
 

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

@@ -1,14 +1,14 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.archery.Archery;
 import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -29,36 +29,36 @@ public class ArcheryCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // ARCHERY_ARROW_RETRIEVAL
         if (canRetrieve) {
-            String[] retrieveStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
+            String[] retrieveStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
             retrieveChance = retrieveStrings[0];
             retrieveChanceLucky = retrieveStrings[1];
         }
         
         // ARCHERY_DAZE
         if (canDaze) {
-            String[] dazeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.ARCHERY_DAZE);
+            String[] dazeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_DAZE);
             dazeChance = dazeStrings[0];
             dazeChanceLucky = dazeStrings[1];
         }
         
-        // rootSkillSHOT
+        // SKILL SHOT
         if (canSkillShot) {
-            skillShotBonus = percent.format(Archery.getDamageBonusPercent(mmoPlayer));
+            skillShotBonus = percent.format(Archery.getDamageBonusPercent(player));
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canSkillShot = canUseSubskill(mmoPlayer, SubSkillType.ARCHERY_SKILL_SHOT);
-        canDaze = canUseSubskill(mmoPlayer, SubSkillType.ARCHERY_DAZE);
-        canRetrieve = canUseSubskill(mmoPlayer, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
+    protected void permissionsCheck(Player player) {
+        canSkillShot = canUseSubskill(player, SubSkillType.ARCHERY_SKILL_SHOT);
+        canDaze = canUseSubskill(player, SubSkillType.ARCHERY_DAZE);
+        canRetrieve = canUseSubskill(player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canRetrieve) {
@@ -75,19 +75,19 @@ public class ArcheryCommand extends SkillCommand {
             messages.add(getStatMessage(SubSkillType.ARCHERY_SKILL_SHOT, skillShotBonus));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
+        if(canUseSubskill(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK,
-                String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(mmoPlayer, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK, 1000))));
+                String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(player, SubSkillType.ARCHERY_ARCHERY_LIMIT_BREAK, 1000))));
         }
 
         return messages;
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.ARCHERY);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ARCHERY);
 
         return textComponents;
     }

+ 19 - 18
src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java

@@ -1,16 +1,17 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.axes.Axes;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -34,43 +35,43 @@ public class AxesCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // ARMOR IMPACT
         if (canImpact) {
-            impactDamage = ((McMMOPlayer) (mmoPlayer)).getArcheryManager().getImpactDurabilityDamage();
+            impactDamage = UserManager.getPlayer(player).getAxesManager().getImpactDurabilityDamage();
         }
 
         // AXE MASTERY
         if (canAxeMastery) {
-            axeMasteryDamage = Axes.getAxeMasteryBonusDamage(mmoPlayer.getPlayer());
+            axeMasteryDamage = Axes.getAxeMasteryBonusDamage(player);
         }
         
         // CRITICAL HIT
         if (canCritical) {
-            String[] criticalHitStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.AXES_CRITICAL_STRIKES);
+            String[] criticalHitStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.AXES_CRITICAL_STRIKES);
             critChance = criticalHitStrings[0];
             critChanceLucky = criticalHitStrings[1];
         }
         
         // SKULL SPLITTER
         if (canSkullSplitter) {
-            String[] skullSplitterStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] skullSplitterStrings = calculateLengthDisplayValues(player, skillValue);
             skullSplitterLength = skullSplitterStrings[0];
             skullSplitterLengthEndurance = skullSplitterStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canSkullSplitter = Permissions.skullSplitter(mmoPlayer.getPlayer()) && RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.AXES_SKULL_SPLITTER);
-        canCritical = canUseSubskill(mmoPlayer, SubSkillType.AXES_CRITICAL_STRIKES);
-        canAxeMastery = canUseSubskill(mmoPlayer, SubSkillType.AXES_AXE_MASTERY);
-        canImpact = canUseSubskill(mmoPlayer, SubSkillType.AXES_ARMOR_IMPACT);
-        canGreaterImpact = canUseSubskill(mmoPlayer, SubSkillType.AXES_GREATER_IMPACT);
+    protected void permissionsCheck(Player player) {
+        canSkullSplitter = Permissions.skullSplitter(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.AXES_SKULL_SPLITTER);
+        canCritical = canUseSubskill(player, SubSkillType.AXES_CRITICAL_STRIKES);
+        canAxeMastery = canUseSubskill(player, SubSkillType.AXES_AXE_MASTERY);
+        canImpact = canUseSubskill(player, SubSkillType.AXES_ARMOR_IMPACT);
+        canGreaterImpact = canUseSubskill(player, SubSkillType.AXES_GREATER_IMPACT);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canImpact) {
@@ -95,19 +96,19 @@ public class AxesCommand extends SkillCommand {
                     + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", skullSplitterLengthEndurance) : ""));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.AXES_AXES_LIMIT_BREAK)) {
+        if(canUseSubskill(player, SubSkillType.AXES_AXES_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.AXES_AXES_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(mmoPlayer, SubSkillType.AXES_AXES_LIMIT_BREAK, 1000))));
+                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(player, SubSkillType.AXES_AXES_LIMIT_BREAK, 1000))));
         }
 
         return messages;
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.AXES);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.AXES);
 
         return textComponents;
     }

+ 13 - 14
src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java

@@ -1,16 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.excavation.ExcavationManager;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -27,26 +26,26 @@ public class ExcavationCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // GIGA DRILL BREAKER
         if (canGigaDrill) {
-            String[] gigaDrillStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] gigaDrillStrings = calculateLengthDisplayValues(player, skillValue);
             gigaDrillBreakerLength = gigaDrillStrings[0];
             gigaDrillBreakerLengthEndurance = gigaDrillStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canGigaDrill = Permissions.gigaDrillBreaker(mmoPlayer.getPlayer()) && RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER);
-        canTreasureHunt = canUseSubskill(mmoPlayer, SubSkillType.EXCAVATION_ARCHAEOLOGY);
+    protected void permissionsCheck(Player player) {
+        canGigaDrill = Permissions.gigaDrillBreaker(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER);
+        canTreasureHunt = canUseSubskill(player, SubSkillType.EXCAVATION_ARCHAEOLOGY);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
-        ExcavationManager excavationManager = ((McMMOPlayer) (mmoPlayer)).getExcavationManager();
+        ExcavationManager excavationManager = UserManager.getPlayer(player).getExcavationManager();
 
         if (canGigaDrill) {
             messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength)
@@ -55,7 +54,7 @@ public class ExcavationCommand extends SkillCommand {
             //messages.add(LocaleLoader.getString("Excavation.Effect.Length", gigaDrillBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
+        if(canUseSubskill(player, SubSkillType.EXCAVATION_ARCHAEOLOGY)) {
             messages.add(getStatMessage(false, false, SubSkillType.EXCAVATION_ARCHAEOLOGY,
                     percent.format(excavationManager.getArchaelogyExperienceOrbChance() / 100.0D)));
             messages.add(getStatMessage(true, false, SubSkillType.EXCAVATION_ARCHAEOLOGY,
@@ -67,10 +66,10 @@ public class ExcavationCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.EXCAVATION);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.EXCAVATION);
 
         return textComponents;
     }

+ 18 - 18
src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java

@@ -7,13 +7,13 @@ import com.gmail.nossr50.datatypes.treasure.Rarity;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.fishing.FishingManager;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -47,8 +47,8 @@ public class FishingCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
-        FishingManager fishingManager = ((McMMOPlayer) (mmoPlayer)).getFishingManager();
+    protected void dataCalculations(Player player, float skillValue) {
+        FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
 
         // TREASURE HUNTER
         if (canTreasureHunt) {
@@ -79,35 +79,35 @@ public class FishingCommand extends SkillCommand {
 
         // FISHING_SHAKE
         if (canShake) {
-            String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(mmoPlayer, PrimarySkillType.FISHING, fishingManager.getShakeChance());
+            String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
             shakeChance = shakeStrings[0];
             shakeChanceLucky = shakeStrings[1];
         }
 
         // FISHERMAN'S DIET
         if (canFishermansDiet) {
-            fishermansDietRank = RankUtils.getRank(mmoPlayer, SubSkillType.FISHING_FISHERMANS_DIET);
+            fishermansDietRank = RankUtils.getRank(player, SubSkillType.FISHING_FISHERMANS_DIET);
         }
 
         // MASTER ANGLER
         if (canMasterAngler) {
-            maMinWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMinWaitReduction(RankUtils.getRank(mmoPlayer, SubSkillType.FISHING_MASTER_ANGLER), false));
-            maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(mmoPlayer, SubSkillType.FISHING_MASTER_ANGLER), false, 0));
+            maMinWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMinWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false));
+            maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false, 0));
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canTreasureHunt = canUseSubskill(mmoPlayer, SubSkillType.FISHING_TREASURE_HUNTER);
-        canMagicHunt = canUseSubskill(mmoPlayer, SubSkillType.FISHING_MAGIC_HUNTER) && canUseSubskill(mmoPlayer, SubSkillType.FISHING_TREASURE_HUNTER);
-        canShake = canUseSubskill(mmoPlayer, SubSkillType.FISHING_SHAKE);
-        canFishermansDiet = canUseSubskill(mmoPlayer, SubSkillType.FISHING_FISHERMANS_DIET);
-        canMasterAngler = mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() != null && canUseSubskill(mmoPlayer, SubSkillType.FISHING_MASTER_ANGLER);
-        canIceFish = canUseSubskill(mmoPlayer, SubSkillType.FISHING_ICE_FISHING);
+    protected void permissionsCheck(Player player) {
+        canTreasureHunt = canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
+        canMagicHunt = canUseSubskill(player, SubSkillType.FISHING_MAGIC_HUNTER) && canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
+        canShake = canUseSubskill(player, SubSkillType.FISHING_SHAKE);
+        canFishermansDiet = canUseSubskill(player, SubSkillType.FISHING_FISHERMANS_DIET);
+        canMasterAngler = mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() != null && canUseSubskill(player, SubSkillType.FISHING_MASTER_ANGLER);
+        canIceFish = canUseSubskill(player, SubSkillType.FISHING_ICE_FISHING);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
         
         if (canFishermansDiet) {
@@ -152,10 +152,10 @@ public class FishingCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.FISHING);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.FISHING);
 
         return textComponents;
     }

+ 21 - 33
src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java

@@ -1,17 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
 import org.bukkit.Material;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -43,74 +41,64 @@ public class HerbalismCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         
         // DOUBLE DROPS
         if (canDoubleDrop) {
-            String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.HERBALISM_DOUBLE_DROPS);
+            String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_DOUBLE_DROPS);
             doubleDropChance = doubleDropStrings[0];
             doubleDropChanceLucky = doubleDropStrings[1];
         }
         
         // FARMERS DIET
         if (canFarmersDiet) {
-            farmersDietRank = RankUtils.getRank(mmoPlayer, SubSkillType.HERBALISM_FARMERS_DIET);
+            farmersDietRank = RankUtils.getRank(player, SubSkillType.HERBALISM_FARMERS_DIET);
         }
         
         // GREEN TERRA
         if (canGreenTerra) {
-            String[] greenTerraStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] greenTerraStrings = calculateLengthDisplayValues(player, skillValue);
             greenTerraLength = greenTerraStrings[0];
             greenTerraLengthEndurance = greenTerraStrings[1];
         }
 
         // GREEN THUMB
         if (canGreenThumbBlocks || canGreenThumbPlants) {
-            greenThumbStage = RankUtils.getRank(mmoPlayer, SubSkillType.HERBALISM_GREEN_THUMB);
+            greenThumbStage = RankUtils.getRank(player, SubSkillType.HERBALISM_GREEN_THUMB);
 
-            String[] greenThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.HERBALISM_GREEN_THUMB);
+            String[] greenThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_GREEN_THUMB);
             greenThumbChance = greenThumbStrings[0];
             greenThumbChanceLucky = greenThumbStrings[1];
         }
 
         // HYLIAN LUCK
         if (hasHylianLuck) {
-            String[] hylianLuckStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.HERBALISM_HYLIAN_LUCK);
+            String[] hylianLuckStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_HYLIAN_LUCK);
             hylianLuckChance = hylianLuckStrings[0];
             hylianLuckChanceLucky = hylianLuckStrings[1];
         }
 
         // SHROOM THUMB
         if (canShroomThumb) {
-            String[] shroomThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.HERBALISM_SHROOM_THUMB);
+            String[] shroomThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_SHROOM_THUMB);
             shroomThumbChance = shroomThumbStrings[0];
             shroomThumbChanceLucky = shroomThumbStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        hasHylianLuck = canUseSubskill(mmoPlayer, SubSkillType.HERBALISM_HYLIAN_LUCK);
-        canGreenTerra = Permissions.greenTerra(mmoPlayer.getPlayer());
-        canGreenThumbPlants = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.HERBALISM_GREEN_THUMB)
-                && (Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.WHEAT)
-                || Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.CARROT)
-                || Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.POTATO)
-                || Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.BEETROOT)
-                || Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.NETHER_WART)
-                || Permissions.greenThumbPlant(Misc.adaptPlayer(mmoPlayer), Material.COCOA));
-        canGreenThumbBlocks = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.HERBALISM_GREEN_THUMB)
-                && (Permissions.greenThumbBlock(Misc.adaptPlayer(mmoPlayer), Material.DIRT)
-                || Permissions.greenThumbBlock(Misc.adaptPlayer(mmoPlayer), Material.COBBLESTONE)
-                || Permissions.greenThumbBlock(Misc.adaptPlayer(mmoPlayer), Material.COBBLESTONE_WALL)
-                || Permissions.greenThumbBlock(Misc.adaptPlayer(mmoPlayer), Material.STONE_BRICKS));
-        canFarmersDiet = canUseSubskill(mmoPlayer, SubSkillType.HERBALISM_FARMERS_DIET);
-        canDoubleDrop = canUseSubskill(mmoPlayer, SubSkillType.HERBALISM_DOUBLE_DROPS) && !rootSkill.getDoubleDropsDisabled();
-        canShroomThumb = canUseSubskill(mmoPlayer, SubSkillType.HERBALISM_SHROOM_THUMB);
+    protected void permissionsCheck(Player player) {
+        hasHylianLuck = canUseSubskill(player, SubSkillType.HERBALISM_HYLIAN_LUCK);
+        canGreenTerra = Permissions.greenTerra(player);
+        canGreenThumbPlants = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbPlant(player, Material.WHEAT) || Permissions.greenThumbPlant(player, Material.CARROT) || Permissions.greenThumbPlant(player, Material.POTATO) || Permissions.greenThumbPlant(player, Material.BEETROOT) || Permissions.greenThumbPlant(player, Material.NETHER_WART) || Permissions.greenThumbPlant(player, Material.COCOA));
+        canGreenThumbBlocks = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbBlock(player, Material.DIRT) || Permissions.greenThumbBlock(player, Material.COBBLESTONE) || Permissions.greenThumbBlock(player, Material.COBBLESTONE_WALL) || Permissions.greenThumbBlock(player, Material.STONE_BRICKS));
+        canFarmersDiet = canUseSubskill(player, SubSkillType.HERBALISM_FARMERS_DIET);
+        canDoubleDrop = canUseSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && !skill.getDoubleDropsDisabled();
+        canShroomThumb = canUseSubskill(player, SubSkillType.HERBALISM_SHROOM_THUMB);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canDoubleDrop) {
@@ -153,10 +141,10 @@ public class HerbalismCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.HERBALISM);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.HERBALISM);
 
         return textComponents;
     }

+ 16 - 15
src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java

@@ -1,15 +1,16 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.mining.MiningManager;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,10 +39,10 @@ public class MiningCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // BLAST MINING
         if (canBlast || canDemoExpert || canBiggerBombs) {
-            MiningManager miningManager = ((McMMOPlayer) (mmoPlayer)).getMiningManager();
+            MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
 
             blastMiningRank = miningManager.getBlastMiningTier();
             bonusTNTDrops = miningManager.getDropMultiplier();
@@ -53,30 +54,30 @@ public class MiningCommand extends SkillCommand {
         
         // DOUBLE DROPS
         if (canDoubleDrop) {
-            String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.MINING_DOUBLE_DROPS);
+            String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.MINING_DOUBLE_DROPS);
             doubleDropChance = doubleDropStrings[0];
             doubleDropChanceLucky = doubleDropStrings[1];
         }
         
         // SUPER BREAKER
         if (canSuperBreaker) {
-            String[] superBreakerStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] superBreakerStrings = calculateLengthDisplayValues(player, skillValue);
             superBreakerLength = superBreakerStrings[0];
             superBreakerLengthEndurance = superBreakerStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canBiggerBombs = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.MINING_BIGGER_BOMBS) && Permissions.biggerBombs(mmoPlayer.getPlayer());
-        canBlast = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.MINING_BLAST_MINING) && Permissions.remoteDetonation(mmoPlayer.getPlayer());
-        canDemoExpert = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.MINING_DEMOLITIONS_EXPERTISE) && Permissions.demolitionsExpertise(mmoPlayer.getPlayer());
-        canDoubleDrop = canUseSubskill(mmoPlayer, SubSkillType.MINING_DOUBLE_DROPS);
-        canSuperBreaker = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.MINING_SUPER_BREAKER) && Permissions.superBreaker(mmoPlayer.getPlayer());
+    protected void permissionsCheck(Player player) {
+        canBiggerBombs = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BIGGER_BOMBS) && Permissions.biggerBombs(player);
+        canBlast = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BLAST_MINING) && Permissions.remoteDetonation(player);
+        canDemoExpert = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_DEMOLITIONS_EXPERTISE) && Permissions.demolitionsExpertise(player);
+        canDoubleDrop = canUseSubskill(player, SubSkillType.MINING_DOUBLE_DROPS);
+        canSuperBreaker = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_SUPER_BREAKER) && Permissions.superBreaker(player);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canBiggerBombs) {
@@ -110,10 +111,10 @@ public class MiningCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.MINING);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.MINING);
 
         return textComponents;
     }

+ 7 - 19
src/main/java/com/gmail/nossr50/commands/skills/MmoInfoCommand.java

@@ -1,16 +1,13 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
 import com.gmail.nossr50.listeners.InteractionManager;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.text.TextComponentFactory;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -37,13 +34,6 @@ public class MmoInfoCommand implements TabExecutor {
                 return false;
 
             Player player = (Player) commandSender;
-            OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-
-            if(mmoPlayer == null) {
-                player.sendMessage(LocaleLoader.getString("Commands.NotLoaded"));
-                return true;
-            }
-
             if(Permissions.mmoinfo(player))
             {
                 if(args == null || args[0] == null)
@@ -58,7 +48,7 @@ public class MmoInfoCommand implements TabExecutor {
                     return true;
                 } else if(InteractionManager.getAbstractByName(args[0]) != null || PrimarySkillType.SUBSKILL_NAMES.contains(args[0]))
                 {
-                    displayInfo(mmoPlayer, args[0]);
+                    displayInfo(player, args[0]);
                     return true;
                 }
 
@@ -79,21 +69,19 @@ public class MmoInfoCommand implements TabExecutor {
         return ImmutableList.of();
     }
 
-    private void displayInfo(@NotNull OnlineMMOPlayer mmoPlayer, String subSkillName)
+    private void displayInfo(Player player, String subSkillName)
     {
-        //Check to see if the rootSkillexists in the new system
+        //Check to see if the skill exists in the new system
         AbstractSubSkill abstractSubSkill = InteractionManager.getAbstractByName(subSkillName);
         if(abstractSubSkill != null)
         {
             /* New System Skills are programmable */
-            abstractSubSkill.printInfo(mmoPlayer.getPlayer());
+            abstractSubSkill.printInfo(player);
             //TextComponentFactory.sendPlayerUrlHeader(player);
         } else {
             /*
-             * rootSkillis only in the old system
+             * Skill is only in the old system
              */
-            Player player = Misc.adaptPlayer(mmoPlayer);
-
             player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
             player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", subSkillName));
             player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));
@@ -107,6 +95,6 @@ public class MmoInfoCommand implements TabExecutor {
         }
 
         //Send Player Wiki Link
-        TextComponentFactory.sendPlayerSubSkillWikiLink(mmoPlayer, subSkillName);
+        TextComponentFactory.sendPlayerSubSkillWikiLink(player, subSkillName);
     }
 }

+ 22 - 21
src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.commands.skills;
 
 import com.gmail.nossr50.datatypes.skills.MaterialType;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
@@ -9,13 +10,13 @@ import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.RepairManager;
 import com.gmail.nossr50.skills.repair.repairables.Repairable;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
 import org.bukkit.Material;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -47,7 +48,7 @@ public class RepairCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // We're using pickaxes here, not the best but it works
         Repairable diamondRepairable = mcMMO.getRepairableManager().getRepairable(Material.DIAMOND_PICKAXE);
         Repairable goldRepairable = mcMMO.getRepairableManager().getRepairable(Material.GOLDEN_PICKAXE);
@@ -67,37 +68,37 @@ public class RepairCommand extends SkillCommand {
 
         // SUPER REPAIR
         if (canSuperRepair) {
-            String[] superRepairStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.REPAIR_SUPER_REPAIR);
+            String[] superRepairStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.REPAIR_SUPER_REPAIR);
             superRepairChance = superRepairStrings[0];
             superRepairChanceLucky = superRepairStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canSuperRepair = canUseSubskill(mmoPlayer, SubSkillType.REPAIR_SUPER_REPAIR);
-        canMasterRepair = canUseSubskill(mmoPlayer, SubSkillType.REPAIR_REPAIR_MASTERY);
-        canArcaneForge = canUseSubskill(mmoPlayer, SubSkillType.REPAIR_ARCANE_FORGING);
-        canRepairDiamond = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.DIAMOND);
-        canRepairGold = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.GOLD);
-        canRepairIron = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.IRON);
-        canRepairStone = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.STONE);
-        canRepairString = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.STRING);
-        canRepairLeather = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.LEATHER);
-        canRepairWood = Permissions.repairMaterialType(Misc.adaptPlayer(mmoPlayer), MaterialType.WOOD);
-        arcaneBypass = (Permissions.arcaneBypass(mmoPlayer.getPlayer()) || Permissions.hasRepairEnchantBypassPerk(mmoPlayer.getPlayer()));
+    protected void permissionsCheck(Player player) {
+        canSuperRepair = canUseSubskill(player, SubSkillType.REPAIR_SUPER_REPAIR);
+        canMasterRepair = canUseSubskill(player, SubSkillType.REPAIR_REPAIR_MASTERY);
+        canArcaneForge = canUseSubskill(player, SubSkillType.REPAIR_ARCANE_FORGING);
+        canRepairDiamond = Permissions.repairMaterialType(player, MaterialType.DIAMOND);
+        canRepairGold = Permissions.repairMaterialType(player, MaterialType.GOLD);
+        canRepairIron = Permissions.repairMaterialType(player, MaterialType.IRON);
+        canRepairStone = Permissions.repairMaterialType(player, MaterialType.STONE);
+        canRepairString = Permissions.repairMaterialType(player, MaterialType.STRING);
+        canRepairLeather = Permissions.repairMaterialType(player, MaterialType.LEATHER);
+        canRepairWood = Permissions.repairMaterialType(player, MaterialType.WOOD);
+        arcaneBypass = (Permissions.arcaneBypass(player) || Permissions.hasRepairEnchantBypassPerk(player));
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canArcaneForge) {
-            RepairManager repairManager = ((McMMOPlayer) (mmoPlayer)).getRepairManager();
+            RepairManager repairManager = UserManager.getPlayer(player).getRepairManager();
 
             messages.add(getStatMessage(false, true,
                     SubSkillType.REPAIR_ARCANE_FORGING,
-                    String.valueOf(RankUtils.getRank(mmoPlayer, SubSkillType.REPAIR_ARCANE_FORGING)),
+                    String.valueOf(RankUtils.getRank(player, SubSkillType.REPAIR_ARCANE_FORGING)),
                     RankUtils.getHighestRankStr(SubSkillType.REPAIR_ARCANE_FORGING)));
 
             if (ArcaneForging.arcaneForgingEnchantLoss || ArcaneForging.arcaneForgingDowngrades) {
@@ -120,10 +121,10 @@ public class RepairCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.REPAIR);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.REPAIR);
 
         return textComponents;
     }

+ 12 - 11
src/main/java/com/gmail/nossr50/commands/skills/SalvageCommand.java

@@ -1,14 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.skills.salvage.SalvageManager;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -22,26 +23,26 @@ public class SalvageCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // TODO Auto-generated method stub
 
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canScrapCollector = canUseSubskill(mmoPlayer, SubSkillType.SALVAGE_SCRAP_COLLECTOR);
-        canArcaneSalvage = canUseSubskill(mmoPlayer, SubSkillType.SALVAGE_ARCANE_SALVAGE);
+    protected void permissionsCheck(Player player) {
+        canScrapCollector = canUseSubskill(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR);
+        canArcaneSalvage = canUseSubskill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
-        SalvageManager salvageManager = ((McMMOPlayer) (mmoPlayer)).getSalvageManager();
+        SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager();
 
         if (canScrapCollector) {
             messages.add(getStatMessage(false, true,
                     SubSkillType.SALVAGE_SCRAP_COLLECTOR,
-                    String.valueOf(RankUtils.getRank(mmoPlayer, SubSkillType.SALVAGE_SCRAP_COLLECTOR)),
+                    String.valueOf(RankUtils.getRank(player, SubSkillType.SALVAGE_SCRAP_COLLECTOR)),
                     RankUtils.getHighestRankStr(SubSkillType.SALVAGE_SCRAP_COLLECTOR)));
         }
 
@@ -63,10 +64,10 @@ public class SalvageCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.SALVAGE);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SALVAGE);
 
         return textComponents;
     }

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

@@ -2,15 +2,15 @@ package com.gmail.nossr50.commands.skills;
 
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.child.FamilyTree;
-import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
 import com.gmail.nossr50.util.player.NotificationManager;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.skills.PerksUtils;
@@ -19,8 +19,6 @@ import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.gmail.nossr50.util.text.TextComponentFactory;
 import com.google.common.collect.ImmutableList;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
-import com.neetgames.mcmmo.skill.RootSkill;
 import net.kyori.adventure.text.Component;
 import net.md_5.bungee.api.ChatColor;
 import org.bukkit.command.Command;
@@ -37,8 +35,7 @@ import java.util.Locale;
 import java.util.Set;
 
 public abstract class SkillCommand implements TabExecutor {
-    protected @NotNull RootSkill rootSkill;
-    protected @NotNull RootSkill rootSkill;
+    protected PrimarySkillType skill;
     private final String skillName;
 
     protected DecimalFormat percent = new DecimalFormat("##0.00%");
@@ -46,11 +43,10 @@ public abstract class SkillCommand implements TabExecutor {
 
     private final CommandExecutor skillGuideCommand;
 
-    public SkillCommand(@NotNull RootSkill rootSkill) {
-        this.rootSkill = PrimarySkillType.getSkill(primarySkillType);
-        this.primarySkillType = primarySkillType;
-        skillName = rootSkill.getName();
-        skillGuideCommand = new SkillGuideCommand(rootSkill);
+    public SkillCommand(PrimarySkillType skill) {
+        this.skill = skill;
+        skillName = skill.getName();
+        skillGuideCommand = new SkillGuideCommand(skill);
     }
 
     @Override
@@ -63,33 +59,33 @@ public abstract class SkillCommand implements TabExecutor {
             return true;
         }
 
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer((Player) sender);
-
-        if(mmoPlayer == null) {
+        if(UserManager.getPlayer((Player) sender) == null)
+        {
             sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
             return true;
         }
 
         if (args.length == 0) {
-            Player player = Misc.adaptPlayer(mmoPlayer);
+            Player player = (Player) sender;
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
 
-            boolean isLucky = Permissions.lucky(player, rootSkill);
+            boolean isLucky = Permissions.lucky(player, skill);
             boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
-            float skillValue = mmoPlayer.getExperienceHandler().getSkillLevel(rootSkill);
+            float skillValue = mcMMOPlayer.getSkillLevel(skill);
 
-            //Send the players a few blank lines to make finding the top of the rootSkillcommand easier
+            //Send the players a few blank lines to make finding the top of the skill command easier
             if (AdvancedConfig.getInstance().doesSkillCommandSendBlankLines())
                 for (int i = 0; i < 2; i++) {
                     player.sendMessage("");
                 }
 
-            permissionsCheck(mmoPlayer);
-            dataCalculations(mmoPlayer, skillValue);
+            permissionsCheck(player);
+            dataCalculations(player, skillValue);
 
-            sendSkillCommandHeader(mmoPlayer, (int) skillValue);
+            sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
 
             //Make JSON text components
-            List<Component> subskillTextComponents = getTextComponents(mmoPlayer);
+            List<Component> subskillTextComponents = getTextComponents(player);
 
             //Subskills Header
             player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul")));
@@ -104,7 +100,7 @@ public abstract class SkillCommand implements TabExecutor {
                 }*/
 
             //Stats
-            sendStatMessages(mmoPlayer, isLucky, hasEndurance, skillValue);
+            getStatMessages(player, isLucky, hasEndurance, skillValue);
 
             //Header
 
@@ -112,12 +108,12 @@ public abstract class SkillCommand implements TabExecutor {
             //Link Header
             if (Config.getInstance().getUrlLinksEnabled()) {
                 player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header"));
-                TextComponentFactory.sendPlayerUrlHeader(mmoPlayer);
+                TextComponentFactory.sendPlayerUrlHeader(player);
             }
 
 
             if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) {
-                ScoreboardManager.enablePlayerSkillScoreboard(player, primarySkillType);
+                ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
             }
 
             return true;
@@ -125,39 +121,39 @@ public abstract class SkillCommand implements TabExecutor {
         return skillGuideCommand.onCommand(sender, command, label, args);
     }
 
-    private void sendStatMessages(@NotNull OnlineMMOPlayer mmoPlayer, boolean isLucky, boolean hasEndurance, float skillValue) {
-        List<String> statsMessages = statsDisplay(mmoPlayer, skillValue, hasEndurance, isLucky);
+    private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) {
+        List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
 
         if (!statsMessages.isEmpty()) {
-            Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
+            player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
 
             for (String message : statsMessages) {
-                Misc.adaptPlayer(mmoPlayer).sendMessage(message);
+                player.sendMessage(message);
             }
         }
 
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase(Locale.ENGLISH)));
+        player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase(Locale.ENGLISH)));
     }
 
-    private void sendSkillCommandHeader(@NotNull OnlineMMOPlayer mmoPlayer, int skillValue) {
+    private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
         ChatColor hd1 = ChatColor.DARK_AQUA;
         ChatColor c1 = ChatColor.GOLD;
         ChatColor c2 = ChatColor.RED;
 
 
-        Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
+        player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
 
-        if(!PrimarySkillType.isChildSkill(rootSkill))
+        if(!skill.isChildSkill())
         {
             /*
              * NON-CHILD SKILLS
              */
 
             //XP GAIN METHOD
-            Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(rootSkill.toString()))));
+            player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
 
             //LEVEL
-            Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mmoPlayer.getExperienceHandler().getSkillXpValue(rootSkill), mmoPlayer.getExperienceHandler().getExperienceToNextLevel(rootSkill)));
+            player.sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
 
         } else {
             /*
@@ -165,11 +161,11 @@ public abstract class SkillCommand implements TabExecutor {
              */
 
 
-            Set<RootSkill> parents = FamilyTree.getParentSkills(rootSkill);
+            Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
 
             //TODO: Add JSON here
-            /*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mmoPlayer.getSkillLevel(parent), mmoPlayer.getSkillXpLevel(parent), mmoPlayer.getXpToLevel(parent)))*/
-            ArrayList<RootSkill> parentList = new ArrayList<>(parents);
+            /*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/
+            ArrayList<PrimarySkillType> parentList = new ArrayList<>(parents);
 
             StringBuilder parentMessage = new StringBuilder();
 
@@ -185,15 +181,35 @@ public abstract class SkillCommand implements TabExecutor {
             }
 
             //XP GAIN METHOD
-            Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
+            player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
 
-            Misc.adaptPlayer(mmoPlayer).sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage.toString()));
+            player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage.toString()));
+            //LEVEL
+            //player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue));
 
         }
+        /*
+        if (!skill.isChildSkill()) {
+            player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
+            player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
+            player.sendMessage(LocaleLoader.getString("Effects.Level", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
+        } else {
+            player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
+            player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
+            player.sendMessage(LocaleLoader.getString("Effects.Child", skillValue));
+
+            player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
+            Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
+
+            for (PrimarySkillType parent : parents) {
+                player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)));
+            }
+        }
+        */
     }
 
     @Override
-    public @NotNull List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
+    public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
         if (args.length == 1) {
             return ImmutableList.of("?");
         }
@@ -204,12 +220,12 @@ public abstract class SkillCommand implements TabExecutor {
         return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
     }
 
-    protected @NotNull String[] getAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull OnlineMMOPlayer mmoPlayer, @NotNull SubSkillType subSkill) {
-        return RandomChanceUtil.calculateAbilityDisplayValues(SkillActivationType, Misc.adaptPlayer(mmoPlayer), subSkill);
+    protected String[] getAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkill) {
+        return RandomChanceUtil.calculateAbilityDisplayValues(skillActivationType, player, subSkill);
     }
 
-    protected @NotNull String[] calculateLengthDisplayValues(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
-        int maxLength = PrimarySkillType.getSuperAbilityType().getMaxLength();
+    protected String[] calculateLengthDisplayValues(Player player, float skillValue) {
+        int maxLength = skill.getAbility().getMaxLength();
         int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
         int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
 
@@ -217,13 +233,13 @@ public abstract class SkillCommand implements TabExecutor {
 
         if(abilityLengthCap <= 0)
         {
-            length = 2 + (int) (rootSkillValue / abilityLengthVar);
+            length = 2 + (int) (skillValue / abilityLengthVar);
         }
         else {
             length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar);
         }
 
-        int enduranceLength = PerksUtils.handleActivationPerks(Misc.adaptPlayer(mmoPlayer), length, maxLength);
+        int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
 
         if (maxLength != 0) {
             length = Math.min(length, maxLength);
@@ -232,12 +248,12 @@ public abstract class SkillCommand implements TabExecutor {
         return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
     }
 
-    protected @NotNull String getStatMessage(SubSkillType subSkillType, String... vars)
+    protected String getStatMessage(SubSkillType subSkillType, String... vars)
     {
         return getStatMessage(false, false, subSkillType, vars);
     }
 
-    protected @NotNull String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars)
+    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();
@@ -251,7 +267,7 @@ public abstract class SkillCommand implements TabExecutor {
         }
     }
 
-    protected @NotNull String getLimitBreakDescriptionParameter() {
+    protected String getLimitBreakDescriptionParameter() {
         if(AdvancedConfig.getInstance().canApplyLimitBreakPVE()) {
             return "(PVP/PVE)";
         } else {
@@ -259,23 +275,24 @@ public abstract class SkillCommand implements TabExecutor {
         }
     }
 
-    protected abstract void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue);
+    protected abstract void dataCalculations(Player player, float skillValue);
 
-    protected abstract void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer);
+    protected abstract void permissionsCheck(Player player);
 
     //protected abstract List<String> effectsDisplay();
 
-    protected abstract @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky);
+    protected abstract List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky);
 
-    protected abstract @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer player);
+    protected abstract List<Component> getTextComponents(Player player);
 
     /**
      * Checks if a player can use a skill
-     * @param mmoPlayer target player
+     * @param player target player
      * @param subSkillType target subskill
-     * @return true if the player has permission and has the rootSkillunlocked
+     * @return true if the player has permission and has the skill unlocked
      */
-    protected boolean canUseSubskill(@NotNull OnlineMMOPlayer mmoPlayer, SubSkillType subSkillType) {
-        return Permissions.isSubSkillEnabled(Misc.adaptPlayer(mmoPlayer), subSkillType) && RankUtils.hasUnlockedSubskill(mmoPlayer, subSkillType);
+    protected boolean canUseSubskill(Player player, SubSkillType subSkillType)
+    {
+        return Permissions.isSubSkillEnabled(player, subSkillType) && RankUtils.hasUnlockedSubskill(player, subSkillType);
     }
 }

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

@@ -1,9 +1,8 @@
 package com.gmail.nossr50.commands.skills;
 
-import com.gmail.nossr50.datatypes.skills.CoreSkills;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.text.StringUtils;
-import com.neetgames.mcmmo.skill.RootSkill;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
@@ -12,18 +11,15 @@ import org.jetbrains.annotations.NotNull;
 import java.util.ArrayList;
 import java.util.Arrays;
 
-//TODO: Switch to root rootSkillbased
 public class SkillGuideCommand implements CommandExecutor {
     private final String header;
-    private final RootSkill rootSkill;
     private final ArrayList<String> guide;
 
     private final String invalidPage = LocaleLoader.getString("Guides.Page.Invalid");
 
-    public SkillGuideCommand(@NotNull RootSkill rootSkill) {
-        this.rootSkill = rootSkill;
-        header = LocaleLoader.getString("Guides.Header", rootSkill.getName());
-        guide = getGuide(rootSkill);
+    public SkillGuideCommand(PrimarySkillType skill) {
+        header = LocaleLoader.getString("Guides.Header", skill.getName());
+        guide = getGuide(skill);
     }
 
     @Override
@@ -90,11 +86,11 @@ public class SkillGuideCommand implements CommandExecutor {
         return allStrings;
     }
 
-    private ArrayList<String> getGuide(RootSkill rootSkill) {
+    private ArrayList<String> getGuide(PrimarySkillType skill) {
         ArrayList<String> guide = new ArrayList<>();
 
         for (int i = 0; i < 10; i++) {
-            String[] section = LocaleLoader.getString("Guides." + StringUtils.getCapitalized(rootSkill.toString()) + ".Section." + i).split("\n");
+            String[] section = LocaleLoader.getString("Guides." + StringUtils.getCapitalized(skill.toString()) + ".Section." + i).split("\n");
 
             if (section[0].startsWith("!")) {
                 break;

+ 14 - 13
src/main/java/com/gmail/nossr50/commands/skills/SmeltingCommand.java

@@ -1,14 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,10 +31,10 @@ public class SmeltingCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // FUEL EFFICIENCY
         if (canFuelEfficiency) {
-            burnTimeModifier = String.valueOf(((McMMOPlayer) (mmoPlayer)).getSmeltingManager().getFuelEfficiencyMultiplier());
+            burnTimeModifier = String.valueOf(UserManager.getPlayer(player).getSmeltingManager().getFuelEfficiencyMultiplier());
         }
 
         // FLUX MINING
@@ -45,22 +46,22 @@ public class SmeltingCommand extends SkillCommand {
         
         // SECOND SMELT
         if (canSecondSmelt) {
-            String[] secondSmeltStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.SMELTING_SECOND_SMELT);
+            String[] secondSmeltStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SMELTING_SECOND_SMELT);
             str_secondSmeltChance = secondSmeltStrings[0];
             str_secondSmeltChanceLucky = secondSmeltStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canFuelEfficiency = canUseSubskill(mmoPlayer, SubSkillType.SMELTING_FUEL_EFFICIENCY);
-        canSecondSmelt = canUseSubskill(mmoPlayer, SubSkillType.SMELTING_SECOND_SMELT);
+    protected void permissionsCheck(Player player) {
+        canFuelEfficiency = canUseSubskill(player, SubSkillType.SMELTING_FUEL_EFFICIENCY);
+        canSecondSmelt = canUseSubskill(player, SubSkillType.SMELTING_SECOND_SMELT);
         //canFluxMine = canUseSubskill(player, SubSkillType.SMELTING_FLUX_MINING);
-        canUnderstandTheArt = Permissions.vanillaXpBoost(Misc.adaptPlayer(mmoPlayer), rootSkill) && RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.SMELTING_UNDERSTANDING_THE_ART);
+        canUnderstandTheArt = Permissions.vanillaXpBoost(player, skill) && RankUtils.hasUnlockedSubskill(player, SubSkillType.SMELTING_UNDERSTANDING_THE_ART);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         /*if (canFluxMine) {
@@ -80,17 +81,17 @@ public class SmeltingCommand extends SkillCommand {
 
         if (canUnderstandTheArt) {
             messages.add(getStatMessage(false, true, SubSkillType.SMELTING_UNDERSTANDING_THE_ART,
-                    String.valueOf(((McMMOPlayer) (mmoPlayer)).getSmeltingManager().getVanillaXpMultiplier())));
+                    String.valueOf(UserManager.getPlayer(player).getSmeltingManager().getVanillaXpMultiplier())));
         }
 
         return messages;
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.SMELTING);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SMELTING);
 
         return textComponents;
     }

+ 22 - 21
src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java

@@ -1,16 +1,17 @@
 package com.gmail.nossr50.commands.skills;
 
 import com.gmail.nossr50.config.AdvancedConfig;
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -33,45 +34,45 @@ public class SwordsCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // SWORDS_COUNTER_ATTACK
         if (canCounter) {
-            String[] counterStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.SWORDS_COUNTER_ATTACK);
+            String[] counterStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_COUNTER_ATTACK);
             counterChance = counterStrings[0];
             counterChanceLucky = counterStrings[1];
         }
 
         // SWORDS_RUPTURE
         if (canBleed) {
-            bleedLength = ((McMMOPlayer) (mmoPlayer)).getSwordsManager().getRuptureBleedTicks();
+            bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
 
-            String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.SWORDS_RUPTURE);
+            String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE);
             bleedChance = bleedStrings[0];
             bleedChanceLucky = bleedStrings[1];
         }
         
         // SERRATED STRIKES
         if (canSerratedStrike) {
-            String[] serratedStrikesStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] serratedStrikesStrings = calculateLengthDisplayValues(player, skillValue);
             serratedStrikesLength = serratedStrikesStrings[0];
             serratedStrikesLengthEndurance = serratedStrikesStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canBleed = canUseSubskill(mmoPlayer, SubSkillType.SWORDS_RUPTURE);
-        canCounter = canUseSubskill(mmoPlayer, SubSkillType.SWORDS_COUNTER_ATTACK);
-        canSerratedStrike = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(mmoPlayer.getPlayer());
+    protected void permissionsCheck(Player player) {
+        canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE);
+        canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK);
+        canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
-        int ruptureTicks = ((McMMOPlayer) (mmoPlayer)).getSwordsManager().getRuptureBleedTicks();
-        double ruptureDamagePlayers =  RankUtils.getRank(mmoPlayer, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer();
-        double ruptureDamageMobs =  RankUtils.getRank(mmoPlayer, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs();
+        int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
+        double ruptureDamagePlayers =  RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer();
+        double ruptureDamageMobs =  RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs();
 
         if (canCounter) {
             messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance)
@@ -94,25 +95,25 @@ public class SwordsCommand extends SkillCommand {
                     + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", serratedStrikesLengthEndurance) : ""));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.SWORDS_STAB))
+        if(canUseSubskill(player, SubSkillType.SWORDS_STAB))
         {
             messages.add(getStatMessage(SubSkillType.SWORDS_STAB,
-                    String.valueOf(((McMMOPlayer) (mmoPlayer)).getSwordsManager().getStabDamage())));
+                    String.valueOf(UserManager.getPlayer(player).getSwordsManager().getStabDamage())));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) {
+        if(canUseSubskill(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.SWORDS_SWORDS_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(mmoPlayer, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK, 1000))));
+                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(player, SubSkillType.SWORDS_SWORDS_LIMIT_BREAK, 1000))));
         }
 
         return messages;
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.SWORDS);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SWORDS);
 
         return textComponents;
     }

+ 17 - 17
src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java

@@ -1,15 +1,15 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.taming.Taming;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
 import org.bukkit.entity.EntityType;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -33,29 +33,29 @@ public class TamingCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         if (canGore) {
-            String[] goreStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.TAMING_GORE);
+            String[] goreStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.TAMING_GORE);
             goreChance = goreStrings[0];
             goreChanceLucky = goreStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canBeastLore = canUseSubskill(mmoPlayer, SubSkillType.TAMING_BEAST_LORE);
-        canCallWild = Permissions.callOfTheWild(Misc.adaptPlayer(mmoPlayer), EntityType.HORSE) || Permissions.callOfTheWild(Misc.adaptPlayer(mmoPlayer), EntityType.WOLF) || Permissions.callOfTheWild(Misc.adaptPlayer(mmoPlayer), EntityType.OCELOT);
-        canEnvironmentallyAware = canUseSubskill(mmoPlayer, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE);
-        canFastFood = canUseSubskill(mmoPlayer, SubSkillType.TAMING_FAST_FOOD_SERVICE);
-        canGore = canUseSubskill(mmoPlayer, SubSkillType.TAMING_GORE);
-        canSharpenedClaws = canUseSubskill(mmoPlayer, SubSkillType.TAMING_SHARPENED_CLAWS);
-        canShockProof = canUseSubskill(mmoPlayer, SubSkillType.TAMING_SHOCK_PROOF);
-        canThickFur = canUseSubskill(mmoPlayer, SubSkillType.TAMING_THICK_FUR);
-        canHolyHound = canUseSubskill(mmoPlayer, SubSkillType.TAMING_HOLY_HOUND);
+    protected void permissionsCheck(Player player) {
+        canBeastLore = canUseSubskill(player, SubSkillType.TAMING_BEAST_LORE);
+        canCallWild = Permissions.callOfTheWild(player, EntityType.HORSE) || Permissions.callOfTheWild(player, EntityType.WOLF) || Permissions.callOfTheWild(player, EntityType.OCELOT);
+        canEnvironmentallyAware = canUseSubskill(player, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE);
+        canFastFood = canUseSubskill(player, SubSkillType.TAMING_FAST_FOOD_SERVICE);
+        canGore = canUseSubskill(player, SubSkillType.TAMING_GORE);
+        canSharpenedClaws = canUseSubskill(player, SubSkillType.TAMING_SHARPENED_CLAWS);
+        canShockProof = canUseSubskill(player, SubSkillType.TAMING_SHOCK_PROOF);
+        canThickFur = canUseSubskill(player, SubSkillType.TAMING_THICK_FUR);
+        canHolyHound = canUseSubskill(player, SubSkillType.TAMING_HOLY_HOUND);
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canEnvironmentallyAware) {
@@ -92,10 +92,10 @@ public class TamingCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, this.rootSkill);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, this.skill);
 
         return textComponents;
     }

+ 20 - 19
src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java

@@ -1,15 +1,16 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.CombatUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -36,53 +37,53 @@ public class UnarmedCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // UNARMED_ARROW_DEFLECT
         if (canDeflect) {
-            String[] deflectStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.UNARMED_ARROW_DEFLECT);
+            String[] deflectStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_ARROW_DEFLECT);
             deflectChance = deflectStrings[0];
             deflectChanceLucky = deflectStrings[1];
         }
         
         // BERSERK
         if (canBerserk) {
-            String[] berserkStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] berserkStrings = calculateLengthDisplayValues(player, skillValue);
             berserkLength = berserkStrings[0];
             berserkLengthEndurance = berserkStrings[1];
         }
 
         // UNARMED_DISARM
         if (canDisarm) {
-            String[] disarmStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP,  mmoPlayer, SubSkillType.UNARMED_DISARM);
+            String[] disarmStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_DISARM);
             disarmChance = disarmStrings[0];
             disarmChanceLucky = disarmStrings[1];
         }
 
         // IRON ARM
         if (canIronArm) {
-            ironArmBonus = ((McMMOPlayer) (mmoPlayer)).getUnarmedManager().getSteelArmStyleDamage();
+            ironArmBonus = UserManager.getPlayer(player).getUnarmedManager().getSteelArmStyleDamage();
         }
 
         // IRON GRIP
         if (canIronGrip) {
-            String[] ironGripStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.UNARMED_IRON_GRIP);
+            String[] ironGripStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_IRON_GRIP);
             ironGripChance = ironGripStrings[0];
             ironGripChanceLucky = ironGripStrings[1];
         }
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canBerserk = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.UNARMED_BERSERK) && Permissions.berserk(mmoPlayer.getPlayer());
-        canIronArm = canUseSubskill(mmoPlayer, SubSkillType.UNARMED_STEEL_ARM_STYLE);
-        canDeflect = canUseSubskill(mmoPlayer, SubSkillType.UNARMED_ARROW_DEFLECT);
-        canDisarm = canUseSubskill(mmoPlayer, SubSkillType.UNARMED_DISARM);
-        canIronGrip = canUseSubskill(mmoPlayer, SubSkillType.UNARMED_IRON_GRIP);
+    protected void permissionsCheck(Player player) {
+        canBerserk = RankUtils.hasUnlockedSubskill(player, SubSkillType.UNARMED_BERSERK) && Permissions.berserk(player);
+        canIronArm = canUseSubskill(player, SubSkillType.UNARMED_STEEL_ARM_STYLE);
+        canDeflect = canUseSubskill(player, SubSkillType.UNARMED_ARROW_DEFLECT);
+        canDisarm = canUseSubskill(player, SubSkillType.UNARMED_DISARM);
+        canIronGrip = canUseSubskill(player, SubSkillType.UNARMED_IRON_GRIP);
         // TODO: Apparently we forgot about block cracker?
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canDeflect) {
@@ -113,19 +114,19 @@ public class UnarmedCommand extends SkillCommand {
             //messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.IronGrip", ironGripChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ironGripChanceLucky) : ""));
         }
 
-        if(canUseSubskill(mmoPlayer, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) {
+        if(canUseSubskill(player, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) {
             messages.add(getStatMessage(SubSkillType.UNARMED_UNARMED_LIMIT_BREAK,
-                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(mmoPlayer, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK, 1000))));
+                    String.valueOf(CombatUtils.getLimitBreakDamageAgainstQuality(player, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK, 1000))));
         }
 
         return messages;
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.UNARMED);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.UNARMED);
 
         return textComponents;
     }

+ 16 - 16
src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java

@@ -1,14 +1,14 @@
 package com.gmail.nossr50.commands.skills;
 
+import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import net.kyori.adventure.text.Component;
-import org.jetbrains.annotations.NotNull;
+import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -32,39 +32,39 @@ public class WoodcuttingCommand extends SkillCommand {
     }
 
     @Override
-    protected void dataCalculations(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue) {
+    protected void dataCalculations(Player player, float skillValue) {
         // DOUBLE DROPS
         if (canDoubleDrop) {
-            setDoubleDropClassicChanceStrings(mmoPlayer);
+            setDoubleDropClassicChanceStrings(player);
         }
         
         // TREE FELLER
         if (canTreeFell) {
-            String[] treeFellerStrings = calculateLengthDisplayValues(mmoPlayer, skillValue);
+            String[] treeFellerStrings = calculateLengthDisplayValues(player, skillValue);
             treeFellerLength = treeFellerStrings[0];
             treeFellerLengthEndurance = treeFellerStrings[1];
         }
     }
 
-    private void setDoubleDropClassicChanceStrings(OnlineMMOPlayer mmoPlayer) {
-        String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, mmoPlayer, SubSkillType.WOODCUTTING_HARVEST_LUMBER);
+    private void setDoubleDropClassicChanceStrings(Player player) {
+        String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.WOODCUTTING_HARVEST_LUMBER);
         doubleDropChance = doubleDropStrings[0];
         doubleDropChanceLucky = doubleDropStrings[1];
     }
 
     @Override
-    protected void permissionsCheck(@NotNull OnlineMMOPlayer mmoPlayer) {
-        canTreeFell = RankUtils.hasUnlockedSubskill(mmoPlayer, SubSkillType.WOODCUTTING_TREE_FELLER) && Permissions.treeFeller(mmoPlayer.getPlayer());
-        canDoubleDrop = canUseSubskill(mmoPlayer, SubSkillType.WOODCUTTING_HARVEST_LUMBER) && !rootSkill.getDoubleDropsDisabled() && RankUtils.getRank(mmoPlayer, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1;
-        canLeafBlow = canUseSubskill(mmoPlayer, SubSkillType.WOODCUTTING_LEAF_BLOWER);
-        canKnockOnWood = canTreeFell && canUseSubskill(mmoPlayer, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD);
+    protected void permissionsCheck(Player player) {
+        canTreeFell = RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_TREE_FELLER) && Permissions.treeFeller(player);
+        canDoubleDrop = canUseSubskill(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) && !skill.getDoubleDropsDisabled() && RankUtils.getRank(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1;
+        canLeafBlow = canUseSubskill(player, SubSkillType.WOODCUTTING_LEAF_BLOWER);
+        canKnockOnWood = canTreeFell && canUseSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD);
         /*canSplinter = canUseSubskill(player, SubSkillType.WOODCUTTING_SPLINTER);
         canBarkSurgeon = canUseSubskill(player, SubSkillType.WOODCUTTING_BARK_SURGEON);
         canNaturesBounty = canUseSubskill(player, SubSkillType.WOODCUTTING_NATURES_BOUNTY);*/
     }
 
     @Override
-    protected @NotNull List<String> statsDisplay(@NotNull OnlineMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canDoubleDrop) {
@@ -75,7 +75,7 @@ public class WoodcuttingCommand extends SkillCommand {
         if (canKnockOnWood) {
             String lootNote;
 
-            if(RankUtils.hasReachedRank(2, mmoPlayer, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
+            if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
                 lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Rank2");
             } else {
                 lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Normal");
@@ -97,10 +97,10 @@ public class WoodcuttingCommand extends SkillCommand {
     }
 
     @Override
-    protected @NotNull List<Component> getTextComponents(@NotNull OnlineMMOPlayer mmoPlayer) {
+    protected List<Component> getTextComponents(Player player) {
         List<Component> textComponents = new ArrayList<>();
 
-        TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.WOODCUTTING);
+        TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.WOODCUTTING);
 
         return textComponents;
     }