2
0

SkillCommand.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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.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.skills.child.FamilyTree;
  9. import com.gmail.nossr50.util.Permissions;
  10. import com.gmail.nossr50.util.StringUtils;
  11. import com.gmail.nossr50.util.TextComponentFactory;
  12. import com.gmail.nossr50.util.commands.CommandUtils;
  13. import com.gmail.nossr50.util.player.UserManager;
  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.google.common.collect.ImmutableList;
  18. import net.md_5.bungee.api.ChatColor;
  19. import net.md_5.bungee.api.chat.TextComponent;
  20. import org.bukkit.command.Command;
  21. import org.bukkit.command.CommandExecutor;
  22. import org.bukkit.command.CommandSender;
  23. import org.bukkit.command.TabExecutor;
  24. import org.bukkit.entity.Player;
  25. import java.text.DecimalFormat;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. import java.util.Set;
  29. public abstract class SkillCommand implements TabExecutor {
  30. protected PrimarySkillType skill;
  31. private String skillName;
  32. protected DecimalFormat percent = new DecimalFormat("##0.00%");
  33. protected DecimalFormat decimal = new DecimalFormat("##0.00");
  34. private CommandExecutor skillGuideCommand;
  35. public SkillCommand(PrimarySkillType skill) {
  36. this.skill = skill;
  37. skillName = skill.getName();
  38. skillGuideCommand = new SkillGuideCommand(skill);
  39. }
  40. @Override
  41. public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
  42. if (CommandUtils.noConsoleUsage(sender)) {
  43. return true;
  44. }
  45. if (!CommandUtils.hasPlayerDataKey(sender)) {
  46. return true;
  47. }
  48. switch (args.length) {
  49. case 0:
  50. Player player = (Player) sender;
  51. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
  52. boolean isLucky = Permissions.lucky(player, skill);
  53. boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
  54. float skillValue = mcMMOPlayer.getSkillLevel(skill);
  55. permissionsCheck(player);
  56. dataCalculations(player, skillValue, isLucky);
  57. sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
  58. //Make JSON text components
  59. List<TextComponent> subskillTextComponents = getTextComponents(player);
  60. //Subskills Header
  61. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul")));
  62. //Send JSON text components
  63. TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents);
  64. /*for(TextComponent tc : subskillTextComponents)
  65. {
  66. player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")});
  67. }*/
  68. //Stats
  69. getStatMessages(player, isLucky, hasEndurance, skillValue);
  70. //Header
  71. player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header"));
  72. //Link Header
  73. TextComponentFactory.sendPlayerUrlHeader(player);
  74. if (Config.getInstance().getScoreboardsEnabled() && Config.getInstance().getSkillUseBoard()) {
  75. ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
  76. }
  77. return true;
  78. default:
  79. return skillGuideCommand.onCommand(sender, command, label, args);
  80. }
  81. }
  82. private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) {
  83. List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
  84. if (!statsMessages.isEmpty()) {
  85. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
  86. for (String message : statsMessages) {
  87. player.sendMessage(message);
  88. }
  89. }
  90. player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase()));
  91. }
  92. private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
  93. ChatColor hd1 = ChatColor.DARK_AQUA;
  94. ChatColor c1 = ChatColor.GOLD;
  95. ChatColor c2 = ChatColor.RED;
  96. player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
  97. if(!skill.isChildSkill())
  98. {
  99. /*
  100. * NON-CHILD SKILLS
  101. */
  102. //XP GAIN METHOD
  103. player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  104. //LEVEL
  105. player.sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
  106. } else {
  107. /*
  108. * CHILD SKILLS
  109. */
  110. Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
  111. ArrayList<PrimarySkillType> parentList = new ArrayList<>();
  112. //TODO: Add JSON here
  113. for (PrimarySkillType parent : parents) {
  114. parentList.add(parent);
  115. /*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/;
  116. }
  117. String parentMessage = "";
  118. for(int i = 0; i < parentList.size(); i++)
  119. {
  120. if(i+1 < parentList.size())
  121. {
  122. parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
  123. parentMessage += ChatColor.GRAY+", ";
  124. } else {
  125. parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
  126. }
  127. }
  128. //XP GAIN METHOD
  129. player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
  130. player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage));
  131. //LEVEL
  132. //player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue));
  133. }
  134. /*
  135. if (!skill.isChildSkill()) {
  136. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
  137. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  138. player.sendMessage(LocaleLoader.getString("Effects.Level", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
  139. } else {
  140. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
  141. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
  142. player.sendMessage(LocaleLoader.getString("Effects.Child", skillValue));
  143. player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
  144. Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
  145. for (PrimarySkillType parent : parents) {
  146. player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)));
  147. }
  148. }
  149. */
  150. }
  151. @Override
  152. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
  153. switch (args.length) {
  154. case 1:
  155. return ImmutableList.of("?");
  156. default:
  157. return ImmutableList.of();
  158. }
  159. }
  160. protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) {
  161. return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
  162. }
  163. protected String[] calculateAbilityDisplayValues(double chance, boolean isLucky) {
  164. String[] displayValues = new String[2];
  165. displayValues[0] = percent.format(Math.min(chance, 100.0D) / 100.0D);
  166. displayValues[1] = isLucky ? percent.format(Math.min(chance * 1.3333D, 100.0D) / 100.0D) : null;
  167. return displayValues;
  168. }
  169. protected String[] calculateAbilityDisplayValues(float skillValue, SubSkillType subSkill, boolean isLucky) {
  170. int maxBonusLevel = AdvancedConfig.getInstance().getMaxBonusLevel(subSkill);
  171. return calculateAbilityDisplayValues((AdvancedConfig.getInstance().getMaxChance(subSkill) / maxBonusLevel) * Math.min(skillValue, maxBonusLevel), isLucky);
  172. }
  173. protected String[] calculateLengthDisplayValues(Player player, float skillValue) {
  174. int maxLength = skill.getAbility().getMaxLength();
  175. int abilityLengthVar = Config.getInstance().getIsRetroMode() ? AdvancedConfig.getInstance().getAbilityLengthRetro() : AdvancedConfig.getInstance().getAbilityLengthStandard();
  176. int length = 2 + (int) (skillValue / abilityLengthVar);
  177. int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
  178. if (maxLength != 0) {
  179. length = Math.min(length, maxLength);
  180. }
  181. return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
  182. }
  183. protected abstract void dataCalculations(Player player, float skillValue, boolean isLucky);
  184. protected abstract void permissionsCheck(Player player);
  185. protected abstract List<String> effectsDisplay();
  186. protected abstract List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky);
  187. protected abstract List<TextComponent> getTextComponents(Player player);
  188. /**
  189. * Checks if a player can use a skill
  190. * @param player target player
  191. * @param subSkillType target subskill
  192. * @return true if the player has permission and has the skill unlocked
  193. */
  194. protected boolean canUseSubskill(Player player, SubSkillType subSkillType)
  195. {
  196. return Permissions.isSubSkillEnabled(player, subSkillType) && RankUtils.hasUnlockedSubskill(player, subSkillType);
  197. }
  198. }