SkillCommand.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package com.gmail.nossr50.commands.skills;
  2. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  3. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  4. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  5. import com.gmail.nossr50.locale.LocaleLoader;
  6. import com.gmail.nossr50.mcMMO;
  7. import com.gmail.nossr50.skills.child.FamilyTree;
  8. import com.gmail.nossr50.util.Permissions;
  9. import com.gmail.nossr50.util.commands.CommandUtils;
  10. import com.gmail.nossr50.util.player.NotificationManager;
  11. import com.gmail.nossr50.util.player.UserManager;
  12. import com.gmail.nossr50.util.random.RandomChanceUtil;
  13. import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
  14. import com.gmail.nossr50.util.skills.PerksUtils;
  15. import com.gmail.nossr50.util.skills.RankUtils;
  16. import com.gmail.nossr50.util.skills.SkillActivationType;
  17. import com.gmail.nossr50.util.skills.SkillTools;
  18. import com.gmail.nossr50.util.text.StringUtils;
  19. import com.gmail.nossr50.util.text.TextComponentFactory;
  20. import com.google.common.collect.ImmutableList;
  21. import net.kyori.adventure.text.Component;
  22. import net.md_5.bungee.api.ChatColor;
  23. import org.bukkit.command.Command;
  24. import org.bukkit.command.CommandExecutor;
  25. import org.bukkit.command.CommandSender;
  26. import org.bukkit.command.TabExecutor;
  27. import org.bukkit.entity.Player;
  28. import org.jetbrains.annotations.NotNull;
  29. import java.text.DecimalFormat;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Locale;
  33. import java.util.Set;
  34. public abstract class SkillCommand implements TabExecutor {
  35. protected PrimarySkillType skill;
  36. private final String skillName;
  37. protected DecimalFormat percent = new DecimalFormat("##0.00%");
  38. protected DecimalFormat decimal = new DecimalFormat("##0.00");
  39. private final CommandExecutor skillGuideCommand;
  40. public SkillCommand(PrimarySkillType skill) {
  41. this.skill = skill;
  42. skillName = mcMMO.p.getSkillTools().getLocalizedSkillName(skill);
  43. skillGuideCommand = new SkillGuideCommand(skill);
  44. }
  45. @Override
  46. public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
  47. if (CommandUtils.noConsoleUsage(sender)) {
  48. return true;
  49. }
  50. if (!CommandUtils.hasPlayerDataKey(sender)) {
  51. return true;
  52. }
  53. Player player = (Player) sender;
  54. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
  55. if (mcMMOPlayer == null) {
  56. sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
  57. return true;
  58. }
  59. if (args.length == 0) {
  60. boolean isLucky = Permissions.lucky(player, skill);
  61. boolean hasEndurance = PerksUtils.handleActivationPerks(player, 0, 0) != 0;
  62. float skillValue = mcMMOPlayer.getSkillLevel(skill);
  63. //Send the players a few blank lines to make finding the top of the skill command easier
  64. if (mcMMO.p.getAdvancedConfig().doesSkillCommandSendBlankLines())
  65. for (int i = 0; i < 2; i++) {
  66. player.sendMessage("");
  67. }
  68. permissionsCheck(player);
  69. dataCalculations(player, skillValue);
  70. sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
  71. //Make JSON text components
  72. List<Component> subskillTextComponents = getTextComponents(player);
  73. //Subskills Header
  74. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul")));
  75. //Send JSON text components
  76. TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents);
  77. /*for(TextComponent tc : subskillTextComponents)
  78. {
  79. player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")});
  80. }*/
  81. //Stats
  82. getStatMessages(player, isLucky, hasEndurance, skillValue);
  83. //Header
  84. //Link Header
  85. if (mcMMO.p.getGeneralConfig().getUrlLinksEnabled()) {
  86. player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header"));
  87. TextComponentFactory.sendPlayerUrlHeader(player);
  88. }
  89. if (mcMMO.p.getGeneralConfig().getScoreboardsEnabled() && mcMMO.p.getGeneralConfig().getSkillUseBoard()) {
  90. ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
  91. }
  92. return true;
  93. } else if ("keep".equals(args[0].toLowerCase())) {
  94. if (!mcMMO.p.getGeneralConfig().getAllowKeepBoard()
  95. || !mcMMO.p.getGeneralConfig().getScoreboardsEnabled()
  96. || !mcMMO.p.getGeneralConfig().getSkillUseBoard()) {
  97. sender.sendMessage(LocaleLoader.getString("Commands.Disabled"));
  98. return true;
  99. }
  100. ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
  101. ScoreboardManager.keepBoard(sender.getName());
  102. sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Keep"));
  103. return true;
  104. }
  105. return skillGuideCommand.onCommand(sender, command, label, args);
  106. }
  107. private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) {
  108. List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
  109. if (!statsMessages.isEmpty()) {
  110. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
  111. for (String message : statsMessages) {
  112. player.sendMessage(message);
  113. }
  114. }
  115. player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase(Locale.ENGLISH)));
  116. }
  117. private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
  118. ChatColor hd1 = ChatColor.DARK_AQUA;
  119. ChatColor c1 = ChatColor.GOLD;
  120. ChatColor c2 = ChatColor.RED;
  121. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
  122. if(!SkillTools.isChildSkill(skill))
  123. {
  124. /*
  125. * NON-CHILD SKILLS
  126. */
  127. //XP GAIN METHOD
  128. player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  129. //LEVEL
  130. player.sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
  131. } else {
  132. /*
  133. * CHILD SKILLS
  134. */
  135. Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
  136. //TODO: Add JSON here
  137. /*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/
  138. ArrayList<PrimarySkillType> parentList = new ArrayList<>(parents);
  139. StringBuilder parentMessage = new StringBuilder();
  140. for(int i = 0; i < parentList.size(); i++)
  141. {
  142. if(i+1 < parentList.size())
  143. {
  144. parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
  145. parentMessage.append(ChatColor.GRAY).append(", ");
  146. } else {
  147. parentMessage.append(LocaleLoader.getString("Effects.Child.ParentList", mcMMO.p.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
  148. }
  149. }
  150. //XP GAIN METHOD
  151. player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
  152. player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage.toString()));
  153. //LEVEL
  154. //player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue));
  155. }
  156. /*
  157. if (!SkillTools.isChildSkill(skill)) {
  158. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
  159. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  160. player.sendMessage(LocaleLoader.getString("Effects.Level", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
  161. } else {
  162. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
  163. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
  164. player.sendMessage(LocaleLoader.getString("Effects.Child", skillValue));
  165. player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
  166. Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
  167. for (PrimarySkillType parent : parents) {
  168. player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)));
  169. }
  170. }
  171. */
  172. }
  173. @Override
  174. public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
  175. if (args.length == 1) {
  176. return ImmutableList.of("?", "keep");
  177. }
  178. return ImmutableList.of();
  179. }
  180. protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) {
  181. return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
  182. }
  183. protected String[] getAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkill) {
  184. return RandomChanceUtil.calculateAbilityDisplayValues(skillActivationType, player, subSkill);
  185. }
  186. protected String[] calculateLengthDisplayValues(Player player, float skillValue) {
  187. int maxLength = mcMMO.p.getSkillTools().getSuperAbilityMaxLength(mcMMO.p.getSkillTools().getSuperAbility(skill));
  188. int abilityLengthVar = mcMMO.p.getAdvancedConfig().getAbilityLength();
  189. int abilityLengthCap = mcMMO.p.getAdvancedConfig().getAbilityLengthCap();
  190. int length;
  191. if(abilityLengthCap <= 0)
  192. {
  193. length = 2 + (int) (skillValue / abilityLengthVar);
  194. }
  195. else {
  196. length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar);
  197. }
  198. int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
  199. if (maxLength != 0) {
  200. length = Math.min(length, maxLength);
  201. }
  202. return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
  203. }
  204. protected String getStatMessage(SubSkillType subSkillType, String... vars)
  205. {
  206. return getStatMessage(false, false, subSkillType, vars);
  207. }
  208. protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars)
  209. {
  210. String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
  211. String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
  212. if(isCustom)
  213. return LocaleLoader.getString(templateKey, LocaleLoader.getString(statDescriptionKey, vars));
  214. else
  215. {
  216. String[] mergedList = NotificationManager.addItemToFirstPositionOfArray(LocaleLoader.getString(statDescriptionKey), vars);
  217. return LocaleLoader.getString(templateKey, mergedList);
  218. }
  219. }
  220. protected String getLimitBreakDescriptionParameter() {
  221. if(mcMMO.p.getAdvancedConfig().canApplyLimitBreakPVE()) {
  222. return "(PVP/PVE)";
  223. } else {
  224. return "(PVP)";
  225. }
  226. }
  227. protected abstract void dataCalculations(Player player, float skillValue);
  228. protected abstract void permissionsCheck(Player player);
  229. //protected abstract List<String> effectsDisplay();
  230. protected abstract List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky);
  231. protected abstract List<Component> getTextComponents(Player player);
  232. /**
  233. * Checks if a player can use a skill
  234. * @param player target player
  235. * @param subSkillType target subskill
  236. * @return true if the player has permission and has the skill unlocked
  237. */
  238. protected boolean canUseSubskill(Player player, SubSkillType subSkillType)
  239. {
  240. return Permissions.isSubSkillEnabled(player, subSkillType) && RankUtils.hasUnlockedSubskill(player, subSkillType);
  241. }
  242. }