Browse Source

JSON hover objects now follow different templates based on the subskill's properties

nossr50 6 năm trước cách đây
mục cha
commit
6dc75760d0

+ 3 - 0
Changelog.txt

@@ -17,6 +17,9 @@ Version 2.1.0
  + (Commands) Added toggle command /mcchatspy
  + (Permissions) Added permission node mcmmo.commands.mcchatspy & mcmmo.commands.mcchatspy.others
  + (Permissions) Added permission nodes for Harvest Lumber, Splinter, Nature's Bounty, and Bark Surgeon
+ + (Locale) Added locale strings for new Woodcutting abilities
+ + (Locale) Added locale strings for mcchatspy command
+ + (Locale) Added locale strings for JSON integration
  - (Config) Removed SkillShot's IncreaseLevel & IncreasePercentage (replaced by RankDamageMultiplier)
  - (Config) Removed AxeMastery's MaxBonus & MaxBonusLevel (replaced by RankDamageMultiplier)
  ! (Skills) Woodcutting's Double Drop subskill is now named Harvest Lumber

+ 123 - 24
src/main/java/com/gmail/nossr50/util/SkillTextComponentFactory.java

@@ -3,6 +3,7 @@ package com.gmail.nossr50.util;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.SubSkill;
+import com.gmail.nossr50.datatypes.skills.SubSkillFlags;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
@@ -17,30 +18,28 @@ import java.util.HashMap;
 
 public class SkillTextComponentFactory {
     public static HashMap<SubSkill, TextComponent> subSkillTextComponents;
-    public static HashMap<SubSkill, BaseComponent[]> subSkillHoverComponents;
+
+    //Yeah there's probably a better way to do this
+    public static HashMap<SubSkill, BaseComponent[]> lockedComponentMap;
+
+    //This is a nested map because each JSON component for a different rank is going to be a bit different.
+    public static HashMap<Integer, HashMap<SubSkill, BaseComponent[]>> hoverComponentOuterMap;
 
     public static TextComponent getSubSkillTextComponent(Player player, SubSkill subSkill, int localeKeyName, int localeKeyDescription)
     {
-        boolean playerHasUnlocked = false;
-
         //Init our maps
         if (subSkillTextComponents == null)
         {
             subSkillTextComponents = new HashMap<>();
-            subSkillHoverComponents = new HashMap<>();
+            lockedComponentMap = new HashMap<>();
+            hoverComponentOuterMap = new HashMap<>();
         }
 
-        int curRank = RankUtils.getRank(player, subSkill);
-
-        if(curRank > 0)
-            playerHasUnlocked = true;
-
         //The skill milestone holds relevant information about the ranks of a skill
         PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
 
         //Get skill name & description from our locale file
         String skillName = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyName);
-        String skillDescription = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyDescription);
 
         if(subSkillTextComponents.get(subSkill) == null)
         {
@@ -49,7 +48,7 @@ public class SkillTextComponentFactory {
             textComponent.setColor(ChatColor.DARK_AQUA);
 
             //Hover Event
-            textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, getBaseComponent(player, subSkill, skillName, skillDescription, curRank, playerHasUnlocked)));
+            textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, getBaseComponent(player, subSkill, localeKeyName, localeKeyDescription)));
 
             //Insertion
             textComponent.setInsertion(skillName);
@@ -61,26 +60,126 @@ public class SkillTextComponentFactory {
         }
     }
 
