nossr50 1 年之前
父節點
當前提交
a54590576f

+ 5 - 0
Changelog.txt

@@ -1,3 +1,8 @@
+Version 2.1.225
+    Fixed various bugs with ability text
+    Updated Adventure dependencies
+    Added new API McMMOPlayerNotificationEvent.getPlayer
+
 Version 2.1.224
     Updated to a new build of ACF to fix NoSuchFieldException locale
     Improved Folia Support (Thanks HSGamer)

+ 40 - 17
pom.xml

@@ -2,7 +2,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.gmail.nossr50.mcMMO</groupId>
     <artifactId>mcMMO</artifactId>
-    <version>2.1.225-SNAPSHOT</version>
+    <version>2.1.225</version>
     <name>mcMMO</name>
     <url>https://github.com/mcMMO-Dev/mcMMO</url>
     <scm>
@@ -150,21 +150,20 @@
                             <include>net.kyori:examination-api</include>
                             <include>net.kyori:examination-string</include>
                             <include>net.kyori:adventure-text-serializer-legacy</include>
+                            <include>net.kyori:adventure-text-serializer-gson</include>
+                            <include>net.kyori:adventure-text-serializer-json</include>
                             <include>net.kyori:adventure-text-serializer-bungeecord</include>
                             <include>net.kyori:adventure-text-serializer-craftbukkit</include>
                             <include>net.kyori:adventure-text-serializer-gson-legacy-impl</include>
+                            <include>net.kyori:adventure-text-serializer-json-legacy-impl</include>
                             <include>co.aikar:acf-bukkit</include>
                             <include>com.tcoded:FoliaLib</include>
                         </includes>
                     </artifactSet>
                     <relocations>
                         <relocation>
-                            <pattern>net.kyori.examination</pattern>
-                            <shadedPattern>com.gmail.nossr50.mcmmo.kyori.examination</shadedPattern>
-                        </relocation>
-                        <relocation>
-                            <pattern>net.kyori.adventure</pattern>
-                            <shadedPattern>com.gmail.nossr50.mcmmo.kyori.adventure</shadedPattern>
+                            <pattern>net.kyori</pattern>
+                            <shadedPattern>com.gmail.nossr50.mcmmo.kyori</shadedPattern>
                         </relocation>
                         <relocation>
                             <pattern>co.aikar.commands</pattern>
@@ -269,41 +268,65 @@
             <artifactId>acf-bukkit</artifactId> <!-- Don't forget to replace this -->
             <version>0.5.1-SNAPSHOT</version> <!-- Replace this as well -->
         </dependency>
-<!--        adventure-api, adventure-text-serializer-gson, adventure-platform-bukkit-->
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-text-serializer-bungeecord</artifactId>
+            <version>4.3.1</version>
+        </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-text-serializer-gson</artifactId>
-            <version>4.13.0</version>
+            <version>4.14.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-text-serializer-gson-legacy-impl</artifactId>
+            <version>4.14.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-text-serializer-json</artifactId>
+            <version>4.14.0</version>
+        </dependency>
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-text-serializer-json-legacy-impl</artifactId>
+            <version>4.14.0</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-api</artifactId>
-            <version>4.13.0</version>
+            <version>4.14.0</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-nbt</artifactId>
-            <version>4.13.0</version>
+            <version>4.14.0</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-key</artifactId>
-            <version>4.13.0</version>
+            <version>4.14.0</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
-            <artifactId>adventure-text-serializer-gson-legacy-impl</artifactId>
-            <version>4.13.0</version>
+            <artifactId>adventure-platform-api</artifactId>
+            <version>4.3.1</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-platform-bukkit</artifactId>
-            <version>4.3.0</version>
+            <version>4.3.1</version>
         </dependency>
         <dependency>
             <groupId>net.kyori</groupId>
-            <artifactId>adventure-platform-api</artifactId>
-            <version>4.3.0</version>
+            <artifactId>adventure-platform-facet</artifactId>
+            <version>4.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-platform-viaversion</artifactId>
+            <version>4.3.1</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.scm</groupId>

+ 10 - 1
src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java

