UnarmedManager.java 6.9 KB

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