UnarmedManager.java 7.3 KB

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