TextComponentFactory.java 25 KB

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