@@ -27,8 +27,13 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable {
     protected Component notificationTextComponent;
     protected final NotificationType notificationType;
 
-    public McMMOPlayerNotificationEvent(Player who, NotificationType notificationType, Component notificationTextComponent, McMMOMessageType chatMessageType, boolean isMessageAlsoBeingSentToChat) {
+    protected final Player player;
+
+    public McMMOPlayerNotificationEvent(Player player, NotificationType notificationType,
+                                        Component notificationTextComponent, McMMOMessageType chatMessageType,
+                                        boolean isMessageAlsoBeingSentToChat) {
         super(false);
+        this.player = player;
         this.notificationType = notificationType;
         this.notificationTextComponent = notificationTextComponent;
         this.chatMessageType = chatMessageType;
@@ -48,6 +53,10 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable {
         isMessageAlsoBeingSentToChat = messageAlsoBeingSentToChat;
     }
 
+    public Player getPlayer() {
+        return player;
+    }
+
     public Component getNotificationTextComponent() {
         return notificationTextComponent;
     }

+ 61 - 36
src/main/java/com/gmail/nossr50/util/player/NotificationManager.java

@@ -16,7 +16,6 @@ import com.gmail.nossr50.util.sounds.SoundType;
 import com.gmail.nossr50.util.text.McMMOMessageType;
 import com.gmail.nossr50.util.text.TextComponentFactory;
 import net.kyori.adventure.audience.Audience;
-import net.kyori.adventure.audience.MessageType;
 import net.kyori.adventure.identity.Identity;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.event.HoverEvent;
@@ -49,7 +48,9 @@ public class NotificationManager {
         if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications())
             return;
 
-        McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM;
+        McMMOMessageType destination
+                = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(notificationType)
+                ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM;
 
         Component message = TextComponentFactory.getNotificationTextComponentFromLocale(key);
         McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(player, notificationType, destination, message);
@@ -75,7 +76,8 @@ public class NotificationManager {
      * @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(Player targetPlayer, NotificationType notificationType, String key,
+                                                    String... values)
     {
         sendPlayerInformation(targetPlayer, notificationType, key, values);
     }
@@ -99,7 +101,8 @@ public class NotificationManager {
         player.sendMessage(prefixFormattedMessage);
     }
 
-    public static void sendPlayerInformation(Player player, NotificationType notificationType, String key, String... values)
+    public static void sendPlayerInformation(Player player, NotificationType notificationType, String key,
+                                             String... values)
     {
         if(UserManager.getPlayer(player) == null || !UserManager.getPlayer(player).useChatNotifications())
             return;
@@ -119,24 +122,28 @@ public class NotificationManager {
         final Audience audience = mcMMO.getAudiences().player(player);
 
         //If the message is being sent to the action bar we need to check if the copy if a copy is sent to the chat system
+        Component notificationTextComponent = customEvent.getNotificationTextComponent();
         if(customEvent.getChatMessageType() == McMMOMessageType.ACTION_BAR)
         {
-            audience.sendActionBar(customEvent.getNotificationTextComponent());
+            audience.sendActionBar(notificationTextComponent);
 
             if(customEvent.isMessageAlsoBeingSentToChat())
             {
                 //Send copy to chat system
-                audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM);
+                audience.sendMessage(notificationTextComponent);
             }
         } else {
-            audience.sendMessage(Identity.nil(), customEvent.getNotificationTextComponent(), MessageType.SYSTEM);
+            audience.sendMessage(notificationTextComponent);
         }
     }
 
-    private static McMMOPlayerNotificationEvent checkNotificationEvent(Player player, NotificationType notificationType, McMMOMessageType destination, Component message) {
+    private static McMMOPlayerNotificationEvent checkNotificationEvent(Player player, NotificationType notificationType,
+                                                                       McMMOMessageType destination,
+                                                                       Component message) {
         //Init event
         McMMOPlayerNotificationEvent customEvent = new McMMOPlayerNotificationEvent(player,
-                notificationType, message, destination, mcMMO.p.getAdvancedConfig().doesNotificationSendCopyToChat(notificationType));
+                notificationType, message, destination,
+                mcMMO.p.getAdvancedConfig().doesNotificationSendCopyToChat(notificationType));
 
         //Call event
         Bukkit.getServer().getPluginManager().callEvent(customEvent);
@@ -149,15 +156,23 @@ public class NotificationManager {
      * @param skillName skill that leveled up
      * @param newLevel new level of that skill
      */
-    public static void sendPlayerLevelUpNotification(McMMOPlayer mcMMOPlayer, PrimarySkillType skillName, int levelsGained, int newLevel)
+    public static void sendPlayerLevelUpNotification(McMMOPlayer mcMMOPlayer, PrimarySkillType skillName,
+                                                     int levelsGained, int newLevel)
     {
         if(!mcMMOPlayer.useChatNotifications())
             return;
 
-        McMMOMessageType destination = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE) ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM;
+        McMMOMessageType destination
+                = mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.LEVEL_UP_MESSAGE)
+                ? McMMOMessageType.ACTION_BAR : McMMOMessageType.SYSTEM;
 
-        Component levelUpTextComponent = TextComponentFactory.getNotificationLevelUpTextComponent(skillName, levelsGained, newLevel);
-        McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(mcMMOPlayer.getPlayer(), NotificationType.LEVEL_UP_MESSAGE, destination, levelUpTextComponent);
+        Component levelUpTextComponent = TextComponentFactory.getNotificationLevelUpTextComponent(
+                skillName, levelsGained, newLevel);
+        McMMOPlayerNotificationEvent customEvent = checkNotificationEvent(
+                mcMMOPlayer.getPlayer(),
+                NotificationType.LEVEL_UP_MESSAGE,
+                destination,
+                levelUpTextComponent);
 
         sendNotification(mcMMOPlayer.getPlayer(), customEvent);
     }
@@ -176,17 +191,12 @@ public class NotificationManager {
             return;
 
         //CHAT MESSAGE
-        mcMMO.getAudiences().player(mcMMOPlayer.getPlayer()).sendMessage(Identity.nil(), TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType));
+        mcMMO.getAudiences().player(mcMMOPlayer.getPlayer()).sendMessage(Identity.nil(),
+                TextComponentFactory.getSubSkillUnlockedNotificationComponents(mcMMOPlayer.getPlayer(), subSkillType));
 
         //Unlock Sound Effect
-        SoundManager.sendCategorizedSound(mcMMOPlayer.getPlayer(), mcMMOPlayer.getPlayer().getLocation(), SoundType.SKILL_UNLOCKED, SoundCategory.MASTER);
-
-        //ACTION BAR MESSAGE
-        /*if(mcMMO.p.getAdvancedConfig().doesNotificationUseActionBar(NotificationType.SUBSKILL_UNLOCKED))
-            mcMMOPlayer.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(LocaleLoader.getString("JSON.SkillUnlockMessage",
-                    subSkillType.getLocaleName(),
-                    String.valueOf(RankUtils.getRank(mcMMOPlayer.getPlayer(),
-                            subSkillType)))));*/
+        SoundManager.sendCategorizedSound(mcMMOPlayer.getPlayer(), mcMMOPlayer.getPlayer().getLocation(),
+                SoundType.SKILL_UNLOCKED, SoundCategory.MASTER);
     }
 
     /**
@@ -225,7 +235,8 @@ 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(CommandSender commandSender,
+                                                           SensitiveCommandType sensitiveCommandType, String... args) {
         /*
          * Determine the 'identity' of the one who executed the command to pass as a parameters
          */
@@ -233,19 +244,26 @@ public class NotificationManager {
 
         if(commandSender instanceof Player)
         {
-            senderName = ((Player) commandSender).getDisplayName() + ChatColor.RESET + "-" + ((Player) commandSender).getUniqueId();
+            senderName = ((Player) commandSender).getDisplayName()
+                    + ChatColor.RESET + "-" + ((Player) commandSender).getUniqueId();
         }
 
         //Send the notification
         switch(sensitiveCommandType)
         {
             case XPRATE_MODIFY:
-                sendAdminNotification(LocaleLoader.getString("Notifications.Admin.XPRate.Start.Others", addItemToFirstPositionOfArray(senderName, args)));
-                sendAdminCommandConfirmation(commandSender, LocaleLoader.getString("Notifications.Admin.XPRate.Start.Self", args));
+                sendAdminNotification(LocaleLoader.getString("Notifications.Admin.XPRate.Start.Others",
+                        addItemToFirstPositionOfArray(senderName, args)));
+                sendAdminCommandConfirmation(
+                        commandSender, LocaleLoader.getString("Notifications.Admin.XPRate.Start.Self", args));
                 break;
             case XPRATE_END:
-                sendAdminNotification(LocaleLoader.getString("Notifications.Admin.XPRate.End.Others", addItemToFirstPositionOfArray(senderName, args)));
-                sendAdminCommandConfirmation(commandSender, LocaleLoader.getString("Notifications.Admin.XPRate.End.Self", args));
+                sendAdminNotification(
+                        LocaleLoader.getString(
+                                "Notifications.Admin.XPRate.End.Others",
+                                addItemToFirstPositionOfArray(senderName, args)));
+                sendAdminCommandConfirmation(commandSender,
+                        LocaleLoader.getString("Notifications.Admin.XPRate.End.Self", args));
                 break;
         }
     }
@@ -266,8 +284,6 @@ public class NotificationManager {
         return newArray;
     }
 
-    //TODO: Remove the code duplication, am lazy atm
-    //TODO: Fix broadcasts being skipped for situations where a player skips over the milestone like with the addlevels command
     public static void processLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, int level) {
         if(level <= 0)
             return;
@@ -290,13 +306,22 @@ public class NotificationManager {
                         .append(Component.newline())
                         .append(Component.text(LocalDate.now().toString()))
                         .append(Component.newline())
-                        .append(Component.text(mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR))
+                        .append(Component.text(
+                                mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType)
+                                        + " reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR))
                         .asHoverEvent();
 
-                String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType));
-                Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover);
-
-                mcMMO.p.getFoliaLib().getImpl().runNextTick(t -> audience.sendMessage(Identity.nil(), message));
+                String localeMessage = LocaleLoader.getString(
+                        "Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level,
+                        mcMMO.p.getSkillTools().getLocalizedSkillName(primarySkillType));
+                Component component = LegacyComponentSerializer
+                        .legacySection()
+                        .deserialize(localeMessage)
+                        .hoverEvent(levelMilestoneHover);
+
+                // TODO: Update system msg API
+                mcMMO.p.getFoliaLib().getImpl().runNextTick(
+                        t -> audience.sendMessage(component));
             }
         }
     }
