浏览代码

Comment out old API, will use as a reference when writing new API

nossr50 4 年之前
父节点
当前提交
1c63e34dbb

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

@@ -1,88 +1,88 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.datatypes.player.McMMOPlayer;
-import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
-import com.gmail.nossr50.runnables.skills.BleedTimerTask;
-import com.gmail.nossr50.util.player.UserManager;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-
-public final class AbilityAPI {
-    private AbilityAPI() {}
-
-    public static boolean berserkEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.BERSERK);
-    }
-
-    public static boolean gigaDrillBreakerEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER);
-    }
-
-    public static boolean greenTerraEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GREEN_TERRA);
-    }
-
-    public static boolean serratedStrikesEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SERRATED_STRIKES);
-    }
-
-    public static boolean skullSplitterEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SKULL_SPLITTER);
-    }
-
-    public static boolean superBreakerEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SUPER_BREAKER);
-    }
-
-    public static boolean treeFellerEnabled(Player player) {
-        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.TREE_FELLER);
-    }
-
-    public static boolean isAnyAbilityEnabled(Player player) {
-        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-
-        for (SuperAbilityType ability : SuperAbilityType.values()) {
-            if (mcMMOPlayer.getAbilityMode(ability)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public static void resetCooldowns(Player player) {
-        UserManager.getPlayer(player).resetCooldowns();
-    }
-
-    public static void setBerserkCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.BERSERK, cooldown);
-    }
-
-    public static void setGigaDrillBreakerCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER, cooldown);
-    }
-
-    public static void setGreenTerraCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GREEN_TERRA, cooldown);
-    }
-
-    public static void setSerratedStrikesCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SERRATED_STRIKES, cooldown);
-    }
-
-    public static void setSkullSplitterCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SKULL_SPLITTER, cooldown);
-    }
-
-    public static void setSuperBreakerCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SUPER_BREAKER, cooldown);
-    }
-
-    public static void setTreeFellerCooldown(Player player, long cooldown) {
-        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.TREE_FELLER, cooldown);
-    }
-
-    public static boolean isBleeding(LivingEntity entity) {
-        return BleedTimerTask.isBleeding(entity);
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+//import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
+//import com.gmail.nossr50.runnables.skills.BleedTimerTask;
+//import com.gmail.nossr50.util.player.UserManager;
+//import org.bukkit.entity.LivingEntity;
+//import org.bukkit.entity.Player;
+//
+//public final class AbilityAPI {
+//    private AbilityAPI() {}
+//
+//    public static boolean berserkEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.BERSERK);
+//    }
+//
+//    public static boolean gigaDrillBreakerEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER);
+//    }
+//
+//    public static boolean greenTerraEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GREEN_TERRA);
+//    }
+//
+//    public static boolean serratedStrikesEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SERRATED_STRIKES);
+//    }
+//
+//    public static boolean skullSplitterEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SKULL_SPLITTER);
+//    }
+//
+//    public static boolean superBreakerEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SUPER_BREAKER);
+//    }
+//
+//    public static boolean treeFellerEnabled(Player player) {
+//        return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.TREE_FELLER);
+//    }
+//
+//    public static boolean isAnyAbilityEnabled(Player player) {
+//        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+//
+//        for (SuperAbilityType ability : SuperAbilityType.values()) {
+//            if (mcMMOPlayer.getAbilityMode(ability)) {
+//                return true;
+//            }
+//        }
+//
+//        return false;
+//    }
+//
+//    public static void resetCooldowns(Player player) {
+//        UserManager.getPlayer(player).resetCooldowns();
+//    }
+//
+//    public static void setBerserkCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.BERSERK, cooldown);
+//    }
+//
+//    public static void setGigaDrillBreakerCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER, cooldown);
+//    }
+//
+//    public static void setGreenTerraCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GREEN_TERRA, cooldown);
+//    }
+//
+//    public static void setSerratedStrikesCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SERRATED_STRIKES, cooldown);
+//    }
+//
+//    public static void setSkullSplitterCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SKULL_SPLITTER, cooldown);
+//    }
+//
+//    public static void setSuperBreakerCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SUPER_BREAKER, cooldown);
+//    }
+//
+//    public static void setTreeFellerCooldown(Player player, long cooldown) {
+//        UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.TREE_FELLER, cooldown);
+//    }
+//
+//    public static boolean isBleeding(LivingEntity entity) {
+//        return BleedTimerTask.isBleeding(entity);
+//    }
+//}

+ 142 - 161
src/main/java/com/gmail/nossr50/api/ChatAPI.java

@@ -1,161 +1,142 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.datatypes.chat.ChatChannel;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
-import com.gmail.nossr50.mcMMO;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Objects;
-
-public final class ChatAPI {
-    private ChatAPI() {}
-
-    /**
-     * Check if a {@link Player} is in the Party chat channel
-     *
-     * @param player target player
-     * @return true if the player is targeting the party chat channel
-     * @deprecated Use {@link #isUsingPartyChat(OnlineMMOPlayer)} instead
-     */
-    @Deprecated
-    public static boolean isUsingPartyChat(@NotNull Player player) {
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-
-        if(mmoPlayer != null)
-            return mmoPlayer.getChatChannel() == ChatChannel.PARTY;
-        else
-            return false;
-    }
-
-    /**
-     * Check if a {@link OnlineMMOPlayer} is in the Party chat channel
-     *
-     * @param mmoPlayer target player
-     * @return true if the player is targeting the party chat channel
-     */
-    public static boolean isUsingPartyChat(@NotNull OnlineMMOPlayer mmoPlayer) {
-        return mmoPlayer.getChatChannel() == ChatChannel.PARTY;
-    }
-
-    /**
-     * Check if a player is currently talking in party chat.
-     *
-     * @param playerName The name of the player to check
-     * @return true if the player is using party chat, false otherwise
-     * @deprecated use {@link #isUsingPartyChat(OnlineMMOPlayer)} instead for performance reasons
-     */
-    @Deprecated
-    public static boolean isUsingPartyChat(String playerName) {
-        if(mcMMO.getUserManager().queryMcMMOPlayer(playerName) != null) {
-            return mcMMO.getUserManager().queryMcMMOPlayer(playerName).getChatChannel() == ChatChannel.PARTY;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Check if a {@link Player} is in the Admin chat channel
-     *
-     * @param player target player
-     * @return true if the player is targeting the admin chat channel
-     * @deprecated Use {@link #isUsingAdminChat(OnlineMMOPlayer)} instead
-     */
-    @Deprecated
-    public static boolean isUsingAdminChat(@NotNull Player player) {
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-
-        if(mmoPlayer != null)
-            return mmoPlayer.getChatChannel() == ChatChannel.ADMIN;
-        else
-            return false;
-    }
-
-    /**
-     * Check if a {@link OnlineMMOPlayer} is in the Admin chat channel
-     *
-     * @param mmoPlayer target player
-     * @return true if the player is targeting the admin chat channel
-     */
-    public static boolean isUsingAdminChat(@NotNull OnlineMMOPlayer mmoPlayer) {
-        return mmoPlayer.getChatChannel() == ChatChannel.ADMIN;
-    }
-
-    /**
-     * Check if a player is currently talking in admin chat.
-     *
-     * @param playerName The name of the player to check
-     * @return true if the player is using admin chat, false otherwise
-     * @deprecated use {@link #isUsingAdminChat(OnlineMMOPlayer)} instead for performance reasons
-     */
-    @Deprecated
-    public static boolean isUsingAdminChat(String playerName) {
-        if(mcMMO.getUserManager().queryMcMMOPlayer(playerName) != null) {
-            return mcMMO.getUserManager().queryMcMMOPlayer(playerName).getChatChannel() == ChatChannel.ADMIN;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Toggle the party chat channel of a {@link OnlineMMOPlayer}
-     *
-     * @param mmoPlayer The player to toggle party chat on.
-     */
-    public static void togglePartyChat(@NotNull OnlineMMOPlayer mmoPlayer) {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.PARTY);
-    }
-
-    /**
-     * Toggle the party chat mode of a player.
-     *
-     * @param player The player to toggle party chat on.
-     * @deprecated use {@link #togglePartyChat(OnlineMMOPlayer)}
-     */
-    @Deprecated
-    public static void togglePartyChat(Player player) throws NullPointerException {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(Objects.requireNonNull(mcMMO.getUserManager().queryPlayer(player)), ChatChannel.PARTY);
-    }
-
-    /**
-     * Toggle the party chat mode of a player.
-     *
-     * @param playerName The name of the player to toggle party chat on.
-     * @deprecated Use {@link #togglePartyChat(OnlineMMOPlayer)} instead
-     */
-    @Deprecated
-    public static void togglePartyChat(String playerName) throws NullPointerException {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(Objects.requireNonNull(mcMMO.getUserManager().queryMcMMOPlayer(playerName)), ChatChannel.PARTY);
-    }
-
-    /**
-     * Toggle the admin chat channel of a {@link OnlineMMOPlayer}
-     *
-     * @param mmoPlayer The player to toggle admin chat on.
-     */
-    public static void toggleAdminChat(@NotNull OnlineMMOPlayer mmoPlayer) {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(mmoPlayer, ChatChannel.ADMIN);
-    }
-
-    /**
-     * Toggle the admin chat mode of a player.
-     *
-     * @param player The player to toggle admin chat on.
-     * @deprecated Use {@link #toggleAdminChat(OnlineMMOPlayer)} instead
-     */
-    @Deprecated
-    public static void toggleAdminChat(Player player) throws NullPointerException {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(Objects.requireNonNull(mcMMO.getUserManager().queryPlayer(player)), ChatChannel.ADMIN);
-    }
-
-    /**
-     * Toggle the admin chat mode of a player.
-     *
-     * @param playerName The name of the player to toggle party chat on.
-     * @deprecated Use {@link #toggleAdminChat(OnlineMMOPlayer)} instead
-     */
-    @Deprecated
-    public static void toggleAdminChat(String playerName) throws NullPointerException {
-        mcMMO.p.getChatManager().setOrToggleChatChannel(Objects.requireNonNull(mcMMO.getUserManager().queryMcMMOPlayer(playerName)), ChatChannel.ADMIN);
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.datatypes.chat.ChatChannel;
+//import com.gmail.nossr50.mcMMO;
+//import com.gmail.nossr50.util.player.UserManager;
+//import org.bukkit.entity.Player;
+//
+//public final class ChatAPI {
+//    private ChatAPI() {}
+//
+////    /**
+////     * Send a message to all members of a party
+////     * </br>
+////     * This function is designed for API usage.
+////     *
+////     * @param plugin The plugin sending the message
+////     * @param sender The name of the sender
+////     * @param displayName The display name of the sender
+////     * @param party The name of the party to send to
+////     * @param message The message to send
+////     */
+////    public static void sendPartyChat(Plugin plugin, String sender, String displayName, String party, String message) {
+////        getPartyChatManager(plugin, party).handleChat(sender, displayName, message);
+////    }
+////
+////    /**
+////     * Send a message to all members of a party
+////     * </br>
+////     * This function is designed for API usage.
+////     *
+////     * @param plugin The plugin sending the message
+////     * @param sender The name of the sender to display in the chat
+////     * @param party The name of the party to send to
+////     * @param message The message to send
+////     */
+////    public static void sendPartyChat(Plugin plugin, String sender, String party, String message) {
+////        getPartyChatManager(plugin, party).handleChat(sender, message);
+////    }
+////
+////    /**
+////     * Send a message to administrators
+////     * </br>
+////     * This function is designed for API usage.
+////     *
+////     * @param plugin The plugin sending the message
+////     * @param sender The name of the sender
+////     * @param displayName The display name of the sender
+////     * @param message The message to send
+////     */
+////    public static void sendAdminChat(Plugin plugin, String sender, String displayName, String message) {
+////        ChatManagerFactory.getChatManager(plugin, ChatChannel.ADMIN).handleChat(sender, displayName, message);
+////    }
+////
+////    /**
+////     * Send a message to administrators
+////     * </br>
+////     * This function is designed for API usage.
+////     *
+////     * @param plugin The plugin sending the message
+////     * @param sender The name of the sender to display in the chat
+////     * @param message The message to send
+////     */
+////    public static void sendAdminChat(Plugin plugin, String sender, String message) {
+////        ChatManagerFactory.getChatManager(plugin, ChatChannel.ADMIN).handleChat(sender, message);
+////    }
+//
+//    /**
+//     * Check if a player is currently talking in party chat.
+//     *
+//     * @param player The player to check
+//     * @return true if the player is using party chat, false otherwise
+//     */
+//    public static boolean isUsingPartyChat(Player player) {
+//        return UserManager.getPlayer(player).getChatChannel() == ChatChannel.PARTY;
+//    }
+//
+//    /**
+//     * Check if a player is currently talking in party chat.
+//     *
+//     * @param playerName The name of the player to check
+//     * @return true if the player is using party chat, false otherwise
+//     */
+//    public static boolean isUsingPartyChat(String playerName) {
+//        return UserManager.getPlayer(playerName).getChatChannel() == ChatChannel.PARTY;
+//    }
+//
+//    /**
+//     * Check if a player is currently talking in admin chat.
+//     *
+//     * @param player The player to check
+//     * @return true if the player is using admin chat, false otherwise
+//     */
+//    public static boolean isUsingAdminChat(Player player) {
+//        return UserManager.getPlayer(player).getChatChannel() == ChatChannel.ADMIN;
+//    }
+//
+//    /**
+//     * Check if a player is currently talking in admin chat.
+//     *
+//     * @param playerName The name of the player to check
+//     * @return true if the player is using admin chat, false otherwise
+//     */
+//    public static boolean isUsingAdminChat(String playerName) {
+//        return UserManager.getPlayer(playerName).getChatChannel() == ChatChannel.ADMIN;
+//    }
+//
+//    /**
+//     * Toggle the party chat mode of a player.
+//     *
+//     * @param player The player to toggle party chat on.
+//     */
+//    public static void togglePartyChat(Player player) {
+//        mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(player), ChatChannel.PARTY);
+//    }
+//
+//    /**
+//     * Toggle the party chat mode of a player.
+//     *
+//     * @param playerName The name of the player to toggle party chat on.
+//     */
+//    public static void togglePartyChat(String playerName) {
+//        mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(playerName), ChatChannel.PARTY);
+//    }
+//
+//    /**
+//     * Toggle the admin chat mode of a player.
+//     *
+//     * @param player The player to toggle admin chat on.
+//     */
+//    public static void toggleAdminChat(Player player) {
+//        mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(player), ChatChannel.ADMIN);
+//    }
+//
+//    /**
+//     * Toggle the admin chat mode of a player.
+//     *
+//     * @param playerName The name of the player to toggle party chat on.
+//     */
+//    public static void toggleAdminChat(String playerName) {
+//        mcMMO.p.getChatManager().setOrToggleChatChannel(UserManager.getPlayer(playerName), ChatChannel.ADMIN);
+//    }
+//}

+ 30 - 30
src/main/java/com/gmail/nossr50/api/DatabaseAPI.java

@@ -1,30 +1,30 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
-import com.gmail.nossr50.mcMMO;
-
-import java.util.UUID;
-
-public class DatabaseAPI {
-
-    /**
-     * Checks if a player exists in the mcMMO Database
-     * @param uuid player UUID
-     * @return true if the player exists in the DB, false if they do not
-     */
-    public boolean doesPlayerExistInDB(String uuid) {
-        return doesPlayerExistInDB(UUID.fromString(uuid));
-    }
-
-    /**
-     * Checks if a player exists in the mcMMO Database
-     * @param uuid player UUID
-     * @return true if the player exists in the DB, false if they do not
-     */
-    public boolean doesPlayerExistInDB(UUID uuid) {
-        PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, null);
-
-        return playerProfile.isLoaded();
-    }
-
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.datatypes.player.PlayerProfile;
+//import com.gmail.nossr50.mcMMO;
+//
+//import java.util.UUID;
+//
+//public class DatabaseAPI {
+//
+//    /**
+//     * Checks if a player exists in the mcMMO Database
+//     * @param uuid player UUID
+//     * @return true if the player exists in the DB, false if they do not
+//     */
+//    public boolean doesPlayerExistInDB(String uuid) {
+//        return doesPlayerExistInDB(UUID.fromString(uuid));
+//    }
+//
+//    /**
+//     * Checks if a player exists in the mcMMO Database
+//     * @param uuid player UUID
+//     * @return true if the player exists in the DB, false if they do not
+//     */
+//    public boolean doesPlayerExistInDB(UUID uuid) {
+//        PlayerProfile playerProfile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, null);
+//
+//        return playerProfile.isLoaded();
+//    }
+//
+//}

+ 1226 - 1225
src/main/java/com/gmail/nossr50/api/ExperienceAPI.java

@@ -1,1225 +1,1226 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.api.exceptions.*;
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.config.experience.ExperienceConfig;
-import com.gmail.nossr50.datatypes.experience.FormulaType;
-import com.gmail.nossr50.datatypes.experience.XPGainReason;
-import com.gmail.nossr50.datatypes.experience.XPGainSource;
-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.mcMMO;
-import com.gmail.nossr50.skills.child.FamilyTree;
-import com.gmail.nossr50.util.player.UserManager;
-import com.gmail.nossr50.util.skills.CombatUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.block.BlockState;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.UUID;
-
-public final class ExperienceAPI {
-    private ExperienceAPI() {}
-
-    /**
-     * Returns whether given string is a valid type of skill suitable for the
-     * other API calls in this class.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param skillType A string that may or may not be a skill
-     * @return true if this is a valid mcMMO skill
-     */
-    public static boolean isValidSkillType(String skillType) {
-        return PrimarySkillType.getSkill(skillType) != null;
-    }
-
-    /**
-     * Start the task that gives combat XP.
-     * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP
-     *
-     * @param mcMMOPlayer The attacking player
-     * @param target The defending entity
-     * @param primarySkillType The skill being used
-     * @param multiplier final XP result will be multiplied by this
-     * @deprecated Draft API
-     */
-    @Deprecated
-    public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
-        CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType, multiplier);
-    }
-
-    /**
-     * Start the task that gives combat XP.
-     * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP
-     *
-     * @param mcMMOPlayer The attacking player
-     * @param target The defending entity
-     * @param primarySkillType The skill being used
-     * @deprecated Draft API
-     */
-    @Deprecated
-    public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) {
-        CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType);
-    }
-
-    /**
-     * Returns whether the given skill type string is both valid and not a
-     * child skill. (Child skills have no XP of their own, and their level is
-     * derived from the parent(s).)
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param skillType the skill to check
-     * @return true if this is a valid, non-child mcMMO skill
-     */
-    public static boolean isNonChildSkill(String skillType) {
-        PrimarySkillType skill = PrimarySkillType.getSkill(skillType);
-
-        return skill != null && !skill.isChildSkill();
-    }
-
-    @Deprecated
-    public static void addRawXP(Player player, String skillType, int XP) {
-        addRawXP(player, skillType, (float) XP);
-    }
-
-    /**
-     * Adds raw XP to the player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    @Deprecated
-    public static void addRawXP(Player player, String skillType, float XP) {
-        addRawXP(player, skillType, XP, "UNKNOWN");
-    }
-
-    /**
-     * Adds raw XP to the player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addRawXP(Player player, String skillType, float XP, String xpGainReason) {
-        addRawXP(player, skillType, XP, xpGainReason, false);
-    }
-
-    /**
-     * Adds raw XP to the player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     * @param isUnshared true if the XP cannot be shared with party members
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addRawXP(Player player, String skillType, float XP, String xpGainReason, boolean isUnshared) {
-        if (isUnshared) {
-            getPlayer(player).beginUnsharedXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-            return;
-        }
-
-        getPlayer(player).applyXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-    }
-
-    /**
-     * Adds raw XP to an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @deprecated We're using float for our XP values now
-     * replaced by {@link #addRawXPOffline(String playerName, String skillType, float XP)}
-     */
-    @Deprecated
-    public static void addRawXPOffline(String playerName, String skillType, int XP) {
-        addRawXPOffline(playerName, skillType, (float) XP);
-    }
-
-    /**
-     * Adds raw XP to an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @deprecated We're using uuids to get an offline player
-     * replaced by {@link #addRawXPOffline(UUID uuid, String skillType, float XP)}
-     *
-     * @param playerName The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static void addRawXPOffline(String playerName, String skillType, float XP) {
-        addOfflineXP(playerName, getSkillType(skillType), (int) Math.floor(XP));
-    }
-
-    /**
-     * Adds raw XP to an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The UUID of player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static void addRawXPOffline(UUID uuid, String skillType, float XP) {
-        addOfflineXP(uuid, getSkillType(skillType), (int) Math.floor(XP));
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate only.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    @Deprecated
-    public static void addMultipliedXP(Player player, String skillType, int XP) {
-        addMultipliedXP(player, skillType, XP, "UNKNOWN");
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate only.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addMultipliedXP(Player player, String skillType, int XP, String xpGainReason) {
-        getPlayer(player).applyXpGain(getSkillType(skillType), (int) (XP * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-    }
-
-    /**
-     * Adds XP to an offline player, calculates for XP Rate only.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static void addMultipliedXPOffline(String playerName, String skillType, int XP) {
-        addOfflineXP(playerName, getSkillType(skillType), (int) (XP * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()));
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate and skill modifier.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    @Deprecated
-    public static void addModifiedXP(Player player, String skillType, int XP) {
-        addModifiedXP(player, skillType, XP, "UNKNOWN");
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate and skill modifier.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addModifiedXP(Player player, String skillType, int XP, String xpGainReason) {
-        addModifiedXP(player, skillType, XP, xpGainReason, false);
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate and skill modifier.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     * @param isUnshared true if the XP cannot be shared with party members
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addModifiedXP(Player player, String skillType, int XP, String xpGainReason, boolean isUnshared) {
-        PrimarySkillType skill = getSkillType(skillType);
-
-        if (isUnshared) {
-            getPlayer(player).beginUnsharedXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-            return;
-        }
-
-        getPlayer(player).applyXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-    }
-
-    /**
-     * Adds XP to an offline player, calculates for XP Rate and skill modifier.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static void addModifiedXPOffline(String playerName, String skillType, int XP) {
-        PrimarySkillType skill = getSkillType(skillType);
-
-        addOfflineXP(playerName, skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()));
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
-     * and party sharing.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    @Deprecated
-    public static void addXP(Player player, String skillType, int XP) {
-        addXP(player, skillType, XP, "UNKNOWN");
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
-     * and party sharing.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addXP(Player player, String skillType, int XP, String xpGainReason) {
-        addXP(player, skillType, XP, xpGainReason, false);
-    }
-
-    /**
-     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
-     * and party sharing.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add XP to
-     * @param skillType The skill to add XP to
-     * @param XP The amount of XP to add
-     * @param xpGainReason The reason to gain XP
-     * @param isUnshared true if the XP cannot be shared with party members
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
-     */
-    public static void addXP(Player player, String skillType, int XP, String xpGainReason, boolean isUnshared) {
-        if (isUnshared) {
-            getPlayer(player).beginUnsharedXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-            return;
-        }
-
-        getPlayer(player).beginXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
-    }
-
-    /**
-     * Get the amount of XP a player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static int getXP(Player player, String skillType) {
-        return getPlayer(player).getSkillXpLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the amount of XP an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static int getOfflineXP(String playerName, String skillType) {
-        return getOfflineProfile(playerName).getSkillXpLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the amount of XP an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static int getOfflineXP(UUID uuid, String skillType) {
-        return getOfflineProfile(uuid).getSkillXpLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the raw amount of XP a player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static float getXPRaw(Player player, String skillType) {
-        return getPlayer(player).getSkillXpLevelRaw(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the raw amount of XP an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static float getOfflineXPRaw(String playerName, String skillType) {
-        return getOfflineProfile(playerName).getSkillXpLevelRaw(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the raw amount of XP an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP in a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static float getOfflineXPRaw(UUID uuid, String skillType) {
-        return getOfflineProfile(uuid).getSkillXpLevelRaw(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the total amount of XP needed to reach the next level.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get the XP amount for
-     * @param skillType The skill to get the XP amount for
-     * @return the total amount of XP needed to reach the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static int getXPToNextLevel(Player player, String skillType) {
-        return getPlayer(player).getXpToLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the total amount of XP an offline player needs to reach the next level.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the total amount of XP needed to reach the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static int getOfflineXPToNextLevel(String playerName, String skillType) {
-        return getOfflineProfile(playerName).getXpToLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the total amount of XP an offline player needs to reach the next level.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the total amount of XP needed to reach the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static int getOfflineXPToNextLevel(UUID uuid, String skillType) {
-        return getOfflineProfile(uuid).getXpToLevel(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the amount of XP remaining until the next level.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get the XP amount for
-     * @param skillType The skill to get the XP amount for
-     * @return the amount of XP remaining until the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static int getXPRemaining(Player player, String skillType) {
-        PrimarySkillType skill = getNonChildSkillType(skillType);
-
-        PlayerProfile profile = getPlayer(player).getProfile();
-
-        return profile.getXpToLevel(skill) - profile.getSkillXpLevel(skill);
-    }
-
-    /**
-     * Get the amount of XP an offline player has left before leveling up.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP needed to reach the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static int getOfflineXPRemaining(String playerName, String skillType) {
-        PrimarySkillType skill = getNonChildSkillType(skillType);
-        PlayerProfile profile = getOfflineProfile(playerName);
-
-        return profile.getXpToLevel(skill) - profile.getSkillXpLevel(skill);
-    }
-
-    /**
-     * Get the amount of XP an offline player has left before leveling up.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get XP for
-     * @param skillType The skill to get XP for
-     * @return the amount of XP needed to reach the next level
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static float getOfflineXPRemaining(UUID uuid, String skillType) {
-        PrimarySkillType skill = getNonChildSkillType(skillType);
-        PlayerProfile profile = getOfflineProfile(uuid);
-
-        return profile.getXpToLevel(skill) - profile.getSkillXpLevelRaw(skill);
-    }
-
-    /**
-     * Add levels to a skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add levels to
-     * @param skillType Type of skill to add levels to
-     * @param levels Number of levels to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    public static void addLevel(Player player, String skillType, int levels) {
-        getPlayer(player).addLevels(getSkillType(skillType), levels);
-    }
-
-    /**
-     * Add levels to a skill for an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to add levels to
-     * @param skillType Type of skill to add levels to
-     * @param levels Number of levels to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static void addLevelOffline(String playerName, String skillType, int levels) {
-        PlayerProfile profile = getOfflineProfile(playerName);
-        PrimarySkillType skill = getSkillType(skillType);
-
-        if (skill.isChildSkill()) {
-            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(skill);
-
-            for (PrimarySkillType parentSkill : parentSkills) {
-                profile.addLevels(parentSkill, (levels / parentSkills.size()));
-            }
-
-            profile.scheduleAsyncSave();
-            return;
-        }
-
-        profile.addLevels(skill, levels);
-        profile.scheduleAsyncSave();
-    }
-
-    /**
-     * Add levels to a skill for an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to add levels to
-     * @param skillType Type of skill to add levels to
-     * @param levels Number of levels to add
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static void addLevelOffline(UUID uuid, String skillType, int levels) {
-        PlayerProfile profile = getOfflineProfile(uuid);
-        PrimarySkillType skill = getSkillType(skillType);
-
-        if (skill.isChildSkill()) {
-            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(skill);
-
-            for (PrimarySkillType parentSkill : parentSkills) {
-                profile.addLevels(parentSkill, (levels / parentSkills.size()));
-            }
-
-            profile.scheduleAsyncSave();
-            return;
-        }
-
-        profile.addLevels(skill, levels);
-        profile.scheduleAsyncSave();
-    }
-
-    /**
-     * Get the level a player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get the level for
-     * @param skillType The skill to get the level for
-     * @return the level of a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @deprecated Use getLevel(Player player, PrimarySkillType skillType) instead
-     */
-    @Deprecated
-    public static int getLevel(Player player, String skillType) {
-        return getPlayer(player).getSkillLevel(getSkillType(skillType));
-    }
-
-    /**
-     * Get the level a player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get the level for
-     * @param skillType The skill to get the level for
-     * @return the level of a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    public static int getLevel(Player player, PrimarySkillType skillType) {
-        return getPlayer(player).getSkillLevel(skillType);
-    }
-
-    /**
-     * Get the level an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get the level for
-     * @param skillType The skill to get the level for
-     * @return the level of a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static int getLevelOffline(String playerName, String skillType) {
-        return getOfflineProfile(playerName).getSkillLevel(getSkillType(skillType));
-    }
-
-    /**
-     * Get the level an offline player has in a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get the level for
-     * @param skillType The skill to get the level for
-     * @return the level of a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static int getLevelOffline(UUID uuid, String skillType) {
-        return getOfflineProfile(uuid).getSkillLevel(getSkillType(skillType));
-    }
-
-    /**
-     * Gets the power level of a player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to get the power level for
-     * @return the power level of the player
-     */
-    public static int getPowerLevel(Player player) {
-        return getPlayer(player).getPowerLevel();
-    }
-
-    /**
-     * Gets the power level of an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to get the power level for
-     * @return the power level of the player
-     *
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static int getPowerLevelOffline(String playerName) {
-        int powerLevel = 0;
-        PlayerProfile profile = getOfflineProfile(playerName);
-
-        for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) {
-            powerLevel += profile.getSkillLevel(type);
-        }
-
-        return powerLevel;
-    }
-
-    /**
-     * Gets the power level of an offline player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to get the power level for
-     * @return the power level of the player
-     *
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static int getPowerLevelOffline(UUID uuid) {
-        int powerLevel = 0;
-        PlayerProfile profile = getOfflineProfile(uuid);
-
-        for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) {
-            powerLevel += profile.getSkillLevel(type);
-        }
-
-        return powerLevel;
-    }
-
-    /**
-     * Get the level cap of a specific skill.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param skillType The skill to get the level cap for
-     * @return the level cap of a given skill
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    public static int getLevelCap(String skillType) {
-        return Config.getInstance().getLevelCap(getSkillType(skillType));
-    }
-
-    /**
-     * Get the power level cap.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return the overall power level cap
-     */
-    public static int getPowerLevelCap() {
-        return Config.getInstance().getPowerLevelCap();
-    }
-
-    /**
-     * Get the position on the leaderboard of a player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The name of the player to check
-     * @param skillType The skill to check
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     *
-     * @return the position on the leaderboard
-     */
-    @Deprecated
-    public static int getPlayerRankSkill(String playerName, String skillType) {
-        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(playerName).getName()).get(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the position on the leaderboard of a player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The name of the player to check
-     * @param skillType The skill to check
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     *
-     * @return the position on the leaderboard
-     */
-    public static int getPlayerRankSkill(UUID uuid, String skillType) {
-        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(uuid).getName()).get(getNonChildSkillType(skillType));
-    }
-
-    /**
-     * Get the position on the power level leaderboard of a player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The name of the player to check
-     *
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     *
-     * @return the position on the power level leaderboard
-     */
-    @Deprecated
-    public static int getPlayerRankOverall(String playerName) {
-        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(playerName).getName()).get(null);
-    }
-
-    /**
-     * Get the position on the power level leaderboard of a player.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The name of the player to check
-     *
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     *
-     * @return the position on the power level leaderboard
-     */
-    public static int getPlayerRankOverall(UUID uuid) {
-        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(uuid).getName()).get(null);
-    }
-
-    /**
-     * Sets the level of a player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to set the level of
-     * @param skillType The skill to set the level for
-     * @param skillLevel The value to set the level to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     */
-    public static void setLevel(Player player, String skillType, int skillLevel) {
-        getPlayer(player).modifySkill(getSkillType(skillType), skillLevel);
-    }
-
-    /**
-     * Sets the level of an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to set the level of
-     * @param skillType The skill to set the level for
-     * @param skillLevel The value to set the level to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    @Deprecated
-    public static void setLevelOffline(String playerName, String skillType, int skillLevel) {
-        getOfflineProfile(playerName).modifySkill(getSkillType(skillType), skillLevel);
-    }
-
-    /**
-     * Sets the level of an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to set the level of
-     * @param skillType The skill to set the level for
-     * @param skillLevel The value to set the level to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     */
-    public static void setLevelOffline(UUID uuid, String skillType, int skillLevel) {
-        getOfflineProfile(uuid).modifySkill(getSkillType(skillType), skillLevel);
-    }
-
-    /**
-     * Sets the XP of a player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to set the XP of
-     * @param skillType The skill to set the XP for
-     * @param newValue The value to set the XP to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static void setXP(Player player, String skillType, int newValue) {
-        getPlayer(player).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
-    }
-
-    /**
-     * Sets the XP of an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to set the XP of
-     * @param skillType The skill to set the XP for
-     * @param newValue The value to set the XP to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static void setXPOffline(String playerName, String skillType, int newValue) {
-        getOfflineProfile(playerName).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
-    }
-
-    /**
-     * Sets the XP of an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to set the XP of
-     * @param skillType The skill to set the XP for
-     * @param newValue The value to set the XP to
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static void setXPOffline(UUID uuid, String skillType, int newValue) {
-        getOfflineProfile(uuid).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
-    }
-
-    /**
-     * Removes XP from a player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to change the XP of
-     * @param skillType The skill to change the XP for
-     * @param xp The amount of XP to remove
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static void removeXP(Player player, String skillType, int xp) {
-        getPlayer(player).removeXp(getNonChildSkillType(skillType), xp);
-    }
-
-    /**
-     * Removes XP from an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playerName The player to change the XP of
-     * @param skillType The skill to change the XP for
-     * @param xp The amount of XP to remove
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    @Deprecated
-    public static void removeXPOffline(String playerName, String skillType, int xp) {
-        getOfflineProfile(playerName).removeXp(getNonChildSkillType(skillType), xp);
-    }
-
-    /**
-     * Removes XP from an offline player in a specific skill type.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param uuid The player to change the XP of
-     * @param skillType The skill to change the XP for
-     * @param xp The amount of XP to remove
-     *
-     * @throws InvalidSkillException if the given skill is not valid
-     * @throws InvalidPlayerException if the given player does not exist in the database
-     * @throws UnsupportedOperationException if the given skill is a child skill
-     */
-    public static void removeXPOffline(UUID uuid, String skillType, int xp) {
-        getOfflineProfile(uuid).removeXp(getNonChildSkillType(skillType), xp);
-    }
-
-    /**
-     * Check how much XP is needed for a specific level with the selected level curve.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param level The level to get the amount of XP for
-     *
-     * @throws InvalidFormulaTypeException if the given formulaType is not valid
-     */
-    public static int getXpNeededToLevel(int level) {
-        return mcMMO.getFormulaManager().getXPtoNextLevel(level, ExperienceConfig.getInstance().getFormulaType());
-    }
-
-    /**
-     * Check how much XP is needed for a specific level with the provided level curve.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param level The level to get the amount of XP for
-     * @param formulaType The formula type to get the amount of XP for
-     *
-     * @throws InvalidFormulaTypeException if the given formulaType is not valid
-     */
-    public static int getXpNeededToLevel(int level, String formulaType) {
-        return mcMMO.getFormulaManager().getXPtoNextLevel(level, getFormulaType(formulaType));
-    }
-
-    /**
-     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given
-     * @param blockStates the blocks to reward XP for
-     * @param mcMMOPlayer the target player
-     */
-    public static void addXpFromBlocks(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer)
-    {
-        for(BlockState bs : blockStates)
-        {
-            for(PrimarySkillType skillType : PrimarySkillType.values())
-            {
-                if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
-                {
-                    mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
-                }
-            }
-        }
-    }
-
-    /**
-     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given if it matches the given skillType
-     * @param blockStates the blocks to reward XP for
-     * @param mcMMOPlayer the target player
-     * @param skillType target primary skill
-     */
-    public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType)
-    {
-        for(BlockState bs : blockStates)
-        {
-            if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
-            {
-                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
-            }
-        }
-    }
-
-    /**
-     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given
-     * @param blockState The target blockstate
-     * @param mcMMOPlayer The target player
-     */
-    public static void addXpFromBlock(BlockState blockState, McMMOPlayer mcMMOPlayer)
-    {
-        for(PrimarySkillType skillType : PrimarySkillType.values())
-        {
-            if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
-            {
-                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
-            }
-        }
-    }
-
-    /**
-     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given if it matches the given skillType
-     * @param blockState The target blockstate
-     * @param mcMMOPlayer The target player
-     * @param skillType target primary skill
-     */
-    public static void addXpFromBlockBySkill(BlockState blockState, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType)
-    {
-        if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
-        {
-            mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
-        }
-    }
-
-    // Utility methods follow.
-    private static void addOfflineXP(UUID playerUniqueId, PrimarySkillType skill, int XP) {
-        PlayerProfile profile = getOfflineProfile(playerUniqueId);
-
-        profile.addXp(skill, XP);
-        profile.save(true);
-    }
-
-    @Deprecated
-    private static void addOfflineXP(String playerName, PrimarySkillType skill, int XP) {
-        PlayerProfile profile = getOfflineProfile(playerName);
-
-        profile.addXp(skill, XP);
-        profile.scheduleAsyncSave();
-    }
-
-    private static PlayerProfile getOfflineProfile(UUID uuid) throws InvalidPlayerException {
-        OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid);
-        String playerName = offlinePlayer.getName();
-        PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName);
-
-        if (!profile.isLoaded()) {
-            throw new InvalidPlayerException();
-        }
-
-        return profile;
-    }
-
-    @Deprecated
-    private static PlayerProfile getOfflineProfile(String playerName) throws InvalidPlayerException {
-        OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(playerName);
-        UUID uuid = offlinePlayer.getUniqueId();
-        PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName);
-
-        if (!profile.isLoaded()) {
-            throw new InvalidPlayerException();
-        }
-
-        return profile;
-    }
-
-    private static PrimarySkillType getSkillType(String skillType) throws InvalidSkillException {
-        PrimarySkillType skill = PrimarySkillType.getSkill(skillType);
-
-        if (skill == null) {
-            throw new InvalidSkillException();
-        }
-
-        return skill;
-    }
-
-    private static PrimarySkillType getNonChildSkillType(String skillType) throws InvalidSkillException, UnsupportedOperationException {
-        PrimarySkillType skill = getSkillType(skillType);
-
-        if (skill.isChildSkill()) {
-            throw new UnsupportedOperationException("Child skills do not have XP");
-        }
-
-        return skill;
-    }
-
-    private static XPGainReason getXPGainReason(String reason) throws InvalidXPGainReasonException {
-        XPGainReason xpGainReason = XPGainReason.getXPGainReason(reason);
-
-        if (xpGainReason == null) {
-            throw new InvalidXPGainReasonException();
-        }
-
-        return xpGainReason;
-    }
-
-    private static FormulaType getFormulaType(String formula) throws InvalidFormulaTypeException {
-        FormulaType formulaType = FormulaType.getFormulaType(formula);
-
-        if (formulaType == null) {
-            throw new InvalidFormulaTypeException();
-        }
-
-        return formulaType;
-    }
-
-    /**
-     * @deprecated Use UserManager::getPlayer(Player player) instead
-     * @param player target player
-     * @return McMMOPlayer for that player if the profile is loaded, otherwise null
-     * @throws McMMOPlayerNotFoundException
-     */
-    @Deprecated
-    private static McMMOPlayer getPlayer(Player player) throws McMMOPlayerNotFoundException {
-        if (!UserManager.hasPlayerDataKey(player)) {
-            throw new McMMOPlayerNotFoundException(player);
-        }
-
-        return UserManager.getPlayer(player);
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.config.Config;
+//import com.gmail.nossr50.config.experience.ExperienceConfig;
+//import com.gmail.nossr50.datatypes.experience.FormulaType;
+//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.mcMMO;
+//import com.gmail.nossr50.skills.child.FamilyTree;
+//import com.gmail.nossr50.util.player.UserManager;
+//import com.gmail.nossr50.util.skills.CombatUtils;
+//import com.neetgames.mcmmo.exceptions.InvalidPlayerException;
+//import com.neetgames.mcmmo.exceptions.InvalidSkillException;
+//import com.neetgames.mcmmo.exceptions.InvalidXPGainReasonException;
+//import com.neetgames.mcmmo.experience.XPGainSource;
+//import org.bukkit.Bukkit;
+//import org.bukkit.OfflinePlayer;
+//import org.bukkit.block.BlockState;
+//import org.bukkit.entity.LivingEntity;
+//import org.bukkit.entity.Player;
+//
+//import java.util.ArrayList;
+//import java.util.Set;
+//import java.util.UUID;
+//
+//public final class ExperienceAPI {
+//    private ExperienceAPI() {}
+//
+//    /**
+//     * Returns whether given string is a valid type of skill suitable for the
+//     * other API calls in this class.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param skillType A string that may or may not be a skill
+//     * @return true if this is a valid mcMMO skill
+//     */
+//    public static boolean isValidSkillType(String skillType) {
+//        return PrimarySkillType.getSkill(skillType) != null;
+//    }
+//
+//    /**
+//     * Start the task that gives combat XP.
+//     * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP
+//     *
+//     * @param mcMMOPlayer The attacking player
+//     * @param target The defending entity
+//     * @param primarySkillType The skill being used
+//     * @param multiplier final XP result will be multiplied by this
+//     * @deprecated Draft API
+//     */
+//    @Deprecated
+//    public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
+//        CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType, multiplier);
+//    }
+//
+//    /**
+//     * Start the task that gives combat XP.
+//     * Processes combat XP like mcMMO normally would, so mcMMO will check whether or not the entity should reward XP when giving out the XP
+//     *
+//     * @param mcMMOPlayer The attacking player
+//     * @param target The defending entity
+//     * @param primarySkillType The skill being used
+//     * @deprecated Draft API
+//     */
+//    @Deprecated
+//    public static void addCombatXP(McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) {
+//        CombatUtils.processCombatXP(mcMMOPlayer, target, primarySkillType);
+//    }
+//
+//    /**
+//     * Returns whether the given skill type string is both valid and not a
+//     * child skill. (Child skills have no XP of their own, and their level is
+//     * derived from the parent(s).)
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param skillType the skill to check
+//     * @return true if this is a valid, non-child mcMMO skill
+//     */
+//    public static boolean isNonChildSkill(String skillType) {
+//        PrimarySkillType skill = PrimarySkillType.getSkill(skillType);
+//
+//        return skill != null && !skill.isChildSkill();
+//    }
+//
+//    @Deprecated
+//    public static void addRawXP(Player player, String skillType, int XP) {
+//        addRawXP(player, skillType, (float) XP);
+//    }
+//
+//    /**
+//     * Adds raw XP to the player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    @Deprecated
+//    public static void addRawXP(Player player, String skillType, float XP) {
+//        addRawXP(player, skillType, XP, "UNKNOWN");
+//    }
+//
+//    /**
+//     * Adds raw XP to the player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addRawXP(Player player, String skillType, float XP, String xpGainReason) {
+//        addRawXP(player, skillType, XP, xpGainReason, false);
+//    }
+//
+//    /**
+//     * Adds raw XP to the player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     * @param isUnshared true if the XP cannot be shared with party members
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addRawXP(Player player, String skillType, float XP, String xpGainReason, boolean isUnshared) {
+//        if (isUnshared) {
+//            getPlayer(player).beginUnsharedXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//            return;
+//        }
+//
+//        getPlayer(player).applyXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//    }
+//
+//    /**
+//     * Adds raw XP to an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @deprecated We're using float for our XP values now
+//     * replaced by {@link #addRawXPOffline(String playerName, String skillType, float XP)}
+//     */
+//    @Deprecated
+//    public static void addRawXPOffline(String playerName, String skillType, int XP) {
+//        addRawXPOffline(playerName, skillType, (float) XP);
+//    }
+//
+//    /**
+//     * Adds raw XP to an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @deprecated We're using uuids to get an offline player
+//     * replaced by {@link #addRawXPOffline(UUID uuid, String skillType, float XP)}
+//     *
+//     * @param playerName The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static void addRawXPOffline(String playerName, String skillType, float XP) {
+//        addOfflineXP(playerName, getSkillType(skillType), (int) Math.floor(XP));
+//    }
+//
+//    /**
+//     * Adds raw XP to an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The UUID of player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static void addRawXPOffline(UUID uuid, String skillType, float XP) {
+//        addOfflineXP(uuid, getSkillType(skillType), (int) Math.floor(XP));
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate only.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    @Deprecated
+//    public static void addMultipliedXP(Player player, String skillType, int XP) {
+//        addMultipliedXP(player, skillType, XP, "UNKNOWN");
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate only.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addMultipliedXP(Player player, String skillType, int XP, String xpGainReason) {
+//        getPlayer(player).applyXpGain(getSkillType(skillType), (int) (XP * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//    }
+//
+//    /**
+//     * Adds XP to an offline player, calculates for XP Rate only.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static void addMultipliedXPOffline(String playerName, String skillType, int XP) {
+//        addOfflineXP(playerName, getSkillType(skillType), (int) (XP * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()));
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate and skill modifier.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    @Deprecated
+//    public static void addModifiedXP(Player player, String skillType, int XP) {
+//        addModifiedXP(player, skillType, XP, "UNKNOWN");
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate and skill modifier.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addModifiedXP(Player player, String skillType, int XP, String xpGainReason) {
+//        addModifiedXP(player, skillType, XP, xpGainReason, false);
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate and skill modifier.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     * @param isUnshared true if the XP cannot be shared with party members
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addModifiedXP(Player player, String skillType, int XP, String xpGainReason, boolean isUnshared) {
+//        PrimarySkillType skill = getSkillType(skillType);
+//
+//        if (isUnshared) {
+//            getPlayer(player).beginUnsharedXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//            return;
+//        }
+//
+//        getPlayer(player).applyXpGain(skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()), getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//    }
+//
+//    /**
+//     * Adds XP to an offline player, calculates for XP Rate and skill modifier.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static void addModifiedXPOffline(String playerName, String skillType, int XP) {
+//        PrimarySkillType skill = getSkillType(skillType);
+//
+//        addOfflineXP(playerName, skill, (int) (XP / skill.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()));
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
+//     * and party sharing.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    @Deprecated
+//    public static void addXP(Player player, String skillType, int XP) {
+//        addXP(player, skillType, XP, "UNKNOWN");
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
+//     * and party sharing.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addXP(Player player, String skillType, int XP, String xpGainReason) {
+//        addXP(player, skillType, XP, xpGainReason, false);
+//    }
+//
+//    /**
+//     * Adds XP to the player, calculates for XP Rate, skill modifiers, perks, child skills,
+//     * and party sharing.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add XP to
+//     * @param skillType The skill to add XP to
+//     * @param XP The amount of XP to add
+//     * @param xpGainReason The reason to gain XP
+//     * @param isUnshared true if the XP cannot be shared with party members
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidXPGainReasonException if the given xpGainReason is not valid
+//     */
+//    public static void addXP(Player player, String skillType, int XP, String xpGainReason, boolean isUnshared) {
+//        if (isUnshared) {
+//            getPlayer(player).beginUnsharedXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//            return;
+//        }
+//
+//        getPlayer(player).beginXpGain(getSkillType(skillType), XP, getXPGainReason(xpGainReason), XPGainSource.CUSTOM);
+//    }
+//
+//    /**
+//     * Get the amount of XP a player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static int getXP(Player player, String skillType) {
+//        return getPlayer(player).getSkillXpLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the amount of XP an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static int getOfflineXP(String playerName, String skillType) {
+//        return getOfflineProfile(playerName).getSkillXpLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the amount of XP an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static int getOfflineXP(UUID uuid, String skillType) {
+//        return getOfflineProfile(uuid).getSkillXpLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the raw amount of XP a player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static float getXPRaw(Player player, String skillType) {
+//        return getPlayer(player).getSkillXpLevelRaw(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the raw amount of XP an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static float getOfflineXPRaw(String playerName, String skillType) {
+//        return getOfflineProfile(playerName).getSkillXpLevelRaw(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the raw amount of XP an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP in a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static float getOfflineXPRaw(UUID uuid, String skillType) {
+//        return getOfflineProfile(uuid).getSkillXpLevelRaw(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the total amount of XP needed to reach the next level.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get the XP amount for
+//     * @param skillType The skill to get the XP amount for
+//     * @return the total amount of XP needed to reach the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static int getXPToNextLevel(Player player, String skillType) {
+//        return getPlayer(player).getXpToLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the total amount of XP an offline player needs to reach the next level.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the total amount of XP needed to reach the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static int getOfflineXPToNextLevel(String playerName, String skillType) {
+//        return getOfflineProfile(playerName).getXpToLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the total amount of XP an offline player needs to reach the next level.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the total amount of XP needed to reach the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static int getOfflineXPToNextLevel(UUID uuid, String skillType) {
+//        return getOfflineProfile(uuid).getXpToLevel(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the amount of XP remaining until the next level.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get the XP amount for
+//     * @param skillType The skill to get the XP amount for
+//     * @return the amount of XP remaining until the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static int getXPRemaining(Player player, String skillType) {
+//        PrimarySkillType skill = getNonChildSkillType(skillType);
+//
+//        PlayerProfile profile = getPlayer(player).getProfile();
+//
+//        return profile.getXpToLevel(skill) - profile.getSkillXpLevel(skill);
+//    }
+//
+//    /**
+//     * Get the amount of XP an offline player has left before leveling up.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP needed to reach the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static int getOfflineXPRemaining(String playerName, String skillType) {
+//        PrimarySkillType skill = getNonChildSkillType(skillType);
+//        PlayerProfile profile = getOfflineProfile(playerName);
+//
+//        return profile.getXpToLevel(skill) - profile.getSkillXpLevel(skill);
+//    }
+//
+//    /**
+//     * Get the amount of XP an offline player has left before leveling up.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get XP for
+//     * @param skillType The skill to get XP for
+//     * @return the amount of XP needed to reach the next level
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static float getOfflineXPRemaining(UUID uuid, String skillType) {
+//        PrimarySkillType skill = getNonChildSkillType(skillType);
+//        PlayerProfile profile = getOfflineProfile(uuid);
+//
+//        return profile.getXpToLevel(skill) - profile.getSkillXpLevelRaw(skill);
+//    }
+//
+//    /**
+//     * Add levels to a skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add levels to
+//     * @param skillType Type of skill to add levels to
+//     * @param levels Number of levels to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    public static void addLevel(Player player, String skillType, int levels) {
+//        getPlayer(player).addLevels(getSkillType(skillType), levels);
+//    }
+//
+//    /**
+//     * Add levels to a skill for an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to add levels to
+//     * @param skillType Type of skill to add levels to
+//     * @param levels Number of levels to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static void addLevelOffline(String playerName, String skillType, int levels) {
+//        PlayerProfile profile = getOfflineProfile(playerName);
+//        PrimarySkillType skill = getSkillType(skillType);
+//
+//        if (skill.isChildSkill()) {
+//            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(skill);
+//
+//            for (PrimarySkillType parentSkill : parentSkills) {
+//                profile.addLevels(parentSkill, (levels / parentSkills.size()));
+//            }
+//
+//            profile.scheduleAsyncSave();
+//            return;
+//        }
+//
+//        profile.addLevels(skill, levels);
+//        profile.scheduleAsyncSave();
+//    }
+//
+//    /**
+//     * Add levels to a skill for an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to add levels to
+//     * @param skillType Type of skill to add levels to
+//     * @param levels Number of levels to add
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static void addLevelOffline(UUID uuid, String skillType, int levels) {
+//        PlayerProfile profile = getOfflineProfile(uuid);
+//        PrimarySkillType skill = getSkillType(skillType);
+//
+//        if (skill.isChildSkill()) {
+//            Set<PrimarySkillType> parentSkills = FamilyTree.getParents(skill);
+//
+//            for (PrimarySkillType parentSkill : parentSkills) {
+//                profile.addLevels(parentSkill, (levels / parentSkills.size()));
+//            }
+//
+//            profile.scheduleAsyncSave();
+//            return;
+//        }
+//
+//        profile.addLevels(skill, levels);
+//        profile.scheduleAsyncSave();
+//    }
+//
+//    /**
+//     * Get the level a player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get the level for
+//     * @param skillType The skill to get the level for
+//     * @return the level of a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @deprecated Use getLevel(Player player, PrimarySkillType skillType) instead
+//     */
+//    @Deprecated
+//    public static int getLevel(Player player, String skillType) {
+//        return getPlayer(player).getSkillLevel(getSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the level a player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get the level for
+//     * @param skillType The skill to get the level for
+//     * @return the level of a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    public static int getLevel(Player player, PrimarySkillType skillType) {
+//        return getPlayer(player).getSkillLevel(skillType);
+//    }
+//
+//    /**
+//     * Get the level an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get the level for
+//     * @param skillType The skill to get the level for
+//     * @return the level of a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static int getLevelOffline(String playerName, String skillType) {
+//        return getOfflineProfile(playerName).getSkillLevel(getSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the level an offline player has in a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get the level for
+//     * @param skillType The skill to get the level for
+//     * @return the level of a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static int getLevelOffline(UUID uuid, String skillType) {
+//        return getOfflineProfile(uuid).getSkillLevel(getSkillType(skillType));
+//    }
+//
+//    /**
+//     * Gets the power level of a player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to get the power level for
+//     * @return the power level of the player
+//     */
+//    public static int getPowerLevel(Player player) {
+//        return getPlayer(player).getPowerLevel();
+//    }
+//
+//    /**
+//     * Gets the power level of an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to get the power level for
+//     * @return the power level of the player
+//     *
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static int getPowerLevelOffline(String playerName) {
+//        int powerLevel = 0;
+//        PlayerProfile profile = getOfflineProfile(playerName);
+//
+//        for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) {
+//            powerLevel += profile.getSkillLevel(type);
+//        }
+//
+//        return powerLevel;
+//    }
+//
+//    /**
+//     * Gets the power level of an offline player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to get the power level for
+//     * @return the power level of the player
+//     *
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static int getPowerLevelOffline(UUID uuid) {
+//        int powerLevel = 0;
+//        PlayerProfile profile = getOfflineProfile(uuid);
+//
+//        for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) {
+//            powerLevel += profile.getSkillLevel(type);
+//        }
+//
+//        return powerLevel;
+//    }
+//
+//    /**
+//     * Get the level cap of a specific skill.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param skillType The skill to get the level cap for
+//     * @return the level cap of a given skill
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    public static int getLevelCap(String skillType) {
+//        return Config.getInstance().getLevelCap(getSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the power level cap.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return the overall power level cap
+//     */
+//    public static int getPowerLevelCap() {
+//        return Config.getInstance().getPowerLevelCap();
+//    }
+//
+//    /**
+//     * Get the position on the leaderboard of a player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The name of the player to check
+//     * @param skillType The skill to check
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     *
+//     * @return the position on the leaderboard
+//     */
+//    @Deprecated
+//    public static int getPlayerRankSkill(String playerName, String skillType) {
+//        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(playerName).getName()).get(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the position on the leaderboard of a player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The name of the player to check
+//     * @param skillType The skill to check
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     *
+//     * @return the position on the leaderboard
+//     */
+//    public static int getPlayerRankSkill(UUID uuid, String skillType) {
+//        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(uuid).getName()).get(getNonChildSkillType(skillType));
+//    }
+//
+//    /**
+//     * Get the position on the power level leaderboard of a player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The name of the player to check
+//     *
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     *
+//     * @return the position on the power level leaderboard
+//     */
+//    @Deprecated
+//    public static int getPlayerRankOverall(String playerName) {
+//        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(playerName).getName()).get(null);
+//    }
+//
+//    /**
+//     * Get the position on the power level leaderboard of a player.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The name of the player to check
+//     *
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     *
+//     * @return the position on the power level leaderboard
+//     */
+//    public static int getPlayerRankOverall(UUID uuid) {
+//        return mcMMO.getDatabaseManager().readRank(mcMMO.p.getServer().getOfflinePlayer(uuid).getName()).get(null);
+//    }
+//
+//    /**
+//     * Sets the level of a player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to set the level of
+//     * @param skillType The skill to set the level for
+//     * @param skillLevel The value to set the level to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     */
+//    public static void setLevel(Player player, String skillType, int skillLevel) {
+//        getPlayer(player).modifySkill(getSkillType(skillType), skillLevel);
+//    }
+//
+//    /**
+//     * Sets the level of an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to set the level of
+//     * @param skillType The skill to set the level for
+//     * @param skillLevel The value to set the level to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    @Deprecated
+//    public static void setLevelOffline(String playerName, String skillType, int skillLevel) {
+//        getOfflineProfile(playerName).modifySkill(getSkillType(skillType), skillLevel);
+//    }
+//
+//    /**
+//     * Sets the level of an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to set the level of
+//     * @param skillType The skill to set the level for
+//     * @param skillLevel The value to set the level to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     */
+//    public static void setLevelOffline(UUID uuid, String skillType, int skillLevel) {
+//        getOfflineProfile(uuid).modifySkill(getSkillType(skillType), skillLevel);
+//    }
+//
+//    /**
+//     * Sets the XP of a player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to set the XP of
+//     * @param skillType The skill to set the XP for
+//     * @param newValue The value to set the XP to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static void setXP(Player player, String skillType, int newValue) {
+//        getPlayer(player).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
+//    }
+//
+//    /**
+//     * Sets the XP of an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to set the XP of
+//     * @param skillType The skill to set the XP for
+//     * @param newValue The value to set the XP to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static void setXPOffline(String playerName, String skillType, int newValue) {
+//        getOfflineProfile(playerName).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
+//    }
+//
+//    /**
+//     * Sets the XP of an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to set the XP of
+//     * @param skillType The skill to set the XP for
+//     * @param newValue The value to set the XP to
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static void setXPOffline(UUID uuid, String skillType, int newValue) {
+//        getOfflineProfile(uuid).setSkillXpLevel(getNonChildSkillType(skillType), newValue);
+//    }
+//
+//    /**
+//     * Removes XP from a player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to change the XP of
+//     * @param skillType The skill to change the XP for
+//     * @param xp The amount of XP to remove
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static void removeXP(Player player, String skillType, int xp) {
+//        getPlayer(player).removeXp(getNonChildSkillType(skillType), xp);
+//    }
+//
+//    /**
+//     * Removes XP from an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playerName The player to change the XP of
+//     * @param skillType The skill to change the XP for
+//     * @param xp The amount of XP to remove
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    @Deprecated
+//    public static void removeXPOffline(String playerName, String skillType, int xp) {
+//        getOfflineProfile(playerName).removeXp(getNonChildSkillType(skillType), xp);
+//    }
+//
+//    /**
+//     * Removes XP from an offline player in a specific skill type.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param uuid The player to change the XP of
+//     * @param skillType The skill to change the XP for
+//     * @param xp The amount of XP to remove
+//     *
+//     * @throws InvalidSkillException if the given skill is not valid
+//     * @throws InvalidPlayerException if the given player does not exist in the database
+//     * @throws UnsupportedOperationException if the given skill is a child skill
+//     */
+//    public static void removeXPOffline(UUID uuid, String skillType, int xp) {
+//        getOfflineProfile(uuid).removeXp(getNonChildSkillType(skillType), xp);
+//    }
+//
+//    /**
+//     * Check how much XP is needed for a specific level with the selected level curve.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param level The level to get the amount of XP for
+//     *
+//     * @throws InvalidFormulaTypeException if the given formulaType is not valid
+//     */
+//    public static int getXpNeededToLevel(int level) {
+//        return mcMMO.getFormulaManager().getXPtoNextLevel(level, ExperienceConfig.getInstance().getFormulaType());
+//    }
+//
+//    /**
+//     * Check how much XP is needed for a specific level with the provided level curve.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param level The level to get the amount of XP for
+//     * @param formulaType The formula type to get the amount of XP for
+//     *
+//     * @throws InvalidFormulaTypeException if the given formulaType is not valid
+//     */
+//    public static int getXpNeededToLevel(int level, String formulaType) {
+//        return mcMMO.getFormulaManager().getXPtoNextLevel(level, getFormulaType(formulaType));
+//    }
+//
+//    /**
+//     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given
+//     * @param blockStates the blocks to reward XP for
+//     * @param mcMMOPlayer the target player
+//     */
+//    public static void addXpFromBlocks(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer)
+//    {
+//        for(BlockState bs : blockStates)
+//        {
+//            for(PrimarySkillType skillType : PrimarySkillType.values())
+//            {
+//                if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
+//                {
+//                    mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
+//                }
+//            }
+//        }
+//    }
+//
+//    /**
+//     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given if it matches the given skillType
+//     * @param blockStates the blocks to reward XP for
+//     * @param mcMMOPlayer the target player
+//     * @param skillType target primary skill
+//     */
+//    public static void addXpFromBlocksBySkill(ArrayList<BlockState> blockStates, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType)
+//    {
+//        for(BlockState bs : blockStates)
+//        {
+//            if(ExperienceConfig.getInstance().getXp(skillType, bs.getType()) > 0)
+//            {
+//                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, bs.getType()), XPGainReason.PVE, XPGainSource.SELF);
+//            }
+//        }
+//    }
+//
+//    /**
+//     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given
+//     * @param blockState The target blockstate
+//     * @param mcMMOPlayer The target player
+//     */
+//    public static void addXpFromBlock(BlockState blockState, McMMOPlayer mcMMOPlayer)
+//    {
+//        for(PrimarySkillType skillType : PrimarySkillType.values())
+//        {
+//            if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
+//            {
+//                mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
+//            }
+//        }
+//    }
+//
+//    /**
+//     * Will add the appropriate type of XP from the block to the player based on the material of the blocks given if it matches the given skillType
+//     * @param blockState The target blockstate
+//     * @param mcMMOPlayer The target player
+//     * @param skillType target primary skill
+//     */
+//    public static void addXpFromBlockBySkill(BlockState blockState, McMMOPlayer mcMMOPlayer, PrimarySkillType skillType)
+//    {
+//        if(ExperienceConfig.getInstance().getXp(skillType, blockState.getType()) > 0)
+//        {
+//            mcMMOPlayer.applyXpGain(skillType, ExperienceConfig.getInstance().getXp(skillType, blockState.getType()), XPGainReason.PVE, XPGainSource.SELF);
+//        }
+//    }
+//
+//    // Utility methods follow.
+//    private static void addOfflineXP(UUID playerUniqueId, PrimarySkillType skill, int XP) {
+//        PlayerProfile profile = getOfflineProfile(playerUniqueId);
+//
+//        profile.addXp(skill, XP);
+//        profile.save(true);
+//    }
+//
+//    @Deprecated
+//    private static void addOfflineXP(String playerName, PrimarySkillType skill, int XP) {
+//        PlayerProfile profile = getOfflineProfile(playerName);
+//
+//        profile.addXp(skill, XP);
+//        profile.scheduleAsyncSave();
+//    }
+//
+//    private static PlayerProfile getOfflineProfile(UUID uuid) throws InvalidPlayerException {
+//        OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(uuid);
+//        String playerName = offlinePlayer.getName();
+//        PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName);
+//
+//        if (!profile.isLoaded()) {
+//            throw new InvalidPlayerException();
+//        }
+//
+//        return profile;
+//    }
+//
+//    @Deprecated
+//    private static PlayerProfile getOfflineProfile(String playerName) throws InvalidPlayerException {
+//        OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(playerName);
+//        UUID uuid = offlinePlayer.getUniqueId();
+//        PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(uuid, playerName);
+//
+//        if (!profile.isLoaded()) {
+//            throw new InvalidPlayerException();
+//        }
+//
+//        return profile;
+//    }
+//
+//    private static PrimarySkillType getSkillType(String skillType) throws InvalidSkillException {
+//        PrimarySkillType skill = PrimarySkillType.getSkill(skillType);
+//
+//        if (skill == null) {
+//            throw new InvalidSkillException();
+//        }
+//
+//        return skill;
+//    }
+//
+//    private static PrimarySkillType getNonChildSkillType(String skillType) throws InvalidSkillException, UnsupportedOperationException {
+//        PrimarySkillType skill = getSkillType(skillType);
+//
+//        if (skill.isChildSkill()) {
+//            throw new UnsupportedOperationException("Child skills do not have XP");
+//        }
+//
+//        return skill;
+//    }
+//
+//    private static XPGainReason getXPGainReason(String reason) throws InvalidXPGainReasonException {
+//        XPGainReason xpGainReason = XPGainReason.getXPGainReason(reason);
+//
+//        if (xpGainReason == null) {
+//            throw new InvalidXPGainReasonException();
+//        }
+//
+//        return xpGainReason;
+//    }
+//
+//    private static FormulaType getFormulaType(String formula) throws InvalidFormulaTypeException {
+//        FormulaType formulaType = FormulaType.getFormulaType(formula);
+//
+//        if (formulaType == null) {
+//            throw new InvalidFormulaTypeException();
+//        }
+//
+//        return formulaType;
+//    }
+//
+//    /**
+//     * @deprecated Use UserManager::getPlayer(Player player) instead
+//     * @param player target player
+//     * @return McMMOPlayer for that player if the profile is loaded, otherwise null
+//     * @throws McMMOPlayerNotFoundException
+//     */
+//    @Deprecated
+//    private static McMMOPlayer getPlayer(Player player) throws McMMOPlayerNotFoundException {
+//        if (!UserManager.hasPlayerDataKey(player)) {
+//            throw new McMMOPlayerNotFoundException(player);
+//        }
+//
+//        return UserManager.getPlayer(player);
+//    }
+//}

+ 17 - 17
src/main/java/com/gmail/nossr50/api/ItemSpawnReason.java

@@ -1,17 +1,17 @@
-package com.gmail.nossr50.api;
-
-public enum ItemSpawnReason {
-    ARROW_RETRIEVAL_ACTIVATED, //Players sometimes can retrieve arrows instead of losing them when hitting a mob
-    EXCAVATION_TREASURE, //Any drops when excavation treasures activate fall under this
-    FISHING_EXTRA_FISH, //A config setting allows more fish to be found when fishing, the extra fish are part of this
-    FISHING_SHAKE_TREASURE, //When using a fishing rod on a mob and finding a treasure via Shake
-    HYLIAN_LUCK_TREASURE, //When finding a treasure in grass via hylian luck
-    BLAST_MINING_DEBRIS_NON_ORES, //The non-ore debris that are dropped from blast mining
-    BLAST_MINING_ORES, //The ore(s) which may include player placed ores being dropped from blast mining
-    BLAST_MINING_ORES_BONUS_DROP, //Any bonus ores that drop from a result of a players Mining skills
-    UNARMED_DISARMED_ITEM, //When you disarm an opponent and they drop their weapon
-    SALVAGE_ENCHANTMENT_BOOK, //When you salvage an enchanted item and get the enchantment back in book form
-    SALVAGE_MATERIALS, //When you salvage an item and get materials back
-    TREE_FELLER_DISPLACED_BLOCK,
-    BONUS_DROPS, //Can be from Mining, Woodcutting, Herbalism, etc
-}
+//package com.gmail.nossr50.api;
+//
+//public enum ItemSpawnReason {
+//    ARROW_RETRIEVAL_ACTIVATED, //Players sometimes can retrieve arrows instead of losing them when hitting a mob
+//    EXCAVATION_TREASURE, //Any drops when excavation treasures activate fall under this
+//    FISHING_EXTRA_FISH, //A config setting allows more fish to be found when fishing, the extra fish are part of this
+//    FISHING_SHAKE_TREASURE, //When using a fishing rod on a mob and finding a treasure via Shake
+//    HYLIAN_LUCK_TREASURE, //When finding a treasure in grass via hylian luck
+//    BLAST_MINING_DEBRIS_NON_ORES, //The non-ore debris that are dropped from blast mining
+//    BLAST_MINING_ORES, //The ore(s) which may include player placed ores being dropped from blast mining
+//    BLAST_MINING_ORES_BONUS_DROP, //Any bonus ores that drop from a result of a players Mining skills
+//    UNARMED_DISARMED_ITEM, //When you disarm an opponent and they drop their weapon
+//    SALVAGE_ENCHANTMENT_BOOK, //When you salvage an enchanted item and get the enchantment back in book form
+//    SALVAGE_MATERIALS, //When you salvage an item and get materials back
+//    TREE_FELLER_DISPLACED_BLOCK,
+//    BONUS_DROPS, //Can be from Mining, Woodcutting, Herbalism, etc
+//}

+ 258 - 258
src/main/java/com/gmail/nossr50/api/PartyAPI.java

@@ -1,258 +1,258 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.interactions.NotificationType;
-import com.gmail.nossr50.datatypes.party.Party;
-import com.gmail.nossr50.datatypes.party.PartyLeader;
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.party.PartyManager;
-import com.gmail.nossr50.util.player.NotificationManager;
-import com.gmail.nossr50.util.player.UserManager;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.entity.Player;
-
-import java.util.*;
-
-public final class PartyAPI {
-    private PartyAPI() {}
-
-    /**
-     * Get the name of the party a player is in.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check the party name of
-     * @return the name of the player's party, or null if not in a party
-     */
-    public static String getPartyName(Player player) {
-        if (!inParty(player)) {
-            return null;
-        }
-
-        return UserManager.getPlayer(player).getParty().getName();
-    }
-
-    /**
-     * Checks if a player is in a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check
-     * @return true if the player is in a party, false otherwise
-     */
-    public static boolean inParty(Player player) {
-        if(UserManager.getPlayer(player) == null)
-            return false;
-
-        return UserManager.getPlayer(player).inParty();
-    }
-
-    /**
-     * Check if two players are in the same party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param playera The first player to check
-     * @param playerb The second player to check
-     * @return true if the two players are in the same party, false otherwise
-     */
-    public static boolean inSameParty(Player playera, Player playerb) {
-        return PartyManager.inSameParty(playera, playerb);
-    }
-
-    /**
-     * Get a list of all current parties.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return the list of parties.
-     */
-    public static List<Party> getParties() {
-        return PartyManager.getParties();
-    }
-
-    /**
-     * Add a player to a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add to the party
-     * @param partyName The party to add the player to
-     * @deprecated parties can have limits, use the other method
-     */
-    @Deprecated
-    public static void addToParty(Player player, String partyName) {
-        //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
-            return;
-
-        Party party = PartyManager.getParty(partyName);
-
-        if (party == null) {
-            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
-        } else {
-            if(PartyManager.isPartyFull(player, party))
-            {
-                NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
-                return;
-            }
-        }
-
-        PartyManager.addToParty(UserManager.getPlayer(player), party);
-    }
-
-    /**
-     * The max party size of the server
-     * 0 or less for no size limit
-     * @return the max party size on this server
-     */
-    public static int getMaxPartySize()
-    {
-        return Config.getInstance().getPartyMaxSize();
-    }
-
-    /**
-     * Add a player to a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to add to the party
-     * @param partyName The party to add the player to
-     * @param bypassLimit if true bypasses party size limits
-     */
-    //TODO: bypasslimit not used?
-    public static void addToParty(Player player, String partyName, boolean bypassLimit) {
-        //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
-            return;
-
-        Party party = PartyManager.getParty(partyName);
-
-        if (party == null) {
-            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
-        }
-
-        PartyManager.addToParty(UserManager.getPlayer(player), party);
-    }
-
-    /**
-     * Remove a player from a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to remove
-     */
-    public static void removeFromParty(Player player) {
-        //Check if player profile is loaded
-        if(UserManager.getPlayer(player) == null)
-            return;
-
-        PartyManager.removeFromParty(UserManager.getPlayer(player));
-    }
-
-    /**
-     * Get the leader of a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param partyName The party name
-     * @return the leader of the party
-     */
-    public static String getPartyLeader(String partyName) {
-        return PartyManager.getPartyLeaderName(partyName);
-    }
-
-    /**
-     * Set the leader of a party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param partyName The name of the party to set the leader of
-     * @param playerName The playerName to set as leader
-     */
-    @Deprecated
-    public static void setPartyLeader(String partyName, String playerName) {
-        PartyManager.setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), PartyManager.getParty(partyName));
-    }
-
-    /**
-     * Get a list of all players in this player's party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check
-     * @return all the players in the player's party
-     */
-    @Deprecated
-    public static List<OfflinePlayer> getOnlineAndOfflineMembers(Player player) {
-        List<OfflinePlayer> members = new ArrayList<>();
-
-        for (UUID memberUniqueId : PartyManager.getAllMembers(player).keySet()) {
-            OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberUniqueId);
-            members.add(member);
-        }
-        return members;
-    }
-
-    /**
-     * Get a list of all player names in this player's party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check
-     * @return all the player names in the player's party
-     */
-    @Deprecated
-    public static LinkedHashSet<String> getMembers(Player player) {
-        return (LinkedHashSet<String>) PartyManager.getAllMembers(player).values();
-    }
-
-    /**
-     * Get a list of all player names and uuids in this player's party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check
-     * @return all the player names and uuids in the player's party
-     */
-    public static LinkedHashMap<UUID, String> getMembersMap(Player player) {
-        return PartyManager.getAllMembers(player);
-    }
-
-    /**
-     * Get a list of all online players in this party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param partyName The party to check
-     * @return all online players in this party
-     */
-    public static List<Player> getOnlineMembers(String partyName) {
-        return PartyManager.getOnlineMembers(partyName);
-    }
-
-    /**
-     * Get a list of all online players in this player's party.
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @param player The player to check
-     * @return all online players in the player's party
-     */
-    public static List<Player> getOnlineMembers(Player player) {
-        return PartyManager.getOnlineMembers(player);
-    }
-
-    public static boolean hasAlly(String partyName) {
-        return getAllyName(partyName) != null;
-    }
-
-    public static String getAllyName(String partyName) {
-        Party ally = PartyManager.getParty(partyName).getAlly();
-        if (ally != null) {
-            return ally.getName();
-        }
-
-        return null;
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.config.Config;
+//import com.gmail.nossr50.datatypes.interactions.NotificationType;
+//import com.gmail.nossr50.datatypes.party.Party;
+//import com.gmail.nossr50.datatypes.party.PartyLeader;
+//import com.gmail.nossr50.mcMMO;
+//import com.gmail.nossr50.party.PartyManager;
+//import com.gmail.nossr50.util.player.NotificationManager;
+//import com.gmail.nossr50.util.player.UserManager;
+//import org.bukkit.OfflinePlayer;
+//import org.bukkit.entity.Player;
+//
+//import java.util.*;
+//
+//public final class PartyAPI {
+//    private PartyAPI() {}
+//
+//    /**
+//     * Get the name of the party a player is in.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check the party name of
+//     * @return the name of the player's party, or null if not in a party
+//     */
+//    public static String getPartyName(Player player) {
+//        if (!inParty(player)) {
+//            return null;
+//        }
+//
+//        return UserManager.getPlayer(player).getParty().getName();
+//    }
+//
+//    /**
+//     * Checks if a player is in a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check
+//     * @return true if the player is in a party, false otherwise
+//     */
+//    public static boolean inParty(Player player) {
+//        if(UserManager.getPlayer(player) == null)
+//            return false;
+//
+//        return UserManager.getPlayer(player).inParty();
+//    }
+//
+//    /**
+//     * Check if two players are in the same party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param playera The first player to check
+//     * @param playerb The second player to check
+//     * @return true if the two players are in the same party, false otherwise
+//     */
+//    public static boolean inSameParty(Player playera, Player playerb) {
+//        return PartyManager.inSameParty(playera, playerb);
+//    }
+//
+//    /**
+//     * Get a list of all current parties.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return the list of parties.
+//     */
+//    public static List<Party> getParties() {
+//        return PartyManager.getParties();
+//    }
+//
+//    /**
+//     * Add a player to a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add to the party
+//     * @param partyName The party to add the player to
+//     * @deprecated parties can have limits, use the other method
+//     */
+//    @Deprecated
+//    public static void addToParty(Player player, String partyName) {
+//        //Check if player profile is loaded
+//        if(UserManager.getPlayer(player) == null)
+//            return;
+//
+//        Party party = PartyManager.getParty(partyName);
+//
+//        if (party == null) {
+//            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
+//        } else {
+//            if(PartyManager.isPartyFull(player, party))
+//            {
+//                NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
+//                return;
+//            }
+//        }
+//
+//        PartyManager.addToParty(UserManager.getPlayer(player), party);
+//    }
+//
+//    /**
+//     * The max party size of the server
+//     * 0 or less for no size limit
+//     * @return the max party size on this server
+//     */
+//    public static int getMaxPartySize()
+//    {
+//        return Config.getInstance().getPartyMaxSize();
+//    }
+//
+//    /**
+//     * Add a player to a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to add to the party
+//     * @param partyName The party to add the player to
+//     * @param bypassLimit if true bypasses party size limits
+//     */
+//    //TODO: bypasslimit not used?
+//    public static void addToParty(Player player, String partyName, boolean bypassLimit) {
+//        //Check if player profile is loaded
+//        if(UserManager.getPlayer(player) == null)
+//            return;
+//
+//        Party party = PartyManager.getParty(partyName);
+//
+//        if (party == null) {
+//            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
+//        }
+//
+//        PartyManager.addToParty(UserManager.getPlayer(player), party);
+//    }
+//
+//    /**
+//     * Remove a player from a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to remove
+//     */
+//    public static void removeFromParty(Player player) {
+//        //Check if player profile is loaded
+//        if(UserManager.getPlayer(player) == null)
+//            return;
+//
+//        PartyManager.removeFromParty(UserManager.getPlayer(player));
+//    }
+//
+//    /**
+//     * Get the leader of a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param partyName The party name
+//     * @return the leader of the party
+//     */
+//    public static String getPartyLeader(String partyName) {
+//        return PartyManager.getPartyLeaderName(partyName);
+//    }
+//
+//    /**
+//     * Set the leader of a party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param partyName The name of the party to set the leader of
+//     * @param playerName The playerName to set as leader
+//     */
+//    @Deprecated
+//    public static void setPartyLeader(String partyName, String playerName) {
+//        PartyManager.setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), PartyManager.getParty(partyName));
+//    }
+//
+//    /**
+//     * Get a list of all players in this player's party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check
+//     * @return all the players in the player's party
+//     */
+//    @Deprecated
+//    public static List<OfflinePlayer> getOnlineAndOfflineMembers(Player player) {
+//        List<OfflinePlayer> members = new ArrayList<>();
+//
+//        for (UUID memberUniqueId : PartyManager.getAllMembers(player).keySet()) {
+//            OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberUniqueId);
+//            members.add(member);
+//        }
+//        return members;
+//    }
+//
+//    /**
+//     * Get a list of all player names in this player's party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check
+//     * @return all the player names in the player's party
+//     */
+//    @Deprecated
+//    public static LinkedHashSet<String> getMembers(Player player) {
+//        return (LinkedHashSet<String>) PartyManager.getAllMembers(player).values();
+//    }
+//
+//    /**
+//     * Get a list of all player names and uuids in this player's party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check
+//     * @return all the player names and uuids in the player's party
+//     */
+//    public static LinkedHashMap<UUID, String> getMembersMap(Player player) {
+//        return PartyManager.getAllMembers(player);
+//    }
+//
+//    /**
+//     * Get a list of all online players in this party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param partyName The party to check
+//     * @return all online players in this party
+//     */
+//    public static List<Player> getOnlineMembers(String partyName) {
+//        return PartyManager.getOnlineMembers(partyName);
+//    }
+//
+//    /**
+//     * Get a list of all online players in this player's party.
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @param player The player to check
+//     * @return all online players in the player's party
+//     */
+//    public static List<Player> getOnlineMembers(Player player) {
+//        return PartyManager.getOnlineMembers(player);
+//    }
+//
+//    public static boolean hasAlly(String partyName) {
+//        return getAllyName(partyName) != null;
+//    }
+//
+//    public static String getAllyName(String partyName) {
+//        Party ally = PartyManager.getParty(partyName).getAlly();
+//        if (ally != null) {
+//            return ally.getName();
+//        }
+//
+//        return null;
+//    }
+//}

+ 93 - 93
src/main/java/com/gmail/nossr50/api/SkillAPI.java

@@ -1,93 +1,93 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public final class SkillAPI {
-    private SkillAPI() {}
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This includes parent and child skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getSkills() {
-        return getListFromEnum(Arrays.asList(PrimarySkillType.values()));
-    }
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This only includes parent skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getNonChildSkills() {
-        return getListFromEnum(PrimarySkillType.NON_CHILD_SKILLS);
-    }
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This only includes child skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getChildSkills() {
-        return getListFromEnum(PrimarySkillType.CHILD_SKILLS);
-    }
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This only includes combat skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getCombatSkills() {
-        return getListFromEnum(PrimarySkillType.COMBAT_SKILLS);
-    }
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This only includes gathering skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getGatheringSkills() {
-        return getListFromEnum(PrimarySkillType.GATHERING_SKILLS);
-    }
-
-    /**
-     * Returns a list of strings with mcMMO's skills
-     * This only includes misc skills
-     * </br>
-     * This function is designed for API usage.
-     *
-     * @return a list of strings with valid skill names
-     */
-    public static List<String> getMiscSkills() {
-        return getListFromEnum(PrimarySkillType.MISC_SKILLS);
-    }
-
-    private static List<String> getListFromEnum(List<PrimarySkillType> skillsTypes) {
-        List<String> skills = new ArrayList<>();
-
-        for (PrimarySkillType primarySkillType : skillsTypes) {
-            skills.add(primarySkillType.name());
-        }
-
-        return skills;
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
+//
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//import java.util.List;
+//
+//public final class SkillAPI {
+//    private SkillAPI() {}
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This includes parent and child skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getSkills() {
+//        return getListFromEnum(Arrays.asList(PrimarySkillType.values()));
+//    }
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This only includes parent skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getNonChildSkills() {
+//        return getListFromEnum(PrimarySkillType.NON_CHILD_SKILLS);
+//    }
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This only includes child skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getChildSkills() {
+//        return getListFromEnum(PrimarySkillType.CHILD_SKILLS);
+//    }
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This only includes combat skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getCombatSkills() {
+//        return getListFromEnum(PrimarySkillType.COMBAT_SKILLS);
+//    }
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This only includes gathering skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getGatheringSkills() {
+//        return getListFromEnum(PrimarySkillType.GATHERING_SKILLS);
+//    }
+//
+//    /**
+//     * Returns a list of strings with mcMMO's skills
+//     * This only includes misc skills
+//     * </br>
+//     * This function is designed for API usage.
+//     *
+//     * @return a list of strings with valid skill names
+//     */
+//    public static List<String> getMiscSkills() {
+//        return getListFromEnum(PrimarySkillType.MISC_SKILLS);
+//    }
+//
+//    private static List<String> getListFromEnum(List<PrimarySkillType> skillsTypes) {
+//        List<String> skills = new ArrayList<>();
+//
+//        for (PrimarySkillType primarySkillType : skillsTypes) {
+//            skills.add(primarySkillType.name());
+//        }
+//
+//        return skills;
+//    }
+//}