123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- package com.gmail.nossr50.skills.mining;
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.List;
- import org.bukkit.Material;
- import org.bukkit.block.Block;
- import org.bukkit.block.BlockState;
- import org.bukkit.enchantments.Enchantment;
- import org.bukkit.entity.Player;
- import org.bukkit.entity.TNTPrimed;
- import org.bukkit.metadata.FixedMetadataValue;
- import com.gmail.nossr50.mcMMO;
- import com.gmail.nossr50.config.Config;
- import com.gmail.nossr50.datatypes.player.McMMOPlayer;
- import com.gmail.nossr50.datatypes.player.PlayerProfile;
- import com.gmail.nossr50.datatypes.skills.AbilityType;
- import com.gmail.nossr50.datatypes.skills.SkillType;
- import com.gmail.nossr50.locale.LocaleLoader;
- import com.gmail.nossr50.runnables.skills.AbilityCooldownTask;
- import com.gmail.nossr50.skills.SkillManager;
- import com.gmail.nossr50.skills.mining.BlastMining.Tier;
- import com.gmail.nossr50.util.BlockUtils;
- import com.gmail.nossr50.util.Misc;
- import com.gmail.nossr50.util.Permissions;
- import com.gmail.nossr50.util.skills.SkillUtils;
- public class MiningManager extends SkillManager {
- public MiningManager(McMMOPlayer mcMMOPlayer) {
- super(mcMMOPlayer, SkillType.MINING);
- }
- public boolean canUseDemolitionsExpertise() {
- return getSkillLevel() >= BlastMining.Tier.FOUR.getLevel() && Permissions.demolitionsExpertise(getPlayer());
- }
- public boolean canDetonate() {
- Player player = getPlayer();
- return canUseBlastMining() && player.isSneaking() && player.getItemInHand().getTypeId() == BlastMining.detonatorID && Permissions.remoteDetonation(player);
- }
- public boolean canUseBlastMining() {
- return getSkillLevel() >= BlastMining.Tier.ONE.getLevel();
- }
- public boolean canUseBiggerBombs() {
- return getSkillLevel() >= BlastMining.Tier.TWO.getLevel() && Permissions.biggerBombs(getPlayer());
- }
- /**
- * Process double drops & XP gain for Mining.
- *
- * @param blockState The {@link BlockState} to check ability activation for
- */
- public void miningBlockCheck(BlockState blockState) {
- Player player = getPlayer();
- applyXpGain(Mining.getBlockXp(blockState));
- if (!Permissions.doubleDrops(player, skill)) {
- return;
- }
- Material material = blockState.getType();
- if (material != Material.GLOWING_REDSTONE_ORE && !Config.getInstance().getDoubleDropsEnabled(skill, material)) {
- return;
- }
- boolean silkTouch = player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH);
- for (int i = mcMMOPlayer.getAbilityMode(skill.getAbility()) ? 2 : 1; i != 0; i--) {
- if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Mining.doubleDropsMaxChance, Mining.doubleDropsMaxLevel)) {
- if (silkTouch) {
- Mining.handleSilkTouchDrops(blockState);
- }
- else {
- Mining.handleMiningDrops(blockState);
- }
- }
- }
- }
- /**
- * Detonate TNT for Blast Mining
- */
- public void remoteDetonation() {
- Player player = getPlayer();
- HashSet<Byte> transparentBlocks = BlastMining.generateTransparentBlockList();
- Block targetBlock = player.getTargetBlock(transparentBlocks, BlastMining.MAXIMUM_REMOTE_DETONATION_DISTANCE);
- if (targetBlock.getType() != Material.TNT || !SkillUtils.blockBreakSimulate(targetBlock, player, true) || !blastMiningCooldownOver()) {
- return;
- }
- TNTPrimed tnt = player.getWorld().spawn(targetBlock.getLocation(), TNTPrimed.class);
- SkillUtils.sendSkillMessage(player, AbilityType.BLAST_MINING.getAbilityPlayer(player));
- player.sendMessage(LocaleLoader.getString("Mining.Blast.Boom"));
- tnt.setMetadata(mcMMO.tntMetadataKey, new FixedMetadataValue(mcMMO.p, player.getName()));
- tnt.setFuseTicks(0);
- targetBlock.setData((byte) 0x0);
- targetBlock.setType(Material.AIR);
- getProfile().setSkillDATS(AbilityType.BLAST_MINING, System.currentTimeMillis());
- mcMMOPlayer.setAbilityInformed(AbilityType.BLAST_MINING, false);
- new AbilityCooldownTask(mcMMOPlayer, AbilityType.BLAST_MINING).runTaskLaterAsynchronously(mcMMO.p, AbilityType.BLAST_MINING.getCooldown() * 20);
- }
- /**
- * Handler for explosion drops and XP gain.
- *
- * @param event Event whose explosion is being processed
- */
- public void blastMiningDropProcessing(float yield, List<Block> blockList) {
- List<BlockState> ores = new ArrayList<BlockState>();
- List<BlockState> debris = new ArrayList<BlockState>();
- int xp = 0;
- float oreBonus = (float) (getOreBonus() / 100);
- float debrisReduction = (float) (getDebrisReduction() / 100);
- int dropMultiplier = getDropMultiplier();
- float debrisYield = yield - debrisReduction;
- for (Block block : blockList) {
- BlockState blockState = block.getState();
- if (BlockUtils.isOre(blockState)) {
- ores.add(blockState);
- }
- else {
- debris.add(blockState);
- }
- }
- for (BlockState blockState : ores) {
- if (Misc.getRandom().nextFloat() < (yield + oreBonus)) {
- if (!mcMMO.getPlaceStore().isTrue(blockState)) {
- xp += Mining.getBlockXp(blockState);
- }
- Misc.dropItem(blockState.getLocation(), blockState.getData().toItemStack(1)); // Initial block that would have been dropped
- if (!mcMMO.getPlaceStore().isTrue(blockState)) {
- for (int i = 1; i < dropMultiplier; i++) {
- Mining.handleSilkTouchDrops(blockState); // Bonus drops - should drop the block & not the items
- }
- }
- }
- }
- if (debrisYield > 0) {
- for (BlockState blockState : debris) {
- if (Misc.getRandom().nextFloat() < debrisYield) {
- Misc.dropItems(blockState.getLocation(), blockState.getBlock().getDrops());
- }
- }
- }
- applyXpGain(xp);
- }
- /**
- * Increases the blast radius of the explosion.
- *
- * @param event Event whose explosion radius is being changed
- */
- public float biggerBombs(float radius) {
- return (float) (radius + getBlastRadiusModifier());
- }
- public int processDemolitionsExpertise(int damage) {
- return (int) (damage * ((100.0D - getBlastDamageModifier()) / 100.0D));
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public int getBlastMiningTier() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.toNumerical();
- }
- }
- return 0;
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public double getOreBonus() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.getOreBonus();
- }
- }
- return 0;
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public double getDebrisReduction() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.getDebrisReduction();
- }
- }
- return 0;
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public int getDropMultiplier() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.getDropMultiplier();
- }
- }
- return 0;
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public double getBlastRadiusModifier() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.getBlastRadiusModifier();
- }
- }
- return 0;
- }
- /**
- * Gets the Blast Mining tier
- *
- * @return the Blast Mining tier
- */
- public double getBlastDamageModifier() {
- int skillLevel = getSkillLevel();
- for (Tier tier : Tier.values()) {
- if (skillLevel >= tier.getLevel()) {
- return tier.getBlastDamageDecrease();
- }
- }
- return 0;
- }
- private boolean blastMiningCooldownOver() {
- Player player = getPlayer();
- PlayerProfile profile = getProfile();
- long oldTime = profile.getSkillDATS(AbilityType.BLAST_MINING) * Misc.TIME_CONVERSION_FACTOR;
- int cooldown = AbilityType.BLAST_MINING.getCooldown();
- if (!SkillUtils.cooldownOver(oldTime, cooldown, player)) {
- player.sendMessage(LocaleLoader.getString("Skills.TooTired", SkillUtils.calculateTimeLeft(oldTime, cooldown, player)));
- return false;
- }
- return true;
- }
- }
|