TextComponentFactory.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. package com.gmail.nossr50.util;
  2. import com.gmail.nossr50.commands.skills.McMMOWebLinks;
  3. import com.gmail.nossr50.config.AdvancedConfig;
  4. import com.gmail.nossr50.config.Config;
  5. import com.gmail.nossr50.config.RankConfig;
  6. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  7. import com.gmail.nossr50.datatypes.json.McMMOUrl;
  8. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  9. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  10. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  11. import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
  12. import com.gmail.nossr50.listeners.InteractionManager;
  13. import com.gmail.nossr50.locale.LocaleLoader;
  14. import com.gmail.nossr50.util.skills.RankUtils;
  15. import net.md_5.bungee.api.ChatColor;
  16. import net.md_5.bungee.api.chat.*;
  17. import org.bukkit.entity.Player;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. /**
  21. * This class handles many of the JSON components that mcMMO makes and uses
  22. */
  23. public class TextComponentFactory {
  24. /**
  25. * Makes a text component using strings from a locale and supports passing an undefined number of variables to the LocaleLoader
  26. * @param localeKey target locale string address
  27. * @param notificationType type of notification
  28. * @param values vars to be passed to the locale loader
  29. * @return
  30. */
  31. public static TextComponent getNotificationMultipleValues(String localeKey, NotificationType notificationType, String... values)
  32. {
  33. String preColoredString = LocaleLoader.getString(localeKey, (Object[]) values);
  34. return new TextComponent(preColoredString);
  35. }
  36. public static TextComponent getNotificationTextComponentFromLocale(String localeKey, NotificationType notificationType)
  37. {
  38. return getNotificationTextComponent(LocaleLoader.getString(localeKey));
  39. }
  40. public static TextComponent getNotificationLevelUpTextComponent(McMMOPlayer player, PrimarySkillType skill, int currentLevel)
  41. {
  42. //player.sendMessage(LocaleLoader.getString(StringUtils.getCapitalized(primarySkill.toString()) + ".Skillup", levelsGained, getSkillLevel(primarySkill)));
  43. TextComponent textComponent = new TextComponent(LocaleLoader.getString("JSON."+StringUtils.getCapitalized(skill.toString()))
  44. +" "+LocaleLoader.getString("JSON.LevelUp"));
  45. textComponent.setColor(AdvancedConfig.getInstance().getJSONActionBarColor(NotificationType.LEVEL_UP_MESSAGE));
  46. TextComponent childComponent = new TextComponent(" "+currentLevel);
  47. //TODO: Config
  48. childComponent.setColor(ChatColor.GREEN);
  49. childComponent.setBold(true);
  50. textComponent.addExtra(childComponent);
  51. return textComponent;
  52. }
  53. private static TextComponent getNotificationTextComponent(String text)
  54. {
  55. //textComponent.setColor(getNotificationColor(notificationType));
  56. return new TextComponent(text);
  57. }
  58. public static void sendPlayerUrlHeader(Player player) {
  59. if(!Config.getInstance().getUrlLinksEnabled())
  60. return;
  61. Player.Spigot spigotPlayer = player.spigot();
  62. TextComponent prefix = new TextComponent("[| ");
  63. prefix.setColor(ChatColor.DARK_AQUA);
  64. TextComponent suffix = new TextComponent(" |]");
  65. suffix.setColor(ChatColor.DARK_AQUA);
  66. TextComponent emptySpace = new TextComponent(" ");
  67. BaseComponent[] baseComponents = {new TextComponent(prefix),
  68. getWebLinkTextComponent(McMMOWebLinks.WEBSITE),
  69. emptySpace,
  70. getWebLinkTextComponent(McMMOWebLinks.DISCORD),
  71. emptySpace,
  72. getWebLinkTextComponent(McMMOWebLinks.PATREON),
  73. emptySpace,
  74. getWebLinkTextComponent(McMMOWebLinks.WIKI),
  75. emptySpace,
  76. getWebLinkTextComponent(McMMOWebLinks.SPIGOT),
  77. emptySpace,
  78. getWebLinkTextComponent(McMMOWebLinks.HELP_TRANSLATE),
  79. new TextComponent(suffix)};
  80. spigotPlayer.sendMessage(baseComponents);
  81. }
  82. public static void sendPlayerSubSkillList(Player player, List<TextComponent> textComponents)
  83. {
  84. TextComponent emptySpace = new TextComponent(" ");
  85. ArrayList<BaseComponent> bulkMessage = new ArrayList<>();
  86. int newLineCount = 0; //Hacky solution to wordwrap problems
  87. for (TextComponent textComponent : textComponents) {
  88. //Don't send more than 3 subskills per line to avoid MOST wordwrap problems
  89. if(newLineCount > 2)
  90. {
  91. TextComponent[] bulkArray = new TextComponent[bulkMessage.size()];
  92. bulkArray = bulkMessage.toArray(bulkArray);
  93. player.spigot().sendMessage(bulkArray);
  94. bulkMessage = new ArrayList<>();
  95. newLineCount = 0;
  96. }
  97. //Style the skills into @links
  98. final String originalTxt = textComponent.getText();
  99. TextComponent stylizedText = new TextComponent("@");
  100. stylizedText.setColor(ChatColor.YELLOW);
  101. addChild(stylizedText, originalTxt);
  102. if(textComponent.getHoverEvent() != null)
  103. stylizedText.setHoverEvent(textComponent.getHoverEvent());
  104. if(textComponent.getClickEvent() != null)
  105. stylizedText.setClickEvent(textComponent.getClickEvent());
  106. bulkMessage.add(stylizedText);
  107. bulkMessage.add(emptySpace);
  108. newLineCount++;
  109. }
  110. /*
  111. * Convert our list into an array
  112. */
  113. TextComponent[] bulkArray = new TextComponent[bulkMessage.size()];
  114. bulkArray = bulkMessage.toArray(bulkArray);
  115. player.spigot().sendMessage(bulkArray);
  116. }
  117. private static TextComponent getWebLinkTextComponent(McMMOWebLinks webLinks)
  118. {
  119. TextComponent webTextComponent;
  120. switch(webLinks)
  121. {
  122. case WEBSITE:
  123. webTextComponent = new TextComponent("@");
  124. webTextComponent.setColor(ChatColor.YELLOW);
  125. addChild(webTextComponent, "Web");
  126. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWebsite));
  127. break;
  128. case SPIGOT:
  129. webTextComponent = new TextComponent("@");
  130. webTextComponent.setColor(ChatColor.YELLOW);
  131. addChild(webTextComponent, "Spigot");
  132. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlSpigot));
  133. break;
  134. case DISCORD:
  135. webTextComponent = new TextComponent("@");
  136. webTextComponent.setColor(ChatColor.YELLOW);
  137. addChild(webTextComponent, "Discord");
  138. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlDiscord));
  139. break;
  140. case PATREON:
  141. webTextComponent = new TextComponent("@");
  142. webTextComponent.setColor(ChatColor.YELLOW);
  143. addChild(webTextComponent, "Patreon");
  144. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlPatreon));
  145. break;
  146. case WIKI:
  147. webTextComponent = new TextComponent("@");
  148. webTextComponent.setColor(ChatColor.YELLOW);
  149. addChild(webTextComponent, "Wiki");
  150. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlWiki));
  151. break;
  152. case HELP_TRANSLATE:
  153. webTextComponent = new TextComponent("@");
  154. webTextComponent.setColor(ChatColor.YELLOW);
  155. addChild(webTextComponent, "Lang");
  156. webTextComponent.setClickEvent(getUrlClickEvent(McMMOUrl.urlTranslate));
  157. break;
  158. default:
  159. webTextComponent = new TextComponent("NOT DEFINED");
  160. }
  161. addNewHoverComponentToTextComponent(webTextComponent, getUrlHoverEvent(webLinks));
  162. webTextComponent.setInsertion(webLinks.getUrl());
  163. return webTextComponent;
  164. }
  165. private static void addChild(TextComponent webTextComponent, String childName) {
  166. TextComponent childComponent = new TextComponent(childName);
  167. childComponent.setColor(ChatColor.BLUE);
  168. webTextComponent.addExtra(childComponent);
  169. }
  170. private static BaseComponent[] getUrlHoverEvent(McMMOWebLinks webLinks)
  171. {
  172. ComponentBuilder componentBuilder = new ComponentBuilder(webLinks.getNiceTitle());
  173. switch(webLinks)
  174. {
  175. case WEBSITE:
  176. addUrlHeaderHover(webLinks, componentBuilder);
  177. componentBuilder.append("\n\n").italic(false);
  178. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  179. componentBuilder.append("\nDev Blogs, and information related to mcMMO can be found here").color(ChatColor.GRAY);
  180. break;
  181. case SPIGOT:
  182. addUrlHeaderHover(webLinks, componentBuilder);
  183. componentBuilder.append("\n\n").italic(false);
  184. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  185. componentBuilder.append("\nI post regularly in the discussion thread here!").color(ChatColor.GRAY);
  186. break;
  187. case PATREON:
  188. addUrlHeaderHover(webLinks, componentBuilder);
  189. componentBuilder.append("\n\n").italic(false);
  190. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  191. componentBuilder.append("\n");
  192. componentBuilder.append("Show support by buying me a coffee :)").italic(false).color(ChatColor.GRAY);
  193. break;
  194. case WIKI:
  195. addUrlHeaderHover(webLinks, componentBuilder);
  196. componentBuilder.append("\n\n").italic(false);
  197. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  198. componentBuilder.append("\n");
  199. componentBuilder.append("I'm looking for more wiki staff, contact me on our discord!").italic(false).color(ChatColor.DARK_GRAY);
  200. break;
  201. case DISCORD:
  202. addUrlHeaderHover(webLinks, componentBuilder);
  203. componentBuilder.append("\n\n").italic(false);
  204. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  205. break;
  206. case HELP_TRANSLATE:
  207. addUrlHeaderHover(webLinks, componentBuilder);
  208. componentBuilder.append("\n\n").italic(false);
  209. componentBuilder.append(webLinks.getLocaleDescription()).color(ChatColor.GREEN);
  210. componentBuilder.append("\n");
  211. componentBuilder.append("You can use this website to help translate mcMMO into your language!" +
  212. "\nIf you want to know more contact me in discord.").italic(false).color(ChatColor.DARK_GRAY);
  213. }
  214. return componentBuilder.create();
  215. }
  216. private static void addUrlHeaderHover(McMMOWebLinks webLinks, ComponentBuilder componentBuilder) {
  217. componentBuilder.append("\n");
  218. componentBuilder.append(webLinks.getUrl()).color(ChatColor.GRAY).italic(true);
  219. }
  220. private static ClickEvent getUrlClickEvent(String url)
  221. {
  222. return new ClickEvent(ClickEvent.Action.OPEN_URL, url);
  223. }
  224. private static TextComponent getSubSkillTextComponent(Player player, SubSkillType subSkillType)
  225. {
  226. //Get skill name
  227. String skillName = subSkillType.getLocaleName();
  228. TextComponent textComponent;
  229. //Setup Text Component
  230. if(RankUtils.hasUnlockedSubskill(player, subSkillType))
  231. {
  232. textComponent = new TextComponent(skillName);
  233. textComponent.setColor(ChatColor.DARK_AQUA);
  234. textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo "+subSkillType.getNiceNameNoSpaces(subSkillType)));
  235. }
  236. else {
  237. textComponent = new TextComponent("???");
  238. textComponent.setColor(ChatColor.DARK_GRAY);
  239. textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo ???"));
  240. }
  241. //Hover Event
  242. addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, subSkillType));
  243. //Insertion
  244. textComponent.setInsertion(skillName);
  245. return textComponent;
  246. }
  247. private static void addNewHoverComponentToTextComponent(TextComponent textComponent, BaseComponent[] baseComponent) {
  248. textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, baseComponent));
  249. }
  250. private static TextComponent getSubSkillTextComponent(Player player, AbstractSubSkill abstractSubSkill)
  251. {
  252. //String key = abstractSubSkill.getConfigKeyName();
  253. String skillName = abstractSubSkill.getNiceName();
  254. //Setup Text Component
  255. TextComponent textComponent;
  256. //Setup Text Component
  257. if(RankUtils.hasUnlockedSubskill(player, abstractSubSkill))
  258. {
  259. textComponent = new TextComponent(skillName);
  260. textComponent.setColor(ChatColor.DARK_AQUA);
  261. textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo "+abstractSubSkill.getConfigKeyName()));
  262. }
  263. else {
  264. textComponent = new TextComponent("???");
  265. textComponent.setColor(ChatColor.DARK_GRAY);
  266. textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/mmoinfo ???"));
  267. }
  268. //Hover Event
  269. addNewHoverComponentToTextComponent(textComponent, getSubSkillHoverComponent(player, abstractSubSkill));
  270. //Insertion
  271. textComponent.setInsertion(skillName);
  272. return textComponent;
  273. }
  274. private static BaseComponent[] getSubSkillHoverComponent(Player player, AbstractSubSkill abstractSubSkill)
  275. {
  276. return getSubSkillHoverEventJSON(abstractSubSkill, player);
  277. }
  278. private static BaseComponent[] getSubSkillHoverComponent(Player player, SubSkillType subSkillType)
  279. {
  280. return getSubSkillHoverEventJSON(subSkillType, player);
  281. }
  282. /**
  283. * Used for the skill in the new skill system (Deriving from AbstractSubSkill)
  284. * @param abstractSubSkill this subskill
  285. * @param player the player who owns this subskill
  286. * @return the hover basecomponent object for this subskill
  287. */
  288. private static BaseComponent[] getSubSkillHoverEventJSON(AbstractSubSkill abstractSubSkill, Player player)
  289. {
  290. String skillName = abstractSubSkill.getNiceName();
  291. /*
  292. * Hover Event BaseComponent color table
  293. */
  294. ChatColor ccSubSkillHeader = ChatColor.GOLD;
  295. ChatColor ccRank = ChatColor.BLUE;
  296. ChatColor ccCurRank = ChatColor.GREEN;
  297. ChatColor ccPossessive = ChatColor.WHITE;
  298. ChatColor ccNumRanks = ccCurRank;
  299. //ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE;
  300. //ChatColor ccDescription = ChatColor.WHITE;
  301. ChatColor ccLocked = ChatColor.DARK_GRAY;
  302. ChatColor ccLevelRequirement = ChatColor.BLUE;
  303. ChatColor ccLevelRequired = ChatColor.RED;
  304. ComponentBuilder componentBuilder;
  305. //SubSkillType Name
  306. if(RankUtils.hasUnlockedSubskill(player, abstractSubSkill))
  307. componentBuilder = getNewComponentBuilder(skillName, ccSubSkillHeader);
  308. else
  309. componentBuilder = getNewComponentBuilder("???", ccSubSkillHeader);
  310. if(!RankUtils.hasUnlockedSubskill(player, abstractSubSkill))
  311. {
  312. //Skill is not unlocked yet
  313. addLocked(abstractSubSkill, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
  314. } else {
  315. addSubSkillTypeToHoverEventJSON(abstractSubSkill, componentBuilder);
  316. //RANK
  317. addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, abstractSubSkill.getNumRanks(), RankUtils.getRank(player, abstractSubSkill));
  318. componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader"));
  319. componentBuilder.append("\n").append(abstractSubSkill.getDescription()).append("\n");
  320. //Empty line
  321. componentBuilder.append("\n").bold(false);
  322. componentBuilder.append("\n");
  323. //Finally, add details to the tooltip
  324. abstractSubSkill.addStats(componentBuilder, player);
  325. }
  326. return componentBuilder.create();
  327. }
  328. private static ComponentBuilder getNewComponentBuilder(String skillName, ChatColor ccSubSkillHeader) {
  329. ComponentBuilder componentBuilder = new ComponentBuilder(skillName);
  330. componentBuilder.bold(true).color(ccSubSkillHeader);
  331. componentBuilder.append("\n");
  332. return componentBuilder;
  333. }
  334. private static void addRanked(ChatColor ccRank, ChatColor ccCurRank, ChatColor ccPossessive, ChatColor ccNumRanks, ComponentBuilder componentBuilder, int numRanks, int rank) {
  335. if (numRanks > 0) {
  336. //Rank
  337. componentBuilder.append(LocaleLoader.getString("JSON.Rank") + ": ").bold(false).color(ccRank);
  338. //x of y
  339. componentBuilder.append(String.valueOf(rank)).color(ccCurRank);
  340. componentBuilder.append(" " + LocaleLoader.getString("JSON.RankPossesive") + " ").color(ccPossessive);
  341. componentBuilder.append(String.valueOf(numRanks)).color(ccNumRanks);
  342. }
  343. }
  344. private static void addLocked(SubSkillType subSkillType, ChatColor ccLocked, ChatColor ccLevelRequirement, ChatColor ccLevelRequired, ComponentBuilder componentBuilder) {
  345. addLocked(ccLocked, ccLevelRequirement, componentBuilder);
  346. componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(subSkillType, 1))).color(ccLevelRequired);
  347. //componentBuilder.append("\n");
  348. }
  349. private static void addLocked(AbstractSubSkill abstractSubSkill, ChatColor ccLocked, ChatColor ccLevelRequirement, ChatColor ccLevelRequired, ComponentBuilder componentBuilder) {
  350. addLocked(ccLocked, ccLevelRequirement, componentBuilder);
  351. componentBuilder.append(String.valueOf(RankConfig.getInstance().getSubSkillUnlockLevel(abstractSubSkill, 1))).color(ccLevelRequired);
  352. //componentBuilder.append("\n");
  353. }
  354. private static void addLocked(ChatColor ccLocked, ChatColor ccLevelRequirement, ComponentBuilder componentBuilder) {
  355. componentBuilder.append(LocaleLoader.getString("JSON.Locked")).color(ccLocked).bold(true);
  356. componentBuilder.append("\n").append("\n").bold(false);
  357. componentBuilder.append(LocaleLoader.getString("JSON.LevelRequirement") + ": ").color(ccLevelRequirement);
  358. }
  359. @Deprecated
  360. private static BaseComponent[] getSubSkillHoverEventJSON(SubSkillType subSkillType, Player player)
  361. {
  362. String skillName = subSkillType.getLocaleName();
  363. /*
  364. * Hover Event BaseComponent color table
  365. */
  366. ChatColor ccSubSkillHeader = ChatColor.GOLD;
  367. ChatColor ccRank = ChatColor.BLUE;
  368. ChatColor ccCurRank = ChatColor.GREEN;
  369. ChatColor ccPossessive = ChatColor.WHITE;
  370. ChatColor ccNumRanks = ccCurRank;
  371. ChatColor ccDescriptionHeader = ChatColor.DARK_PURPLE;
  372. ChatColor ccDescription = ChatColor.DARK_GRAY;
  373. ChatColor ccLocked = ChatColor.DARK_GRAY;
  374. ChatColor ccLevelRequirement = ChatColor.BLUE;
  375. ChatColor ccLevelRequired = ChatColor.RED;
  376. ComponentBuilder componentBuilder;
  377. //SubSkillType Name
  378. if(RankUtils.hasUnlockedSubskill(player, subSkillType))
  379. componentBuilder = getNewComponentBuilder(skillName, ccSubSkillHeader);
  380. else
  381. componentBuilder = getNewComponentBuilder("???", ccSubSkillHeader);
  382. if(!RankUtils.hasUnlockedSubskill(player, subSkillType))
  383. {
  384. //Skill is not unlocked yet
  385. addLocked(subSkillType, ccLocked, ccLevelRequirement, ccLevelRequired, componentBuilder);
  386. } else {
  387. //addSubSkillTypeToHoverEventJSON(subSkillType, componentBuilder);
  388. //RANK
  389. if(subSkillType.getNumRanks() > 0)
  390. {
  391. addRanked(ccRank, ccCurRank, ccPossessive, ccNumRanks, componentBuilder, subSkillType.getNumRanks(), RankUtils.getRank(player, subSkillType));
  392. //Empty line
  393. componentBuilder.append("\n").bold(false);
  394. }
  395. componentBuilder.append(LocaleLoader.getString("JSON.DescriptionHeader"));
  396. componentBuilder.color(ccDescriptionHeader);
  397. componentBuilder.append("\n");
  398. componentBuilder.append(subSkillType.getLocaleDescription());
  399. componentBuilder.color(ccDescription);
  400. }
  401. return componentBuilder.create();
  402. }
  403. private static void addSubSkillTypeToHoverEventJSON(AbstractSubSkill abstractSubSkill, ComponentBuilder componentBuilder)
  404. {
  405. if(abstractSubSkill.isSuperAbility())
  406. {
  407. componentBuilder.append(LocaleLoader.getString("JSON.Type.SuperAbility")).color(ChatColor.LIGHT_PURPLE);
  408. componentBuilder.bold(true);
  409. } else if(abstractSubSkill.isActiveUse())
  410. {
  411. componentBuilder.append(LocaleLoader.getString("JSON.Type.Active")).color(ChatColor.DARK_RED);
  412. componentBuilder.bold(true);
  413. } else {
  414. componentBuilder.append(LocaleLoader.getString("JSON.Type.Passive")).color(ChatColor.GREEN);
  415. componentBuilder.bold(true);
  416. }
  417. componentBuilder.append("\n");
  418. }
  419. public static void getSubSkillTextComponents(Player player, List<TextComponent> textComponents, PrimarySkillType parentSkill) {
  420. for(SubSkillType subSkillType : SubSkillType.values())
  421. {
  422. if(subSkillType.getParentSkill() == parentSkill)
  423. {
  424. if(Permissions.isSubSkillEnabled(player, subSkillType))
  425. {
  426. if(!InteractionManager.hasSubSkill(subSkillType))
  427. textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, subSkillType));
  428. }
  429. }
  430. }
  431. /* NEW SKILL SYSTEM */
  432. for(AbstractSubSkill abstractSubSkill : InteractionManager.getSubSkillList())
  433. {
  434. if(abstractSubSkill.getPrimarySkill() == parentSkill)
  435. {
  436. if(Permissions.isSubSkillEnabled(player, abstractSubSkill))
  437. textComponents.add(TextComponentFactory.getSubSkillTextComponent(player, abstractSubSkill));
  438. }
  439. }
  440. }
  441. }