UnarmedManager.java 7.2 KB

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