TextComponentFactory.java 25 KB

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