@@ -331,7 +356,7 @@ public class NotificationManager {
                 String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel);
                 Component message = LegacyComponentSerializer.legacySection().deserialize(localeMessage).hoverEvent(levelMilestoneHover);
 
-                mcMMO.p.getFoliaLib().getImpl().runNextTick(t -> audience.sendMessage(Identity.nil(), message));
+                mcMMO.p.getFoliaLib().getImpl().runNextTick(t -> audience.sendMessage(message));
             }
         }
     }

+ 0 - 18
src/main/java/com/gmail/nossr50/util/skills/RankUtils.java

@@ -291,30 +291,12 @@ public class RankUtils {
         subSkillRanks.computeIfAbsent(s, k -> new HashMap<>());
     }
 
-/*    public static int getSubSkillUnlockRequirement(SubSkillType subSkillType)
-    {
-        String skillName = subSkillType.toString();
-        int numRanks = subSkillType.getNumRanks();
-
-        if(subSkillRanks == null)
-            subSkillRanks = new HashMap<>();
-
-        if(numRanks == 0)
-            return -1; //-1 Means the skill doesn't have ranks
-
-        if(subSkillRanks.get(skillName) == null && numRanks > 0)
-            addRanks(subSkillType);
-
-        return subSkillRanks.get(subSkillType.toString()).get(1);
-    }*/
-
     /**
      * Gets the unlock level for a specific rank in a subskill
      * @param subSkillType The target subskill
      * @param rank The target rank
      * @return The level at which this rank unlocks
      */
