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

This commit is contained in:
nossr50 2019-01-03 07:16:05 -08:00
parent fe90f1e7eb
commit 6dc75760d0
4 changed files with 146 additions and 25 deletions

View File

@ -17,6 +17,9 @@ Version 2.1.0
+ (Commands) Added toggle command /mcchatspy + (Commands) Added toggle command /mcchatspy
+ (Permissions) Added permission node mcmmo.commands.mcchatspy & mcmmo.commands.mcchatspy.others + (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 + (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 SkillShot's IncreaseLevel & IncreasePercentage (replaced by RankDamageMultiplier)
- (Config) Removed AxeMastery's MaxBonus & MaxBonusLevel (replaced by RankDamageMultiplier) - (Config) Removed AxeMastery's MaxBonus & MaxBonusLevel (replaced by RankDamageMultiplier)
! (Skills) Woodcutting's Double Drop subskill is now named Harvest Lumber ! (Skills) Woodcutting's Double Drop subskill is now named Harvest Lumber

View File

@ -3,6 +3,7 @@ package com.gmail.nossr50.util;
import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SubSkill; import com.gmail.nossr50.datatypes.skills.SubSkill;
import com.gmail.nossr50.datatypes.skills.SubSkillFlags;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
@ -17,30 +18,28 @@ import java.util.HashMap;
public class SkillTextComponentFactory { public class SkillTextComponentFactory {
public static HashMap<SubSkill, TextComponent> subSkillTextComponents; 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) public static TextComponent getSubSkillTextComponent(Player player, SubSkill subSkill, int localeKeyName, int localeKeyDescription)
{ {
boolean playerHasUnlocked = false;
//Init our maps //Init our maps
if (subSkillTextComponents == null) if (subSkillTextComponents == null)
{ {
subSkillTextComponents = new HashMap<>(); 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 //The skill milestone holds relevant information about the ranks of a skill
PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile(); PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
//Get skill name & description from our locale file //Get skill name & description from our locale file
String skillName = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyName); String skillName = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyName);
String skillDescription = LocaleLoader.getString(subSkill.getLocalKeyRoot()+localeKeyDescription);
if(subSkillTextComponents.get(subSkill) == null) if(subSkillTextComponents.get(subSkill) == null)
{ {
@ -49,7 +48,7 @@ public class SkillTextComponentFactory {
textComponent.setColor(ChatColor.DARK_AQUA); textComponent.setColor(ChatColor.DARK_AQUA);
//Hover Event //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 //Insertion
textComponent.setInsertion(skillName); 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 the inner hashmap for this rank isn't made yet
if(subSkill.getNumRanks() == 0) if(hoverComponentOuterMap.get(curRank) == null)
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(); hoverComponentOuterMap.put(curRank, new HashMap<>());
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();
subSkillHoverComponents.put(subSkill, newComponents); //Inner Hashmap for current rank
return subSkillHoverComponents.get(subSkill); 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");
}
} }
}

View File

@ -89,7 +89,8 @@ public class RankUtils {
HashMap<Integer, Integer> rankMap = subSkillRanks.get(subSkill); 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)); rankMap.put(rank, getUnlockLevel(subSkill, rank));
} }

View File

@ -15,6 +15,24 @@
# #
# --Shatteredbeam # --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
Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing** Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing**
Acrobatics.Combat.Proc=[[GREEN]]**Dodged** Acrobatics.Combat.Proc=[[GREEN]]**Dodged**