SkillCommand.java 12 KB

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