UnarmedManager.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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.SubSkillType;
  6. import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
  7. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  8. import com.gmail.nossr50.datatypes.skills.ToolType;
  9. import com.gmail.nossr50.locale.LocaleLoader;
  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.skills.SkillActivationType;
  19. import com.gmail.nossr50.util.skills.SkillUtils;
  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. import org.bukkit.block.data.BlockData;
  27. public class UnarmedManager extends SkillManager {
  28. public UnarmedManager(McMMOPlayer mcMMOPlayer) {
  29. super(mcMMOPlayer, PrimarySkillType.UNARMED);
  30. }
  31. public boolean canActivateAbility() {
  32. return mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && Permissions.berserk(getPlayer());
  33. }
  34. public boolean canUseIronArm() {
  35. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_IRON_ARM_STYLE);
  36. }
  37. public boolean canUseBerserk() {
  38. return mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && Permissions.berserk(getPlayer());
  39. }
  40. public boolean canDisarm(LivingEntity target) {
  41. return target instanceof Player && ((Player) target).getInventory().getItemInMainHand().getType() != Material.AIR && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_DISARM);
  42. }
  43. public boolean canDeflect() {
  44. Player player = getPlayer();
  45. return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand()) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT);
  46. }
  47. public boolean canUseBlockCracker() {
  48. return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_BLOCK_CRACKER);
  49. }
  50. public boolean blockCrackerCheck(BlockState blockState) {
  51. if (!SkillUtils.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer(), null, 0, 0)) {
  52. return false;
  53. }
  54. BlockData data = blockState.getBlockData();
  55. switch (blockState.getType()) {
  56. case STONE_BRICKS:
  57. if (!Unarmed.blockCrackerSmoothBrick) {
  58. return false;
  59. }
  60. blockState.setType(Material.CRACKED_STONE_BRICKS);
  61. return true;
  62. default:
  63. return false;
  64. }
  65. }
  66. /**
  67. * Check for disarm.
  68. *
  69. * @param defender The defending player
  70. */
  71. public void disarmCheck(Player defender) {
  72. if (SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer(), this.skill, getSkillLevel(), activationChance) && !hasIronGrip(defender)) {
  73. if (EventUtils.callDisarmEvent(defender).isCancelled()) {
  74. return;
  75. }
  76. Item item = Misc.dropItem(defender.getLocation(), defender.getInventory().getItemInMainHand());
  77. if (item != null && AdvancedConfig.getInstance().getDisarmProtected()) {
  78. item.setMetadata(mcMMO.disarmedItemKey, UserManager.getPlayer(defender).getPlayerMetadata());
  79. }
  80. defender.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
  81. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Skills.Disarmed");
  82. }
  83. }
  84. /**
  85. * Check for arrow deflection.
  86. */
  87. public boolean deflectCheck() {
  88. if (SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_ARROW_DEFLECT, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
  89. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.ArrowDeflect");
  90. return true;
  91. }
  92. return false;
  93. }
  94. /**
  95. * Handle the effects of the Berserk ability
  96. *
  97. * @param damage The amount of damage initially dealt by the event
  98. */
  99. public double berserkDamage(double damage) {
  100. damage = (damage * Unarmed.berserkDamageModifier) - damage;
  101. return damage;
  102. }
  103. /**
  104. * Handle the effects of the Iron Arm ability
  105. */
  106. public double ironArm() {
  107. if (!SkillUtils.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_IRON_ARM_STYLE, getPlayer(), null, 0, 0)) {
  108. return 0;
  109. }
  110. //linear check no cap
  111. return Math.min(Unarmed.ironArmMinBonusDamage + (getSkillLevel() / Unarmed.ironArmIncreaseLevel), Unarmed.ironArmMaxBonusDamage);
  112. }
  113. /**
  114. * Check Iron Grip ability success
  115. *
  116. * @param defender The defending player
  117. * @return true if the defender was not disarmed, false otherwise
  118. */
  119. private boolean hasIronGrip(Player defender) {
  120. if (!Misc.isNPCEntity(defender) && Permissions.isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP) && SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_NO_CAP, SubSkillType.UNARMED_IRON_GRIP, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
  121. NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Defender");
  122. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Attacker");
  123. return true;
  124. }
  125. return false;
  126. }
  127. }