Преглед изворни кода

annotate messaging classes + update more things to use mmoPlayer

nossr50 пре 4 година
родитељ
комит
8491d0f4e5

+ 3 - 0
Changelog.txt

@@ -3,6 +3,9 @@ Version 2.2.000
     Parts of the API have been migrated to mcMMO-API
     (API) mcMMO makes use of jmal (Java Minecraft Abstraction Library) for some abstraction now
 
+    Codebase Stuff
+        Many places that passed type Player now passes type McMMOPlayer instead
+
     New Skill - Tridents
     New Skill - Crossbows
 

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

@@ -43,7 +43,7 @@ public class ExcavationCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         ExcavationManager excavationManager = mmoPlayer.getExcavationManager();
@@ -67,7 +67,7 @@ public class ExcavationCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.EXCAVATION);

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

@@ -107,7 +107,7 @@ public class FishingCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
         
         if (canFishermansDiet) {
@@ -152,7 +152,7 @@ public class FishingCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.FISHING);

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

@@ -77,7 +77,7 @@ public class MiningCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canBiggerBombs) {
@@ -111,7 +111,7 @@ public class MiningCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.MINING);

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

@@ -91,7 +91,7 @@ public class RepairCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         if (canArcaneForge) {
@@ -122,7 +122,7 @@ public class RepairCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.REPAIR);

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

@@ -36,7 +36,7 @@ public class SalvageCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
         SalvageManager salvageManager = mmoPlayer.getSalvageManager();
 
@@ -65,7 +65,7 @@ public class SalvageCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.SALVAGE);

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

@@ -67,7 +67,7 @@ public abstract class SkillCommand implements TabExecutor {
         }
 
         if (args.length == 0) {
-            Player player = (Player) sender;
+            Player player = mmoPlayer.getPlayer();
 
             boolean isLucky = Permissions.lucky(player, skill);
             boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
@@ -79,7 +79,7 @@ public abstract class SkillCommand implements TabExecutor {
                     player.sendMessage("");
                 }
 
-            permissionsCheck(player);
+            permissionsCheck(mmoPlayer);
             dataCalculations(mmoPlayer, skillValue);
 
             sendSkillCommandHeader(player, mmoPlayer, (int) skillValue);
@@ -209,7 +209,7 @@ public abstract class SkillCommand implements TabExecutor {
     }
 
     @Override
-    public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
+    public @NotNull List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
         if (args.length == 1) {
             return ImmutableList.of("?");
         }
@@ -220,11 +220,11 @@ public abstract class SkillCommand implements TabExecutor {
         return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
     }
 
-    protected String[] getAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkill) {
+    protected @NotNull String[] getAbilityDisplayValues(@NotNull SkillActivationType skillActivationType, @NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkill) {
         return RandomChanceUtil.calculateAbilityDisplayValues(skillActivationType, mmoPlayer.getPlayer(), subSkill);
     }
 
-    protected String[] calculateLengthDisplayValues(@NotNull McMMOPlayer mmoPlayer, float skillValue) {
+    protected @NotNull String[] calculateLengthDisplayValues(@NotNull McMMOPlayer mmoPlayer, float skillValue) {
         int maxLength = skill.getSuperAbilityType().getMaxLength();
         int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
         int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
@@ -248,12 +248,12 @@ public abstract class SkillCommand implements TabExecutor {
         return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
     }
 
-    protected String getStatMessage(SubSkillType subSkillType, String... vars)
+    protected @NotNull String getStatMessage(SubSkillType subSkillType, String... vars)
     {
         return getStatMessage(false, false, subSkillType, vars);
     }
 
-    protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars)
+    protected @NotNull String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars)
     {
         String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
         String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
@@ -277,13 +277,13 @@ public abstract class SkillCommand implements TabExecutor {
 
     protected abstract void dataCalculations(@NotNull McMMOPlayer mmoPlayer, float skillValue);
 
-    protected abstract void permissionsCheck(@NotNull Player player);
+    protected abstract void permissionsCheck(@NotNull McMMOPlayer mmoPlayer);
 
     //protected abstract List<String> effectsDisplay();
 
-    protected abstract List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky);
+    protected abstract @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky);
 
-    protected abstract List<Component> getTextComponents(@NotNull McMMOPlayer player);
+    protected abstract @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer player);
 
     /**
      * Checks if a player can use a skill

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

@@ -61,7 +61,7 @@ public class SmeltingCommand extends SkillCommand {
     }
 
     @Override
-    protected List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
+    protected @NotNull List<String> statsDisplay(@NotNull McMMOPlayer mmoPlayer, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<>();
 
         /*if (canFluxMine) {
@@ -88,7 +88,7 @@ public class SmeltingCommand extends SkillCommand {
     }
 
     @Override
-    protected List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
+    protected @NotNull List<Component> getTextComponents(@NotNull McMMOPlayer mmoPlayer) {
         List<Component> textComponents = new ArrayList<>();
 
         TextComponentFactory.getSubSkillTextComponents(mmoPlayer, textComponents, PrimarySkillType.SMELTING);

+ 6 - 1
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -38,15 +38,20 @@ import net.kyori.adventure.identity.Identity;
 import org.bukkit.Location;
 import org.bukkit.entity.Player;
 import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.permissions.Permissible;
+import org.bukkit.permissions.Permission;
+import org.bukkit.permissions.PermissionAttachment;
+import org.bukkit.permissions.PermissionAttachmentInfo;
 import org.bukkit.plugin.Plugin;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 
-public class McMMOPlayer extends PlayerProfile implements Identified {
+public class McMMOPlayer extends PlayerProfile implements Identified, Permissible {
     private final @NotNull Player player;
     private final @NotNull Identity identity;
     private @Nullable Party playerPartyRef;

+ 4 - 2
src/main/java/com/gmail/nossr50/datatypes/skills/subskills/interfaces/SubSkill.java

@@ -1,8 +1,10 @@
 package com.gmail.nossr50.datatypes.skills.subskills.interfaces;
 
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.interfaces.Skill;
 import net.kyori.adventure.text.TextComponent;
 import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
 
 public interface SubSkill extends Skill {
     /**
@@ -59,9 +61,9 @@ public interface SubSkill extends Skill {
     /**
      * Adds detailed stats specific to this skill
      * @param componentBuilder target component builder
-     * @param player owner of this skill
+     * @param mmoPlayer owner of this skill
      */