-    private static BaseComponent[] getBaseComponent(Player player, SubSkill subSkill, String skillName, String skillDescription, int curRank, boolean playerHasUnlocked)
+    private static BaseComponent[] getBaseComponent(Player player, SubSkill subSkill, int localeKeyName, int localeKeyDescription)
     {
-        if(subSkillHoverComponents.get(subSkill) != null)
+        //If the player hasn't unlocked this skill yet we use a different JSON template
+        if(subSkill.getNumRanks() > 0 && RankUtils.getRank(player, subSkill) == 0)
         {
-            return subSkillHoverComponents.get(subSkill);
+            //If the JSON component already exists
+            if(lockedComponentMap.get(subSkill) != null)
+                return lockedComponentMap.get(subSkill);
+
+            BaseComponent[] newComponents = getSubSkillHoverEventJSON(subSkill, player, localeKeyName, localeKeyDescription);
+            lockedComponentMap.put(subSkill, newComponents);
+            return lockedComponentMap.get(subSkill);
         }
 
-        BaseComponent[] newComponents;
+        int curRank = RankUtils.getRank(player, subSkill);
 
-        //TODO: Clean this up
-        if(subSkill.getNumRanks() == 0)
-            newComponents = new ComponentBuilder(skillName).bold(true).color(ChatColor.GOLD).append("\n\nDescription").bold(true).color(ChatColor.GREEN).append("\n"+skillDescription).bold(false).color(ChatColor.WHITE).create();
-        else if(playerHasUnlocked)
-            newComponents = new ComponentBuilder(skillName).bold(true).color(ChatColor.GOLD).append("\nRank "+curRank).bold(false).color(ChatColor.GREEN).append(" of ").color(ChatColor.WHITE).append(String.valueOf(subSkill.getNumRanks())).color(ChatColor.GOLD).append("\n\nDescription").bold(true).color(ChatColor.GREEN).append("\n"+skillDescription).bold(false).color(ChatColor.WHITE).create();
-        else
-            newComponents = new ComponentBuilder(skillName).bold(true).color(ChatColor.RED).append("\n-=LOCKED=-").color(ChatColor.GRAY).append("\n\nUnlock Requirements").color(ChatColor.YELLOW).append("\nLevel "+ AdvancedConfig.getInstance().getSubSkillUnlockLevel(subSkill, 1)+" "+subSkill.getParentNiceNameLocale()).bold(false).create();
+        //If the inner hashmap for this rank isn't made yet
+        if(hoverComponentOuterMap.get(curRank) == null)
+            hoverComponentOuterMap.put(curRank, new HashMap<>());
 
-        subSkillHoverComponents.put(subSkill, newComponents);
-        return subSkillHoverComponents.get(subSkill);
+        //Inner Hashmap for current rank
+        HashMap<SubSkill, BaseComponent[]> innerMap = hoverComponentOuterMap.get(curRank);
+
+        if(innerMap.get(subSkill) == null)
+            innerMap.put(subSkill, getSubSkillHoverEventJSON(subSkill, player, localeKeyName, localeKeyDescription));
+
+        return innerMap.get(subSkill);
+    }
+
+    /**
+     * Checks to see if a bit is flagged in the subskill
+     * @param flag1 The flag to check for
+     * @param subSkill The target subskill
+     * @return returns true if the bit is flagged in the subskill
+     */
+    private static boolean checkFlags(int flag1, SubSkill subSkill)
+    {
+        return (flag1 & subSkill.getFlags()) == flag1;
     }
 
+    private static BaseComponent[] getSubSkillHoverEventJSON(SubSkill subSkill, Player player, int localeKeyName, int localeKeyDescription)
+    {
+        String skillName = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyName);
+        String skillDescription = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyDescription);
 
