2
0

TextComponentFactory.java 26 KB

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