-    void addStats(TextComponent.Builder componentBuilder, Player player);
+    void addStats(TextComponent.Builder componentBuilder, @NotNull McMMOPlayer mmoPlayer);
 
     /**
      * Whether or not this subskill is enabled

+ 29 - 19
src/main/java/com/gmail/nossr50/util/player/NotificationManager.java

@@ -25,6 +25,7 @@ import org.bukkit.Server;
 import org.bukkit.SoundCategory;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
 
 public class NotificationManager {
     /**
@@ -34,9 +35,11 @@ public class NotificationManager {
      * @param notificationType notifications defined type
      * @param key the locale key for the notifications defined message
      */
-    public static void sendPlayerInformation(Player player, NotificationType notificationType, String key)
+    public static void sendPlayerInformation(@NotNull Player player, @NotNull NotificationType notificationType, @NotNull String key)
     {
-        if(mcMMO.getUserManager().queryPlayer(player) == null || !mcMMO.getUserManager().queryPlayer(player).hasSkillChatNotifications())
+        McMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+
+        if(mmoPlayer == null || !mmoPlayer.hasSkillChatNotifications())
             return;
 
         McMMOMessageType destination = AdvancedConfig.getInstance().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM;
@@ -48,40 +51,47 @@ public class NotificationManager {
     }
 
 
-    public static boolean doesPlayerUseNotifications(Player player)
+    public static boolean doesPlayerUseNotifications(@NotNull Player player)
     {
-        if(mcMMO.getUserManager().queryPlayer(player) == null)
+        McMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+
+        if(mmoPlayer == null)
             return false;
         else
-            return mcMMO.getUserManager().queryPlayer(player).hasSkillChatNotifications();
+            return mmoPlayer.hasSkillChatNotifications();
     }
 
     /**
      * Sends players notifications from mcMMO
      * This does this by sending out an event so other plugins can cancel it
      * This event in particular is provided with a source player, and players near the source player are sent the information
+     *
      * @param targetPlayer the recipient player for this message
      * @param notificationType type of notification
      * @param key Locale Key for the string to use with this event
      * @param values values to be injected into the locale string
      */
-    public static void sendNearbyPlayersInformation(Player targetPlayer, NotificationType notificationType, String key, String... values)
+    public static void sendNearbyPlayersInformation(@NotNull Player targetPlayer, @NotNull NotificationType notificationType, @NotNull String key, String... values)
     {
         sendPlayerInformation(targetPlayer, notificationType, key, values);
     }
 
-    public static void sendPlayerInformationChatOnly(Player player, String key, String... values)
+    public static void sendPlayerInformationChatOnly(@NotNull Player player, @NotNull String key, String... values)
     {
-        if(mcMMO.getUserManager().queryPlayer(player) == null || !mcMMO.getUserManager().queryPlayer(player).hasSkillChatNotifications())
+        McMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+
+        if(mmoPlayer == null || !mmoPlayer.hasSkillChatNotifications())
             return;
 
         String preColoredString = LocaleLoader.getString(key, (Object[]) values);
         player.sendMessage(preColoredString);
     }
 
-    public static void sendPlayerInformationChatOnlyPrefixed(Player player, String key, String... values)
+    public static void sendPlayerInformationChatOnlyPrefixed(@NotNull Player player, @NotNull String key, String... values)
     {
-        if(mcMMO.getUserManager().queryPlayer(player) == null || !mcMMO.getUserManager().queryPlayer(player).hasSkillChatNotifications())
+        McMMOPlayer mmoPlayer = mcMMO.getUserManager().queryPlayer(player);
+
+        if(mmoPlayer == null || !mmoPlayer.hasSkillChatNotifications())
             return;
 
         String preColoredString = LocaleLoader.getString(key, (Object[]) values);
@@ -89,7 +99,7 @@ public class NotificationManager {
         player.sendMessage(prefixFormattedMessage);
     }
 
-    public static void sendPlayerInformation(Player player, NotificationType notificationType, String key, String... values)
+    public static void sendPlayerInformation(@NotNull Player player, @NotNull NotificationType notificationType, @NotNull String key, String... values)
     {
         if(mcMMO.getUserManager().queryPlayer(player) == null || !mcMMO.getUserManager().queryPlayer(player).hasSkillChatNotifications())
             return;
@@ -102,7 +112,7 @@ public class NotificationManager {
         sendNotification(player, customEvent);
     }
 
-    private static void sendNotification(Player player, McMMOPlayerNotificationEvent customEvent) {
+    private static void sendNotification(@NotNull Player player, @NotNull McMMOPlayerNotificationEvent customEvent) {
         if (customEvent.isCancelled())
             return;
 
@@ -152,7 +162,7 @@ public class NotificationManager {
         sendNotification(mmoPlayer.getPlayer(), customEvent);
     }
 
-    public static void broadcastTitle(Server server, String title, String subtitle, int i1, int i2, int i3)
+    public static void broadcastTitle(@NotNull Server server, @NotNull String title, @NotNull String subtitle, int i1, int i2, int i3)
     {
         for(Player player : server.getOnlinePlayers())
         {
@@ -160,13 +170,13 @@ public class NotificationManager {
         }
     }
 
-    public static void sendPlayerUnlockNotification(McMMOPlayer mmoPlayer, SubSkillType subSkillType)
+    public static void sendPlayerUnlockNotification(@NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkillType)
     {
         if(!mmoPlayer.hasSkillChatNotifications())
             return;
 
         //CHAT MESSAGE
-        mcMMO.getAudiences().player(mmoPlayer.getPlayer()).sendMessage(Identity.nil(), TextComponentFactory.getSubSkillUnlockedNotificationComponents(mmoPlayer.getPlayer(), subSkillType));
+        mcMMO.getAudiences().player(mmoPlayer.getPlayer()).sendMessage(Identity.nil(), TextComponentFactory.getSubSkillUnlockedNotificationComponents(mmoPlayer, subSkillType));
 
         //Unlock Sound Effect
         SoundManager.sendCategorizedSound(mmoPlayer.getPlayer(), mmoPlayer.getPlayer().getLocation(), SoundType.SKILL_UNLOCKED, SoundCategory.MASTER);
@@ -184,7 +194,7 @@ public class NotificationManager {
      * Admins are currently players with either Operator status or Admin Chat permission
      * @param msg message fetched from locale
      */
-    private static void sendAdminNotification(String msg) {
+    private static void sendAdminNotification(@NotNull String msg) {
         //If its not enabled exit
         if(!Config.getInstance().adminNotifications())
             return;
@@ -206,7 +216,7 @@ public class NotificationManager {
      * @param commandSender target command sender
      * @param msg message fetched from locale
      */
-    private static void sendAdminCommandConfirmation(CommandSender commandSender, String msg) {
+    private static void sendAdminCommandConfirmation(@NotNull CommandSender commandSender, @NotNull String msg) {
         commandSender.sendMessage(LocaleLoader.getString("Notifications.Admin.Format.Self", msg));
     }
 
@@ -215,7 +225,7 @@ public class NotificationManager {
      * @param commandSender the command user
      * @param sensitiveCommandType type of command issued
      */
-    public static void processSensitiveCommandNotification(CommandSender commandSender, SensitiveCommandType sensitiveCommandType, String... args) {
+    public static void processSensitiveCommandNotification(@NotNull CommandSender commandSender, @NotNull SensitiveCommandType sensitiveCommandType, String... args) {
         /*
          * Determine the 'identity' of the one who executed the command to pass as a parameters
          */
@@ -247,7 +257,7 @@ public class NotificationManager {
      * @param existingArray the existing array to be copied to the new array at position [0]+1 relative to their original index
      * @return the new array combining itemToAdd at the start and existing array elements following while retaining their order
      */
-    public static String[] addItemToFirstPositionOfArray(String itemToAdd, String... existingArray) {
+    public static @NotNull String[] addItemToFirstPositionOfArray(@NotNull String itemToAdd, @NotNull String... existingArray) {
         String[] newArray = new String[existingArray.length + 1];
         newArray[0] = itemToAdd;
 

+ 3 - 2
src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java

@@ -1,6 +1,7 @@
 package com.gmail.nossr50.util.random;
 
 import com.gmail.nossr50.config.AdvancedConfig;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
@@ -327,7 +328,7 @@ public class RandomChanceUtil
         return displayValues;
     }
 
-    public static String[] calculateAbilityDisplayValuesStatic(Player player, PrimarySkillType primarySkillType, double chance) {
+    public static String[] calculateAbilityDisplayValuesStatic(@NotNull McMMOPlayer mmoPlayer, PrimarySkillType primarySkillType, double chance) {
         RandomChanceStatic rcs = new RandomChanceStatic(chance, false);
         double successChance = getRandomChanceExecutionChance(rcs);
 
@@ -336,7 +337,7 @@ public class RandomChanceUtil
 
         String[] displayValues = new String[2];
 
-        boolean isLucky = Permissions.lucky(player, primarySkillType);
+        boolean isLucky = Permissions.lucky(mmoPlayer.getPlayer(), primarySkillType);
 
         displayValues[0] = percent.format(Math.min(successChance, 100.0D) / 100.0D);
         displayValues[1] = isLucky ? percent.format(Math.min(successChance_lucky, 100.0D) / 100.0D) : null;

+ 60 - 63
src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java

@@ -4,6 +4,7 @@ import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.RankConfig;
 import com.gmail.nossr50.datatypes.json.McMMOUrl;
 import com.gmail.nossr50.datatypes.json.McMMOWebLinks;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
@@ -38,31 +39,31 @@ public class TextComponentFactory {
      * Makes a text component using strings from a locale and supports passing an undefined number of variables to the LocaleLoader
      * @param localeKey target locale string address
      * @param values vars to be passed to the locale loader
+     *
      * @return
      */
-    public static TextComponent getNotificationMultipleValues(String localeKey, String... values)
+    public static TextComponent getNotificationMultipleValues(@NotNull String localeKey, String... values)
     {
         String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values);
         return Component.text(preColoredString);
     }
 
-    public static Component getNotificationTextComponentFromLocale(String localeKey)
+    public static Component getNotificationTextComponentFromLocale(@NotNull String localeKey)
     {
         return getNotificationTextComponent(LocaleLoader.getString(localeKey));
     }
 
-    public static Component getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel)
+    public static Component getNotificationLevelUpTextComponent(@NotNull PrimarySkillType skill, int levelsGained, int currentLevel)
     {
         return Component.text(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+ StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel));
     }
 
-    private static TextComponent getNotificationTextComponent(String text)
+    private static TextComponent getNotificationTextComponent(@NotNull String text)
     {
-        //textComponent.setColor(getNotificationColor(notificationType));
         return Component.text(text);
     }
 
-    public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted)
+    public static void sendPlayerSubSkillWikiLink(McMMOPlayer mmoPlayer, String subskillformatted)
     {
         if(!Config.getInstance().getUrlLinksEnabled())
             return;
@@ -78,10 +79,10 @@ public class TextComponentFactory {
 
         wikiLinkComponent.hoverEvent(HoverEvent.showText(componentBuilder.build()));
 
-        mcMMO.getAudiences().player(player).sendMessage(Identity.nil(), wikiLinkComponent, MessageType.SYSTEM);
+        mcMMO.getAudiences().player(mmoPlayer.getPlayer()).sendMessage(Identity.nil(), wikiLinkComponent, MessageType.SYSTEM);
     }
 
-    public static void sendPlayerUrlHeader(Player player) {
+    public static void sendPlayerUrlHeader(@NotNull McMMOPlayer mmoPlayer) {
         TextComponent prefix = Component.text(LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Prefix") + " ");
         /*prefix.setColor(ChatColor.DARK_AQUA);*/
         TextComponent suffix = Component.text(" "+LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix"));
@@ -89,7 +90,7 @@ public class TextComponentFactory {
 
         TextComponent emptySpace = Component.space();
 
-        mcMMO.getAudiences().player(player).sendMessage(Identity.nil(),TextComponent.ofChildren(
+        mcMMO.getAudiences().player(mmoPlayer.getPlayer()).sendMessage(Identity.nil(),TextComponent.ofChildren(
           prefix,
           getWebLinkTextComponent(McMMOWebLinks.WEBSITE),
           emptySpace,
@@ -135,7 +136,7 @@ public class TextComponentFactory {
         }
     }
 
-    private static Component getWebLinkTextComponent(McMMOWebLinks webLinks)
+    private static Component getWebLinkTextComponent(@NotNull McMMOWebLinks webLinks)
     {
         TextComponent.Builder webTextComponent;
 
@@ -181,7 +182,7 @@ public class TextComponentFactory {
         return webTextComponent.build();
     }
 
-    private static Component getUrlHoverEvent(McMMOWebLinks webLinks)
+    private static Component getUrlHoverEvent(@NotNull McMMOWebLinks webLinks)
     {
         TextComponent.Builder componentBuilder = Component.text().content(webLinks.getNiceTitle());
 
@@ -230,7 +231,7 @@ public class TextComponentFactory {
         return componentBuilder.build();
     }
 
-    private static void addUrlHeaderHover(McMMOWebLinks webLinks, TextComponent.Builder componentBuilder) {
+    private static void addUrlHeaderHover(@NotNull McMMOWebLinks webLinks, @NotNull TextComponent.Builder componentBuilder) {
         componentBuilder.append(Component.newline());
         componentBuilder.append(Component.text(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC));
     }
@@ -240,17 +241,17 @@ public class TextComponentFactory {
         return ClickEvent.openUrl(url);
     }
 
-    private static Component getSubSkillTextComponent(Player player, SubSkillType subSkillType)
+    private static Component getSubSkillTextComponent(@NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkillType)
     {
         //Get skill name
         String skillName = subSkillType.getLocaleName();
 
-        boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType);
+        boolean skillUnlocked = RankUtils.hasUnlockedSubskill(mmoPlayer, subSkillType);
 
-        TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked);
+        TextComponent.Builder textComponent = initNewSkillTextComponent(mmoPlayer, skillName, subSkillType, skillUnlocked);
 
         //Hover Event
-        TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType));
+        TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(mmoPlayer, subSkillType));
 
         //Insertion
         textComponent.insertion(skillName);
@@ -258,7 +259,7 @@ public class TextComponentFactory {
         return textComponent.build();
     }
 
-    private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill)
+    private static TextComponent getSubSkillTextComponent(@NotNull McMMOPlayer mmoPlayer, @NotNull AbstractSubSkill abstractSubSkill)
     {
         //String key = abstractSubSkill.getConfigKeyName();
         String skillName = abstractSubSkill.getNiceName();
@@ -266,12 +267,12 @@ public class TextComponentFactory {
         //Setup Text Component
         SubSkillType subSkillType = abstractSubSkill.getSubSkillType();
 
-        boolean skillUnlocked = RankUtils.hasUnlockedSubskill(player, subSkillType);
+        boolean skillUnlocked = RankUtils.hasUnlockedSubskill(mmoPlayer, subSkillType);
 
-        TextComponent.Builder textComponent = initNewSkillTextComponent(player, skillName, subSkillType, skillUnlocked);
+        TextComponent.Builder textComponent = initNewSkillTextComponent(mmoPlayer, skillName, subSkillType, skillUnlocked);
 
         //Hover Event
-        TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill));
+        TextUtils.addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(mmoPlayer, abstractSubSkill));
 
         //Insertion
         textComponent.insertion(skillName);
@@ -279,10 +280,10 @@ public class TextComponentFactory {
         return textComponent.build();
     }
 
-    private static TextComponent.Builder initNewSkillTextComponent(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) {
+    private static TextComponent.Builder initNewSkillTextComponent(@NotNull McMMOPlayer mmoPlayer, @NotNull String skillName, @NotNull SubSkillType subSkillType, boolean skillUnlocked) {
         TextComponent.Builder textComponent;
         if (skillUnlocked) {
-            if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1)
+            if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(mmoPlayer, subSkillType) && subSkillType.getNumRanks() > 1)
                 textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName));
             else
                 textComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.SkillName", skillName));
@@ -298,35 +299,29 @@ public class TextComponentFactory {
         return textComponent;
     }
 
-    private static Component getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill)
+    private static Component getSubSkillHoverComponent(@NotNull McMMOPlayer mmoPlayer, @NotNull AbstractSubSkill abstractSubSkill)
     {
-        return getSubSkillHoverEventJSON(abstractSubSkill, player);
+        return getSubSkillHoverEventJSON(abstractSubSkill, mmoPlayer);
     }
 
-    private static Component getSubSkillHoverComponent(Player player, SubSkillType subSkillType)
+    private static Component getSubSkillHoverComponent(@NotNull McMMOPlayer mmoPlayer, SubSkillType subSkillType)
     {
-        return getSubSkillHoverEventJSON(subSkillType, player);
+        return getSubSkillHoverEventJSON(subSkillType, mmoPlayer);
     }
 
     /**
      * Used for the skill in the new skill system (Deriving from AbstractSubSkill)
      * @param abstractSubSkill this subskill
-     * @param player the player who owns this subskill
+     * @param mmoPlayer the player who owns this subskill
      * @return the hover basecomponent object for this subskill
      */
-    private static Component getSubSkillHoverEventJSON(AbstractSubSkill abstractSubSkill, Player player)
+    private static Component getSubSkillHoverEventJSON(@NotNull AbstractSubSkill abstractSubSkill, @NotNull McMMOPlayer mmoPlayer)
     {
         String skillName = abstractSubSkill.getNiceName();
 
         /*
          * Hover Event BaseComponent color table
          */
-        TextColor ccSubSkillHeader      = NamedTextColor.GOLD;
-        TextColor ccRank                = NamedTextColor.BLUE;
-        TextColor ccCurRank             = NamedTextColor.GREEN;
-        TextColor ccPossessive          = NamedTextColor.WHITE;
-        //ChatColor ccDescriptionHeader   = ChatColor.DARK_PURPLE;
-        //ChatColor ccDescription         = ChatColor.WHITE;
         TextColor ccLocked              = NamedTextColor.DARK_GRAY;
         TextColor ccLevelRequirement    = NamedTextColor.BLUE;
         TextColor ccLevelRequired       = NamedTextColor.RED;
@@ -334,9 +329,9 @@ public class TextComponentFactory {
         SubSkillType subSkillType = abstractSubSkill.getSubSkillType();
 
         //SubSkillType Name
-        TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill));
+        TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(mmoPlayer, skillName, subSkillType, RankUtils.hasUnlockedSubskill(mmoPlayer, abstractSubSkill));
 
-        if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill))
+        if(!RankUtils.hasUnlockedSubskill(mmoPlayer, abstractSubSkill))
         {
             //Skill is not unlocked yet
             addLocked(abstractSubSkill, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
@@ -344,7 +339,7 @@ public class TextComponentFactory {
             addSubSkillTypeToHoverEventJSON(abstractSubSkill, componentBuilder);
 
             //RANK
-            int curRank = RankUtils.getRank(player, abstractSubSkill);
+            int curRank = RankUtils.getRank(mmoPlayer, abstractSubSkill);
             int nextRank = 0;
 
             if(curRank < abstractSubSkill.getNumRanks() && abstractSubSkill.getNumRanks() > 0)
@@ -352,7 +347,7 @@ public class TextComponentFactory {
                 nextRank = RankUtils.getRankUnlockLevel(abstractSubSkill, curRank+1);
             }
 
-            addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill), nextRank);
+            addRanked(componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(mmoPlayer, abstractSubSkill), nextRank);
 
             componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader")));
             componentBuilder.append(Component.newline()).append(Component.text(abstractSubSkill.getDescription())).append(Component.newline());
@@ -362,16 +357,16 @@ public class TextComponentFactory {
             componentBuilder.append(Component.newline());
 
             //Finally, add details to the tooltip
-            abstractSubSkill.addStats(componentBuilder, player);
+            abstractSubSkill.addStats(componentBuilder, mmoPlayer);
         }
 
         return componentBuilder.build();
     }
 
-    private static TextComponent.Builder setupSkillComponentNameStyle(Player player, String skillName, SubSkillType subSkillType, boolean skillUnlocked) {
+    private static TextComponent.Builder setupSkillComponentNameStyle(@NotNull McMMOPlayer mmoPlayer, @NotNull String skillName, @NotNull SubSkillType subSkillType, boolean skillUnlocked) {
         TextComponent.Builder componentBuilder;
         if (skillUnlocked) {
-            if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(player, subSkillType) && subSkillType.getNumRanks() > 1)
+            if (RankUtils.getHighestRank(subSkillType) == RankUtils.getRank(mmoPlayer, subSkillType) && subSkillType.getNumRanks() > 1)
                 componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.MaxRankSkillName", skillName));
             else
                 componentBuilder = getNewComponentBuilder(LocaleLoader.getString("JSON.Hover.SkillName", skillName));
@@ -381,13 +376,13 @@ public class TextComponentFactory {
         return componentBuilder;
     }
 
-    private static TextComponent.Builder getNewComponentBuilder(String skillName) {
+    private static TextComponent.Builder getNewComponentBuilder(@NotNull String skillName) {
         TextComponent.Builder componentBuilder = Component.text().content(skillName);
         componentBuilder.append(Component.newline());
         return componentBuilder;
     }
 
-    private static void addRanked(TextColor ccRank, TextColor ccCurRank, TextColor ccPossessive, TextColor ccNumRanks, TextComponent.Builder componentBuilder, int numRanks, int rank, int nextRank) {
+    private static void addRanked(@NotNull TextComponent.Builder componentBuilder, int numRanks, int rank, int nextRank) {
         if (numRanks > 0) {
             //Rank: x
             componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Hover.Rank", String.valueOf(rank)))).append(Component.newline());
@@ -395,32 +390,34 @@ public class TextComponentFactory {
             //Next Rank: x
             if(nextRank > rank)
                 componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Hover.NextRank", String.valueOf(nextRank)))).append(Component.newline());
-
-            /*componentBuilder.append(" " + LocaleLoader.getString("JSON.RankPossesive") + " ").color(ccPossessive);
-            componentBuilder.append(String.valueOf(numRanks)).color(ccNumRanks);*/
         }
     }
 
-    private static void addLocked(SubSkillType subSkillType, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) {
+    private static void addLocked(@NotNull SubSkillType subSkillType, @NotNull TextColor ccLocked, @NotNull TextColor ccLevelRequirement,
+                                  @NotNull TextColor ccLevelRequired, @NotNull TextComponent.Builder componentBuilder) {
         addLocked(ccLocked, ccLevelRequirement, componentBuilder);
         componentBuilder.append(Component.text(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1)), ccLevelRequired));
         //componentBuilder.append(Component.newline());
     }
 
-    private static void addLocked(AbstractSubSkill abstractSubSkill, TextColor ccLocked, TextColor ccLevelRequirement, TextColor ccLevelRequired, TextComponent.Builder componentBuilder) {
+    private static void addLocked(@NotNull AbstractSubSkill abstractSubSkill, @NotNull TextColor ccLocked,
+                                  @NotNull TextColor ccLevelRequirement, @NotNull TextColor ccLevelRequired,
+                                  @NotNull TextComponent.Builder componentBuilder) {
         addLocked(ccLocked, ccLevelRequirement, componentBuilder);
         componentBuilder.append(Component.text(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1)), ccLevelRequired));
         //componentBuilder.append(Component.newline());
     }
 
-    private static void addLocked(TextColor ccLocked, TextColor ccLevelRequirement, TextComponent.Builder componentBuilder) {
+    private static void addLocked(@NotNull TextColor ccLocked,
+                                  @NotNull TextColor ccLevelRequirement,
+                                  @NotNull TextComponent.Builder componentBuilder) {
         componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Locked"), ccLocked, TextDecoration.BOLD));
         componentBuilder.append(Component.newline()).append(Component.newline());
         componentBuilder.append(Component.text(LocaleLoader.getString("JSON.LevelRequirement") + ": ", ccLevelRequirement));
     }
 
     @Deprecated
-    private static Component getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player)
+    private static @NotNull Component getSubSkillHoverEventJSON(@NotNull SubSkillType subSkillType, @NotNull McMMOPlayer mmoPlayer)
     {
         String skillName = subSkillType.getLocaleName();
 
@@ -438,9 +435,9 @@ public class TextComponentFactory {
         TextColor ccLevelRequired       = NamedTextColor.RED;
 
         //SubSkillType Name
-        TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType));
+        TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(mmoPlayer, skillName, subSkillType, RankUtils.hasUnlockedSubskill(mmoPlayer, subSkillType));
 
-        if(!RankUtils.hasUnlockedSubskill(player, subSkillType))
+        if(!RankUtils.hasUnlockedSubskill(mmoPlayer, subSkillType))
         {
             //Skill is not unlocked yet
             addLocked(subSkillType, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
@@ -450,7 +447,7 @@ public class TextComponentFactory {
             //RANK
             if(subSkillType.getNumRanks() > 0)
             {
-                int curRank = RankUtils.getRank(player, subSkillType);
+                int curRank = RankUtils.getRank(mmoPlayer, subSkillType);
                 int nextRank = 0;
 
                 if(curRank < subSkillType.getNumRanks())
@@ -458,7 +455,7 @@ public class TextComponentFactory {
                     nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1);
                 }
 
-                addRanked(ccRank, ccCurRank, ccPossessive, ccCurRank, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType), nextRank);
+                addRanked(componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(mmoPlayer, subSkillType), nextRank);
 
             }
 
@@ -473,7 +470,7 @@ public class TextComponentFactory {
         return componentBuilder.build();
     }
 
-    private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, TextComponent.Builder componentBuilder)
+    private static void addSubSkillTypeToHoverEventJSON(@NotNull AbstractSubSkill abstractSubSkill, @NotNull TextComponent.Builder componentBuilder)
     {
         if(abstractSubSkill.isSuperAbility())
         {
@@ -488,7 +485,7 @@ public class TextComponentFactory {
         componentBuilder.append(Component.newline());
     }
 
-    public static void getSubSkillTextComponents(Player player, List<Component> textComponents, PrimarySkillType parentSkill) {
+    public static void getSubSkillTextComponents(@NotNull McMMOPlayer mmoPlayer, @NotNull List<Component> textComponents, @NotNull PrimarySkillType parentSkill) {
         for(SubSkillType subSkillType : SubSkillType.values())
         {
             if(subSkillType.getParentSkill() == parentSkill)
@@ -498,10 +495,10 @@ public class TextComponentFactory {
                 if(subSkillType == SubSkillType.FISHING_MASTER_ANGLER && mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() == null)
                     continue;
 
-                if(Permissions.isSubSkillEnabled(player, subSkillType))
+                if(Permissions.isSubSkillEnabled(mmoPlayer, subSkillType))
                 {
                     if(!InteractionManager.hasSubSkill(subSkillType))
-                        textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, subSkillType));
+                        textComponents.add(TextComponentFactory.getSubSkillTextComponent(mmoPlayer, subSkillType));
                 }
             }
         }
@@ -511,16 +508,16 @@ public class TextComponentFactory {
         {
             if(abstractSubSkill.getPrimarySkill() == parentSkill)
             {
-                if(Permissions.isSubSkillEnabled(player, abstractSubSkill))
-                    textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, abstractSubSkill));
+                if(Permissions.isSubSkillEnabled(mmoPlayer, abstractSubSkill))
+                    textComponents.add(TextComponentFactory.getSubSkillTextComponent(mmoPlayer, abstractSubSkill));
             }
         }
     }
 
-    public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, SubSkillType subSkillType)
+    public static @NotNull TextComponent getSubSkillUnlockedNotificationComponents(@NotNull McMMOPlayer mmoPlayer, @NotNull SubSkillType subSkillType)
     {
-        TextComponent.Builder unlockMessage = Component.text().content(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), RankUtils.getRank(player, subSkillType)));
-        unlockMessage.hoverEvent(HoverEvent.showText(getSubSkillHoverComponent(player, subSkillType)));
+        TextComponent.Builder unlockMessage = Component.text().content(LocaleLoader.getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(), RankUtils.getRank(mmoPlayer, subSkillType)));
+        unlockMessage.hoverEvent(HoverEvent.showText(getSubSkillHoverComponent(mmoPlayer, subSkillType)));
         unlockMessage.clickEvent(ClickEvent.runCommand("/"+subSkillType.getParentSkill().toString().toLowerCase(Locale.ENGLISH)));
         return unlockMessage.build();
     }