SkillCommand.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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.mcMMO;
  6. import com.gmail.nossr50.skills.child.FamilyTree;
  7. import com.gmail.nossr50.util.StringUtils;
  8. import com.gmail.nossr50.util.skills.SkillActivationType;
  9. import com.google.common.collect.ImmutableList;
  10. import net.md_5.bungee.api.ChatColor;
  11. import net.md_5.bungee.api.chat.TextComponent;
  12. import org.bukkit.command.Command;
  13. import org.bukkit.command.CommandExecutor;
  14. import org.bukkit.command.CommandSender;
  15. import org.bukkit.command.TabExecutor;
  16. import org.bukkit.entity.Player;
  17. import java.text.DecimalFormat;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Set;
  21. public abstract class SkillCommand implements TabExecutor {
  22. protected PrimarySkillType skill;
  23. protected DecimalFormat percent = new DecimalFormat("##0.00%");
  24. protected DecimalFormat decimal = new DecimalFormat("##0.00");
  25. private String skillName;
  26. private CommandExecutor skillGuideCommand;
  27. protected mcMMO pluginRef;
  28. public SkillCommand(PrimarySkillType primarySkillType, mcMMO pluginRef) {
  29. this.pluginRef = pluginRef;
  30. this.skill = primarySkillType;
  31. skillName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType);
  32. skillGuideCommand = new SkillGuideCommand(primarySkillType, pluginRef);
  33. }
  34. public static String[] addItemToFirstPositionOfArray(String itemToAdd, String... existingArray) {
  35. String[] newArray = new String[existingArray.length + 1];
  36. newArray[0] = itemToAdd;
  37. System.arraycopy(existingArray, 0, newArray, 1, existingArray.length);
  38. return newArray;
  39. }
  40. @Override
  41. public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
  42. if (pluginRef.getCommandTools().noConsoleUsage(sender)) {
  43. return true;
  44. }
  45. if (!pluginRef.getCommandTools().hasPlayerDataKey(sender)) {
  46. return true;
  47. }
  48. if (pluginRef.getUserManager().getPlayer((Player) sender) == null) {
  49. sender.sendMessage(pluginRef.getLocaleManager().getString("Profile.PendingLoad"));
  50. return true;
  51. }
  52. switch (args.length) {
  53. case 0:
  54. Player player = (Player) sender;
  55. McMMOPlayer mcMMOPlayer = pluginRef.getUserManager().getPlayer(player);
  56. boolean isLucky = pluginRef.getPermissionTools().lucky(player, skill);
  57. boolean hasEndurance = pluginRef.getSkillTools().getEnduranceLength(player) > 0;
  58. double skillValue = mcMMOPlayer.getSkillLevel(skill);
  59. //Send the players a few blank lines to make finding the top of the skill command easier
  60. if (pluginRef.getConfigManager().getConfigCommands().isSendBlankLines())
  61. for (int i = 0; i < 2; i++) {
  62. player.sendMessage("");
  63. }
  64. permissionsCheck(player);
  65. dataCalculations(player, skillValue);
  66. sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
  67. //Make JSON text components
  68. List<TextComponent> subskillTextComponents = getTextComponents(player);
  69. //Subskills Header
  70. player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Overhaul.Header", pluginRef.getLocaleManager().getString("Effects.SubSkills.Overhaul")));
  71. //Send JSON text components
  72. pluginRef.getTextComponentFactory().sendPlayerSubSkillList(player, subskillTextComponents);
  73. /*for(TextComponent tc : subskillTextComponents)
  74. {
  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 (pluginRef.getConfigManager().getConfigAds().isShowWebsiteLinks()) {
  82. player.sendMessage(pluginRef.getLocaleManager().getString("Overhaul.mcMMO.Header"));
  83. pluginRef.getTextComponentFactory().sendPlayerUrlHeader(player);
  84. }
  85. if (pluginRef.getScoreboardSettings().getScoreboardsEnabled()
  86. && pluginRef.getScoreboardSettings().getConfigSectionScoreboardTypes()
  87. .getConfigSectionSkillBoard().isUseThisBoard()) {
  88. pluginRef.getScoreboardManager().enablePlayerSkillScoreboard(player, skill);
  89. }
  90. return true;
  91. default:
  92. return skillGuideCommand.onCommand(sender, command, label, args);
  93. }
  94. }
  95. private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, double skillValue) {
  96. List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
  97. if (!statsMessages.isEmpty()) {
  98. player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Overhaul.Header", pluginRef.getLocaleManager().getString("Commands.Stats.Self.Overhaul")));
  99. for (String message : statsMessages) {
  100. player.sendMessage(message);
  101. }
  102. }
  103. player.sendMessage(pluginRef.getLocaleManager().getString("Guides.Available", skillName, skillName.toLowerCase()));
  104. }
  105. private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
  106. ChatColor hd1 = ChatColor.DARK_AQUA;
  107. ChatColor c1 = ChatColor.GOLD;
  108. ChatColor c2 = ChatColor.RED;
  109. player.sendMessage(pluginRef.getLocaleManager().getString("Skills.Overhaul.Header", skillName));
  110. if (!pluginRef.getSkillTools().isChildSkill(skill)) {
  111. /*
  112. * NON-CHILD SKILLS
  113. */
  114. //XP GAIN METHOD
  115. player.sendMessage(pluginRef.getLocaleManager().getString("Commands.XPGain.Overhaul", pluginRef.getLocaleManager().getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  116. //LEVEL
  117. player.sendMessage(pluginRef.getLocaleManager().getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
  118. } else {
  119. /*
  120. * CHILD SKILLS
  121. */
  122. Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
  123. ArrayList<PrimarySkillType> parentList = new ArrayList<>();
  124. //TODO: Add JSON here
  125. /*player.sendMessage(parent.getName() + " - " + pluginRef.getLocaleManager().getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/
  126. parentList.addAll(parents);
  127. StringBuilder parentMessage = new StringBuilder();
  128. for (int i = 0; i < parentList.size(); i++) {
  129. if (i + 1 < parentList.size()) {
  130. parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", pluginRef.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
  131. parentMessage.append(ChatColor.GRAY + ", ");
  132. } else {
  133. parentMessage.append(pluginRef.getLocaleManager().getString("Effects.Child.ParentList", pluginRef.getSkillTools().getLocalizedSkillName(parentList.get(i)), mcMMOPlayer.getSkillLevel(parentList.get(i))));
  134. }
  135. }
  136. //XP GAIN METHOD
  137. player.sendMessage(pluginRef.getLocaleManager().getString("Commands.XPGain.Overhaul", pluginRef.getLocaleManager().getString("Commands.XPGain.Child")));
  138. player.sendMessage(pluginRef.getLocaleManager().getString("Effects.Child.Overhaul", skillValue, parentMessage.toString()));
  139. //LEVEL
  140. //player.sendMessage(pluginRef.getLocaleManager().getString("Effects.Child.Overhaul", skillValue, skillValue));
  141. }
  142. }
  143. @Override
  144. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
  145. switch (args.length) {
  146. case 1:
  147. return ImmutableList.of("?");
  148. default:
  149. return ImmutableList.of();
  150. }
  151. }
  152. protected int calculateRank(double skillValue, int maxLevel, int rankChangeLevel) {
  153. return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
  154. }
  155. protected String[] getAbilityDisplayValues(Player player, SubSkillType subSkill) {
  156. return pluginRef.getRandomChanceTools().calculateAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, subSkill);
  157. }
  158. protected String[] formatLengthDisplayValues(Player player, double skillValue) {
  159. int length = pluginRef.getSkillTools().calculateAbilityLength(pluginRef.getUserManager().getPlayer(player), skill, pluginRef.getSkillTools().getSuperAbility(skill));
  160. int enduranceLength = pluginRef.getSkillTools().calculateAbilityLengthPerks(pluginRef.getUserManager().getPlayer(player), skill, pluginRef.getSkillTools().getSuperAbility(skill));
  161. return new String[]{String.valueOf(length), String.valueOf(enduranceLength)};
  162. }
  163. protected String getStatMessage(SubSkillType subSkillType, String... vars) {
  164. return getStatMessage(false, false, subSkillType, vars);
  165. }
  166. protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) {
  167. String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
  168. String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription(pluginRef) : subSkillType.getLocaleKeyStatExtraDescription(pluginRef);
  169. if (isCustom)
  170. return pluginRef.getLocaleManager().getString(templateKey, pluginRef.getLocaleManager().getString(statDescriptionKey, vars));
  171. else {
  172. String[] mergedList = pluginRef.getNotificationManager().addItemToFirstPositionOfArray(pluginRef.getLocaleManager().getString(statDescriptionKey), vars);
  173. return pluginRef.getLocaleManager().getString(templateKey, mergedList);
  174. }
  175. }
  176. <<<<<<< HEAD
  177. protected abstract void dataCalculations(Player player, double skillValue);
  178. =======
  179. protected String getLimitBreakDescriptionParameter() {
  180. if(AdvancedConfig.getInstance().canApplyLimitBreakPVE()) {
  181. return "(PVP/PVE)";
  182. } else {
  183. return "(PVP)";
  184. }
  185. }
  186. protected abstract void dataCalculations(Player player, float skillValue);
  187. >>>>>>> 308e3a4b1f46e9e3de28d6d540dd055a540ed4d5
  188. protected abstract void permissionsCheck(Player player);
  189. //protected abstract List<String> effectsDisplay();
  190. protected abstract List<String> statsDisplay(Player player, double skillValue, boolean hasEndurance, boolean isLucky);
  191. protected abstract List<TextComponent> getTextComponents(Player player);
  192. /**
  193. * Checks if a player can use a skill
  194. *
  195. * @param player target player
  196. * @param subSkillType target subskill
  197. * @return true if the player has permission and has the skill unlocked
  198. */
  199. protected boolean canUseSubskill(Player player, SubSkillType subSkillType) {
  200. return pluginRef.getPermissionTools().isSubSkillEnabled(player, subSkillType) && pluginRef.getRankTools().hasUnlockedSubskill(player, subSkillType);
  201. }
  202. }