+        /*
+         * Hover Event BaseComponent color table
+         */
+        ChatColor ccSubSkillHeader      = ChatColor.GOLD;
+        ChatColor ccRank                = ChatColor.BLUE;
+        ChatColor ccCurRank             = ChatColor.GREEN;
+        ChatColor ccPossessive          = ChatColor.WHITE;
+        ChatColor ccNumRanks            = ccCurRank;
+        ChatColor ccDescriptionHeader   = ChatColor.DARK_PURPLE;
+        ChatColor ccDescription         = ChatColor.WHITE;
+        ChatColor ccLocked              = ChatColor.DARK_GRAY;
+        ChatColor ccLevelRequirement    = ChatColor.BLUE;
+        ChatColor ccLevelRequired       = ChatColor.RED;
+
+        //SubSkill Name
+        ComponentBuilder componentBuilder = new ComponentBuilder(skillName);
+        componentBuilder.bold(true).color(ccSubSkillHeader);
+        componentBuilder.append("\n");
+
+        if(RankUtils.getRank(player, subSkill) == 0)
+        {
+            //Skill is not unlocked yet
+            componentBuilder.append(LocaleLoader.getString("JSON.Locked")).color(ccLocked).bold(true);
+            componentBuilder.append("\n").append("\n").bold(false);
+            componentBuilder.append(LocaleLoader.getString("JSON.LevelRequirement") +": ").color(ccLevelRequirement);
+            componentBuilder.append(String.valueOf(AdvancedConfig.getInstance().getSubSkillUnlockLevel(subSkill, 1))).color(ccLevelRequired);
+
+        } else {
+            addSubSkillTypeToHoverEventJSON(subSkill, componentBuilder);
+
+            //RANK
+            if(subSkill.getNumRanks() > 0)
+            {
+                //Rank
+                componentBuilder.append(LocaleLoader.getString("JSON.Rank") + ": ").bold(false).color(ccRank);
+
+                //x of y
+                componentBuilder.append(String.valueOf(RankUtils.getRank(player, subSkill))).color(ccCurRank);
+                componentBuilder.append(" "+LocaleLoader.getString("JSON.RankPossesive")+" ").color(ccPossessive);
+                componentBuilder.append(String.valueOf(subSkill.getNumRanks())).color(ccNumRanks);
+            }
+
+            //Empty line
+            componentBuilder.append("\n").bold(false);
+            componentBuilder.append("\n");
+
+            //Description Header
+            componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")).bold(false).color(ccDescriptionHeader);
+            componentBuilder.append("\n").bold(false);
+
+            //Description
+            componentBuilder.append(skillDescription).color(ccDescription);
+            //componentBuilder.append("\n");
+        }
+
+        return componentBuilder.create();
+    }
+
+    private static void addSubSkillTypeToHoverEventJSON(SubSkill subSkill, ComponentBuilder componentBuilder)
+    {
+        if(checkFlags(SubSkillFlags.SUPERABILITY, subSkill))
+        {
+            componentBuilder.append(LocaleLoader.getString("JSON.Type.SuperAbility")).color(ChatColor.LIGHT_PURPLE);
+            componentBuilder.bold(true);
+        } else if(checkFlags(SubSkillFlags.ACTIVE, subSkill))
+        {
+            componentBuilder.append(LocaleLoader.getString("JSON.Type.Active")).color(ChatColor.DARK_RED);
+            componentBuilder.bold(true);
+        } else {
+            componentBuilder.append(LocaleLoader.getString("JSON.Type.Passive")).color(ChatColor.GREEN);
+            componentBuilder.bold(true);
+        }
+
+        componentBuilder.append("\n");
+    }
 }
+
+

+ 2 - 1
src/main/java/com/gmail/nossr50/util/skills/RankUtils.java

@@ -89,7 +89,8 @@ public class RankUtils {
 
         HashMap<Integer, Integer> rankMap = subSkillRanks.get(subSkill);
 
-        System.out.println("[DEBUG]: Rank "+rank+" for "+subSkill.toString()+" requires skill level "+getUnlockLevel(subSkill, rank));
+        //TODO: Remove this debug code
+        //System.out.println("[DEBUG]: Rank "+rank+" for "+subSkill.toString()+" requires skill level "+getUnlockLevel(subSkill, rank));
         rankMap.put(rank, getUnlockLevel(subSkill, rank));
     }
 

+ 18 - 0
src/main/resources/locale/locale_en_US.properties

@@ -15,6 +15,24 @@
 #
 #                                 --Shatteredbeam
 
+#JSON
+# !!!! Do not use color codes here !!!!
+# !!!! Do not use color codes here !!!!
+JSON.Rank=Rank
+JSON.RankPossesive=of
+JSON.DescriptionHeader=Description
+JSON.Activation=How to use
+JSON.Type.Passive=Passive
+JSON.Type.Active=Active
+JSON.Type.SuperAbility=Super Ability
+JSON.SuperAbility.Charges=Charges
+JSON.SuperAbility.Duration=Duration
+JSON.Locked=-=[LOCKED]=-
+JSON.LevelRequirement=Level Requirement
+# !!!! Do not use color codes here !!!!
+# !!!! Do not use color codes here !!!!
+
+
 #ACROBATICS
 Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing**
 Acrobatics.Combat.Proc=[[GREEN]]**Dodged**