MiningManager.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package com.gmail.nossr50.skills.mining;
  2. import com.gmail.nossr50.config.AdvancedConfig;
  3. import com.gmail.nossr50.config.MainConfig;
  4. import com.gmail.nossr50.datatypes.experience.XPGainReason;
  5. import com.gmail.nossr50.datatypes.interactions.NotificationType;
  6. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  7. import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
  8. import com.gmail.nossr50.datatypes.skills.SubSkillType;
  9. import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
  10. import com.gmail.nossr50.mcMMO;
  11. import com.gmail.nossr50.runnables.skills.AbilityCooldownTask;
  12. import com.gmail.nossr50.skills.SkillManager;
  13. import com.gmail.nossr50.util.BlockUtils;
  14. import com.gmail.nossr50.util.EventUtils;
  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.random.RandomChanceUtil;
  19. import com.gmail.nossr50.util.skills.RankUtils;
  20. import com.gmail.nossr50.util.skills.SkillUtils;
  21. import org.bukkit.Material;
  22. import org.bukkit.block.Block;
  23. import org.bukkit.block.BlockState;
  24. import org.bukkit.enchantments.Enchantment;
  25. import org.bukkit.entity.Player;
  26. import org.bukkit.entity.TNTPrimed;
  27. import org.bukkit.inventory.ItemStack;
  28. import java.util.ArrayList;
  29. import java.util.List;
  30. public class MiningManager extends SkillManager {
  31. public MiningManager(McMMOPlayer mcMMOPlayer) {
  32. super(mcMMOPlayer, PrimarySkillType.MINING);
  33. }
  34. public boolean canUseDemolitionsExpertise() {
  35. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DEMOLITIONS_EXPERTISE))
  36. return false;
  37. return getSkillLevel() >= BlastMining.getDemolitionExpertUnlockLevel() && Permissions.demolitionsExpertise(getPlayer());
  38. }
  39. public boolean canDetonate() {
  40. Player player = getPlayer();
  41. return canUseBlastMining() && player.isSneaking()
  42. && Mining.getInstance().isDetonator(player.getInventory().getItemInMainHand())
  43. && Permissions.remoteDetonation(player);
  44. }
  45. public boolean canUseBlastMining() {
  46. //Not checking permissions?
  47. return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_BLAST_MINING);
  48. }
  49. public boolean canUseBiggerBombs() {
  50. if(!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_BIGGER_BOMBS))
  51. return false;
  52. return getSkillLevel() >= BlastMining.getBiggerBombsUnlockLevel() && Permissions.biggerBombs(getPlayer());
  53. }
  54. /**
  55. * Process double drops & XP gain for Mining.
  56. *
  57. * @param blockState The {@link BlockState} to check ability activation for
  58. */
  59. public void miningBlockCheck(BlockState blockState) {
  60. Player player = getPlayer();
  61. applyXpGain(Mining.getBlockXp(blockState), XPGainReason.PVE);
  62. if (!Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS)) {
  63. return;
  64. }
  65. Material material = blockState.getType();
  66. if (mcMMOPlayer.getAbilityMode(skill.getAbility())) {
  67. SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.getConfigManager().getConfigSuperAbilities().getSuperAbilityLimits().getToolDurabilityDamage());
  68. }
  69. //if ((mcMMO.getModManager().isCustomMiningBlock(blockState) && !mcMMO.getModManager().getBlock(blockState).isDoubleDropEnabled()) || !MainConfig.getInstance().getDoubleDropsEnabled(skill, material)) {
  70. if(!MainConfig.getInstance().getDoubleDropsEnabled(skill, material)) {
  71. return;
  72. }
  73. boolean silkTouch = player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH);
  74. if(silkTouch && !AdvancedConfig.getInstance().getDoubleDropSilkTouchEnabled())
  75. return;
  76. //TODO: Make this readable
  77. if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS, true)) {
  78. BlockUtils.markDropsAsBonus(blockState, mcMMOPlayer.getAbilityMode(skill.getAbility()));
  79. }
  80. }
  81. /**
  82. * Detonate TNT for Blast Mining
  83. */
  84. public void remoteDetonation() {
  85. Player player = getPlayer();
  86. Block targetBlock = player.getTargetBlock(BlockUtils.getTransparentBlocks(), BlastMining.MAXIMUM_REMOTE_DETONATION_DISTANCE);
  87. //Blast mining cooldown check needs to be first so the player can be messaged
  88. if (!blastMiningCooldownOver() || targetBlock.getType() != Material.TNT || !EventUtils.simulateBlockBreak(targetBlock, player, true)) {
  89. return;
  90. }
  91. TNTPrimed tnt = player.getWorld().spawn(targetBlock.getLocation(), TNTPrimed.class);
  92. //SkillUtils.sendSkillMessage(player, SuperAbilityType.BLAST_MINING.getAbilityPlayer(player));
  93. NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, "Mining.Blast.Boom");
  94. //player.sendMessage(LocaleLoader.getString("Mining.Blast.Boom"));
  95. tnt.setMetadata(mcMMO.tntMetadataKey, mcMMOPlayer.getPlayerMetadata());
  96. tnt.setFuseTicks(0);
  97. targetBlock.setType(Material.AIR);
  98. mcMMOPlayer.setAbilityDATS(SuperAbilityType.BLAST_MINING, System.currentTimeMillis());
  99. mcMMOPlayer.setAbilityInformed(SuperAbilityType.BLAST_MINING, false);
  100. new AbilityCooldownTask(mcMMOPlayer, SuperAbilityType.BLAST_MINING).runTaskLater(mcMMO.p, SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR);
  101. }
  102. /**
  103. * Handler for explosion drops and XP gain.
  104. *
  105. * @param yield The % of blocks to drop
  106. * @param blockList The list of blocks to drop
  107. */
  108. public void blastMiningDropProcessing(float yield, List<Block> blockList) {
  109. List<BlockState> ores = new ArrayList<>();
  110. List<BlockState> debris = new ArrayList<>();
  111. int xp = 0;
  112. float oreBonus = (float) (getOreBonus() / 100);
  113. float debrisReduction = (float) (getDebrisReduction() / 100);
  114. int dropMultiplier = getDropMultiplier();
  115. float debrisYield = yield - debrisReduction;
  116. for (Block block : blockList) {
  117. BlockState blockState = block.getState();
  118. if (BlockUtils.isOre(blockState)) {
  119. ores.add(blockState);
  120. }
  121. else {
  122. debris.add(blockState);
  123. }
  124. }
  125. for (BlockState blockState : ores) {
  126. if (Misc.getRandom().nextFloat() < (yield + oreBonus)) {
  127. if (!mcMMO.getPlaceStore().isTrue(blockState)) {
  128. xp += Mining.getBlockXp(blockState);
  129. }
  130. Misc.dropItem(Misc.getBlockCenter(blockState), new ItemStack(blockState.getType())); // Initial block that would have been dropped
  131. if (!mcMMO.getPlaceStore().isTrue(blockState)) {
  132. for (int i = 1; i < dropMultiplier; i++) {
  133. Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items
  134. }
  135. }
  136. }
  137. }
  138. if (debrisYield > 0) {
  139. for (BlockState blockState : debris) {
  140. if (Misc.getRandom().nextFloat() < debrisYield) {
  141. Misc.dropItems(Misc.getBlockCenter(blockState), blockState.getBlock().getDrops());
  142. }
  143. }
  144. }
  145. applyXpGain(xp, XPGainReason.PVE);
  146. }
  147. /**
  148. * Increases the blast radius of the explosion.
  149. *
  150. * @param radius to modify
  151. * @return modified radius
  152. */
  153. public float biggerBombs(float radius) {
  154. return (float) (radius + getBlastRadiusModifier());
  155. }
  156. public double processDemolitionsExpertise(double damage) {
  157. return damage * ((100.0D - getBlastDamageModifier()) / 100.0D);
  158. }
  159. /**
  160. * Gets the Blast Mining tier
  161. *
  162. * @return the Blast Mining tier
  163. */
  164. public int getBlastMiningTier() {
  165. return RankUtils.getRank(getPlayer(), SubSkillType.MINING_BLAST_MINING);
  166. }
  167. /**
  168. * Gets the Blast Mining tier
  169. *
  170. * @return the Blast Mining tier
  171. */
  172. public double getOreBonus() {
  173. return getOreBonus(getBlastMiningTier());
  174. }
  175. public static double getOreBonus(int rank) {
  176. return AdvancedConfig.getInstance().getOreBonus(rank);
  177. }
  178. public static double getDebrisReduction(int rank) {
  179. return AdvancedConfig.getInstance().getDebrisReduction(rank);
  180. }
  181. /**
  182. * Gets the Blast Mining tier
  183. *
  184. * @return the Blast Mining tier
  185. */
  186. public double getDebrisReduction() {
  187. return getDebrisReduction(getBlastMiningTier());
  188. }
  189. public static int getDropMultiplier(int rank) {
  190. return AdvancedConfig.getInstance().getDropMultiplier(rank);
  191. }
  192. /**
  193. * Gets the Blast Mining tier
  194. *
  195. * @return the Blast Mining tier
  196. */
  197. public int getDropMultiplier() {
  198. return getDropMultiplier(getBlastMiningTier());
  199. }
  200. /**
  201. * Gets the Blast Mining tier
  202. *
  203. * @return the Blast Mining tier
  204. */
  205. public double getBlastRadiusModifier() {
  206. return BlastMining.getBlastRadiusModifier(getBlastMiningTier());
  207. }
  208. /**
  209. * Gets the Blast Mining tier
  210. *
  211. * @return the Blast Mining tier
  212. */
  213. public double getBlastDamageModifier() {
  214. return BlastMining.getBlastDamageDecrease(getBlastMiningTier());
  215. }
  216. private boolean blastMiningCooldownOver() {
  217. int timeRemaining = mcMMOPlayer.calculateTimeRemaining(SuperAbilityType.BLAST_MINING);
  218. if (timeRemaining > 0) {
  219. //getPlayer().sendMessage(LocaleLoader.getString("Skills.TooTired", timeRemaining));
  220. NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining));
  221. return false;
  222. }
  223. return true;
  224. }
  225. }