SkillCommand.java 11 KB

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