Ver Fonte

Start to migrate Party API -> mcMMO-API

nossr50 há 4 anos atrás
pai
commit
602d47698a
50 ficheiros alterados com 1066 adições e 1885 exclusões
  1. 255 255
      src/main/java/com/gmail/nossr50/api/PartyAPI.java
  2. 2 2
      src/main/java/com/gmail/nossr50/commands/chat/PartyChatCommand.java
  3. 0 1
      src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java
  4. 1 1
      src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java
  5. 0 1
      src/main/java/com/gmail/nossr50/commands/party/PartyRenameCommand.java
  6. 1 2
      src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java
  7. 1 2
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java
  8. 1 2
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java
  9. 2 2
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java
  10. 1 1
      src/main/java/com/gmail/nossr50/commands/party/teleport/PtpToggleCommand.java
  11. 2 3
      src/main/java/com/gmail/nossr50/config/Config.java
  12. 3 3
      src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java
  13. 1 1
      src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java
  14. 1 1
      src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java
  15. 5 5
      src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java
  16. 1 1
      src/main/java/com/gmail/nossr50/datatypes/experience/OnlineExperienceProcessor.java
  17. 0 38
      src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java
  18. 0 4
      src/main/java/com/gmail/nossr50/datatypes/party/PartyInviteManager.java
  19. 0 85
      src/main/java/com/gmail/nossr50/datatypes/party/PartyItemShareManager.java
  20. 0 7
      src/main/java/com/gmail/nossr50/datatypes/party/PartyMemberRank.java
  21. 0 25
      src/main/java/com/gmail/nossr50/datatypes/party/ShareMode.java
  22. 13 46
      src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
  23. 1 1
      src/main/java/com/gmail/nossr50/datatypes/skills/CoreRootSkill.java
  24. 3 1
      src/main/java/com/gmail/nossr50/datatypes/skills/SuperCoreSkill.java
  25. 91 91
      src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java
  26. 75 104
      src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java
  27. 54 54
      src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java
  28. 46 46
      src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java
  29. 76 76
      src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java
  30. 2 1
      src/main/java/com/gmail/nossr50/mcMMO.java
  31. 38 0
      src/main/java/com/gmail/nossr50/party/ItemShareType.java
  32. 12 12
      src/main/java/com/gmail/nossr50/party/PartyExperienceManagerImpl.java
  33. 1 1
      src/main/java/com/gmail/nossr50/party/PartyFeature.java
  34. 20 12
      src/main/java/com/gmail/nossr50/party/PartyImpl.java
  35. 2 1
      src/main/java/com/gmail/nossr50/party/PartyInvite.java
  36. 4 0
      src/main/java/com/gmail/nossr50/party/PartyInviteManagerImpl.java
  37. 85 0
      src/main/java/com/gmail/nossr50/party/PartyItemShareManager.java
  38. 0 864
      src/main/java/com/gmail/nossr50/party/PartyManager.java
  39. 211 0
      src/main/java/com/gmail/nossr50/party/PartyManagerImpl.java
  40. 4 3
      src/main/java/com/gmail/nossr50/party/PartyMemberImpl.java
  41. 22 8
      src/main/java/com/gmail/nossr50/party/PartyMemberManagerImpl.java
  42. 1 1
      src/main/java/com/gmail/nossr50/party/PartyTeleportRecord.java
  43. 13 4
      src/main/java/com/gmail/nossr50/party/PersistentPartyData.java
  44. 2 106
      src/main/java/com/gmail/nossr50/party/ShareHandler.java
  45. 1 1
      src/main/java/com/gmail/nossr50/util/Permissions.java
  46. 1 1
      src/main/java/com/gmail/nossr50/util/experience/MMOExperienceBarManager.java
  47. 6 4
      src/main/java/com/gmail/nossr50/util/input/AbilityActivationProcessor.java
  48. 3 2
      src/main/java/com/gmail/nossr50/util/input/SuperSkillManagerImpl.java
  49. 1 2
      src/main/java/com/gmail/nossr50/util/player/PartyUtils.java
  50. 1 1
      src/main/java/com/gmail/nossr50/util/text/StringUtils.java

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

@@ -1,255 +1,255 @@
-package com.gmail.nossr50.api;
-
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.interactions.NotificationType;
-import com.neetgames.mcmmo.party.Party;
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.player.NotificationManager;
-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 mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
-            return false;
-
-        return mcMMO.getUserManager().queryPlayer(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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().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(mcMMO.getUserManager().queryPlayer(player) == null)
-            return;
-
-        Party party = mcMMO.getPartyManager().getParty(partyName);
-
-        if (party == null) {
-            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
-        } else {
-            if(mcMMO.getPartyManager().isPartyFull(player, party))
-            {
-                NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
-                return;
-            }
-        }
-
-        mcMMO.getPartyManager().addToParty(mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
-            return;
-
-        Party party = mcMMO.getPartyManager().getParty(partyName);
-
-        if (party == null) {
-            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
-        }
-
-        mcMMO.getPartyManager().addToParty(mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
-            return;
-
-        mcMMO.getPartyManager().removeFromParty(mcMMO.getUserManager().queryPlayer(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 mcMMO.getPartyManager().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) {
-        mcMMO.getPartyManager().setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), mcMMO.getPartyManager().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 : mcMMO.getPartyManager().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>) mcMMO.getPartyManager().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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().getOnlineMembers(player);
-    }
-
-    public static boolean hasAlly(String partyName) {
-        return getAllyName(partyName) != null;
-    }
-
-    public static String getAllyName(String partyName) {
-        Party ally = mcMMO.getPartyManager().getParty(partyName).getAlly();
-        if (ally != null) {
-            return ally.getPartyName();
-        }
-
-        return null;
-    }
-}
+//package com.gmail.nossr50.api;
+//
+//import com.gmail.nossr50.config.Config;
+//import com.gmail.nossr50.datatypes.interactions.NotificationType;
+//import com.neetgames.mcmmo.party.Party;
+//import com.gmail.nossr50.mcMMO;
+//import com.gmail.nossr50.util.player.NotificationManager;
+//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 mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
+//            return false;
+//
+//        return mcMMO.getUserManager().queryPlayer(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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().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(mcMMO.getUserManager().queryPlayer(player) == null)
+//            return;
+//
+//        Party party = mcMMO.getPartyManager().getParty(partyName);
+//
+//        if (party == null) {
+//            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
+//        } else {
+//            if(mcMMO.getPartyManager().isPartyFull(player, party))
+//            {
+//                NotificationManager.sendPlayerInformation(player, NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull", party.toString());
+//                return;
+//            }
+//        }
+//
+//        mcMMO.getPartyManager().addToParty(mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
+//            return;
+//
+//        Party party = mcMMO.getPartyManager().getParty(partyName);
+//
+//        if (party == null) {
+//            party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName);
+//        }
+//
+//        mcMMO.getPartyManager().addToParty(mcMMO.getUserManager().queryPlayer(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(mcMMO.getUserManager().queryPlayer(player) == null)
+//            return;
+//
+//        mcMMO.getPartyManager().removeFromParty(mcMMO.getUserManager().queryPlayer(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 mcMMO.getPartyManager().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) {
+//        mcMMO.getPartyManager().setPartyLeader(mcMMO.p.getServer().getOfflinePlayer(playerName).getUniqueId(), mcMMO.getPartyManager().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 : mcMMO.getPartyManager().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>) mcMMO.getPartyManager().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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().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 mcMMO.getPartyManager().getOnlineMembers(player);
+//    }
+//
+//    public static boolean hasAlly(String partyName) {
+//        return getAllyName(partyName) != null;
+//    }
+//
+//    public static String getAllyName(String partyName) {
+//        Party ally = mcMMO.getPartyManager().getParty(partyName).getAlly();
+//        if (ally != null) {
+//            return ally.getPartyName();
+//        }
+//
+//        return null;
+//    }
+//}

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

@@ -8,7 +8,7 @@ import co.aikar.commands.annotation.Default;
 import com.gmail.nossr50.commands.CommandManager;
 import com.gmail.nossr50.commands.CommandManager;
 import com.gmail.nossr50.datatypes.chat.ChatChannel;
 import com.gmail.nossr50.datatypes.chat.ChatChannel;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.party.PartyManagerImpl;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
@@ -76,7 +76,7 @@ public class PartyChatCommand extends BaseCommand {
             mcMMO.p.getLogger().severe("You need to specify a party name and then write a message afterwards.");
             mcMMO.p.getLogger().severe("You need to specify a party name and then write a message afterwards.");
         } else {
         } else {
             //Grab party
             //Grab party
-            Party targetParty = PartyManager.getParty(args[0]);
+            Party targetParty = PartyManagerImpl.getParty(args[0]);
 
 
             if(targetParty != null) {
             if(targetParty != null) {
                 pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty);
                 pluginRef.getChatManager().processConsoleMessage(StringUtils.buildStringAfterNthElement(args, 1), targetParty);

+ 0 - 1
src/main/java/com/gmail/nossr50/commands/party/PartyDisbandCommand.java

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.commands.party;
 package com.gmail.nossr50.commands.party;
 
 
-import com.gmail.nossr50.datatypes.party.PartyMember;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;

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

@@ -1,7 +1,7 @@
 package com.gmail.nossr50.commands.party;
 package com.gmail.nossr50.commands.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.party.PartyFeature;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;

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

@@ -1,6 +1,5 @@
 package com.gmail.nossr50.commands.party;
 package com.gmail.nossr50.commands.party;
 
 
-import com.gmail.nossr50.datatypes.party.PartyMember;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;

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

@@ -1,8 +1,7 @@
 package com.gmail.nossr50.commands.party;
 package com.gmail.nossr50.commands.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.party.PartyFeature;
-import com.gmail.nossr50.datatypes.party.ShareMode;
+import com.gmail.nossr50.party.PartyFeature;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.commands.CommandUtils;
 import com.gmail.nossr50.util.commands.CommandUtils;

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptAnyCommand.java

@@ -1,7 +1,6 @@
 package com.gmail.nossr50.commands.party.teleport;
 package com.gmail.nossr50.commands.party.teleport;
 
 
-import com.gmail.nossr50.datatypes.party.PartyMember;
-import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
+import com.gmail.nossr50.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;

+ 1 - 2
src/main/java/com/gmail/nossr50/commands/party/teleport/PtpAcceptCommand.java

@@ -1,11 +1,10 @@
 package com.gmail.nossr50.commands.party.teleport;
 package com.gmail.nossr50.commands.party.teleport;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
+import com.gmail.nossr50.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.skills.SkillUtils;
 import org.bukkit.World;
 import org.bukkit.World;
 import org.bukkit.command.Command;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandExecutor;

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

@@ -2,8 +2,8 @@ package com.gmail.nossr50.commands.party.teleport;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.WorldBlacklist;
 import com.gmail.nossr50.config.WorldBlacklist;
-import com.gmail.nossr50.datatypes.party.PartyFeature;
-import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
+import com.gmail.nossr50.party.PartyFeature;
+import com.gmail.nossr50.party.PartyTeleportRecord;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;

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

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.commands.party.teleport;
 package com.gmail.nossr50.commands.party.teleport;
 
 
-import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
+import com.gmail.nossr50.party.PartyTeleportRecord;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;

+ 2 - 3
src/main/java/com/gmail/nossr50/config/Config.java

@@ -1,13 +1,12 @@
 package com.gmail.nossr50.config;
 package com.gmail.nossr50.config;
 
 
 import com.gmail.nossr50.database.SQLDatabaseManager.PoolIdentifier;
 import com.gmail.nossr50.database.SQLDatabaseManager.PoolIdentifier;
-import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.party.PartyFeature;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.gmail.nossr50.util.text.StringUtils;
 import com.neetgames.mcmmo.MobHealthBarType;
 import com.neetgames.mcmmo.MobHealthBarType;
 import com.neetgames.mcmmo.skill.RootSkill;
 import com.neetgames.mcmmo.skill.RootSkill;
-import com.neetgames.mcmmo.skill.SkillIdentity;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.data.BlockData;
 import org.bukkit.block.data.BlockData;
 import org.bukkit.configuration.ConfigurationSection;
 import org.bukkit.configuration.ConfigurationSection;
@@ -566,7 +565,7 @@ public class Config extends AutoUpdateConfigLoader {
 
 
     public int getLevelCap(@NotNull RootSkill rootSkill) {
     public int getLevelCap(@NotNull RootSkill rootSkill) {
 
 
-        int cap = config.getInt("Skills." + StringUtils.getCapitalized(rootSkill.getSkillName()) + ".Level_Cap", 0);
+        int cap = config.getInt("Skills." + StringUtils.getCapitalized(rootSkill.getRawSkillName()) + ".Level_Cap", 0);
         return (cap <= 0) ? Integer.MAX_VALUE : cap;
         return (cap <= 0) ? Integer.MAX_VALUE : cap;
     }
     }
 
 

+ 3 - 3
src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java

@@ -331,11 +331,11 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
     public boolean getAddExtraDetails() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false);}
     public boolean getAddExtraDetails() { return config.getBoolean("Experience_Bars.ThisMayCauseLag.AlwaysUpdateTitlesWhenXPIsGained.ExtraDetails", false);}
     public boolean isExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Enable", true); }
     public boolean isExperienceBarsEnabled() { return config.getBoolean("Experience_Bars.Enable", true); }
     public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Enable", true);}
     public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(primarySkillType.toString())+".Enable", true);}
-    public boolean isExperienceBarEnabled(@NotNull RootSkill rootSkill) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getSkillName())+".Enable", true);}
+    public boolean isExperienceBarEnabled(@NotNull RootSkill rootSkill) { return config.getBoolean("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getRawSkillName())+".Enable", true);}
 
 
     public BarColor getExperienceBarColor(@NotNull RootSkill rootSkill)
     public BarColor getExperienceBarColor(@NotNull RootSkill rootSkill)
     {
     {
-        String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getSkillName())+".Color");
+        String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getRawSkillName())+".Color");
 
 
         for(BarColor barColor : BarColor.values())
         for(BarColor barColor : BarColor.values())
         {
         {
@@ -375,7 +375,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
     }
     }
 
 
     public BarStyle getExperienceBarStyle(@NotNull RootSkill rootSkill) {
     public BarStyle getExperienceBarStyle(@NotNull RootSkill rootSkill) {
-        String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getSkillName())+".BarStyle");
+        String colorValueFromConfig = config.getString("Experience_Bars."+StringUtils.getCapitalized(rootSkill.getRawSkillName())+".BarStyle");
 
 
         for(BarStyle barStyle : BarStyle.values())
         for(BarStyle barStyle : BarStyle.values())
         {
         {

+ 1 - 1
src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java

@@ -1117,7 +1117,7 @@ public final class FlatFileDatabaseManager extends AbstractDatabaseManager {
                                 }
                                 }
                                 int cap = Config.getInstance().getLevelCap(rootSkill);
                                 int cap = Config.getInstance().getLevelCap(rootSkill);
                                 if (Integer.parseInt(stringDataArray[index]) > cap) {
                                 if (Integer.parseInt(stringDataArray[index]) > cap) {
-                                    mcMMO.p.getLogger().warning("Truncating " + rootSkill.getSkillName() + " to configured max level for player " + stringDataArray[FlatFileMappings.USERNAME]);
+                                    mcMMO.p.getLogger().warning("Truncating " + rootSkill.getRawSkillName() + " to configured max level for player " + stringDataArray[FlatFileMappings.USERNAME]);
                                     stringDataArray[index] = cap + "";
                                     stringDataArray[index] = cap + "";
                                     updated = true;
                                     updated = true;
                                 }
                                 }

+ 1 - 1
src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java

@@ -1117,7 +1117,7 @@ public final class FlatFileDatabaseManager extends AbstractDatabaseManager {
                                 }
                                 }
                                 int cap = Config.getInstance().getLevelCap(rootSkill);
                                 int cap = Config.getInstance().getLevelCap(rootSkill);
                                 if (Integer.parseInt(stringDataArray[index]) > cap) {
                                 if (Integer.parseInt(stringDataArray[index]) > cap) {
-                                    mcMMO.p.getLogger().warning("Truncating " + rootSkill.getSkillName() + " to configured max level for player " + stringDataArray[FlatFileMappings.USERNAME]);
+                                    mcMMO.p.getLogger().warning("Truncating " + rootSkill.getRawSkillName() + " to configured max level for player " + stringDataArray[FlatFileMappings.USERNAME]);
                                     stringDataArray[index] = cap + "";
                                     stringDataArray[index] = cap + "";
                                     updated = true;
                                     updated = true;
                                 }
                                 }

