UnarmedManager.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package com.gmail.nossr50.skills.unarmed;
  2. import static com.gmail.nossr50.util.random.ProbabilityUtil.isSkillRNGSuccessful;
  3. import com.gmail.nossr50.api.ItemSpawnReason;
  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.MetadataConstants;
  15. import com.gmail.nossr50.util.Misc;
  16. import com.gmail.nossr50.util.Permissions;
  17. import com.gmail.nossr50.util.player.NotificationManager;
  18. import com.gmail.nossr50.util.player.UserManager;
  19. import com.gmail.nossr50.util.random.ProbabilityUtil;
  20. import com.gmail.nossr50.util.skills.RankUtils;
  21. import org.bukkit.Material;
  22. import org.bukkit.block.Block;
  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 mmoPlayer) {
  30. super(mmoPlayer, 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. }
  39. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE);
  40. }
  41. public boolean canUseBerserk() {
  42. return mmoPlayer.getAbilityMode(SuperAbilityType.BERSERK);
  43. }
  44. public boolean canDisarm(LivingEntity target) {
  45. if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_DISARM)) {
  46. return false;
  47. }
  48. return target instanceof Player
  49. && ((Player) target).getInventory().getItemInMainHand().getType() != Material.AIR
  50. && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_DISARM);
  51. }
  52. public boolean canDeflect() {
  53. if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT)) {
  54. return false;
  55. }
  56. Player player = getPlayer();
  57. return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand())
  58. && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT);
  59. }
  60. public boolean canUseBlockCracker() {
  61. if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER)) {
  62. return false;
  63. }
  64. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER);
  65. }
  66. public void blockCrackerCheck(@NotNull Block block) {
  67. if (!mcMMO.p.getGeneralConfig().isBlockCrackerAllowed()) {
  68. return;
  69. }
  70. if (!ProbabilityUtil.isNonRNGSkillActivationSuccessful(SubSkillType.UNARMED_BLOCK_CRACKER,
  71. mmoPlayer)) {
  72. return;
  73. }
  74. switch (block.getType()) {
  75. case STONE_BRICKS:
  76. block.setType(Material.CRACKED_STONE_BRICKS);
  77. return;
  78. case INFESTED_STONE_BRICKS:
  79. block.setType(Material.INFESTED_CRACKED_STONE_BRICKS);
  80. return;
  81. case DEEPSLATE_BRICKS:
  82. block.setType(Material.CRACKED_DEEPSLATE_BRICKS);
  83. return;
  84. case DEEPSLATE_TILES:
  85. block.setType(Material.CRACKED_DEEPSLATE_TILES);
  86. return;
  87. case POLISHED_BLACKSTONE_BRICKS:
  88. block.setType(Material.CRACKED_POLISHED_BLACKSTONE_BRICKS);
  89. return;
  90. case NETHER_BRICKS:
  91. block.setType(Material.CRACKED_NETHER_BRICKS);
  92. return;
  93. default:
  94. }
  95. }
  96. /**
  97. * Check for disarm.
  98. *
  99. * @param defender The defending player
  100. */
  101. public void disarmCheck(@NotNull Player defender) {
  102. if (isSkillRNGSuccessful(SubSkillType.UNARMED_DISARM, mmoPlayer,
  103. mmoPlayer.getAttackStrength())
  104. && !hasIronGrip(defender)) {
  105. if (EventUtils.callDisarmEvent(defender).isCancelled()) {
  106. return;
  107. }
  108. if (UserManager.getPlayer(defender) == null) {
  109. return;
  110. }
  111. final Item item = ItemUtils.spawnItem(getPlayer(), defender.getLocation(),
  112. defender.getInventory().getItemInMainHand(),
  113. ItemSpawnReason.UNARMED_DISARMED_ITEM);
  114. if (item != null && mcMMO.p.getAdvancedConfig().getDisarmProtected()) {
  115. item.setMetadata(MetadataConstants.METADATA_KEY_DISARMED_ITEM,
  116. UserManager.getPlayer(defender).getPlayerMetadata());
  117. }
  118. defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
  119. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE,
  120. "Skills.Disarmed");
  121. }
  122. }
  123. /**
  124. * Check for arrow deflection.
  125. */
  126. public boolean deflectCheck() {
  127. if (isSkillRNGSuccessful(SubSkillType.UNARMED_ARROW_DEFLECT, mmoPlayer)) {
  128. NotificationManager.sendPlayerInformation(getPlayer(),
  129. NotificationType.SUBSKILL_MESSAGE, "Combat.ArrowDeflect");
  130. return true;
  131. }
  132. return false;
  133. }
  134. /**
  135. * Handle the effects of the Berserk ability
  136. *
  137. * @param damage The amount of damage initially dealt by the event
  138. */
  139. public double berserkDamage(double damage) {
  140. damage =
  141. ((damage * Unarmed.berserkDamageModifier) * mmoPlayer.getAttackStrength()) - damage;
  142. return damage;
  143. }
  144. /**
  145. * Handle the effects of the Iron Arm ability
  146. */
  147. public double calculateSteelArmStyleDamage() {
  148. if (ProbabilityUtil.isNonRNGSkillActivationSuccessful(SubSkillType.UNARMED_STEEL_ARM_STYLE,
  149. mmoPlayer)) {
  150. return getSteelArmStyleDamage();
  151. }
  152. return 0;
  153. }
  154. public double getSteelArmStyleDamage() {
  155. double rank = RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE);
  156. double bonus = 0;
  157. if (rank >= 18) {
  158. bonus = 1 + rank - 18;
  159. }
  160. double finalBonus = bonus + 0.5 + (rank / 2);
  161. if (mcMMO.p.getAdvancedConfig().isSteelArmDamageCustom()) {
  162. return mcMMO.p.getAdvancedConfig().getSteelArmOverride(
  163. RankUtils.getRank(getPlayer(), SubSkillType.UNARMED_STEEL_ARM_STYLE),
  164. finalBonus);
  165. } else {
  166. return finalBonus;
  167. }
  168. }
  169. /**
  170. * Check Iron Grip ability success
  171. *
  172. * @param defender The defending player
  173. * @return true if the defender was not disarmed, false otherwise
  174. */
  175. private boolean hasIronGrip(@NotNull Player defender) {
  176. if (!Misc.isNPCEntityExcludingVillagers(defender)
  177. && Permissions.isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP)
  178. && isSkillRNGSuccessful(SubSkillType.UNARMED_IRON_GRIP,
  179. UserManager.getPlayer(defender))) {
  180. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE,
  181. "Unarmed.Ability.IronGrip.Defender");
  182. NotificationManager.sendPlayerInformation(getPlayer(),
  183. NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Attacker");
  184. return true;
  185. }
  186. return false;
  187. }
  188. }