SkillTextComponentFactory.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package com.gmail.nossr50.util;
  2. import com.gmail.nossr50.config.AdvancedConfig;
  3. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  4. import com.gmail.nossr50.datatypes.skills.PrimarySkill;
  5. import com.gmail.nossr50.datatypes.skills.SubSkill;
  6. import com.gmail.nossr50.datatypes.skills.SubSkillFlags;
  7. import com.gmail.nossr50.locale.LocaleLoader;
  8. import com.gmail.nossr50.util.player.UserManager;
  9. import com.gmail.nossr50.util.skills.RankUtils;
  10. import net.md_5.bungee.api.ChatColor;
  11. import net.md_5.bungee.api.chat.BaseComponent;
  12. import net.md_5.bungee.api.chat.ComponentBuilder;
  13. import net.md_5.bungee.api.chat.HoverEvent;
  14. import net.md_5.bungee.api.chat.TextComponent;
  15. import org.bukkit.entity.Player;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. public class SkillTextComponentFactory {
  19. public static HashMap<SubSkill, TextComponent> subSkillTextComponents;
  20. //Yeah there's probably a better way to do this
  21. public static HashMap<SubSkill, BaseComponent[]> lockedComponentMap;
  22. //This is a nested map because each JSON component for a different rank is going to be a bit different.
  23. public static HashMap<Integer, HashMap<SubSkill, BaseComponent[]>> hoverComponentOuterMap;
  24. public static TextComponent getSubSkillTextComponent(Player player, SubSkill subSkill)
  25. {
  26. //Init our maps
  27. if (subSkillTextComponents == null)
  28. {
  29. subSkillTextComponents = new HashMap<>();
  30. lockedComponentMap = new HashMap<>();
  31. hoverComponentOuterMap = new HashMap<>();
  32. }
  33. //The skill milestone holds relevant information about the ranks of a skill
  34. PlayerProfile playerProfile = UserManager.getPlayer(player).getProfile();
  35. //Get skill name & description from our locale file
  36. String skillName = subSkill.getLocaleName();
  37. if(subSkillTextComponents.get(subSkill) == null)
  38. {
  39. //Setup Text Component
  40. TextComponent textComponent = new TextComponent(skillName);
  41. textComponent.setColor(ChatColor.DARK_AQUA);
  42. //Hover Event
  43. textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, getBaseComponent(player, subSkill)));
  44. //Insertion
  45. textComponent.setInsertion(skillName);
  46. subSkillTextComponents.put(subSkill, textComponent);
  47. return subSkillTextComponents.get(subSkill);
  48. } else {
  49. return subSkillTextComponents.get(subSkill);
  50. }
  51. }
  52. private static BaseComponent[] getBaseComponent(Player player, SubSkill subSkill)
  53. {
  54. //If the player hasn't unlocked this skill yet we use a different JSON template
  55. if(subSkill.getNumRanks() > 0 && RankUtils.getRank(player, subSkill) == 0)
  56. {
  57. //If the JSON component already exists
  58. if(lockedComponentMap.get(subSkill) != null)
  59. return lockedComponentMap.get(subSkill);
  60. BaseComponent[] newComponents = getSubSkillHoverEventJSON(subSkill, player);
  61. lockedComponentMap.put(subSkill, newComponents);
  62. return lockedComponentMap.get(subSkill);
  63. }
  64. int curRank = RankUtils.getRank(player, subSkill);
  65. //If the inner hashmap for this rank isn't made yet
  66. if(hoverComponentOuterMap.get(curRank) == null)
  67. hoverComponentOuterMap.put(curRank, new HashMap<>());
  68. //Inner Hashmap for current rank
  69. HashMap<SubSkill, BaseComponent[]> innerMap = hoverComponentOuterMap.get(curRank);
  70. if(innerMap.get(subSkill) == null)
  71. innerMap.put(subSkill, getSubSkillHoverEventJSON(subSkill, player));
  72. return innerMap.get(subSkill);
  73. }
  74. /**
  75. * Checks to see if a bit is flagged in the subskill
  76. * @param flag1 The flag to check for
  77. * @param subSkill The target subskill
  78. * @return returns true if the bit is flagged in the subskill
  79. */
  80. private static boolean checkFlags(int flag1, SubSkill subSkill)
  81. {
  82. return (flag1 & subSkill.getFlags()) == flag1;
  83. }
  84. private static BaseComponent[] getSubSkillHoverEventJSON(SubSkill subSkill, Player player)
  85. {
  86. String skillName = subSkill.getLocaleName();
  87. String skillDescription = subSkill.getLocaleDescription();
  88. /*
  89. * Hover Event BaseComponent color table
  90. */
  91. ChatColor ccSubSkillHeader = ChatColor.GOLD;
  92. ChatColor ccRank = ChatColor.BLUE;
  93. ChatColor ccCurRank = ChatColor.GREEN;
  94. ChatColor ccPossessive = ChatColor.WHITE;
  95. ChatColor ccNumRanks = ccCurRank;
  96. ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE;
  97. ChatColor ccDescription = ChatColor.WHITE;
  98. ChatColor ccLocked = ChatColor.DARK_GRAY;
  99. ChatColor ccLevelRequirement = ChatColor.BLUE;
  100. ChatColor ccLevelRequired = ChatColor.RED;
  101. //SubSkill Name
  102. ComponentBuilder componentBuilder = new ComponentBuilder(skillName);
  103. componentBuilder.bold(true).color(ccSubSkillHeader);
  104. componentBuilder.append("\n");
  105. if(RankUtils.getRank(player, subSkill) == 0)
  106. {
  107. //Skill is not unlocked yet
  108. componentBuilder.append(LocaleLoader.getString("JSON.Locked")).color(ccLocked).bold(true);
  109. componentBuilder.append("\n").append("\n").bold(false);
  110. componentBuilder.append(LocaleLoader.getString("JSON.LevelRequirement") +": ").color(ccLevelRequirement);
  111. componentBuilder.append(String.valueOf(AdvancedConfig.getInstance().getSubSkillUnlockLevel(subSkill, 1))).color(ccLevelRequired);
  112. } else {
  113. addSubSkillTypeToHoverEventJSON(subSkill, componentBuilder);
  114. //RANK
  115. if(subSkill.getNumRanks() > 0)
  116. {
  117. //Rank
  118. componentBuilder.append(LocaleLoader.getString("JSON.Rank") + ": ").bold(false).color(ccRank);
  119. //x of y
  120. componentBuilder.append(String.valueOf(RankUtils.getRank(player, subSkill))).color(ccCurRank);
  121. componentBuilder.append(" "+LocaleLoader.getString("JSON.RankPossesive")+" ").color(ccPossessive);
  122. componentBuilder.append(String.valueOf(subSkill.getNumRanks())).color(ccNumRanks);
  123. }
  124. //Empty line
  125. componentBuilder.append("\n").bold(false);
  126. componentBuilder.append("\n");
  127. //Description Header
  128. componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader")).bold(false).color(ccDescriptionHeader);
  129. componentBuilder.append("\n").bold(false);
  130. //Description
  131. componentBuilder.append(skillDescription).color(ccDescription);
  132. //componentBuilder.append("\n");
  133. }
  134. return componentBuilder.create();
  135. }
  136. private static void addSubSkillTypeToHoverEventJSON(SubSkill subSkill, ComponentBuilder componentBuilder)
  137. {
  138. if(checkFlags(SubSkillFlags.SUPERABILITY, subSkill))
  139. {
  140. componentBuilder.append(LocaleLoader.getString("JSON.Type.SuperAbility")).color(ChatColor.LIGHT_PURPLE);
  141. componentBuilder.bold(true);
  142. } else if(checkFlags(SubSkillFlags.ACTIVE, subSkill))
  143. {
  144. componentBuilder.append(LocaleLoader.getString("JSON.Type.Active")).color(ChatColor.DARK_RED);
  145. componentBuilder.bold(true);
  146. } else {
  147. componentBuilder.append(LocaleLoader.getString("JSON.Type.Passive")).color(ChatColor.GREEN);
  148. componentBuilder.bold(true);
  149. }
  150. componentBuilder.append("\n");
  151. }
  152. public static void getSubSkillTextComponents(Player player, List<TextComponent> textComponents, PrimarySkill parentSkill) {
  153. for(SubSkill subSkill : SubSkill.values())
  154. {
  155. if(subSkill.getParentSkill() == parentSkill)
  156. {
  157. if(Permissions.isSubSkillEnabled(player, subSkill))
  158. {
  159. textComponents.add(SkillTextComponentFactory.getSubSkillTextComponent(player, subSkill));
  160. }
  161. }
  162. }
  163. }
  164. }