SkillCommand.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.gmail.nossr50.commands.skills;
  2. import java.text.DecimalFormat;
  3. import java.util.List;
  4. import java.util.Set;
  5. import org.bukkit.command.Command;
  6. import org.bukkit.command.CommandExecutor;
  7. import org.bukkit.command.CommandSender;
  8. import org.bukkit.command.TabExecutor;
  9. import org.bukkit.entity.Player;
  10. import com.gmail.nossr50.config.AdvancedConfig;
  11. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  12. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  13. import com.gmail.nossr50.datatypes.skills.SkillType;
  14. import com.gmail.nossr50.locale.LocaleLoader;
  15. import com.gmail.nossr50.skills.child.FamilyTree;
  16. import com.gmail.nossr50.util.Permissions;
  17. import com.gmail.nossr50.util.StringUtils;
  18. import com.gmail.nossr50.util.commands.CommandUtils;
  19. import com.gmail.nossr50.util.player.UserManager;
  20. import com.gmail.nossr50.util.skills.PerksUtils;
  21. import com.gmail.nossr50.util.skills.SkillUtils;
  22. import com.google.common.collect.ImmutableList;
  23. public abstract class SkillCommand implements TabExecutor {
  24. protected SkillType skill;
  25. protected String skillName;
  26. protected Player player;
  27. protected PlayerProfile profile;
  28. protected McMMOPlayer mcMMOPlayer;
  29. protected float skillValue;
  30. protected boolean isLucky;
  31. protected boolean hasEndurance;
  32. protected DecimalFormat percent = new DecimalFormat("##0.00%");
  33. protected DecimalFormat decimal = new DecimalFormat("##0.00");
  34. private CommandExecutor skillGuideCommand;
  35. public SkillCommand(SkillType skill) {
  36. this.skill = skill;
  37. skillName = SkillUtils.getSkillName(skill);
  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. mcMMOPlayer = UserManager.getPlayer(sender.getName());
  46. player = mcMMOPlayer.getPlayer();
  47. switch (args.length) {
  48. case 0:
  49. profile = mcMMOPlayer.getProfile();
  50. skillValue = profile.getSkillLevel(skill);
  51. isLucky = Permissions.lucky(sender, skill);
  52. hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
  53. permissionsCheck();
  54. dataCalculations();
  55. if (!skill.isChildSkill()) {
  56. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
  57. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
  58. player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, profile.getSkillXpLevel(skill), profile.getXpToLevel(skill)));
  59. }
  60. else {
  61. player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
  62. player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
  63. player.sendMessage(LocaleLoader.getString("Effects.Child", (int) skillValue));
  64. player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
  65. Set<SkillType> parents = FamilyTree.getParents(skill);
  66. for (SkillType parent : parents) {
  67. player.sendMessage(SkillUtils.getSkillName(parent) + " - " + LocaleLoader.getString("Effects.Level", profile.getSkillLevel(parent), profile.getSkillXpLevel(parent), profile.getXpToLevel(parent)));
  68. }
  69. }
  70. if (effectsHeaderPermissions()) {
  71. player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects")));
  72. }
  73. effectsDisplay();
  74. if (statsHeaderPermissions()) {
  75. player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self")));
  76. }
  77. statsDisplay();
  78. player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase()));
  79. return true;
  80. default:
  81. return skillGuideCommand.onCommand(sender, command, label, args);
  82. }
  83. }
  84. @Override
  85. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
  86. switch (args.length) {
  87. case 1:
  88. return ImmutableList.of("?");
  89. default:
  90. return ImmutableList.of();
  91. }
  92. }
  93. protected int calculateRank(int maxLevel, int rankChangeLevel) {
  94. return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
  95. }
  96. protected String[] calculateAbilityDisplayValues(double chance) {
  97. String[] displayValues = new String[2];
  98. displayValues[0] = percent.format(Math.min(chance, 100.0D) / 100.0D);
  99. displayValues[1] = isLucky ? percent.format(Math.min(chance * 1.3333D, 100.0D) / 100.0D) : null;
  100. return displayValues;
  101. }
  102. protected String[] calculateAbilityDisplayValues(int maxBonusLevel, double maxChance) {
  103. return calculateAbilityDisplayValues((maxChance / maxBonusLevel) * Math.min(skillValue, maxBonusLevel));
  104. }
  105. protected String[] calculateLengthDisplayValues() {
  106. int maxLength = skill.getAbility().getMaxTicks();
  107. int length = 2 + (int) (skillValue / AdvancedConfig.getInstance().getAbilityLength());
  108. int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
  109. if (maxLength != 0) {
  110. length = Math.min(length, maxLength);
  111. }
  112. return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };
  113. }
  114. protected void luckyEffectsDisplay() {
  115. if (isLucky) {
  116. String perkPrefix = LocaleLoader.getString("MOTD.PerksPrefix");
  117. player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", skillName)));
  118. }
  119. }
  120. protected abstract void dataCalculations();
  121. protected abstract void permissionsCheck();
  122. protected abstract boolean effectsHeaderPermissions();
  123. protected abstract void effectsDisplay();
  124. protected abstract boolean statsHeaderPermissions();
  125. protected abstract void statsDisplay();
  126. }