UnarmedManager.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package com.gmail.nossr50.skills.unarmed;
  2. import com.gmail.nossr50.core.MetadataConstants;
  3. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  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.datatypes.skills.SuperAbilityType;
  8. import com.gmail.nossr50.datatypes.skills.ToolType;
  9. import com.gmail.nossr50.mcMMO;
  10. import com.gmail.nossr50.skills.SkillManager;
  11. import com.gmail.nossr50.util.Misc;
  12. import com.gmail.nossr50.util.skills.SkillActivationType;
  13. import org.bukkit.Material;
  14. import org.bukkit.block.BlockState;
  15. import org.bukkit.entity.Item;
  16. import org.bukkit.entity.LivingEntity;
  17. import org.bukkit.entity.Player;
  18. import org.bukkit.inventory.ItemStack;
  19. public class UnarmedManager extends SkillManager {
  20. private long lastAttacked;
  21. private long attackInterval;
  22. public UnarmedManager(mcMMO pluginRef, McMMOPlayer mcMMOPlayer) {
  23. super(pluginRef, mcMMOPlayer, PrimarySkillType.UNARMED);
  24. initUnarmedPerPlayerVars();
  25. }
  26. /**
  27. * Inits variables used for each player for unarmed
  28. */
  29. private void initUnarmedPerPlayerVars() {
  30. lastAttacked = 0;
  31. attackInterval = 750;
  32. }
  33. public boolean canActivateAbility() {
  34. return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && pluginRef.getPermissionTools().berserk(getPlayer());
  35. }
  36. public boolean canUseIronArm() {
  37. if (!pluginRef.getRankTools().hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE))
  38. return false;
  39. return pluginRef.getPermissionTools().isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE);
  40. }
  41. public boolean canUseBerserk() {
  42. return mcMMOPlayer.getSuperAbilityMode(SuperAbilityType.BERSERK);
  43. }
  44. public boolean canDisarm(LivingEntity target) {
  45. if (!pluginRef.getRankTools().hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_DISARM))
  46. return false;
  47. return target instanceof Player && ((Player) target).getInventory().getItemInMainHand().getType() != Material.AIR && pluginRef.getPermissionTools().isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_DISARM);
  48. }
  49. public boolean canDeflect() {
  50. if (!pluginRef.getRankTools().hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT))
  51. return false;
  52. Player player = getPlayer();
  53. return pluginRef.getItemTools().isUnarmed(player.getInventory().getItemInMainHand()) && pluginRef.getPermissionTools().isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT);
  54. }
  55. public boolean canUseBlockCracker() {
  56. if (!pluginRef.getRankTools().hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER))
  57. return false;
  58. return pluginRef.getPermissionTools().isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER);
  59. }
  60. public boolean blockCrackerCheck(BlockState blockState) {
  61. if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer())) {
  62. return false;
  63. }
  64. switch (blockState.getType()) {
  65. case STONE_BRICKS:
  66. /*if (!Unarmed.blockCrackerSmoothBrick) {
  67. return false;
  68. }*/
  69. blockState.setType(Material.CRACKED_STONE_BRICKS);
  70. return true;
  71. default:
  72. return false;
  73. }
  74. }
  75. /**
  76. * Check for disarm.
  77. *
  78. * @param defender The defending player
  79. */
  80. public void disarmCheck(Player defender) {
  81. if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer()) && !hasIronGrip(defender)) {
  82. if (pluginRef.getEventManager().callDisarmEvent(defender).isCancelled()) {
  83. return;
  84. }
  85. if (pluginRef.getUserManager().getPlayer(defender) == null)
  86. return;
  87. Item item = Misc.dropItem(defender.getLocation(), defender.getInventory().getItemInMainHand());
  88. if (item != null && pluginRef.getConfigManager().getConfigUnarmed().doesDisarmPreventTheft()) {
  89. item.setMetadata(MetadataConstants.DISARMED_ITEM_METAKEY, pluginRef.getUserManager().getPlayer(defender).getPlayerMetadata());
  90. }
  91. defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
  92. pluginRef.getNotificationManager().sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Skills.Disarmed");
  93. }
  94. }
  95. /**
  96. * Check for arrow deflection.
  97. */
  98. public boolean deflectCheck() {
  99. if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_ARROW_DEFLECT, getPlayer())) {
  100. pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.ArrowDeflect");
  101. return true;
  102. }
  103. return false;
  104. }
  105. /**
  106. * Handle the effects of the Berserk ability
  107. *
  108. * @param damage The amount of damage initially dealt by the event
  109. */
  110. public double berserkDamage(double damage) {
  111. damage = (damage * Unarmed.berserkDamageModifier) - damage;
  112. return damage;
  113. }
  114. /**
  115. * Handle the effects of the Iron Arm ability
  116. */
  117. public double ironArm() {
  118. if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_IRON_ARM_STYLE, getPlayer())) {
  119. return 0;
  120. }
  121. return getIronArmDamage();
  122. }
  123. public boolean isPunchingCooldownOver() {
  124. return (lastAttacked + attackInterval) <= System.currentTimeMillis();
  125. }
  126. public double getIronArmDamage() {
  127. int rank = pluginRef.getRankTools().getRank(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE);
  128. if (rank == 1) {
  129. return 4;
  130. } else {
  131. return 3 + (rank * 2);
  132. }
  133. }
  134. /**
  135. * Check Iron Grip ability success
  136. *
  137. * @param defender The defending player
  138. * @return true if the defender was not disarmed, false otherwise
  139. */
  140. private boolean hasIronGrip(Player defender) {
  141. if (!Misc.isNPCEntityExcludingVillagers(defender)
  142. && pluginRef.getPermissionTools().isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP)
  143. && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_IRON_GRIP, defender)) {
  144. pluginRef.getNotificationManager().sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Defender");
  145. pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Attacker");
  146. return true;
  147. }
  148. return false;
  149. }
  150. public long getLastAttacked() {
  151. return lastAttacked;
  152. }
  153. public void setLastAttacked(long lastAttacked) {
  154. this.lastAttacked = lastAttacked;
  155. }
  156. public long getAttackInterval() {
  157. return attackInterval;
  158. }
  159. public void setAttackInterval(long attackInterval) {
  160. this.attackInterval = attackInterval;
  161. }
  162. }