TextComponentFactory.java 25 KB

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