2
0

SkillCommand.java 12 KB

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