+ 5 - 5
src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java

@@ -418,7 +418,7 @@ public final class SQLDatabaseManager extends AbstractDatabaseManager {
         }
         }
 
 
 
 
-        String query = rootSkill == null ? ALL_QUERY_VERSION : rootSkill.getSkillName().toLowerCase(Locale.ENGLISH);
+        String query = rootSkill == null ? ALL_QUERY_VERSION : rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH);
         ResultSet resultSet = null;
         ResultSet resultSet = null;
         PreparedStatement statement = null;
         PreparedStatement statement = null;
         Connection connection = null;
         Connection connection = null;
@@ -464,7 +464,7 @@ public final class SQLDatabaseManager extends AbstractDatabaseManager {
         try {
         try {
             connection = getConnection(PoolIdentifier.MISC);
             connection = getConnection(PoolIdentifier.MISC);
             for (RootSkill rootSkill : CoreSkills.getNonChildSkills()) {
             for (RootSkill rootSkill : CoreSkills.getNonChildSkills()) {
-                String skillName = rootSkill.getSkillName().toLowerCase(Locale.ENGLISH);
+                String skillName = rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH);
                 // Get count of all users with higher skill level than player
                 // Get count of all users with higher skill level than player
                 String sql = "SELECT COUNT(*) AS 'rank' FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " +
                 String sql = "SELECT COUNT(*) AS 'rank' FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " +
                         "AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " +
                         "AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " +
@@ -1025,8 +1025,8 @@ public final class SQLDatabaseManager extends AbstractDatabaseManager {
                     int cap = Config.getInstance().getLevelCap(rootSkill);
                     int cap = Config.getInstance().getLevelCap(rootSkill);
                     if (cap != Integer.MAX_VALUE) {
                     if (cap != Integer.MAX_VALUE) {
                         statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `"
                         statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `"
-                                + rootSkill.getSkillName().toLowerCase(Locale.ENGLISH) + "` = " + cap + " WHERE `"
-                                + rootSkill.getSkillName().toLowerCase(Locale.ENGLISH) + "` > " + cap);
+                                + rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH) + "` = " + cap + " WHERE `"
+                                + rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH) + "` > " + cap);
                         statement.executeUpdate();
                         statement.executeUpdate();
                         tryClose(statement);
                         tryClose(statement);
                     }
                     }
@@ -1455,7 +1455,7 @@ public final class SQLDatabaseManager extends AbstractDatabaseManager {
                 mcMMO.p.getLogger().info("Indexing tables, this may take a while on larger databases");
                 mcMMO.p.getLogger().info("Indexing tables, this may take a while on larger databases");
 
 
                 for (RootSkill rootSkill : CoreSkills.getNonChildSkills()) {
                 for (RootSkill rootSkill : CoreSkills.getNonChildSkills()) {
-                    String skill_name = rootSkill.getSkillName().toLowerCase(Locale.ENGLISH);
+                    String skill_name = rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH);
 
 
                     try {
                     try {
                         statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_" + skill_name + "` (`" + skill_name + "`) USING BTREE");
                         statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_" + skill_name + "` (`" + skill_name + "`) USING BTREE");

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/experience/OnlineExperienceProcessor.java

@@ -318,7 +318,7 @@ public class OnlineExperienceProcessor implements ExperienceHandler {
         if(hasReachedPowerLevelCap()) {
         if(hasReachedPowerLevelCap()) {
             NotificationManager.sendPlayerInformationChatOnly(Misc.adaptPlayer(mmoPlayer), "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap()));
             NotificationManager.sendPlayerInformationChatOnly(Misc.adaptPlayer(mmoPlayer), "LevelCap.PowerLevel", String.valueOf(Config.getInstance().getPowerLevelCap()));
         } else if(hasReachedLevelCap(rootSkill)) {
         } else if(hasReachedLevelCap(rootSkill)) {
-            NotificationManager.sendPlayerInformationChatOnly(Misc.adaptPlayer(mmoPlayer), "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(rootSkill)), rootSkill.getSkillName());
+            NotificationManager.sendPlayerInformationChatOnly(Misc.adaptPlayer(mmoPlayer), "LevelCap.Skill", String.valueOf(Config.getInstance().getLevelCap(rootSkill)), rootSkill.getRawSkillName());
         }
         }
 
 
         //Updates from Party sources
         //Updates from Party sources

+ 0 - 38
src/main/java/com/gmail/nossr50/datatypes/party/ItemShareType.java

@@ -1,38 +0,0 @@
-package com.gmail.nossr50.datatypes.party;
-
-import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.ItemUtils;
-import com.gmail.nossr50.util.text.StringUtils;
-import org.bukkit.inventory.ItemStack;
-
-public enum ItemShareType {
-    LOOT,
-    MINING,
-    HERBALISM,
-    WOODCUTTING,
-    MISC;
-
-    public static ItemShareType getShareType(ItemStack itemStack) {
-        if (ItemUtils.isMobDrop(itemStack)) {
-            return LOOT;
-        }
-        else if (ItemUtils.isMiningDrop(itemStack)) {
-            return MINING;
-        }
-        else if (ItemUtils.isHerbalismDrop(itemStack)) {
-            return HERBALISM;
-        }
-        else if (ItemUtils.isWoodcuttingDrop(itemStack)) {
-            return WOODCUTTING;
-        }
-        else if (ItemUtils.isMiscDrop(itemStack)) {
-            return MISC;
-        }
-
-        return null;
-    }
-
-    public String getLocaleString() {
-        return LocaleLoader.getString("Party.ItemShare.Category." + StringUtils.getCapitalized(this.toString()));
-    }
-}

+ 0 - 4
src/main/java/com/gmail/nossr50/datatypes/party/PartyInviteManager.java

@@ -1,4 +0,0 @@
-package com.gmail.nossr50.datatypes.party;
-
-public class PartyInviteManager {
-}

+ 0 - 85
src/main/java/com/gmail/nossr50/datatypes/party/PartyItemShareManager.java

@@ -1,85 +0,0 @@
-package com.gmail.nossr50.datatypes.party;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class PartyItemShareManager {
-
-    private ShareMode itemShareMode = ShareMode.NONE;
-
-    private boolean shareLootDrops        = true;
-    private boolean shareMiningDrops      = true;
-    private boolean shareHerbalismDrops   = true;
-    private boolean shareWoodcuttingDrops = true;
-    private boolean shareMiscDrops        = true;
-
-    public void setItemShareMode(ShareMode itemShareMode) {
-        this.itemShareMode = itemShareMode;
-    }
-
-    public ShareMode getItemShareMode() {
-        return itemShareMode;
-    }
-
-    public boolean sharingDrops(ItemShareType shareType) {
-        switch (shareType) {
-            case HERBALISM:
-                return shareHerbalismDrops;
-
-            case LOOT:
-                return shareLootDrops;
-
-            case MINING:
-                return shareMiningDrops;
-
-            case MISC:
-                return shareMiscDrops;
-
-            case WOODCUTTING:
-                return shareWoodcuttingDrops;
-
-            default:
-                return false;
-        }
-    }
-
-    public void setSharingDrops(ItemShareType shareType, boolean enabled) {
-        switch (shareType) {
-            case HERBALISM:
-                shareHerbalismDrops = enabled;
-                break;
-
-            case LOOT:
-                shareLootDrops = enabled;
-                break;
-
-            case MINING:
-                shareMiningDrops = enabled;
-                break;
-
-            case MISC:
-                shareMiscDrops = enabled;
-                break;
-
-            case WOODCUTTING:
-                shareWoodcuttingDrops = enabled;
-                break;
-
-            default:
-        }
-    }
-
-    public List<String> getItemShareCategories() {
-        List<String> shareCategories = new ArrayList<>();
-
-        for (ItemShareType shareType : ItemShareType.values()) {
-            if (sharingDrops(shareType)) {
-                shareCategories.add(shareType.getLocaleString());
-            }
-        }
-
-        return shareCategories;
-    }
-
-
-}

+ 0 - 7
src/main/java/com/gmail/nossr50/datatypes/party/PartyMemberRank.java

@@ -1,7 +0,0 @@
-package com.gmail.nossr50.datatypes.party;
-
-public enum PartyMemberRank {
-    MEMBER,
-    OFFICER,
-    LEADER;
-}

+ 0 - 25
src/main/java/com/gmail/nossr50/datatypes/party/ShareMode.java

@@ -1,25 +0,0 @@
-package com.gmail.nossr50.datatypes.party;
-
-import com.gmail.nossr50.util.commands.CommandUtils;
-
-public enum ShareMode {
-    NONE,
-    EQUAL,
-    RANDOM;
-
-    public static ShareMode getShareMode(String string) {
-        try {
-            return valueOf(string);
-        }
-        catch (IllegalArgumentException ex) {
-            if (string.equalsIgnoreCase("even")) {
-                return EQUAL;
-            }
-            else if (CommandUtils.shouldDisableToggle(string)) {
-                return NONE;
-            }
-
-            return null;
-        }
-    }
-}

+ 13 - 46
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -7,9 +7,8 @@ import com.gmail.nossr50.datatypes.chat.ChatChannel;
 import com.gmail.nossr50.datatypes.skills.CoreRootSkill;
 import com.gmail.nossr50.datatypes.skills.CoreRootSkill;
 import com.gmail.nossr50.datatypes.skills.CoreSkills;
 import com.gmail.nossr50.datatypes.skills.CoreSkills;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
-import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
+import com.gmail.nossr50.party.PartyTeleportRecord;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
-import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.skills.SkillManager;
@@ -34,9 +33,10 @@ import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 import com.gmail.nossr50.util.input.AbilityActivationProcessor;
 import com.gmail.nossr50.util.input.AbilityActivationProcessor;
-import com.gmail.nossr50.util.input.SuperAbilityManager;
+import com.gmail.nossr50.util.input.SuperSkillManagerImpl;
 import com.neetgames.mcmmo.player.MMOPlayerData;
 import com.neetgames.mcmmo.player.MMOPlayerData;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
+import com.neetgames.mcmmo.player.SuperSkillManager;
 import com.neetgames.mcmmo.skill.RootSkill;
 import com.neetgames.mcmmo.skill.RootSkill;
 import net.kyori.adventure.identity.Identified;
 import net.kyori.adventure.identity.Identified;
 import net.kyori.adventure.identity.Identity;
 import net.kyori.adventure.identity.Identity;
@@ -81,7 +81,7 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
     private @Nullable Location teleportCommence;
     private @Nullable Location teleportCommence;
 
 
     private final @NotNull FixedMetadataValue playerMetadata;
     private final @NotNull FixedMetadataValue playerMetadata;
-    private final @NotNull SuperAbilityManager superAbilityManager;
+    private final @NotNull SuperSkillManagerImpl superSkillManagerImpl;
     private final @NotNull AbilityActivationProcessor abilityActivationProcessor;
     private final @NotNull AbilityActivationProcessor abilityActivationProcessor;
 
 
     /**
     /**
@@ -102,7 +102,7 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         playerMetadata = new FixedMetadataValue(mcMMO.p, player.getName());
         playerMetadata = new FixedMetadataValue(mcMMO.p, player.getName());
         experienceBarManager = new MMOExperienceBarManager(this, mmoPlayerData.getBarStateMap());
         experienceBarManager = new MMOExperienceBarManager(this, mmoPlayerData.getBarStateMap());
 
 
-        superAbilityManager = new SuperAbilityManager(this, mmoPlayerData);
+        superSkillManagerImpl = new SuperSkillManagerImpl(this, mmoPlayerData);
         abilityActivationProcessor = new AbilityActivationProcessor(this);
         abilityActivationProcessor = new AbilityActivationProcessor(this);
 
 
         debugMode = false; //Debug mode helps solve support issues, players can toggle it on or off
         debugMode = false; //Debug mode helps solve support issues, players can toggle it on or off
@@ -151,7 +151,7 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
             mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
             mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
         }
         }
 
 
-        superAbilityManager = new SuperAbilityManager(this, mmoPlayerData);
+        superSkillManagerImpl = new SuperSkillManagerImpl(this, mmoPlayerData);
         abilityActivationProcessor = new AbilityActivationProcessor(this);
         abilityActivationProcessor = new AbilityActivationProcessor(this);
         experienceBarManager = new MMOExperienceBarManager(this, this.mmoPlayerData.getBarStateMap());
         experienceBarManager = new MMOExperienceBarManager(this, this.mmoPlayerData.getBarStateMap());
 
 
@@ -335,10 +335,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         return (WoodcuttingManager) skillManagers.get(PrimarySkillType.WOODCUTTING);
         return (WoodcuttingManager) skillManagers.get(PrimarySkillType.WOODCUTTING);
     }
     }
 
 
-    /*
-     * Recently Hurt
-     */
-
     /**
     /**
      * The timestamp of the last time this player was hurt
      * The timestamp of the last time this player was hurt
      * @return the timestamp of the most recent player damage
      * @return the timestamp of the most recent player damage
@@ -362,10 +358,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
         recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
     }
     }
 
 
-    /*
-     * Exploit Prevention
-     */
-
     /**
     /**
      * Get the activation time stamp for this player's last respawn
      * Get the activation time stamp for this player's last respawn
      * @return the time stamp of this player's last respawn
      * @return the time stamp of this player's last respawn
@@ -411,10 +403,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         databaseATS = System.currentTimeMillis();
         databaseATS = System.currentTimeMillis();
     }
     }
 
 
-    /*
-     * God Mode
-     */
-
     /**
     /**
      * Whether or not this player is in god mode
      * Whether or not this player is in god mode
      * @return true if this player is in god mode
      * @return true if this player is in god mode
@@ -430,10 +418,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         godMode = !godMode;
         godMode = !godMode;
     }
     }
 
 
-    /*
-     * Debug Mode Flags
-     */
-
     /**
     /**
      * Whether or not this player is using debug mode
      * Whether or not this player is using debug mode
      * @return true if this player is in debug mode
      * @return true if this player is in debug mode
@@ -449,10 +433,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         debugMode = !debugMode;
         debugMode = !debugMode;
     }
     }
 
 
-    /*
-     * Skill notifications
-     */
-
     /**
     /**
      * Whether or not this player receives specific skill notifications in chat
      * Whether or not this player receives specific skill notifications in chat
      * @return true if the player receives specific chat notifications related to skills
      * @return true if the player receives specific chat notifications related to skills
@@ -491,17 +471,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         }
         }
     }
     }
 
 
-    /**
-     * Calculate the time remaining until the superAbilityType's cooldown expires.
-     *
-     * @param superAbilityType the super ability cooldown to check
-     *
-     * @return the number of seconds remaining before the cooldown expires
-     */
-    public int getCooldownSeconds(SuperAbilityType superAbilityType) {
-        return superAbilityManager.calculateTimeRemaining(superAbilityType);
-    }
-
     /**
     /**
      * This is sort of a hack, used for thread safety
      * This is sort of a hack, used for thread safety
      * @return this player's {@link FixedMetadataValue}
      * @return this player's {@link FixedMetadataValue}
@@ -510,14 +479,6 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
         return playerMetadata;
         return playerMetadata;
     }
     }
 
 
-    /**
-     * Grab this players {@link SuperAbilityManager}
-     * @return this player's super ability manager
-     */
-    public @NotNull SuperAbilityManager getSuperAbilityManager() {
-        return superAbilityManager;
-    }
-
     /**
     /**
      * Grab this player's {@link AbilityActivationProcessor}
      * Grab this player's {@link AbilityActivationProcessor}
      * Used to process all things related to manually activated abilities
      * Used to process all things related to manually activated abilities
@@ -534,7 +495,7 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
      * Etc...
      * Etc...
      */
      */
     public void cleanup() {
     public void cleanup() {
-        superAbilityManager.disableSuperAbilities();
+        superSkillManagerImpl.disableSuperAbilities();
         getTamingManager().cleanupAllSummons();
         getTamingManager().cleanupAllSummons();
     }
     }
 
 
@@ -641,4 +602,10 @@ public class McMMOPlayer extends PlayerProfile implements OnlineMMOPlayer, Ident
     public @Nullable Party getParty() {
     public @Nullable Party getParty() {
         return playerPartyRef;
         return playerPartyRef;
     }
     }
+
+    @Override
+    public @NotNull SuperSkillManager getSuperSkillManager() {
+        return superSkillManagerImpl;
+    }
+
 }
 }

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

@@ -54,6 +54,6 @@ public class CoreRootSkill extends AbstractRootSkill {
 
 
     @Override
     @Override
     public boolean isOffensiveActionAllowed(@NotNull Object victim) {
     public boolean isOffensiveActionAllowed(@NotNull Object victim) {
-        return (victim instanceof Player || (victim instanceof Tameable && ((Tameable) victim).isTamed())) ? isPVPPermitted() : isPVEPermitted();;
+        return (victim instanceof Player || (victim instanceof Tameable && ((Tameable) victim).isTamed())) ? isPVPPermitted() : isPVEPermitted();
     }
     }
 }
 }

+ 3 - 1
src/main/java/com/gmail/nossr50/datatypes/skills/SuperCoreSkill.java

@@ -1,8 +1,10 @@
 package com.gmail.nossr50.datatypes.skills;
 package com.gmail.nossr50.datatypes.skills;
 
 
+import com.gmail.nossr50.util.skills.PerksUtils;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.skill.RootSkill;
 import com.neetgames.mcmmo.skill.RootSkill;
 import com.neetgames.mcmmo.skill.SuperSkill;
 import com.neetgames.mcmmo.skill.SuperSkill;
+import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.Nullable;
 
 
@@ -22,6 +24,6 @@ public class SuperCoreSkill extends CoreSkill implements SuperSkill {
 
 
     @Override
     @Override
     public int getCooldown(@NotNull OnlineMMOPlayer onlineMMOPlayer) {
     public int getCooldown(@NotNull OnlineMMOPlayer onlineMMOPlayer) {
-        //TODO: Move implementation
+        return PerksUtils.handleCooldownPerks((Player) onlineMMOPlayer.getServerAPIPlayerImpl(), defaultCooldown);
     }
     }
 }
 }

+ 91 - 91
src/main/java/com/gmail/nossr50/events/party/McMMOPartyAllianceChangeEvent.java

@@ -1,91 +1,91 @@
-package com.gmail.nossr50.events.party;
-
-import org.bukkit.entity.Player;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.jetbrains.annotations.NotNull;
-
-public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancellable {
-    private final String oldAlly;
-    private final String newAlly;
-    private final EventReason reason;
-    private boolean cancelled;
-
-    public McMMOPartyAllianceChangeEvent(Player player, String oldAlly, String newAlly, EventReason reason) {
-        super(player);
-
-        if (newAlly != null) {
-            newAlly = newAlly.replace(":", ".");
-        }
-
-        this.oldAlly = oldAlly;
-        this.newAlly = newAlly;
-        this.reason = reason;
-        this.cancelled = false;
-    }
-
-    /**
-     * @return The party being left, or null if the player was not in a party
-     */
-    public String getOldAlly() {
-        return oldAlly;
-    }
-
-    /**
-     * @return The party being joined, or null if the player is not joining a new party
-     */
-    public String getNewAlly() {
-        return newAlly;
-    }
-
-    /**
-     * @return The reason for the event being fired
-     */
-    public EventReason getReason() {
-        return reason;
-    }
-
-    /**
-     * A list of reasons why the event may have been fired
-     */
-    public enum EventReason {
-        /**
-         * Formed an alliance for the first time.
-         */
-        FORMED_ALLIANCE,
-
-        /**
-         * Left a party and did not join a new one.
-         */
-        DISBAND_ALLIANCE,
-
-        /**
-         * Any reason that doesn't fit elsewhere.
-         */
-        CUSTOM
-    }
-
-    /** Following are required for Cancellable **/
-    @Override
-    public boolean isCancelled() {
-        return cancelled;
-    }
-
-    @Override
-    public void setCancelled(boolean cancelled) {
-        this.cancelled = cancelled;
-    }
-
-    /** Rest of file is required boilerplate for custom events **/
-    private static final HandlerList handlers = new HandlerList();
-
-    @Override
-    public @NotNull HandlerList getHandlers() {
-        return handlers;
-    }
-
-    public static HandlerList getHandlerList() {
-        return handlers;
-    }
-}
+//package com.gmail.nossr50.events.party;
+//
+//import org.bukkit.entity.Player;
+//import org.bukkit.event.Cancellable;
+//import org.bukkit.event.HandlerList;
+//import org.bukkit.event.player.PlayerEvent;
+//import org.jetbrains.annotations.NotNull;
+//
+//public class McMMOPartyAllianceChangeEvent extends PlayerEvent implements Cancellable {
+//    private final String oldAlly;
+//    private final String newAlly;
+//    private final EventReason reason;
+//    private boolean cancelled;
+//
+//    public McMMOPartyAllianceChangeEvent(Player player, String oldAlly, String newAlly, EventReason reason) {
+//        super(player);
+//
+//        if (newAlly != null) {
+//            newAlly = newAlly.replace(":", ".");
+//        }
+//
+//        this.oldAlly = oldAlly;
+//        this.newAlly = newAlly;
+//        this.reason = reason;
+//        this.cancelled = false;
+//    }
+//
+//    /**
+//     * @return The party being left, or null if the player was not in a party
+//     */
+//    public String getOldAlly() {
+//        return oldAlly;
+//    }
+//
+//    /**
+//     * @return The party being joined, or null if the player is not joining a new party
+//     */
+//    public String getNewAlly() {
+//        return newAlly;
+//    }
+//
+//    /**
+//     * @return The reason for the event being fired
+//     */
+//    public EventReason getReason() {
+//        return reason;
+//    }
+//
+//    /**
+//     * A list of reasons why the event may have been fired
+//     */
+//    public enum EventReason {
+//        /**
+//         * Formed an alliance for the first time.
+//         */
+//        FORMED_ALLIANCE,
+//
+//        /**
+//         * Left a party and did not join a new one.
+//         */
+//        DISBAND_ALLIANCE,
+//
+//        /**
+//         * Any reason that doesn't fit elsewhere.
+//         */
+//        CUSTOM
+//    }
+//
+//    /** Following are required for Cancellable **/
+//    @Override
+//    public boolean isCancelled() {
+//        return cancelled;
+//    }
+//
+//    @Override
+//    public void setCancelled(boolean cancelled) {
+//        this.cancelled = cancelled;
+//    }
+//
+//    /** Rest of file is required boilerplate for custom events **/
+//    private static final HandlerList handlers = new HandlerList();
+//
+//    @Override
+//    public @NotNull HandlerList getHandlers() {
+//        return handlers;
+//    }
+//
+//    public static HandlerList getHandlerList() {
+//        return handlers;
+//    }
+//}

+ 75 - 104
src/main/java/com/gmail/nossr50/events/party/McMMOPartyChangeEvent.java

@@ -1,104 +1,75 @@
-package com.gmail.nossr50.events.party;
-
-import org.bukkit.entity.Player;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Called when a player attempts to join, leave, or change parties.
- */
-public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable {
-    private final String oldParty;
-    private final String newParty;
-    private final EventReason reason;
-    private boolean cancelled;
-
-    public McMMOPartyChangeEvent(Player player, String oldParty, String newParty, EventReason reason) {
-        super(player);
-
-        if (newParty != null) {
-            newParty = newParty.replace(":", ".");
-        }
-
-        this.oldParty = oldParty;
-        this.newParty = newParty;
-        this.reason = reason;
-        this.cancelled = false;
-    }
-
-    /**
-     * @return The party being left, or null if the player was not in a party
-     */
-    public String getOldParty() {
-        return oldParty;
-    }
-
-    /**
-     * @return The party being joined, or null if the player is not joining a new party
-     */
-    public String getNewParty() {
-        return newParty;
-    }
-
-    /**
-     * @return The reason for the event being fired
-     */
-    public EventReason getReason() {
-        return reason;
-    }
-
-    /**
-     * A list of reasons why the event may have been fired
-     */
-    public enum EventReason {
-        /**
-         * Joined a party for the first time.
-         */
-        JOINED_PARTY,
-
-        /**
-         * Left a party and did not join a new one.
-         */
-        LEFT_PARTY,
-
-        /**
-         * Was kicked from a party.
-         */
-        KICKED_FROM_PARTY,
-
-        /**
-         * Left one party to join another.
-         */
-        CHANGED_PARTIES,
-
-        /**
-         * Any reason that doesn't fit elsewhere.
-         */
-        CUSTOM
-    }
-
-    /** Following are required for Cancellable **/
-    @Override
-    public boolean isCancelled() {
-        return cancelled;
-    }
-
-    @Override
-    public void setCancelled(boolean cancelled) {
-        this.cancelled = cancelled;
-    }
-
-    /** Rest of file is required boilerplate for custom events **/
-    private static final HandlerList handlers = new HandlerList();
-
-    @Override
-    public @NotNull HandlerList getHandlers() {
-        return handlers;
-    }
-
-    public static HandlerList getHandlerList() {
-        return handlers;
-    }
-}
+//package com.gmail.nossr50.events.party;
+//
+//import com.neetgames.mcmmo.party.PartyEventReason;
+//import org.bukkit.entity.Player;
+//import org.bukkit.event.Cancellable;
+//import org.bukkit.event.HandlerList;
+//import org.bukkit.event.player.PlayerEvent;
+//import org.jetbrains.annotations.NotNull;
+//
+///**
+// * Called when a player attempts to join, leave, or change parties.
+// */
+//public class McMMOPartyChangeEvent extends PlayerEvent implements Cancellable {
+//    private final String oldParty;
+//    private final String newParty;
+//    private final PartyEventReason reason;
+//    private boolean cancelled;
+//
+//    public McMMOPartyChangeEvent(@NotNull Player player, @NotNull String oldParty, @NotNull String newParty, PartyEventReason reason) {
+//        super(player);
+//
+//        if (newParty != null) {
+//            newParty = newParty.replace(":", ".");
+//        }
+//
+//        this.oldParty = oldParty;
+//        this.newParty = newParty;
+//        this.reason = reason;
+//        this.cancelled = false;
+//    }
+//
+//    /**
+//     * @return The party being left, or null if the player was not in a party
+//     */
+//    public String getOldParty() {
+//        return oldParty;
+//    }
+//
+//    /**
+//     * @return The party being joined, or null if the player is not joining a new party
+//     */
+//    public String getNewParty() {
+//        return newParty;
+//    }
+//
+//    /**
+//     * @return The reason for the event being fired
+//     */
+//    public PartyEventReason getReason() {
+//        return reason;
+//    }
+//
+//    /** Following are required for Cancellable **/
+//    @Override
+//    public boolean isCancelled() {
+//        return cancelled;
+//    }
+//
+//    @Override
+//    public void setCancelled(boolean cancelled) {
+//        this.cancelled = cancelled;
+//    }
+//
+//    /** Rest of file is required boilerplate for custom events **/
+//    private static final HandlerList handlers = new HandlerList();
+//
+//    @Override
+//    public @NotNull HandlerList getHandlers() {
+//        return handlers;
+//    }
+//
+//    public static HandlerList getHandlerList() {
+//        return handlers;
+//    }
+//}

+ 54 - 54
src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java

@@ -1,54 +1,54 @@
-package com.gmail.nossr50.events.party;
-
-import com.neetgames.mcmmo.party.Party;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.jetbrains.annotations.NotNull;
-
-public class McMMOPartyLevelUpEvent extends Event implements Cancellable {
-    private final Party party;
-    private int levelsChanged;
-    private boolean cancelled;
-
-    public McMMOPartyLevelUpEvent(Party party, int levelsChanged) {
-        this.party = party;
-        this.levelsChanged = levelsChanged;
-        this.cancelled = false;
-    }
-
-    public Party getParty() {
-        return party;
-    }
-
-    public int getLevelsChanged() {
-        return levelsChanged;
-    }
-
-    public void setLevelsChanged(int levelsChanged) {
-        this.levelsChanged = levelsChanged;
-    }
-
-    /** Following are required for Cancellable **/
-    @Override
-    public boolean isCancelled() {
-        return cancelled;
-    }
-
-    @Override
-    public void setCancelled(boolean cancelled) {
-        this.cancelled = cancelled;
-    }
-
-    /** Rest of file is required boilerplate for custom events **/
-    private static final HandlerList handlers = new HandlerList();
-
-    @Override
-    public @NotNull HandlerList getHandlers() {
-        return handlers;
-    }
-
-    public static HandlerList getHandlerList() {
-        return handlers;
-    }
-}
+//package com.gmail.nossr50.events.party;
+//
+//import com.neetgames.mcmmo.party.Party;
+//import org.bukkit.event.Cancellable;
+//import org.bukkit.event.Event;
+//import org.bukkit.event.HandlerList;
+//import org.jetbrains.annotations.NotNull;
+//
+//public class McMMOPartyLevelUpEvent extends Event implements Cancellable {
+//    private final Party party;
+//    private int levelsChanged;
+//    private boolean cancelled;
+//
+//    public McMMOPartyLevelUpEvent(Party party, int levelsChanged) {
+//        this.party = party;
+//        this.levelsChanged = levelsChanged;
+//        this.cancelled = false;
+//    }
+//
+//    public Party getParty() {
+//        return party;
+//    }
+//
+//    public int getLevelsChanged() {
+//        return levelsChanged;
+//    }
+//
+//    public void setLevelsChanged(int levelsChanged) {
+//        this.levelsChanged = levelsChanged;
+//    }
+//
+//    /** Following are required for Cancellable **/
+//    @Override
+//    public boolean isCancelled() {
+//        return cancelled;
+//    }
+//
+//    @Override
+//    public void setCancelled(boolean cancelled) {
+//        this.cancelled = cancelled;
+//    }
+//
+//    /** Rest of file is required boilerplate for custom events **/
+//    private static final HandlerList handlers = new HandlerList();
+//
+//    @Override
+//    public @NotNull HandlerList getHandlers() {
+//        return handlers;
+//    }
+//
+//    public static HandlerList getHandlerList() {
+//        return handlers;
+//    }
+//}

+ 46 - 46
src/main/java/com/gmail/nossr50/events/party/McMMOPartyTeleportEvent.java

@@ -1,46 +1,46 @@
-package com.gmail.nossr50.events.party;
-
-import org.bukkit.entity.Player;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerTeleportEvent;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Called just before a player teleports using the /ptp command.
- */
-public class McMMOPartyTeleportEvent extends PlayerTeleportEvent {
-    private final String party;
-    private final Player target;
-
-    public McMMOPartyTeleportEvent(Player player, Player target, String party) {
-        super(player, player.getLocation(), target.getLocation(), TeleportCause.COMMAND);
-        this.party = party;
-        this.target = target;
-    }
-
-    /**
-     * @return The party the teleporting player is in
-     */
-    public String getParty() {
-        return party;
-    }
-
-    /**
-     * @return The player being teleported to
-     */
-    public Player getTarget() {
-        return target;
-    }
-
-    /** Rest of file is required boilerplate for custom events **/
-    private static final HandlerList handlers = new HandlerList();
-
-    @Override
-    public @NotNull HandlerList getHandlers() {
-        return handlers;
-    }
-
-    public static @NotNull HandlerList getHandlerList() {
-        return handlers;
-    }
-}
+//package com.gmail.nossr50.events.party;
+//
+//import org.bukkit.entity.Player;
+//import org.bukkit.event.HandlerList;
+//import org.bukkit.event.player.PlayerTeleportEvent;
+//import org.jetbrains.annotations.NotNull;
+//
+///**
+// * Called just before a player teleports using the /ptp command.
+// */
+//public class McMMOPartyTeleportEvent extends PlayerTeleportEvent {
+//    private final String party;
+//    private final Player target;
+//
+//    public McMMOPartyTeleportEvent(Player player, Player target, String party) {
+//        super(player, player.getLocation(), target.getLocation(), TeleportCause.COMMAND);
+//        this.party = party;
+//        this.target = target;
+//    }
+//
+//    /**
+//     * @return The party the teleporting player is in
+//     */
+//    public String getParty() {
+//        return party;
+//    }
+//
+//    /**
+//     * @return The player being teleported to
+//     */
+//    public Player getTarget() {
+//        return target;
+//    }
+//
+//    /** Rest of file is required boilerplate for custom events **/
+//    private static final HandlerList handlers = new HandlerList();
+//
+//    @Override
+//    public @NotNull HandlerList getHandlers() {
+//        return handlers;
+//    }
+//
+//    public static @NotNull HandlerList getHandlerList() {
+//        return handlers;
+//    }
+//}

+ 76 - 76
src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java

@@ -1,76 +1,76 @@
-package com.gmail.nossr50.events.party;
-
-import com.neetgames.mcmmo.party.Party;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
-import org.bukkit.event.HandlerList;
-import org.jetbrains.annotations.NotNull;
-
-public class McMMOPartyXpGainEvent extends Event implements Cancellable {
-    private final Party party;
-    private float xpGained;
-    private boolean cancelled;
-
-    public McMMOPartyXpGainEvent(Party party, float xpGained) {
-        this.party = party;
-        this.xpGained = xpGained;
-        this.cancelled = false;
-    }
-
-    public Party getParty() {
-        return party;
-    }
-
-    /**
-     * @return The amount of experience gained in this event
-     */
-    public float getRawXpGained() {
-        return xpGained;
-    }
-
-    /**
-     * @return int amount of experience gained in this event
-     */
-    @Deprecated
-    public int getXpGained() {
-        return (int) xpGained;
-    }
-
-    /**
-     * @param xpGained set amount of experience gained in this event
-     */
-    public void setRawXpGained(float xpGained) {
-        this.xpGained = xpGained;
-    }
-
-    /**
-     * @param xpGained set int amount of experience gained in this event
-     */
-    @Deprecated
-    public void setXpGained(int xpGained) {
-        this.xpGained = xpGained;
-    }
-
-    /** Following are required for Cancellable **/
-    @Override
-    public boolean isCancelled() {
-        return cancelled;
-    }
-
-    @Override
-    public void setCancelled(boolean cancelled) {
-        this.cancelled = cancelled;
-    }
-
-    /** Rest of file is required boilerplate for custom events **/
-    private static final HandlerList handlers = new HandlerList();
-
-    @Override
-    public @NotNull HandlerList getHandlers() {
-        return handlers;
-    }
-
-    public static HandlerList getHandlerList() {
-        return handlers;
-    }
-}
+//package com.gmail.nossr50.events.party;
+//
+//import com.neetgames.mcmmo.party.Party;
+//import org.bukkit.event.Cancellable;
+//import org.bukkit.event.Event;
+//import org.bukkit.event.HandlerList;
+//import org.jetbrains.annotations.NotNull;
+//
+//public class McMMOPartyXpGainEvent extends Event implements Cancellable {
+//    private final Party party;
+//    private float xpGained;
+//    private boolean cancelled;
+//
+//    public McMMOPartyXpGainEvent(Party party, float xpGained) {
+//        this.party = party;
+//        this.xpGained = xpGained;
+//        this.cancelled = false;
+//    }
+//
+//    public Party getParty() {
+//        return party;
+//    }
+//
+//    /**
+//     * @return The amount of experience gained in this event
+//     */
+//    public float getRawXpGained() {
+//        return xpGained;
+//    }
+//
+//    /**
+//     * @return int amount of experience gained in this event
+//     */
+//    @Deprecated
+//    public int getXpGained() {
+//        return (int) xpGained;
+//    }
+//
+//    /**
+//     * @param xpGained set amount of experience gained in this event
+//     */
+//    public void setRawXpGained(float xpGained) {
+//        this.xpGained = xpGained;
+//    }
+//
+//    /**
+//     * @param xpGained set int amount of experience gained in this event
+//     */
+//    @Deprecated
+//    public void setXpGained(int xpGained) {
+//        this.xpGained = xpGained;
+//    }
+//
+//    /** Following are required for Cancellable **/
+//    @Override
+//    public boolean isCancelled() {
+//        return cancelled;
+//    }
+//
+//    @Override
+//    public void setCancelled(boolean cancelled) {
+//        this.cancelled = cancelled;
+//    }
+//
+//    /** Rest of file is required boilerplate for custom events **/
+//    private static final HandlerList handlers = new HandlerList();
+//
+//    @Override
+//    public @NotNull HandlerList getHandlers() {
+//        return handlers;
+//    }
+//
+//    public static HandlerList getHandlerList() {
+//        return handlers;
+//    }
+//}

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

@@ -15,7 +15,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SkillRegisterImpl;
 import com.gmail.nossr50.datatypes.skills.SkillRegisterImpl;
 import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll;
 import com.gmail.nossr50.datatypes.skills.subskills.acrobatics.Roll;
 import com.gmail.nossr50.listeners.*;
 import com.gmail.nossr50.listeners.*;
-import com.gmail.nossr50.party.PartyManager;
+import com.gmail.nossr50.party.PartyManagerImpl;
 import com.gmail.nossr50.runnables.CheckDateTask;
 import com.gmail.nossr50.runnables.CheckDateTask;
 import com.gmail.nossr50.runnables.SaveTimerTask;
 import com.gmail.nossr50.runnables.SaveTimerTask;
 import com.gmail.nossr50.runnables.backups.CleanBackupsTask;
 import com.gmail.nossr50.runnables.backups.CleanBackupsTask;
@@ -51,6 +51,7 @@ import com.gmail.nossr50.util.upgrade.UpgradeManager;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.gmail.nossr50.worldguard.WorldGuardManager;
 import com.google.common.base.Charsets;
 import com.google.common.base.Charsets;
 import com.neetgames.mcmmo.api.SkillRegister;
 import com.neetgames.mcmmo.api.SkillRegister;
+import com.neetgames.mcmmo.party.PartyManager;
 import net.kyori.adventure.platform.bukkit.BukkitAudiences;
 import net.kyori.adventure.platform.bukkit.BukkitAudiences;
 import net.shatteredlands.shatt.backup.ZipLibrary;
 import net.shatteredlands.shatt.backup.ZipLibrary;
 import org.bstats.bukkit.Metrics;
 import org.bstats.bukkit.Metrics;

+ 38 - 0
src/main/java/com/gmail/nossr50/party/ItemShareType.java

@@ -0,0 +1,38 @@
+//package com.gmail.nossr50.party;
+//
+//import com.gmail.nossr50.locale.LocaleLoader;
+//import com.gmail.nossr50.util.ItemUtils;
+//import com.gmail.nossr50.util.text.StringUtils;
+//import org.bukkit.inventory.ItemStack;
+//
+//public enum ItemShareType {
+//    LOOT,
+//    MINING,
+//    HERBALISM,
+//    WOODCUTTING,
+//    MISC;
+//
+//    public static ItemShareType getShareType(ItemStack itemStack) {
+//        if (ItemUtils.isMobDrop(itemStack)) {
+//            return LOOT;
+//        }
+//        else if (ItemUtils.isMiningDrop(itemStack)) {
+//            return MINING;
+//        }
+//        else if (ItemUtils.isHerbalismDrop(itemStack)) {
+//            return HERBALISM;
+//        }
+//        else if (ItemUtils.isWoodcuttingDrop(itemStack)) {
+//            return WOODCUTTING;
+//        }
+//        else if (ItemUtils.isMiscDrop(itemStack)) {
+//            return MISC;
+//        }
+//
+//        return null;
+//    }
+//
+//    public String getLocaleString() {
+//        return LocaleLoader.getString("Party.ItemShare.Category." + StringUtils.getCapitalized(this.toString()));
+//    }
+//}

+ 12 - 12
src/main/java/com/gmail/nossr50/datatypes/party/PartyExperienceManager.java → src/main/java/com/gmail/nossr50/party/PartyExperienceManagerImpl.java

@@ -1,4 +1,4 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.config.experience.ExperienceConfig;
@@ -8,29 +8,33 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.EventUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.sounds.SoundType;
+import com.neetgames.mcmmo.party.Party;
+import com.neetgames.mcmmo.party.PartyExperience;
+import com.neetgames.mcmmo.party.PartyExperienceShareMode;
+import com.neetgames.mcmmo.party.PartyMemberManager;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
 
 
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
 
 
-public class PartyExperienceManager {
+public class PartyExperienceManagerImpl implements PartyExperience {
 
 
     private int partyLevel;
     private int partyLevel;
     private float partyExperience;
     private float partyExperience;
     private final @NotNull Party partyRef;
     private final @NotNull Party partyRef;
     private final @NotNull PartyMemberManager partyMemberManagerRef;
     private final @NotNull PartyMemberManager partyMemberManagerRef;
-    private @NotNull ShareMode xpShareMode = ShareMode.NONE;
+    private @NotNull PartyExperienceShareMode xpShareMode = PartyExperienceShareMode.NONE;
 
 
-    public PartyExperienceManager(@NotNull PartyMemberManager partyMemberManager, @NotNull Party party) {
+    public PartyExperienceManagerImpl(@NotNull PartyMemberManager partyMemberManagerRef, @NotNull Party party) {
         this.partyRef = party;
         this.partyRef = party;
-        this.partyMemberManagerRef = partyMemberManager;
+        this.partyMemberManagerRef = partyMemberManagerRef;
     }
     }
 
 
-    public void setXpShareMode(@NotNull ShareMode xpShareMode) {
-        this.xpShareMode = xpShareMode;
+    public void setXpShareMode(@NotNull PartyExperienceShareMode partyExperienceShareMode) {
+        this.xpShareMode = partyExperienceShareMode;
     }
     }
 
 
-    public @NotNull ShareMode getXpShareMode() {
+    public @NotNull PartyExperienceShareMode getXpShareMode() {
         return xpShareMode;
         return xpShareMode;
     }
     }
 
 
@@ -124,8 +128,4 @@ public class PartyExperienceManager {
         DecimalFormat percent = new DecimalFormat("##0.00%");
         DecimalFormat percent = new DecimalFormat("##0.00%");
         return percent.format(this.getXp() / getXpToLevel());
         return percent.format(this.getXp() / getXpToLevel());
     }
     }
-
-    public @NotNull Party getParty() {
-        return partyRef;
-    }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java → src/main/java/com/gmail/nossr50/party/PartyFeature.java

@@ -1,4 +1,4 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.commands.party.PartySubCommandType;
 import com.gmail.nossr50.commands.party.PartySubCommandType;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;

+ 20 - 12
src/main/java/com/gmail/nossr50/datatypes/party/PartyImpl.java → src/main/java/com/gmail/nossr50/party/PartyImpl.java

@@ -1,7 +1,10 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.chat.SamePartyPredicate;
 import com.gmail.nossr50.chat.SamePartyPredicate;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
+import com.neetgames.mcmmo.party.PartyExperience;
+import com.neetgames.mcmmo.party.PartyMember;
+import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
@@ -15,34 +18,39 @@ import java.util.function.Predicate;
 public class PartyImpl implements Party {
 public class PartyImpl implements Party {
     private final @NotNull Predicate<CommandSender> samePartyPredicate;
     private final @NotNull Predicate<CommandSender> samePartyPredicate;
     private final @NotNull PersistentPartyData persistentPartyData;
     private final @NotNull PersistentPartyData persistentPartyData;
-    private final @NotNull PartyMemberManager partyMemberManager;
-    private final @NotNull PartyExperienceManager partyExperienceManager;
+    private final @NotNull PartyMemberManagerImpl partyMemberManagerImpl;
+    private final @NotNull PartyExperience partyExperienceManager;
 
 
     public PartyImpl(@NotNull PersistentPartyData persistentPartyData) {
     public PartyImpl(@NotNull PersistentPartyData persistentPartyData) {
         this.persistentPartyData = persistentPartyData;
         this.persistentPartyData = persistentPartyData;
 
 
         //Initialize Managers
         //Initialize Managers
-        partyMemberManager = new PartyMemberManager(persistentPartyData);
-        partyExperienceManager = new PartyExperienceManager(partyMemberManager, this);
+        partyMemberManagerImpl = new PartyMemberManagerImpl(persistentPartyData);
+        partyExperienceManager = new PartyExperienceManagerImpl(partyMemberManagerImpl, this);
         samePartyPredicate = new SamePartyPredicate<>(this);
         samePartyPredicate = new SamePartyPredicate<>(this);
     }
     }
 
 
-    public @NotNull PartyMemberManager getPartyMemberManager() {
-        return partyMemberManager;
+    public @NotNull PartyMemberManagerImpl getPartyMemberManager() {
+        return partyMemberManagerImpl;
     }
     }
 
 
-    public @NotNull PartyExperienceManager getPartyExperienceManager() {
+    public @NotNull PartyExperience getPartyExperienceManager() {
         return partyExperienceManager;
         return partyExperienceManager;
     }
     }
 
 
     public @NotNull Set<PartyMember> getPartyMembers() {
     public @NotNull Set<PartyMember> getPartyMembers() {
-        return partyMemberManager.getPartyMembers();
+        return partyMemberManagerImpl.getPartyMembers();
     }
     }
 
 
     public @NotNull String getPartyName() {
     public @NotNull String getPartyName() {
         return persistentPartyData.getPartyName();
         return persistentPartyData.getPartyName();
     }
     }
 
 
+    @Override
+    public @Nullable PartyMember getPartyMember(@NotNull OnlineMMOPlayer onlineMMOPlayer) {
+        return getPartyMemberManager().getPartyMember(onlineMMOPlayer.getUUID());
+    }
+
     private void buildChatMessage(@NotNull StringBuilder stringBuilder, String @NotNull [] names) {
     private void buildChatMessage(@NotNull StringBuilder stringBuilder, String @NotNull [] names) {
         for(int i = 0; i < names.length; i++) {
         for(int i = 0; i < names.length; i++) {
             if(i + 1 >= names.length) {
             if(i + 1 >= names.length) {
@@ -63,13 +71,13 @@ public class PartyImpl implements Party {
         PartyImpl party = (PartyImpl) o;
         PartyImpl party = (PartyImpl) o;
         return samePartyPredicate.equals(party.samePartyPredicate)
         return samePartyPredicate.equals(party.samePartyPredicate)
                 && persistentPartyData.equals(party.persistentPartyData)
                 && persistentPartyData.equals(party.persistentPartyData)
-                && partyMemberManager.equals(party.partyMemberManager)
+                && partyMemberManagerImpl.equals(party.partyMemberManagerImpl)
                 && partyExperienceManager.equals(party.partyExperienceManager);
                 && partyExperienceManager.equals(party.partyExperienceManager);
     }
     }
 
 
     @Override
     @Override
     public int hashCode() {
     public int hashCode() {
-        return Objects.hash(samePartyPredicate, persistentPartyData, partyMemberManager, partyExperienceManager);
+        return Objects.hash(samePartyPredicate, persistentPartyData, partyMemberManagerImpl, partyExperienceManager);
     }
     }
 
 
     public @Nullable PartyMember getPartyMember(@NotNull Player player) {
     public @Nullable PartyMember getPartyMember(@NotNull Player player) {
@@ -77,7 +85,7 @@ public class PartyImpl implements Party {
     }
     }
 
 
     public @Nullable PartyMember getPartyMember(@NotNull UUID playerUUID) {
     public @Nullable PartyMember getPartyMember(@NotNull UUID playerUUID) {
-        return partyMemberManager.getPartyMember(playerUUID);
+        return partyMemberManagerImpl.getPartyMember(playerUUID);
     }
     }
 
 
     public @NotNull Predicate<CommandSender> getSamePartyPredicate() {
     public @NotNull Predicate<CommandSender> getSamePartyPredicate() {

+ 2 - 1
src/main/java/com/gmail/nossr50/datatypes/party/PartyInvite.java → src/main/java/com/gmail/nossr50/party/PartyInvite.java

@@ -1,5 +1,6 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
+import com.neetgames.mcmmo.party.Party;
 import org.bukkit.Bukkit;
 import org.bukkit.Bukkit;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;

+ 4 - 0
src/main/java/com/gmail/nossr50/party/PartyInviteManagerImpl.java

@@ -0,0 +1,4 @@
+package com.gmail.nossr50.party;
+
+public class PartyInviteManagerImpl {
+}

+ 85 - 0
src/main/java/com/gmail/nossr50/party/PartyItemShareManager.java

@@ -0,0 +1,85 @@
+//package com.gmail.nossr50.party;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+//public class PartyItemShareManager {
+//
+//    private ShareMode itemShareMode = ShareMode.NONE;
+//
+//    private boolean shareLootDrops        = true;
+//    private boolean shareMiningDrops      = true;
+//    private boolean shareHerbalismDrops   = true;
+//    private boolean shareWoodcuttingDrops = true;
+//    private boolean shareMiscDrops        = true;
+//
+//    public void setItemShareMode(ShareMode itemShareMode) {
+//        this.itemShareMode = itemShareMode;
+//    }
+//
+//    public ShareMode getItemShareMode() {
+//        return itemShareMode;
+//    }
+//
+//    public boolean sharingDrops(ItemShareType shareType) {
+//        switch (shareType) {
+//            case HERBALISM:
+//                return shareHerbalismDrops;
+//
+//            case LOOT:
+//                return shareLootDrops;
+//
+//            case MINING:
+//                return shareMiningDrops;
+//
+//            case MISC:
+//                return shareMiscDrops;
+//
+//            case WOODCUTTING:
+//                return shareWoodcuttingDrops;
+//
+//            default:
+//                return false;
+//        }
+//    }
+//
+//    public void setSharingDrops(ItemShareType shareType, boolean enabled) {
+//        switch (shareType) {
+//            case HERBALISM:
+//                shareHerbalismDrops = enabled;
+//                break;
+//
+//            case LOOT:
+//                shareLootDrops = enabled;
+//                break;
+//
+//            case MINING:
+//                shareMiningDrops = enabled;
+//                break;
+//
+//            case MISC:
+//                shareMiscDrops = enabled;
+//                break;
+//
+//            case WOODCUTTING:
+//                shareWoodcuttingDrops = enabled;
+//                break;
+//
+//            default:
+//        }
+//    }
+//
+//    public List<String> getItemShareCategories() {
+//        List<String> shareCategories = new ArrayList<>();
+//
+//        for (ItemShareType shareType : ItemShareType.values()) {
+//            if (sharingDrops(shareType)) {
+//                shareCategories.add(shareType.getLocaleString());
+//            }
+//        }
+//
+//        return shareCategories;
+//    }
+//
+//
+//}

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

@@ -1,864 +0,0 @@
-package com.gmail.nossr50.party;
-
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.datatypes.chat.ChatChannel;
-import com.gmail.nossr50.datatypes.database.UpgradeType;
-import com.gmail.nossr50.datatypes.interactions.NotificationType;
-import com.gmail.nossr50.datatypes.party.ItemShareType;
-import com.neetgames.mcmmo.party.Party;
-import com.gmail.nossr50.datatypes.party.PartyMember;
-import com.gmail.nossr50.datatypes.party.ShareMode;
-import com.neetgames.mcmmo.party.Party;
-import com.neetgames.mcmmo.player.OnlineMMOPlayer;
-import com.gmail.nossr50.datatypes.player.PlayerProfile;
-import com.gmail.nossr50.events.party.McMMOPartyAllianceChangeEvent;
-import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
-import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
-import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.Misc;
-import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.player.NotificationManager;
-import com.gmail.nossr50.util.sounds.SoundManager;
-import com.gmail.nossr50.util.sounds.SoundType;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.util.*;
-import java.util.Map.Entry;
-
-/**
- * About mcMMO parties
- * Parties are identified by a {@link String} name
- * Parties always have a party leader, if the party leader is not defined mcMMO will force party leadership onto someone in the party
- */
-//TODO: Needs to be optimized, currently all parties are loaded into memory, it should be changed to as needed, but then we need to handle loading asynchronously and accommodate for that
-public final class PartyManager {
-    private final @NotNull HashMap<String, Party> parties;
-    private final @NotNull File partyFile;
-
-    public PartyManager() {
-        String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml";
-        partyFile = new File(partiesFilePath);
-        parties = new HashMap<>();
-    }
-
-    /**
-     * Attempts to find a party for a player by UUID
-     *
-     * @param playerUUID target uuid
-     * @return the party if it exists otherwise null
-     */
-    public @Nullable Party queryParty(@NotNull UUID playerUUID) {
-        for(Party party : parties.values()) {
-            if(party.getPartyMemberManager().hasMember(playerUUID)) {
-                return party;
-            }
-        }
-
-        return null; //No party
-    }
-
-    /**
-     * Attempts to find a party by party name
-     * Party names are not case sensitive
-     *
-     * @param partyName party name
-     * @return the party if it exists otherwise null
-     */
-    public @Nullable Party queryParty(@NotNull String partyName) {
-        return parties.get(partyName.toLowerCase());
-    }
-
-    /**
-     * Get the level of a party
-     *
-     * @param party target party
-     * @return the level value of the target party
-     */
-    public int getPartyLevel(@NotNull Party party) {
-        return party.getPartyExperienceManager().getLevel();
-    }
-
-    /**
-     * Check if a party with a given name already exists.
-     *
-     * @param partyName The name of the party to check
-     * @return true if a party with that name exists, false otherwise
-     */
-    public boolean isParty(@NotNull String partyName) {
-        return getParty(partyName) != null;
-    }
-
-    /**
-     * Checks if the player can join a party, parties can have a size limit, although there is a permission to bypass this
-     *
-     * @param player player who is attempting to join the party
-     * @param targetParty the target party
-     * @return true if party is full and cannot be joined
-     */
-    public boolean isPartyFull(@NotNull Player player, @NotNull Party targetParty)
-    {
-        return !Permissions.partySizeBypass(player)
-                && targetParty.getPartyMembers().size() >= Config.getInstance().getPartyMaxSize();
-    }
-
-    /**
-     * Attempt to change parties or join a new party.
-     *
-     * @param mmoPlayer The player changing or joining parties
-     * @param newPartyName The name of the party being joined
-     * @return true if the party was joined successfully, false otherwise
-     */
-    public boolean changeOrJoinParty(@NotNull OnlineMMOPlayer mmoPlayer, @NotNull String newPartyName) {
-        Player player = Misc.adaptPlayer(mmoPlayer);
-
-        if (inParty(mmoPlayer)) {
-            Party oldParty = mmoPlayer.getParty();
-
-            if (!handlePartyChangeEvent(player, oldParty.getPartyName(), newPartyName, EventReason.CHANGED_PARTIES)) {
-                return false;
-            }
-
-            removeFromParty(mmoPlayer);
-        }
-        else return handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY);
-
-        return true;
-    }
-
-    /**
-     * Check if two online players are in the same party.
-     *
-     * @param firstPlayer The first player
-     * @param secondPlayer The second player
-     * @return true if they are in the same party, false otherwise
-     */
-    public boolean inSameParty(Player firstPlayer, Player secondPlayer) {
-        //Profile not loaded
-        if(mcMMO.getUserManager().queryPlayer(firstPlayer) == null)
-        {
-            return false;
-        }
-
-        //Profile not loaded
-        if(mcMMO.getUserManager().queryPlayer(secondPlayer) == null)
-        {
-            return false;
-        }
-
-        Party firstParty = mcMMO.getUserManager().queryPlayer(firstPlayer).getParty();
-        Party secondParty = mcMMO.getUserManager().queryPlayer(secondPlayer).getParty();
-
-        if (firstParty == null || secondParty == null) {
-            return false;
-        }
-
-        return firstParty.equals(secondParty);
-    }
-
-    /**
-     * Get the near party members.
-     *
-     * @param mmoPlayer The player to check
-     * @return the near party members
-     */
-    public List<Player> getNearMembers(OnlineMMOPlayer mmoPlayer) {
-        List<Player> nearMembers = new ArrayList<>();
-        Party party = mmoPlayer.getParty();
-
-        if (party != null) {
-            Player player = Misc.adaptPlayer(mmoPlayer);
-            double range = Config.getInstance().getPartyShareRange();
-
-            for (PartyMember member : party.getPartyMembers()) {
-                if (!player.equals(member) && member.isValid() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
-                    nearMembers.add(member);
-                }
-            }
-        }
-
-        return nearMembers;
-    }
-
-    public List<Player> getNearVisibleMembers(@NotNull OnlineMMOPlayer mmoPlayer) {
-        List<Player> nearMembers = new ArrayList<>();
-        Party party = mmoPlayer.getParty();
-
-        if (party != null) {
-            Player player = Misc.adaptPlayer(mmoPlayer);
-            double range = Config.getInstance().getPartyShareRange();
-
-            for (Player member : party.getVisibleMembers(player)) {
-                if (!player.equals(member)
-                        && member.isValid()
-                        && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
-                    nearMembers.add(member);
-                }
-            }
-        }
-
-        return nearMembers;
-    }
-
-
-    /**
-     * Get a list of all players in this player's party.
-     *
-     * @param player The player to check
-     * @return all the players in the player's party
-     */
-    public LinkedHashMap<UUID, String> getAllMembers(Player player) {
-        Party party = getParty(player);
-
-        return party == null ? new LinkedHashMap<>() : party.getMembers();
-    }
-
-    /**
-     * Get a list of all online players in this party.
-     *
-     * @param partyName The party to check
-     * @return all online players in this party
-     */
-    public List<Player> getOnlineMembers(String partyName) {
-        return getOnlineMembers(getParty(partyName));
-    }
-
-    /**
-     * Get a list of all online players in this party.
-     *
-     * @param player The player to check
-     * @return all online players in this party
-     */
-    public List<Player> getOnlineMembers(Player player) {
-        return getOnlineMembers(getParty(player));
-    }
-
-    private List<Player> getOnlineMembers(Party party) {
-        return party == null ? new ArrayList<>() : party.getPartyMembers();
-    }
-
-    /**
-     * Retrieve a party by its name
-     *
-     * @param partyName The party name
-     * @return the existing party, null otherwise
-     */
-    public Party getParty(String partyName) {
-        for (Party party : parties) {
-            if (party.getPartyName().equalsIgnoreCase(partyName)) {
-                return party;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Retrieve a party by a members name
-     *
-     * @param playerName The members name
-     * @return the existing party, null otherwise
-     */
-    @Deprecated
-    public Party getPlayerParty(String playerName) {
-        for (Party party : parties) {
-            if (party.getMembers().containsKey(playerName)) {
-                return party;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Retrieve a party by a members uuid
-     *
-     * @param uuid The members uuid
-     * @return the existing party, null otherwise
-     */
-    public Party getPlayerParty(String playerName, UUID uuid) {
-        for (Party party : parties) {
-            LinkedHashMap<UUID, String> members = party.getMembers();
-            if (members.containsKey(uuid) || members.containsValue(playerName)) {
-
-                // Name changes
-                if (members.get(uuid) == null || !members.get(uuid).equals(playerName)) {
-                    members.put(uuid, playerName);
-                }
-
-                return party;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Retrieve a party by member
-     *
-     * @param player The member
-     * @return the existing party, null otherwise
-     */
-    public Party getParty(Player player) {
-        //Profile not loaded
-        if(mcMMO.getUserManager().queryPlayer(player) == null)
-        {
-            return null;
-        }
-
-        OnlineMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
-
-        return mmoPlayer.getParty();
-    }
-
-    /**
-     * Get a list of all current parties.
-     *
-     * @return the list of parties.
-     */
-    public List<Party> getParties() {
-        return parties;
-    }
-
-    /**
-     * Remove a player from a party.
-     *
-     * @param player The player to remove
-     * @param party The party
-     */
-    public void removeFromParty(OfflinePlayer player, Party party) {
-        LinkedHashMap<UUID, String> members = party.getMembers();
-        String playerName = player.getName();
-
-        members.remove(player.getUniqueId());
-
-        if (player.isOnline()) {
-            party.getPartyMembers().remove(player.getPlayer());
-        }
-
-        if (members.isEmpty()) {
-            parties.remove(party);
-        }
-        else {
-            // If the leaving player was the party leader, appoint a new leader from the party members
-            if (party.getLeader().getUniqueId().equals(player.getUniqueId())) {
-                setPartyLeader(members.keySet().iterator().next(), party);
-            }
-
-            informPartyMembersQuit(party, playerName);
-        }
-    }
-
-    /**
-     * Remove a player from a party.
-     *
-     * @param mmoPlayer The player to remove
-     */
-    public void removeFromParty(OnlineMMOPlayer mmoPlayer) {
-        removeFromParty(Misc.adaptPlayer(mmoPlayer), mmoPlayer.getParty());
-        processPartyLeaving(mmoPlayer);
-    }
-
-    /**
-     * Disband a party. Kicks out all members and removes the party.
-     *
-     * @param party The party to remove
-     */
-    public void disbandParty(Party party) {
-        //TODO: Potential issues with unloaded profile?
-        for (Player member : party.getPartyMembers()) {
-            //Profile not loaded
-            if(mcMMO.getUserManager().queryPlayer(member) == null)
-            {
-                continue;
-            }
-
-            processPartyLeaving(mcMMO.getUserManager().queryPlayer(member));
-        }
-
-        // Disband the alliance between the disbanded party and it's ally
-        if (party.getAlly() != null) {
-            party.getAlly().setAlly(null);
-        }
-
-        parties.remove(party);
-    }
-
-    /**
-     * Create a new party
-     *
-     * @param mmoPlayer The player to add to the party
-     * @param partyName The party to add the player to
-     * @param password The password for this party, null if there was no password
-     */
-    public void createParty(OnlineMMOPlayer mmoPlayer, String partyName, String password) {
-        Player player = Misc.adaptPlayer(mmoPlayer);
-
-        Party party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName.replace(".", ""), password);
-
-        if (password != null) {
-            player.sendMessage(LocaleLoader.getString("Party.Password.Set", password));
-        }
-
-        parties.add(party);
-
-        player.sendMessage(LocaleLoader.getString("Commands.Party.Create", party.getPartyName()));
-        addToParty(mmoPlayer, party);
-    }
-
-    /**
-     * Check if a player can join a party
-     *
-     * @param player The player trying to join a party
-     * @param party The party
-     * @param password The password provided by the player
-     * @return true if the player can join the party
-     */
-    public boolean checkPartyPassword(Player player, Party party, String password) {
-        if (party.isLocked()) {
-            String partyPassword = party.getPartyPassword();
-
-            if (partyPassword == null) {
-                player.sendMessage(LocaleLoader.getString("Party.Locked"));
-                return false;
-            }
-
-            if (password == null) {
-                player.sendMessage(LocaleLoader.getString("Party.Password.None"));
-                return false;
-            }
-
-            if (!password.equals(partyPassword)) {
-                player.sendMessage(LocaleLoader.getString("Party.Password.Incorrect"));
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Accept a party invitation
-     *
-     * @param mmoPlayer The player to add to the party
-     */
-    public void joinInvitedParty(OnlineMMOPlayer mmoPlayer) {
-        Party invite = mmoPlayer.getPartyInvite();
-
-        // Check if the party still exists, it might have been disbanded
-        if (!parties.contains(invite)) {
-            NotificationManager.sendPlayerInformation(Misc.adaptPlayer(mmoPlayer), NotificationType.PARTY_MESSAGE, "Party.Disband");
-            return;
-        }
-
-        /*
-         * Don't let players join a full party
-         */
-        if(Config.getInstance().getPartyMaxSize() > 0 && invite.getMembers().size() >= Config.getInstance().getPartyMaxSize())
-        {
-            NotificationManager.sendPlayerInformation(Misc.adaptPlayer(mmoPlayer), NotificationType.PARTY_MESSAGE, "Commands.Party.PartyFull.InviteAccept", invite.getPartyName(), String.valueOf(Config.getInstance().getPartyMaxSize()));
-            return;
-        }
-
-        NotificationManager.sendPlayerInformation(Misc.adaptPlayer(mmoPlayer), NotificationType.PARTY_MESSAGE, "Commands.Party.Invite.Accepted", invite.getPartyName());
-        mmoPlayer.removePartyInvite();
-        addToParty(mmoPlayer, invite);
-    }
-
-    /**
-     * Accept a party alliance invitation
-     *
-     * @param mmoPlayer The player who accepts the alliance invite
-     */
-    public void acceptAllianceInvite(OnlineMMOPlayer mmoPlayer) {
-        Party invite = mmoPlayer.getPartyAllianceInvite();
-        Player player = Misc.adaptPlayer(mmoPlayer);
-
-        // Check if the party still exists, it might have been disbanded
-        if (!parties.contains(invite)) {
-            player.sendMessage(LocaleLoader.getString("Party.Disband"));
-            return;
-        }
-
-        if (!handlePartyChangeAllianceEvent(player, mmoPlayer.getParty().getName(), invite.getPartyName(), McMMOPartyAllianceChangeEvent.EventReason.FORMED_ALLIANCE)) {
-            return;
-        }
-
-        player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.Accepted", invite.getPartyName()));
-        mmoPlayer.removePartyAllianceInvite();
-
-        createAlliance(mmoPlayer.getParty(), invite);
-    }
-
-    public void createAlliance(Party firstParty, Party secondParty) {
-        firstParty.setAlly(secondParty);
-        secondParty.setAlly(firstParty);
-
-        for (Player member : firstParty.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.Alliance.Formed", secondParty.getPartyName()));
-        }
-
-        for (Player member : secondParty.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.Alliance.Formed", firstParty.getPartyName()));
-        }
-    }
-
-    public boolean disbandAlliance(Player player, Party firstParty, Party secondParty){
-        if (!handlePartyChangeAllianceEvent(player, firstParty.getPartyName(), secondParty.getPartyName(), McMMOPartyAllianceChangeEvent.EventReason.DISBAND_ALLIANCE)) {
-            return false;
-        }
-
-        mcMMO.getPartyManager().disbandAlliance(firstParty, secondParty);
-        return true;
-    }
-
-    private void disbandAlliance(Party firstParty, Party secondParty) {
-        firstParty.setAlly(null);
-        secondParty.setAlly(null);
-
-        for (Player member : firstParty.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.Alliance.Disband", secondParty.getPartyName()));
-        }
-
-        for (Player member : secondParty.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.Alliance.Disband", firstParty.getPartyName()));
-        }
-    }
-
-    /**
-     * Add a player to a party
-     *
-     * @param mmoPlayer The player to add to the party
-     * @param party The party
-     */
-    public void addToParty(OnlineMMOPlayer mmoPlayer, Party party) {
-        Player player = Misc.adaptPlayer(mmoPlayer);
-        String playerName = player.getName();
-
-        informPartyMembersJoin(party, playerName);
-        party.getMembers().put(player.getUniqueId(), player.getName());
-        party.getPartyMembers().add(player);
-    }
-
-    /**
-     * Get the leader of a party.
-     *
-     * @param partyName The party name
-     * @return the leader of the party
-     */
-    public String getPartyLeaderName(String partyName) {
-        Party party = getParty(partyName);
-
-        return party == null ? null : party.getLeader().getPlayerName();
-    }
-
-    /**
-     * Set the leader of a party.
-     *
-     * @param uuid The uuid of the player to set as leader
-     * @param party The party
-     */
-    public void setPartyLeader(UUID uuid, Party party) {
-        OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(uuid);
-        UUID leaderUniqueId = party.getLeader().getUniqueId();
-
-        for (Player member : party.getPartyMembers()) {
-            UUID memberUniqueId = member.getUniqueId();
-
-            if (memberUniqueId.equals(player.getUniqueId())) {
-                member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
-            }
-            else if (memberUniqueId.equals(leaderUniqueId)) {
-                member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
-            }
-            else {
-                member.sendMessage(LocaleLoader.getString("Party.Owner.New", player.getName()));
-            }
-        }
-
-        party.setLeader(new PartyLeader(player.getUniqueId(), player.getName()));
-    }
-
-    /**
-     * Check if a player can invite others to his party.
-     *
-     * @return true if the player can invite
-     */
-    public boolean canInvite(OnlineMMOPlayer mmoPlayer) {
-        Party party = mmoPlayer.getParty();
-
-        return !party.isLocked() || party.getLeader().getUniqueId().equals(mmoPlayer.getUUID());
-    }
-
-    /**
-     * Load party file.
-     */
-    public void loadParties() {
-        if (!partyFile.exists()) {
-            return;
-        }
-
-        if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) {
-            loadAndUpgradeParties();
-            return;
-        }
-
-        try {
-            YamlConfiguration partiesFile;
-            partiesFile = YamlConfiguration.loadConfiguration(partyFile);
-
-            ArrayList<Party> hasAlly = new ArrayList<>();
-
-            for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
-                Party party = new Party(partyName);
-
-                String[] leaderSplit = partiesFile.getString(partyName + ".Leader").split("[|]");
-                party.setLeader(new PartyLeader(UUID.fromString(leaderSplit[0]), leaderSplit[1]));
-                party.setPartyPassword(partiesFile.getString(partyName + ".Password"));
-                party.setPartyLock(partiesFile.getBoolean(partyName + ".Locked"));
-                party.setLevel(partiesFile.getInt(partyName + ".Level"));
-                party.setXp(partiesFile.getInt(partyName + ".Xp"));
-
-                if (partiesFile.getString(partyName + ".Ally") != null) {
-                    hasAlly.add(party);
-                }
-
-                party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
-                party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
-
-                for (ItemShareType itemShareType : ItemShareType.values()) {
-                    party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
-                }
-
-                LinkedHashMap<UUID, String> members = party.getMembers();
-
-                for (String memberEntry : partiesFile.getStringList(partyName + ".Members")) {
-                    String[] memberSplit = memberEntry.split("[|]");
-                    members.put(UUID.fromString(memberSplit[0]), memberSplit[1]);
-                }
-
-                parties.add(party);
-            }
-
-            mcMMO.p.getLogger().info("Loaded (" + parties.size() + ") Parties...");
-
-            for (Party party : hasAlly) {
-                party.setAlly(mcMMO.getPartyManager().getParty(partiesFile.getString(party.getPartyName() + ".Ally")));
-            }
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-    }
-
-    /**
-     * Save party file.
-     */
-    public void saveParties() {
-        if (partyFile.exists()) {
-            if (!partyFile.delete()) {
-                mcMMO.p.getLogger().warning("Could not delete party file. Party saving failed!");
-                return;
-            }
-        }
-
-        YamlConfiguration partiesFile = new YamlConfiguration();
-
-        mcMMO.p.getLogger().info("Saving Parties... (" + parties.size() + ")");
-        for (Party party : parties) {
-            String partyName = party.getPartyName();
-            PartyLeader leader = party.getLeader();
-
-            partiesFile.set(partyName + ".Leader", leader.getUniqueId().toString() + "|" + leader.getPlayerName());
-            partiesFile.set(partyName + ".Password", party.getPartyPassword());
-            partiesFile.set(partyName + ".Locked", party.isLocked());
-            partiesFile.set(partyName + ".Level", party.getLevel());
-            partiesFile.set(partyName + ".Xp", (int) party.getXp());
-            partiesFile.set(partyName + ".Ally", (party.getAlly() != null) ? party.getAlly().getPartyName() : "");
-            partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString());
-            partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString());
-
-            for (ItemShareType itemShareType : ItemShareType.values()) {
-                partiesFile.set(partyName + ".ItemShareType." + itemShareType.toString(), party.sharingDrops(itemShareType));
-            }
-
-            List<String> members = new ArrayList<>();
-
-            for (Entry<UUID, String> memberEntry : party.getMembers().entrySet()) {
-                String memberUniqueId = memberEntry.getKey() == null ? "" : memberEntry.getKey().toString();
-                String memberName = memberEntry.getValue();
-
-                if (!members.contains(memberName)) {
-                    members.add(memberUniqueId + "|" + memberName);
-                }
-            }
-
-            partiesFile.set(partyName + ".Members", members);
-        }
-
-        try {
-            partiesFile.save(partyFile);
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void loadAndUpgradeParties() {
-        YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile);
-
-        if (!partyFile.renameTo(new File(mcMMO.getFlatFileDirectory() + "parties.yml.converted"))) {
-            mcMMO.p.getLogger().severe("Could not rename parties.yml to parties.yml.converted!");
-            return;
-        }
-
-        ArrayList<Party> hasAlly = new ArrayList<>();
-
-        for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
-            Party party = new Party(partyName);
-
-            String leaderName = partiesFile.getString(partyName + ".Leader");
-            PlayerProfile profile = mcMMO.getDatabaseManager().queryPlayerDataByUUID(leaderName, false);
-
-            if (!profile.isLoaded()) {
-                mcMMO.p.getLogger().warning("Could not find UUID in database for party leader " + leaderName + " in party " + partyName);
-                continue;
-            }
-
-            UUID leaderUniqueId = profile.getUniqueId();
-
-            party.setLeader(new PartyLeader(leaderUniqueId, leaderName));
-            party.setPartyPassword(partiesFile.getString(partyName + ".Password"));
-            party.setPartyLock(partiesFile.getBoolean(partyName + ".Locked"));
-            party.setLevel(partiesFile.getInt(partyName + ".Level"));
-            party.setXp(partiesFile.getInt(partyName + ".Xp"));
-
-            if (partiesFile.getString(partyName + ".Ally") != null) {
-                hasAlly.add(party);
-            }
-
-            party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
-            party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
-
-            for (ItemShareType itemShareType : ItemShareType.values()) {
-                party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
-            }
-
-            LinkedHashMap<UUID, String> members = party.getMembers();
-
-            for (String memberName : partiesFile.getStringList(partyName + ".Members")) {
-                PlayerProfile memberProfile = mcMMO.getDatabaseManager().queryPlayerDataByUUID(memberName, false);
-
-                if (!memberProfile.isLoaded()) {
-                    mcMMO.p.getLogger().warning("Could not find UUID in database for party member " + memberName + " in party " + partyName);
-                    continue;
-                }
-
-                UUID memberUniqueId = memberProfile.getUniqueId();
-
-                members.put(memberUniqueId, memberName);
-            }
-
-            parties.add(party);
-        }
-
-        mcMMO.p.getLogger().info("Loaded (" + parties.size() + ") Parties...");
-
-        for (Party party : hasAlly) {
-            party.setAlly(mcMMO.getPartyManager().getParty(partiesFile.getString(party.getPartyName() + ".Ally")));
-        }
-
-        mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS_PARTY);
-    }
-
-    /**
-     * Handle party change event.
-     *
-     * @param player The player changing parties
-     * @param oldPartyName The name of the old party
-     * @param newPartyName The name of the new party
-     * @param reason The reason for changing parties
-     * @return true if the change event was successful, false otherwise
-     */
-    public boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
-        McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, oldPartyName, newPartyName, reason);
-        mcMMO.p.getServer().getPluginManager().callEvent(event);
-
-        return !event.isCancelled();
-    }
-
-    /**
-     * Handle party alliance change event.
-     *
-     * @param player The player changing party alliances
-     * @param oldAllyName The name of the old ally
-     * @param newAllyName The name of the new ally
-     * @param reason The reason for changing allies
-     * @return true if the change event was successful, false otherwise
-     */
-    public boolean handlePartyChangeAllianceEvent(Player player, String oldAllyName, String newAllyName, McMMOPartyAllianceChangeEvent.EventReason reason) {
-        McMMOPartyAllianceChangeEvent event = new McMMOPartyAllianceChangeEvent(player, oldAllyName, newAllyName, reason);
-        mcMMO.p.getServer().getPluginManager().callEvent(event);
-
-        return !event.isCancelled();
-    }
-
-    /**
-     * Remove party data from the mmoPlayer.
-     *
-     * @param mmoPlayer The player to remove party data from.
-     */
-    public void processPartyLeaving(@NotNull OnlineMMOPlayer mmoPlayer) {
-        mmoPlayer.removeParty();
-        mmoPlayer.setChatMode(ChatChannel.NONE);
-        mmoPlayer.setItemShareModifier(10);
-    }
-
-    /**
-     * Notify party members when the party levels up.
-     *
-     * @param party The concerned party
-     * @param levelsGained The amount of levels gained
-     * @param level The current party level
-     */
-    public void informPartyMembersLevelUp(Party party, int levelsGained, int level) {
-        boolean levelUpSoundsEnabled = Config.getInstance().getLevelUpSoundsEnabled();
-        for (Player member : party.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, level));
-
-            if (levelUpSoundsEnabled) {
-                SoundManager.sendSound(member, member.getLocation(), SoundType.LEVEL_UP);
-            }
-        }
-    }
-
-    /**
-     * Notify party members when a player joins.
-     *
-     * @param party The concerned party
-     * @param playerName The name of the player that joined
-     */
-    private void informPartyMembersJoin(Party party, String playerName) {
-        for (Player member : party.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", playerName));
-        }
-    }
-
-    /**
-     * Notify party members when a party member quits.
-     *
-     * @param party The concerned party
-     * @param playerName The name of the player that left
-     */
-    private void informPartyMembersQuit(Party party, String playerName) {
-        for (Player member : party.getPartyMembers()) {
-            member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", playerName));
-        }
-    }
-}

+ 211 - 0
src/main/java/com/gmail/nossr50/party/PartyManagerImpl.java

@@ -0,0 +1,211 @@
+package com.gmail.nossr50.party;
+
+import com.neetgames.mcmmo.party.Party;
+import com.neetgames.mcmmo.party.PartyManager;
+import com.gmail.nossr50.events.party.McMMOPartyAllianceChangeEvent;
+import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
+import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
+import com.gmail.nossr50.mcMMO;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.util.*;
+
+/**
+ * About mcMMO parties
+ * Parties are identified by a {@link String} name
+ * Parties always have a party leader, if the party leader is not defined mcMMO will force party leadership onto someone in the party
+ */
+//TODO: Needs to be optimized, currently all parties are loaded into memory, it should be changed to as needed, but then we need to handle loading asynchronously and accommodate for that
+public final class PartyManagerImpl implements PartyManager {
+    private final @NotNull HashMap<String, Party> parties;
+    private final @NotNull File partyFile;
+
+    public PartyManagerImpl() {
+        String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml";
+        partyFile = new File(partiesFilePath);
+        parties = new HashMap<>();
+    }
+
+//    /**
+//     * Load party file.
+//     */
+//    public void loadParties() {
+//        if (!partyFile.exists()) {
+//            return;
+//        }
+//
+//        if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) {
+//            loadAndUpgradeParties();
+//            return;
+//        }
+//
+//        try {
+//            YamlConfiguration partiesFile;
+//            partiesFile = YamlConfiguration.loadConfiguration(partyFile);
+//
+//            ArrayList<Party> hasAlly = new ArrayList<>();
+//
+//            for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
+//                Party party = new Party(partyName);
+//
+//                String[] leaderSplit = partiesFile.getString(partyName + ".Leader").split("[|]");
+//                party.setLeader(new PartyLeader(UUID.fromString(leaderSplit[0]), leaderSplit[1]));
+//                party.setPartyPassword(partiesFile.getString(partyName + ".Password"));
+//                party.setPartyLock(partiesFile.getBoolean(partyName + ".Locked"));
+//                party.setLevel(partiesFile.getInt(partyName + ".Level"));
+//                party.setXp(partiesFile.getInt(partyName + ".Xp"));
+//
+//                if (partiesFile.getString(partyName + ".Ally") != null) {
+//                    hasAlly.add(party);
+//                }
+//
+//                party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
+//                party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
+//
+//                for (ItemShareType itemShareType : ItemShareType.values()) {
+//                    party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
+//                }
+//
+//                LinkedHashMap<UUID, String> members = party.getMembers();
+//
+//                for (String memberEntry : partiesFile.getStringList(partyName + ".Members")) {
+//                    String[] memberSplit = memberEntry.split("[|]");
+//                    members.put(UUID.fromString(memberSplit[0]), memberSplit[1]);
+//                }
+//
+//                parties.add(party);
+//            }
+//
+//            mcMMO.p.getLogger().info("Loaded (" + parties.size() + ") Parties...");
+//
+//            for (Party party : hasAlly) {
+//                party.setAlly(mcMMO.getPartyManager().getParty(partiesFile.getString(party.getPartyName() + ".Ally")));
+//            }
+//
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//
+//    }
+//
+//    /**
+//     * Save party file.
+//     */
+//    public void saveParties() {
+//        if (partyFile.exists()) {
+//            if (!partyFile.delete()) {
+//                mcMMO.p.getLogger().warning("Could not delete party file. Party saving failed!");
+//                return;
+//            }
+//        }
+//
+//        YamlConfiguration partiesFile = new YamlConfiguration();
+//
+//        mcMMO.p.getLogger().info("Saving Parties... (" + parties.size() + ")");
+//        for (Party party : parties) {
+//            String partyName = party.getPartyName();
+//            PartyLeader leader = party.getLeader();
+//
+//            partiesFile.set(partyName + ".Leader", leader.getUniqueId().toString() + "|" + leader.getPlayerName());
+//            partiesFile.set(partyName + ".Password", party.getPartyPassword());
+//            partiesFile.set(partyName + ".Locked", party.isLocked());
+//            partiesFile.set(partyName + ".Level", party.getLevel());
+//            partiesFile.set(partyName + ".Xp", (int) party.getXp());
+//            partiesFile.set(partyName + ".Ally", (party.getAlly() != null) ? party.getAlly().getPartyName() : "");
+//            partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString());
+//            partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString());
+//
+//            for (ItemShareType itemShareType : ItemShareType.values()) {
+//                partiesFile.set(partyName + ".ItemShareType." + itemShareType.toString(), party.sharingDrops(itemShareType));
+//            }
+//
+//            List<String> members = new ArrayList<>();
+//
+//            for (Entry<UUID, String> memberEntry : party.getMembers().entrySet()) {
+//                String memberUniqueId = memberEntry.getKey() == null ? "" : memberEntry.getKey().toString();
+//                String memberName = memberEntry.getValue();
+//
+//                if (!members.contains(memberName)) {
+//                    members.add(memberUniqueId + "|" + memberName);
+//                }
+//            }
+//
+//            partiesFile.set(partyName + ".Members", members);
+//        }
+//
+//        try {
+//            partiesFile.save(partyFile);
+//        }
+//        catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    private void loadAndUpgradeParties() {
+//        YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile);
+//
+//        if (!partyFile.renameTo(new File(mcMMO.getFlatFileDirectory() + "parties.yml.converted"))) {
+//            mcMMO.p.getLogger().severe("Could not rename parties.yml to parties.yml.converted!");
+//            return;
+//        }
+//
+//        ArrayList<Party> hasAlly = new ArrayList<>();
+//
+//        for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
+//            Party party = new Party(partyName);
+//
+//            String leaderName = partiesFile.getString(partyName + ".Leader");
+//            PlayerProfile profile = mcMMO.getDatabaseManager().queryPlayerDataByUUID(leaderName, false);
+//
+//            if (!profile.isLoaded()) {
+//                mcMMO.p.getLogger().warning("Could not find UUID in database for party leader " + leaderName + " in party " + partyName);
+//                continue;
+//            }
+//
+//            UUID leaderUniqueId = profile.getUniqueId();
+//
+//            party.setLeader(new PartyLeader(leaderUniqueId, leaderName));
+//            party.setPartyPassword(partiesFile.getString(partyName + ".Password"));
+//            party.setPartyLock(partiesFile.getBoolean(partyName + ".Locked"));
+//            party.setLevel(partiesFile.getInt(partyName + ".Level"));
+//            party.setXp(partiesFile.getInt(partyName + ".Xp"));
+//
+//            if (partiesFile.getString(partyName + ".Ally") != null) {
+//                hasAlly.add(party);
+//            }
+//
+//            party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
+//            party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
+//
+//            for (ItemShareType itemShareType : ItemShareType.values()) {
+//                party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
+//            }
+//
+//            LinkedHashMap<UUID, String> members = party.getMembers();
+//
+//            for (String memberName : partiesFile.getStringList(partyName + ".Members")) {
+//                PlayerProfile memberProfile = mcMMO.getDatabaseManager().queryPlayerDataByUUID(memberName, false);
+//
+//                if (!memberProfile.isLoaded()) {
+//                    mcMMO.p.getLogger().warning("Could not find UUID in database for party member " + memberName + " in party " + partyName);
+//                    continue;
+//                }
+//
+//                UUID memberUniqueId = memberProfile.getUniqueId();
+//
+//                members.put(memberUniqueId, memberName);
+//            }
+//
+//            parties.add(party);
+//        }
+//
+//        mcMMO.p.getLogger().info("Loaded (" + parties.size() + ") Parties...");
+//
+//        for (Party party : hasAlly) {
+//            party.setAlly(mcMMO.getPartyManager().getParty(partiesFile.getString(party.getPartyName() + ".Ally")));
+//        }
+//
+//        mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS_PARTY);
+//    }
+}

+ 4 - 3
src/main/java/com/gmail/nossr50/datatypes/party/PartyMember.java → src/main/java/com/gmail/nossr50/party/PartyMemberImpl.java

@@ -1,5 +1,6 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
+import com.neetgames.mcmmo.party.PartyMemberRank;
 import org.bukkit.Bukkit;
 import org.bukkit.Bukkit;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
@@ -7,7 +8,7 @@ import org.jetbrains.annotations.Nullable;
 
 
 import java.util.UUID;
 import java.util.UUID;
 
 
-public class PartyMember {
+public class PartyMemberImpl {
     private String playerName;
     private String playerName;
     private final @NotNull UUID playerUUID;
     private final @NotNull UUID playerUUID;
     private @Nullable OfflinePlayer offlinePlayer;
     private @Nullable OfflinePlayer offlinePlayer;
@@ -15,7 +16,7 @@ public class PartyMember {
     private @Nullable PartyTeleportRecord partyTeleportRecord;
     private @Nullable PartyTeleportRecord partyTeleportRecord;
     private int itemShareModifier;
     private int itemShareModifier;
 
 
-    public PartyMember(@NotNull UUID playerUUID, @NotNull PartyMemberRank partyMemberRank) {
+    public PartyMemberImpl(@NotNull UUID playerUUID, @NotNull PartyMemberRank partyMemberRank) {
         this.playerUUID = playerUUID;
         this.playerUUID = playerUUID;
         this.partyMemberRank = partyMemberRank;
         this.partyMemberRank = partyMemberRank;
     }
     }

+ 22 - 8
src/main/java/com/gmail/nossr50/datatypes/party/PartyMemberManager.java → src/main/java/com/gmail/nossr50/party/PartyMemberManagerImpl.java

@@ -1,7 +1,11 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
+import com.neetgames.mcmmo.party.PartyMember;
+import com.neetgames.mcmmo.party.PartyMemberManager;
+import com.neetgames.mcmmo.party.PartyMemberRank;
+import com.neetgames.mcmmo.player.MMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;
@@ -11,13 +15,13 @@ import org.jetbrains.annotations.Nullable;
 
 
 import java.util.*;
 import java.util.*;
 
 
-public class PartyMemberManager {
+public class PartyMemberManagerImpl implements PartyMemberManager {
 
 
     private final @NotNull PersistentPartyData persistentPartyData;
     private final @NotNull PersistentPartyData persistentPartyData;
     private final @NotNull HashMap<UUID, PartyMember> partyMemberMap;
     private final @NotNull HashMap<UUID, PartyMember> partyMemberMap;
     private @Nullable PartyMember partyLeaderRef;
     private @Nullable PartyMember partyLeaderRef;
     
     
-    public PartyMemberManager(@NotNull PersistentPartyData persistentPartyData) {
+    public PartyMemberManagerImpl(@NotNull PersistentPartyData persistentPartyData) {
         this.persistentPartyData = persistentPartyData;
         this.persistentPartyData = persistentPartyData;
         this.partyMemberMap = new HashMap<>();
         this.partyMemberMap = new HashMap<>();
         initPartyLeaderRef();
         initPartyLeaderRef();
@@ -28,6 +32,7 @@ public class PartyMemberManager {
      *
      *
      * @return all party members
      * @return all party members
      */
      */
+    @Override
     public @NotNull Set<PartyMember> getPartyMembers() {
     public @NotNull Set<PartyMember> getPartyMembers() {
         return persistentPartyData.getPartyMembers();
         return persistentPartyData.getPartyMembers();
     }
     }
@@ -38,6 +43,7 @@ public class PartyMemberManager {
      * @param playerUUID target UUID
      * @param playerUUID target UUID
      * @return the party member if they exist, otherwise null
      * @return the party member if they exist, otherwise null
      */
      */
+    @Override
     public @Nullable PartyMember getPartyMember(@NotNull UUID playerUUID) {
     public @Nullable PartyMember getPartyMember(@NotNull UUID playerUUID) {
         return partyMemberMap.get(playerUUID);
         return partyMemberMap.get(playerUUID);
     }
     }
@@ -50,10 +56,11 @@ public class PartyMemberManager {
      * @param playerUUID target player's uuid
      * @param playerUUID target player's uuid
      * @param partyMemberRank target rank
      * @param partyMemberRank target rank
      */
      */
+    @Override
     public void addPartyMember(@NotNull UUID playerUUID, @NotNull PartyMemberRank partyMemberRank) {
     public void addPartyMember(@NotNull UUID playerUUID, @NotNull PartyMemberRank partyMemberRank) {
         //TODO: Prevent adding multiple leaders
         //TODO: Prevent adding multiple leaders
         //TODO: Call event
         //TODO: Call event
-        PartyMember partyMember = new PartyMember(playerUUID, partyMemberRank);
+        PartyMember partyMember = new PartyMemberImpl(playerUUID, partyMemberRank);
         persistentPartyData.getPartyMembers().add(partyMember);
         persistentPartyData.getPartyMembers().add(partyMember);
         partyMemberMap.put(playerUUID, partyMember);
         partyMemberMap.put(playerUUID, partyMember);
     }
     }
@@ -62,10 +69,10 @@ public class PartyMemberManager {
      * Get party members that are "Visible" to a target {@link Player}
      * Get party members that are "Visible" to a target {@link Player}
      *
      *
      * @param player target {@link Player}
      * @param player target {@link Player}
-     * @return returns a {@link HashSet<PartyMember>} which are visible to the player
+     * @return returns a {@link HashSet< PartyMember >} which are visible to the player
      */
      */
-    public @NotNull HashSet<PartyMember> getVisibleMembers(@NotNull Player player)
-    {
+    @Override
+    public @NotNull HashSet<PartyMember> getVisibleMembers(@NotNull OnlineMMOPlayer onlineMMOPlayer) {
         HashSet<PartyMember> visibleMembers = new HashSet<>();
         HashSet<PartyMember> visibleMembers = new HashSet<>();
 
 
         for(PartyMember partyMember : persistentPartyData.getPartyMembers())
         for(PartyMember partyMember : persistentPartyData.getPartyMembers())
@@ -116,6 +123,7 @@ public class PartyMemberManager {
      *
      *
      * @return the party leader
      * @return the party leader
      */
      */
+    @Override
     public @NotNull PartyMember getPartyLeader() {
     public @NotNull PartyMember getPartyLeader() {
         if(partyLeaderRef == null) {
         if(partyLeaderRef == null) {
             //The first player in a party is now the leader
             //The first player in a party is now the leader
@@ -126,10 +134,16 @@ public class PartyMemberManager {
         return partyLeaderRef;
         return partyLeaderRef;
     }
     }
 
 
+    @Override
     public boolean hasMember(@NotNull UUID playerUUID) {
     public boolean hasMember(@NotNull UUID playerUUID) {
         return partyMemberMap.containsKey(playerUUID);
         return partyMemberMap.containsKey(playerUUID);
     }
     }
 
 
+    @Override
+    public boolean hasMember(@NotNull MMOPlayer mmoPlayer) {
+        return false;
+    }
+
     public boolean hasMember(@NotNull Player player) {
     public boolean hasMember(@NotNull Player player) {
         return hasMember(player.getUniqueId());
         return hasMember(player.getUniqueId());
     }
     }
@@ -162,7 +176,7 @@ public class PartyMemberManager {
      * @param mmoPlayer The player to check
      * @param mmoPlayer The player to check
      * @return the near party members
      * @return the near party members
      */
      */
-    public @NotNull List<Player> getNearMembers(@NotNull OnlineMMOPlayer mmoPlayer) {
+    public @NotNull List<OnlineMMOPlayer> getNearMembers(@NotNull OnlineMMOPlayer mmoPlayer) {
         List<Player> nearMembers = new ArrayList<>();
         List<Player> nearMembers = new ArrayList<>();
         Party party = mmoPlayer.getParty();
         Party party = mmoPlayer.getParty();
 
 

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/party/PartyTeleportRecord.java → src/main/java/com/gmail/nossr50/party/PartyTeleportRecord.java

@@ -1,4 +1,4 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;

+ 13 - 4
src/main/java/com/gmail/nossr50/datatypes/party/PersistentPartyData.java → src/main/java/com/gmail/nossr50/party/PersistentPartyData.java

@@ -1,5 +1,7 @@
-package com.gmail.nossr50.datatypes.party;
+package com.gmail.nossr50.party;
 
 
+import com.google.common.base.Objects;
+import com.neetgames.mcmmo.party.PartyMember;
 import com.neetgames.neetlib.dirtydata.DirtyData;
 import com.neetgames.neetlib.dirtydata.DirtyData;
 import com.neetgames.neetlib.dirtydata.DirtySet;
 import com.neetgames.neetlib.dirtydata.DirtySet;
 import com.neetgames.neetlib.mutableprimitives.MutableBoolean;
 import com.neetgames.neetlib.mutableprimitives.MutableBoolean;
@@ -7,7 +9,6 @@ import com.neetgames.neetlib.mutableprimitives.MutableString;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
 
 
 import java.util.HashSet;
 import java.util.HashSet;
-import java.util.Objects;
 import java.util.Set;
 import java.util.Set;
 
 
 public class PersistentPartyData {
 public class PersistentPartyData {
@@ -34,16 +35,24 @@ public class PersistentPartyData {
         return dirtyFlag.getImmutableCopy();
         return dirtyFlag.getImmutableCopy();
     }
     }
 
 
+    @Override
+    public String toString() {
+        return "PersistentPartyData{" +
+                "partyName=" + partyName +
+                ", partyMembers=" + partyMembers +
+                '}';
+    }
+
     @Override
     @Override
     public boolean equals(Object o) {
     public boolean equals(Object o) {
         if (this == o) return true;
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         if (o == null || getClass() != o.getClass()) return false;
         PersistentPartyData that = (PersistentPartyData) o;
         PersistentPartyData that = (PersistentPartyData) o;
-        return dirtyFlag.equals(that.dirtyFlag) && partyName.equals(that.partyName) && partyMembers.equals(that.partyMembers);
+        return Objects.equal(partyName, that.partyName) && Objects.equal(partyMembers, that.partyMembers);
     }
     }
 
 
     @Override
     @Override
     public int hashCode() {
     public int hashCode() {
-        return Objects.hash(dirtyFlag, partyName, partyMembers);
+        return Objects.hashCode(partyName, partyMembers);
     }
     }
 }
 }

+ 2 - 106
src/main/java/com/gmail/nossr50/party/ShareHandler.java

@@ -2,9 +2,9 @@ package com.gmail.nossr50.party;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.party.ItemWeightConfig;
 import com.gmail.nossr50.config.party.ItemWeightConfig;
-import com.gmail.nossr50.datatypes.party.ItemShareType;
+import com.neetgames.mcmmo.experience.XPGainReason;
+import com.neetgames.mcmmo.experience.XPGainSource;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
-import com.gmail.nossr50.datatypes.party.ShareMode;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
@@ -59,102 +59,6 @@ public final class ShareHandler {
         return true;
         return true;
     }
     }
 
 
-    /**
-     * Distribute Items amongst party members.
-     *
-     * @param drop Item that will get shared
-     * @param mmoPlayer Player who picked up the item
-     * @return True if the item has been shared
-     */
-    public static boolean handleItemShare(Item drop, OnlineMMOPlayer mmoPlayer) {
-        ItemStack itemStack = drop.getItemStack();
-        ItemShareType dropType = ItemShareType.getShareType(itemStack);
-
-        if (dropType == null) {
-            return false;
-        }
-
-        Party party = mmoPlayer.getParty();
-
-        if (!party.sharingDrops(dropType)) {
-            return false;
-        }
-
-        ShareMode shareMode = party.getItemShareMode();
-
-        if (shareMode == ShareMode.NONE) {
-            return false;
-        }
-
-        List<Player> nearMembers = mcMMO.getPartyManager().getNearMembers(mmoPlayer);
-
-        if (nearMembers.isEmpty()) {
-            return false;
-        }
-
-        Player winningPlayer = null;
-        ItemStack newStack = itemStack.clone();
-
-        nearMembers.add(mmoPlayer.getPlayer());
-        int partySize = nearMembers.size();
-
-        drop.remove();
-        newStack.setAmount(1);
-
-        switch (shareMode) {
-            case EQUAL:
-                int itemWeight = ItemWeightConfig.getInstance().getItemWeight(itemStack.getType());
-
-                for (int i = 0; i < itemStack.getAmount(); i++) {
-                    int highestRoll = 0;
-
-                    for (Player member : nearMembers) {
-                        OnlineMMOPlayer mcMMOMember = mcMMO.getUserManager().getPlayer(member);
-
-                        //Profile not loaded
-                        if(mcMMO.getUserManager().getPlayer(member) == null)
-                        {
-                            continue;
-                        }
-
-                        int itemShareModifier = mcMMOMember.getItemShareModifier();
-                        int diceRoll = Misc.getRandom().nextInt(itemShareModifier);
-
-                        if (diceRoll <= highestRoll) {
-                            mcMMOMember.setItemShareModifier(itemShareModifier + itemWeight);
-                            continue;
-                        }
-
-                        highestRoll = diceRoll;
-
-                        if (winningPlayer != null) {
-                            OnlineMMOPlayer mcMMOWinning = mcMMO.getUserManager().getPlayer(winningPlayer);
-                            mcMMOWinning.setItemShareModifier(mcMMOWinning.getItemShareModifier() + itemWeight);
-                        }
-
-                        winningPlayer = member;
-                    }
-
-                    OnlineMMOPlayer mcMMOTarget = mcMMO.getUserManager().getPlayer(winningPlayer);
-                    mcMMOTarget.setItemShareModifier(mcMMOTarget.getItemShareModifier() - itemWeight);
-                    awardDrop(winningPlayer, newStack);
-                }
-
-                return true;
-
-            case RANDOM:
-                for (int i = 0; i < itemStack.getAmount(); i++) {
-                    winningPlayer = nearMembers.get(Misc.getRandom().nextInt(partySize));
-                    awardDrop(winningPlayer, newStack);
-                }
-
-                return true;
-
-            default:
-                return false;
-        }
-    }
-
     public static XPGainReason getSharedXpGainReason(XPGainReason xpGainReason) {
     public static XPGainReason getSharedXpGainReason(XPGainReason xpGainReason) {
         if (xpGainReason == XPGainReason.PVE) {
         if (xpGainReason == XPGainReason.PVE) {
             return XPGainReason.SHARED_PVE;
             return XPGainReason.SHARED_PVE;
@@ -166,12 +70,4 @@ public final class ShareHandler {
             return xpGainReason;
             return xpGainReason;
         }
         }
     }
     }
-
-    private static void awardDrop(Player winningPlayer, ItemStack drop) {
-        if (winningPlayer.getInventory().addItem(drop).size() != 0) {
-            winningPlayer.getWorld().dropItem(winningPlayer.getLocation(), drop);
-        }
-
-        winningPlayer.updateInventory();
-    }
 }
 }

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

@@ -117,7 +117,7 @@ public final class Permissions {
     public static boolean hasSalvageEnchantBypassPerk(Permissible permissible) { return permissible.hasPermission("mcmmo.perks.bypass.salvageenchant"); }
     public static boolean hasSalvageEnchantBypassPerk(Permissible permissible) { return permissible.hasPermission("mcmmo.perks.bypass.salvageenchant"); }
 
 
     public static boolean lucky(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.lucky." + skill.toString().toLowerCase(Locale.ENGLISH)); }
     public static boolean lucky(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.lucky." + skill.toString().toLowerCase(Locale.ENGLISH)); }
-    public static boolean lucky(Permissible permissible, RootSkill rootSkill) { return permissible.hasPermission("mcmmo.perks.lucky." + rootSkill.getSkillName().toLowerCase(Locale.ENGLISH)); }
+    public static boolean lucky(Permissible permissible, RootSkill rootSkill) { return permissible.hasPermission("mcmmo.perks.lucky." + rootSkill.getRawSkillName().toLowerCase(Locale.ENGLISH)); }
 
 
     /* XP PERKS */
     /* XP PERKS */
     public static boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase(Locale.ENGLISH)); }
     public static boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { return permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase(Locale.ENGLISH)); }

+ 1 - 1
src/main/java/com/gmail/nossr50/util/experience/MMOExperienceBarManager.java

@@ -167,7 +167,7 @@ public class MMOExperienceBarManager {
     private void informPlayer(@NotNull SkillBossBarSetting settingTarget, @NotNull RootSkill rootSkill) {
     private void informPlayer(@NotNull SkillBossBarSetting settingTarget, @NotNull RootSkill rootSkill) {
         //Inform player of setting change
         //Inform player of setting change
         if(settingTarget != SkillBossBarSetting.RESET) {
         if(settingTarget != SkillBossBarSetting.RESET) {
-            NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Commands.XPBar.SettingChanged", rootSkill.getSkillName(), settingTarget.toString());
+            NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Commands.XPBar.SettingChanged", rootSkill.getRawSkillName(), settingTarget.toString());
         } else {
         } else {
             NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Commands.XPBar.Reset");
             NotificationManager.sendPlayerInformationChatOnlyPrefixed(Misc.adaptPlayer(mmoPlayer), "Commands.XPBar.Reset");
         }
         }

+ 6 - 4
src/main/java/com/gmail/nossr50/util/input/AbilityActivationProcessor.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.util.input;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
+import com.gmail.nossr50.util.Misc;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.neetgames.mcmmo.player.OnlineMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
@@ -24,12 +25,13 @@ import org.bukkit.block.BlockState;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
 
 
 public class AbilityActivationProcessor {
 public class AbilityActivationProcessor {
-    private final OnlineMMOPlayer mmoPlayer;
-    private final Player player;
+    private final @NotNull OnlineMMOPlayer mmoPlayer;
+    private final @NotNull Player player;
 
 
-    public AbilityActivationProcessor(OnlineMMOPlayer mmoPlayer) {
+    public AbilityActivationProcessor(@NotNull OnlineMMOPlayer mmoPlayer) {
         this.mmoPlayer = mmoPlayer;
         this.mmoPlayer = mmoPlayer;
         this.player = Misc.adaptPlayer(mmoPlayer);
         this.player = Misc.adaptPlayer(mmoPlayer);
     }
     }
@@ -238,7 +240,7 @@ public class AbilityActivationProcessor {
         return !getAbilityMode(ability) && calculateTimeRemaining(ability) > 0;
         return !getAbilityMode(ability) && calculateTimeRemaining(ability) > 0;
     }
     }
 
 
-    private SuperAbilityManager getSuperAbilityManager() {
+    private SuperSkillManagerImpl getSuperAbilityManager() {
         return mmoPlayer.getSuperAbilityManager();
         return mmoPlayer.getSuperAbilityManager();
     }
     }
 
 

+ 3 - 2
src/main/java/com/gmail/nossr50/util/input/SuperAbilityManager.java → src/main/java/com/gmail/nossr50/util/input/SuperSkillManagerImpl.java

@@ -19,6 +19,7 @@ import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.sounds.SoundType;
+import com.neetgames.mcmmo.player.SuperSkillManager;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.NotNull;
@@ -26,7 +27,7 @@ import org.jetbrains.annotations.NotNull;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
-public class SuperAbilityManager {
+public class SuperSkillManagerImpl implements SuperSkillManager {
 
 
     private final McMMOPlayer mmoPlayer;
     private final McMMOPlayer mmoPlayer;
     private final Player player;
     private final Player player;
@@ -39,7 +40,7 @@ public class SuperAbilityManager {
     private final Map<AbilityToolType, Boolean> toolMode = new HashMap<>();
     private final Map<AbilityToolType, Boolean> toolMode = new HashMap<>();
     private final MMOPlayerData mmoPlayerData;
     private final MMOPlayerData mmoPlayerData;
 
 
-    public SuperAbilityManager(@NotNull McMMOPlayer mmoPlayer, @NotNull MMOPlayerData mmoPlayerData) {
+    public SuperSkillManagerImpl(@NotNull McMMOPlayer mmoPlayer, @NotNull MMOPlayerData mmoPlayerData) {
         this.mmoPlayer = mmoPlayer;
         this.mmoPlayer = mmoPlayer;
         this.mmoPlayerData = mmoPlayerData;
         this.mmoPlayerData = mmoPlayerData;
         this.player = Misc.adaptPlayer(mmoPlayer);
         this.player = Misc.adaptPlayer(mmoPlayer);

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

@@ -2,8 +2,7 @@ package com.gmail.nossr50.util.player;
 
 
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.neetgames.mcmmo.party.Party;
 import com.neetgames.mcmmo.party.Party;
-import com.gmail.nossr50.datatypes.party.PartyFeature;
-import com.gmail.nossr50.datatypes.party.PartyMember;
+import com.gmail.nossr50.party.PartyFeature;
 import org.bukkit.Bukkit;
 import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
 import org.bukkit.ChatColor;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;

+ 1 - 1
src/main/java/com/gmail/nossr50/util/text/StringUtils.java

@@ -1,6 +1,6 @@
 package com.gmail.nossr50.util.text;
 package com.gmail.nossr50.util.text;
 
 
-import com.gmail.nossr50.datatypes.party.PartyFeature;
+import com.gmail.nossr50.party.PartyFeature;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.block.data.Ageable;
 import org.bukkit.block.data.Ageable;