-    @Deprecated
     public static int getRankUnlockLevel(SubSkillType subSkillType, int rank)
     {
         return RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, rank);

+ 88 - 125
src/main/java/com/gmail/nossr50/util/text/TextComponentFactory.java

@@ -12,8 +12,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.kyori.adventure.audience.Audience;
-import net.kyori.adventure.audience.MessageType;
-import net.kyori.adventure.identity.Identity;
 import net.kyori.adventure.text.Component;
 import net.kyori.adventure.text.TextComponent;
 import net.kyori.adventure.text.event.ClickEvent;
@@ -35,41 +33,37 @@ 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
+     * @param values    vars to be passed to the locale loader
      * @return
      */
-    public static TextComponent getNotificationMultipleValues(String localeKey, String... values)
-    {
+    public static TextComponent getNotificationMultipleValues(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(String localeKey) {
         return getNotificationTextComponent(LocaleLoader.getString(localeKey));
     }
 
-    public static Component getNotificationLevelUpTextComponent(PrimarySkillType skill, int levelsGained, int currentLevel)
-    {
-        return Component.text(LocaleLoader.getString("Overhaul.Levelup", LocaleLoader.getString("Overhaul.Name."+ StringUtils.getCapitalized(skill.toString())), levelsGained, currentLevel));
+    public static Component getNotificationLevelUpTextComponent(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(String text) {
         //textComponent.setColor(getNotificationColor(notificationType));
         return Component.text(text);
     }
 
-    public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted)
-    {
-        if(!mcMMO.p.getGeneralConfig().getUrlLinksEnabled())
+    public static void sendPlayerSubSkillWikiLink(Player player, String subskillformatted) {
+        if (!mcMMO.p.getGeneralConfig().getUrlLinksEnabled())
             return;
 
         TextComponent.Builder wikiLinkComponent = Component.text().content(LocaleLoader.getString("Overhaul.mcMMO.MmoInfo.Wiki"));
         wikiLinkComponent.decoration(TextDecoration.UNDERLINED, true);
 
-        String wikiUrl = "https://wiki.mcmmo.org/"+subskillformatted;
+        String wikiUrl = "https://wiki.mcmmo.org/" + subskillformatted;
 
         wikiLinkComponent.clickEvent(ClickEvent.openUrl(wikiUrl));
 
@@ -77,39 +71,40 @@ public class TextComponentFactory {
 
         wikiLinkComponent.hoverEvent(HoverEvent.showText(componentBuilder.build()));
 
-        mcMMO.getAudiences().player(player).sendMessage(Identity.nil(), wikiLinkComponent, MessageType.SYSTEM);
+        mcMMO.getAudiences().player(player).sendMessage(wikiLinkComponent);
     }
 
     public static void sendPlayerUrlHeader(Player player) {
         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"));
+        TextComponent suffix = Component.text(" " + LocaleLoader.getString("Overhaul.mcMMO.Url.Wrap.Suffix"));
         /*suffix.setColor(ChatColor.DARK_AQUA);*/
 
         TextComponent emptySpace = Component.space();
 
-        mcMMO.getAudiences().player(player).sendMessage(Identity.nil(),TextComponent.ofChildren(
-          prefix,
-          getWebLinkTextComponent(McMMOWebLinks.WEBSITE),
-          emptySpace,
-          getWebLinkTextComponent(McMMOWebLinks.DISCORD),
-          emptySpace,
-          getWebLinkTextComponent(McMMOWebLinks.PATREON),
-          emptySpace,
-          getWebLinkTextComponent(McMMOWebLinks.WIKI),
-          emptySpace,
-          getWebLinkTextComponent(McMMOWebLinks.SPIGOT),
-          emptySpace,
-          getWebLinkTextComponent(McMMOWebLinks.HELP_TRANSLATE),
-          suffix
-        ), MessageType.SYSTEM);
+        // TODO: Update system msg API
+        mcMMO.getAudiences().player(player).sendMessage(Component.textOfChildren(
+                prefix,
+                getWebLinkTextComponent(McMMOWebLinks.WEBSITE),
+                emptySpace,
+                getWebLinkTextComponent(McMMOWebLinks.DISCORD),
+                emptySpace,
+                getWebLinkTextComponent(McMMOWebLinks.PATREON),
+                emptySpace,
+                getWebLinkTextComponent(McMMOWebLinks.WIKI),
+                emptySpace,
+                getWebLinkTextComponent(McMMOWebLinks.SPIGOT),
+                emptySpace,
+                getWebLinkTextComponent(McMMOWebLinks.HELP_TRANSLATE),
+                suffix
+        ));
     }
 
     /**
      * Sends a player a bunch of text components that represent a list of sub-skills
      * Styling and formatting is applied before sending the messages
      *
-     * @param player target player
+     * @param player             target player
      * @param subSkillComponents the text components representing the sub-skills by name
      */
     public static void sendPlayerSubSkillList(@NotNull Player player, @NotNull List<Component> subSkillComponents) {
@@ -129,17 +124,15 @@ public class TextComponentFactory {
         }
 
         //Send each group
-        for(Component curLine : individualLinesToSend) {
-            audience.sendMessage(Identity.nil(), curLine);
+        for (Component curLine : individualLinesToSend) {
+            audience.sendMessage(curLine);
         }
     }
 
-    private static Component getWebLinkTextComponent(McMMOWebLinks webLinks)
-    {
+    private static Component getWebLinkTextComponent(McMMOWebLinks webLinks) {
         TextComponent.Builder webTextComponent;
 
-        switch(webLinks)
-        {
+        switch (webLinks) {
             case WEBSITE:
                 webTextComponent = Component.text().content(LocaleLoader.getString("JSON.Hover.AtSymbolURL"));
                 TextUtils.addChildWebComponent(webTextComponent, "Web");
@@ -180,12 +173,10 @@ public class TextComponentFactory {
         return webTextComponent.build();
     }
 
-    private static Component getUrlHoverEvent(McMMOWebLinks webLinks)
-    {
+    private static Component getUrlHoverEvent(McMMOWebLinks webLinks) {
         TextComponent.Builder componentBuilder = Component.text().content(webLinks.getNiceTitle());
 
-        switch(webLinks)
-        {
+        switch (webLinks) {
             case WEBSITE:
                 addUrlHeaderHover(webLinks, componentBuilder);
                 componentBuilder.append(Component.newline()).append(Component.newline());
@@ -223,7 +214,7 @@ public class TextComponentFactory {
                 componentBuilder.append(Component.text(webLinks.getLocaleDescription(), NamedTextColor.GREEN));
                 componentBuilder.append(Component.newline());
                 componentBuilder.append(Component.text("You can use this website to help translate mcMMO into your language!" +
-                  "\nIf you want to know more contact me in discord.", NamedTextColor.DARK_GRAY));
+                        "\nIf you want to know more contact me in discord.", NamedTextColor.DARK_GRAY));
         }
 
         return componentBuilder.build();
@@ -234,13 +225,11 @@ public class TextComponentFactory {
         componentBuilder.append(Component.text(webLinks.getUrl(), NamedTextColor.GRAY, TextDecoration.ITALIC));
     }
 
-    private static ClickEvent getUrlClickEvent(String url)
-    {
+    private static ClickEvent getUrlClickEvent(String url) {
         return ClickEvent.openUrl(url);
     }
 
-    private static Component getSubSkillTextComponent(Player player, SubSkillType subSkillType)
-    {
+    private static Component getSubSkillTextComponent(Player player, SubSkillType subSkillType) {
         //Get skill name
         String skillName = subSkillType.getLocaleName();
 
@@ -257,8 +246,7 @@ public class TextComponentFactory {
         return textComponent.build();
     }
 
-    private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill)
-    {
+    private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill) {
         //String key = abstractSubSkill.getConfigKeyName();
         String skillName = abstractSubSkill.getNiceName();
 
@@ -297,46 +285,37 @@ public class TextComponentFactory {
         return textComponent;
     }
 
-    private static Component getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill)
-    {
+    private static Component getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill) {
         return getSubSkillHoverEventJSON(abstractSubSkill, player);
     }
 
-    private static Component getSubSkillHoverComponent(Player player, SubSkillType subSkillType)
-    {
+    private static Component getSubSkillHoverComponent(Player player, SubSkillType subSkillType) {
         return getSubSkillHoverEventJSON(subSkillType, player);
     }
 
     /**
      * 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 player           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(AbstractSubSkill abstractSubSkill, Player player) {
         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;
+        TextColor ccLocked = NamedTextColor.DARK_GRAY;
+        TextColor ccLevelRequirement = NamedTextColor.BLUE;
+        TextColor ccLevelRequired = NamedTextColor.RED;
 
         SubSkillType subSkillType = abstractSubSkill.getSubSkillType();
 
         //SubSkillType Name
         TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, abstractSubSkill));
 
-        if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill))
-        {
+        if (!RankUtils.hasUnlockedSubskill(player, abstractSubSkill)) {
             //Skill is not unlocked yet
             addLocked(abstractSubSkill, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
         } else {
@@ -346,12 +325,11 @@ public class TextComponentFactory {
             int curRank = RankUtils.getRank(player, abstractSubSkill);
             int nextRank = 0;
 
-            if(curRank < abstractSubSkill.getNumRanks() && abstractSubSkill.getNumRanks() > 0)
-            {
-                nextRank = RankUtils.getRankUnlockLevel(abstractSubSkill, curRank+1);
+            if (curRank < abstractSubSkill.getNumRanks() && abstractSubSkill.getNumRanks() > 0) {
+                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(player, abstractSubSkill), nextRank);
 
             componentBuilder.append(Component.text(LocaleLoader.getString("JSON.DescriptionHeader")));
             componentBuilder.append(Component.newline()).append(Component.text(abstractSubSkill.getDescription())).append(Component.newline());
@@ -386,17 +364,14 @@ public class TextComponentFactory {
         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(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());
 
             //Next Rank: x
-            if(nextRank > rank)
+            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);*/
         }
     }
 
@@ -418,47 +393,38 @@ public class TextComponentFactory {
         componentBuilder.append(Component.text(LocaleLoader.getString("JSON.LevelRequirement") + ": ", ccLevelRequirement));
     }
 
-    @Deprecated
-    private static Component getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player)
-    {
+    private static Component getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player) {
         String skillName = subSkillType.getLocaleName();
 
         /*
          * Hover Event BaseComponent color table
          */
-        TextColor ccSubSkillHeader      = NamedTextColor.GOLD;
-        TextColor ccRank                = NamedTextColor.BLUE;
-        TextColor ccCurRank             = NamedTextColor.GREEN;
-        TextColor ccPossessive          = NamedTextColor.WHITE;
-        TextColor ccDescriptionHeader   = NamedTextColor.DARK_PURPLE;
-        TextColor ccDescription         = NamedTextColor.DARK_GRAY;
-        TextColor ccLocked              = NamedTextColor.DARK_GRAY;
-        TextColor ccLevelRequirement    = NamedTextColor.BLUE;
-        TextColor ccLevelRequired       = NamedTextColor.RED;
+        TextColor ccDescriptionHeader = NamedTextColor.DARK_PURPLE;
+        TextColor ccDescription = NamedTextColor.DARK_GRAY;
+        TextColor ccLocked = NamedTextColor.DARK_GRAY;
+        TextColor ccLevelRequirement = NamedTextColor.BLUE;
+        TextColor ccLevelRequired = NamedTextColor.RED;
 
         //SubSkillType Name
         TextComponent.Builder componentBuilder = setupSkillComponentNameStyle(player, skillName, subSkillType, RankUtils.hasUnlockedSubskill(player, subSkillType));
 
-        if(!RankUtils.hasUnlockedSubskill(player, subSkillType))
-        {
+        if (!RankUtils.hasUnlockedSubskill(player, subSkillType)) {
             //Skill is not unlocked yet
             addLocked(subSkillType, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
         } else {
             //addSubSkillTypeToHoverEventJSON(subSkillType, componentBuilder);
 
             //RANK
-            if(subSkillType.getNumRanks() > 0)
-            {
+            if (subSkillType.getNumRanks() > 0) {
                 int curRank = RankUtils.getRank(player, subSkillType);
                 int nextRank = 0;
 
-                if(curRank < subSkillType.getNumRanks())
-                {
-                    nextRank = RankUtils.getRankUnlockLevel(subSkillType, curRank+1);
+                if (curRank < subSkillType.getNumRanks()) {
+                    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(player, subSkillType), nextRank);
             }
 
             componentBuilder.append(Component.newline());
@@ -472,55 +438,52 @@ public class TextComponentFactory {
         return componentBuilder.build();
     }
 
-    private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, TextComponent.Builder componentBuilder)
-    {
-        if(abstractSubSkill.isSuperAbility())
-        {
-            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.SuperAbility"), NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD));
-        } else if(abstractSubSkill.isActiveUse())
-        {
-            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Active"), NamedTextColor.DARK_RED, TextDecoration.BOLD));
+    private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill,
+                                                        TextComponent.Builder componentBuilder) {
+        if (abstractSubSkill.isSuperAbility()) {
+            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.SuperAbility"),
+                    NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD));
+        } else if (abstractSubSkill.isActiveUse()) {
+            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Active"),
+                    NamedTextColor.DARK_RED, TextDecoration.BOLD));
         } else {
-            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Passive"), NamedTextColor.GREEN, TextDecoration.BOLD));
+            componentBuilder.append(Component.text(LocaleLoader.getString("JSON.Type.Passive"),
+                    NamedTextColor.GREEN, TextDecoration.BOLD));
         }
 
         componentBuilder.append(Component.newline());
     }
 
-    public static void getSubSkillTextComponents(Player player, List<Component> textComponents, PrimarySkillType parentSkill) {
-        for(SubSkillType subSkillType : SubSkillType.values())
-        {
-            if(subSkillType.getParentSkill() == parentSkill)
-            {
+    public static void getSubSkillTextComponents(Player player, List<Component> textComponents,
+                                                 PrimarySkillType parentSkill) {
+        for (SubSkillType subSkillType : SubSkillType.values()) {
+            if (subSkillType.getParentSkill() == parentSkill) {
                 //TODO: Hacky rewrite later
                 //Only some versions of MC have this skill
-                if(subSkillType == SubSkillType.FISHING_MASTER_ANGLER && mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() == null)
+                if (subSkillType == SubSkillType.FISHING_MASTER_ANGLER
+                        && mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer() == null)
                     continue;
 
-                if(Permissions.isSubSkillEnabled(player, subSkillType))
-                {
-                    if(!InteractionManager.hasSubSkill(subSkillType))
+                if (Permissions.isSubSkillEnabled(player, subSkillType)) {
+                    if (!InteractionManager.hasSubSkill(subSkillType))
                         textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, subSkillType));
                 }
             }
         }
 
         /* NEW SKILL SYSTEM */
-        for(AbstractSubSkill abstractSubSkill : InteractionManager.getSubSkillList())
-        {
-            if(abstractSubSkill.getPrimarySkill() == parentSkill)
-            {
-                if(Permissions.isSubSkillEnabled(player, abstractSubSkill))
+        for (AbstractSubSkill abstractSubSkill : InteractionManager.getSubSkillList()) {
+            if (abstractSubSkill.getPrimarySkill() == parentSkill) {
+                if (Permissions.isSubSkillEnabled(player, abstractSubSkill))
                     textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, abstractSubSkill));
             }
         }
     }
 
-    public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, SubSkillType subSkillType)
-    {
+    public static TextComponent getSubSkillUnlockedNotificationComponents(Player player, 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)));
-        unlockMessage.clickEvent(ClickEvent.runCommand("/"+subSkillType.getParentSkill().toString().toLowerCase(Locale.ENGLISH)));
+        unlockMessage.clickEvent(ClickEvent.runCommand("/" + subSkillType.getParentSkill().toString().toLowerCase(Locale.ENGLISH)));
         return unlockMessage.build();
     }
 }