UnarmedManager.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package com.gmail.nossr50.skills.unarmed;
  2. import com.gmail.nossr50.config.AdvancedConfig;
  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.EventUtils;
  12. import com.gmail.nossr50.util.ItemUtils;
  13. import com.gmail.nossr50.util.Misc;
  14. import com.gmail.nossr50.util.Permissions;
  15. import com.gmail.nossr50.util.player.NotificationManager;
  16. import com.gmail.nossr50.util.player.UserManager;
  17. import com.gmail.nossr50.util.random.RandomChanceUtil;
  18. import com.gmail.nossr50.util.skills.RankUtils;
  19. import com.gmail.nossr50.util.skills.SkillActivationType;
  20. import org.bukkit.Material;
  21. import org.bukkit.block.BlockState;
  22. import org.bukkit.entity.Item;
  23. import org.bukkit.entity.LivingEntity;
  24. import org.bukkit.entity.Player;
  25. import org.bukkit.inventory.ItemStack;
  26. public class UnarmedManager extends SkillManager {
  27. public UnarmedManager(McMMOPlayer mcMMOPlayer) {
  28. super(mcMMOPlayer, PrimarySkillType.UNARMED);
  29. }
  30. public boolean canActivateAbility() {
  31. return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer());
  32. }
  33. public boolean canUseIronArm() {
  34. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE))
  35. return false;
  36. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE);
  37. }
  38. public boolean canUseBerserk() {
  39. return mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK);
  40. }
  41. public boolean canDisarm(LivingEntity target) {
  42. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_DISARM))
  43. return false;
  44. return target instanceof Player && ((Player) target).getInventory().getItemInMainHand().getType() != Material.AIR && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_DISARM);
  45. }
  46. public boolean canDeflect() {
  47. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT))
  48. return false;
  49. Player player = getPlayer();
  50. return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand()) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT);
  51. }
  52. public boolean canUseBlockCracker() {
  53. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER))
  54. return false;
  55. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER);
  56. }
  57. public boolean blockCrackerCheck(BlockState blockState) {
  58. if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer())) {
  59. return false;
  60. }
  61. switch (blockState.getType()) {
  62. case STONE_BRICKS:
  63. if (!Unarmed.blockCrackerSmoothBrick) {
  64. return false;
  65. }
  66. blockState.getBlock().setType(Material.CRACKED_STONE_BRICKS);
  67. return true;
  68. case INFESTED_STONE_BRICKS:
  69. if (!Unarmed.blockCrackerSmoothBrick) {
  70. return false;
  71. }
  72. blockState.getBlock().setType(Material.INFESTED_CRACKED_STONE_BRICKS);
  73. return true;
  74. default:
  75. return false;
  76. }
  77. }
  78. /**
  79. * Check for disarm.
  80. *
  81. * @param defender The defending player
  82. */
  83. public void disarmCheck(Player defender) {
  84. if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer(), mcMMOPlayer.getAttackStrength()) && !hasIronGrip(defender)) {
  85. if (EventUtils.callDisarmEvent(defender).isCancelled()) {
  86. return;
  87. }
  88. if(UserManager.getPlayer(defender) == null)
  89. return;
  90. Item item = Misc.dropItem(defender.getLocation(), defender.getInventory().getItemInMainHand());
  91. if (item != null && AdvancedConfig.getInstance().getDisarmProtected()) {
  92. item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata());
  93. }
  94. defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
  95. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Skills.Disarmed");
  96. }
  97. }
  98. /**
  99. * Check for arrow deflection.
  100. */
  101. public boolean deflectCheck() {
  102. if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_ARROW_DEFLECT, getPlayer())) {
  103. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.ArrowDeflect");
  104. return true;
  105. }
  106. return false;
  107. }
  108. /**
  109. * Handle the effects of the Berserk ability
  110. *
  111. * @param damage The amount of damage initially dealt by the event
  112. */
  113. public double berserkDamage(double damage) {
  114. damage = ((damage * Unarmed.berserkDamageModifier) * mcMMOPlayer.getAttackStrength()) - damage;
  115. return damage;
  116. }
  117. /**
  118. * Handle the effects of the Iron Arm ability
  119. */
  120. public double calculateSteelArmStyleDamage() {
  121. if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_STEEL_ARM_STYLE, getPlayer())) {
  122. return 0;
  123. }
  124. return getSteelArmStyleDamage();
  125. }
  126. public double getSteelArmStyleDamage() {
  127. double rank = RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE);
  128. double bonus = 0;
  129. if(rank >= 18)
  130. bonus = 1 + rank - 18;
  131. return bonus + 0.5 + (rank / 2);
  132. }
  133. /**
  134. * Check Iron Grip ability success
  135. *
  136. * @param defender The defending player
  137. * @return true if the defender was not disarmed, false otherwise
  138. */
  139. private boolean hasIronGrip(Player defender) {
  140. if (!Misc.isNPCEntityExcludingVillagers(defender)
  141. && Permissions.isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP)
  142. && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_IRON_GRIP, defender)) {
  143. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Defender");
  144. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Attacker");
  145. return true;
  146. }
  147. return false;
  148. }
  149. }