mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 02:53:43 +01:00 
			
		
		
		
	Restructuring Blast Mining.
This commit is contained in:
		@@ -204,14 +204,14 @@ public class BlockListener implements Listener {
 | 
			
		||||
 | 
			
		||||
        /* MINING */
 | 
			
		||||
        else if (BlockChecks.canBeSuperBroken(block) && Permissions.mining(player)) {
 | 
			
		||||
            MiningManager manager = new MiningManager(player);
 | 
			
		||||
            MiningManager miningManager = new MiningManager(player);
 | 
			
		||||
            if (configInstance.getMiningRequiresTool()) {
 | 
			
		||||
                if (ItemChecks.isPickaxe(inHand)) {
 | 
			
		||||
                    manager.miningBlockCheck(block);
 | 
			
		||||
                    miningManager.miningBlockCheck(block);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                manager.miningBlockCheck(block);
 | 
			
		||||
                miningManager.miningBlockCheck(block);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -356,17 +356,17 @@ public class BlockListener implements Listener {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (profile.getAbilityMode(AbilityType.SUPER_BREAKER) && Skills.triggerCheck(player, block, AbilityType.SUPER_BREAKER)) {
 | 
			
		||||
            MiningManager manager = new MiningManager(player);
 | 
			
		||||
            MiningManager miningManager = new MiningManager(player);
 | 
			
		||||
 | 
			
		||||
            if (configInstance.getMiningRequiresTool()) {
 | 
			
		||||
                if (ItemChecks.isPickaxe(inHand)) {
 | 
			
		||||
                    event.setInstaBreak(true);
 | 
			
		||||
                    manager.superBreakerBlockCheck(block);
 | 
			
		||||
                    miningManager.superBreakerBlockCheck(block);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                event.setInstaBreak(true);
 | 
			
		||||
                manager.superBreakerBlockCheck(block);
 | 
			
		||||
                miningManager.superBreakerBlockCheck(block);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if (profile.getSkillLevel(SkillType.WOODCUTTING) >= LEAF_BLOWER_LEVEL && (material.equals(Material.LEAVES) || (configInstance.getBlockModsEnabled() && ModChecks.isCustomLeafBlock(block)))) {
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ import com.gmail.nossr50.party.PartyManager;
 | 
			
		||||
import com.gmail.nossr50.runnables.BleedTimer;
 | 
			
		||||
import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager;
 | 
			
		||||
import com.gmail.nossr50.skills.archery.Archery;
 | 
			
		||||
import com.gmail.nossr50.skills.mining.BlastMining;
 | 
			
		||||
import com.gmail.nossr50.skills.mining.MiningManager;
 | 
			
		||||
import com.gmail.nossr50.skills.taming.TamingManager;
 | 
			
		||||
import com.gmail.nossr50.util.Combat;
 | 
			
		||||
import com.gmail.nossr50.util.Misc;
 | 
			
		||||
@@ -151,7 +151,8 @@ public class EntityListener implements Listener {
 | 
			
		||||
                    acroManager.rollCheck(event);
 | 
			
		||||
                }
 | 
			
		||||
                else if (cause == DamageCause.BLOCK_EXPLOSION && Permissions.demolitionsExpertise(player)) {
 | 
			
		||||
                    BlastMining.demolitionsExpertise(player, event);
 | 
			
		||||
                    MiningManager miningManager = new MiningManager(player); 
 | 
			
		||||
                    miningManager.demolitionsExpertise(event);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (event.getDamage() >= 1) {
 | 
			
		||||
@@ -219,7 +220,8 @@ public class EntityListener implements Listener {
 | 
			
		||||
                Player player = plugin.getTNTPlayer(id);
 | 
			
		||||
 | 
			
		||||
                if (Permissions.biggerBombs(player)) {
 | 
			
		||||
                    BlastMining.biggerBombs(player, event);
 | 
			
		||||
                    MiningManager miningManager = new MiningManager(player);
 | 
			
		||||
                    miningManager.biggerBombs(event);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -243,7 +245,8 @@ public class EntityListener implements Listener {
 | 
			
		||||
 | 
			
		||||
            if (plugin.tntIsTracked(id)) {
 | 
			
		||||
                Player player = plugin.getTNTPlayer(id);
 | 
			
		||||
                BlastMining.dropProcessing(player, event);
 | 
			
		||||
                MiningManager miningManager = new MiningManager(player);
 | 
			
		||||
                miningManager.blastMiningDropProcessing(event);
 | 
			
		||||
                plugin.removeFromTNTTracker(id);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,42 @@
 | 
			
		||||
package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.event.entity.ExplosionPrimeEvent;
 | 
			
		||||
 | 
			
		||||
public class BiggerBombsEventHandler {
 | 
			
		||||
    private int skillLevel;
 | 
			
		||||
 | 
			
		||||
    private ExplosionPrimeEvent event;
 | 
			
		||||
    private float radius;
 | 
			
		||||
    private float radiusModifier; 
 | 
			
		||||
 | 
			
		||||
    protected BiggerBombsEventHandler(MiningManager manager, ExplosionPrimeEvent event) {
 | 
			
		||||
        this.skillLevel = manager.getSkillLevel();
 | 
			
		||||
 | 
			
		||||
        this.event = event;
 | 
			
		||||
        this.radius = event.getRadius();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void calculateRadiusIncrease() {
 | 
			
		||||
        if (skillLevel < BlastMining.BLAST_MINING_RANK_2) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= BlastMining.BLAST_MINING_RANK_8) {
 | 
			
		||||
            radiusModifier = 4.0f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_6) {
 | 
			
		||||
            radiusModifier = 3.0f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_4) {
 | 
			
		||||
            radiusModifier = 2.0f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_2) {
 | 
			
		||||
            radiusModifier = 1.0f;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void modifyBlastRadius() {
 | 
			
		||||
        radius = radius + radiusModifier;
 | 
			
		||||
        event.setRadius(radius);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,20 +1,13 @@
 | 
			
		||||
package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.entity.TNTPrimed;
 | 
			
		||||
import org.bukkit.event.entity.EntityDamageEvent;
 | 
			
		||||
import org.bukkit.event.entity.EntityExplodeEvent;
 | 
			
		||||
import org.bukkit.event.entity.ExplosionPrimeEvent;
 | 
			
		||||
import org.bukkit.event.player.PlayerInteractEvent;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
@@ -23,240 +16,22 @@ import com.gmail.nossr50.datatypes.AbilityType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.PlayerProfile;
 | 
			
		||||
import com.gmail.nossr50.datatypes.SkillType;
 | 
			
		||||
import com.gmail.nossr50.locale.LocaleLoader;
 | 
			
		||||
import com.gmail.nossr50.util.BlockChecks;
 | 
			
		||||
import com.gmail.nossr50.util.Misc;
 | 
			
		||||
import com.gmail.nossr50.util.Skills;
 | 
			
		||||
import com.gmail.nossr50.util.Users;
 | 
			
		||||
 | 
			
		||||
public class BlastMining {
 | 
			
		||||
    static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 | 
			
		||||
 | 
			
		||||
    private static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 | 
			
		||||
    private static Random random = new Random();
 | 
			
		||||
 | 
			
		||||
    private static int blastMiningRank1 = advancedConfig.getBlastMiningRank1();
 | 
			
		||||
    private static int blastMiningRank2 = advancedConfig.getBlastMiningRank2();
 | 
			
		||||
    private static int blastMiningRank3 = advancedConfig.getBlastMiningRank3();
 | 
			
		||||
    private static int blastMiningRank4 = advancedConfig.getBlastMiningRank4();
 | 
			
		||||
    private static int blastMiningRank5 = advancedConfig.getBlastMiningRank5();
 | 
			
		||||
    private static int blastMiningRank6 = advancedConfig.getBlastMiningRank6();
 | 
			
		||||
    private static int blastMiningRank7 = advancedConfig.getBlastMiningRank7();
 | 
			
		||||
    private static int blastMiningRank8 = advancedConfig.getBlastMiningRank8();
 | 
			
		||||
    /**
 | 
			
		||||
     * Handler for what blocks drop from the explosion.
 | 
			
		||||
     *
 | 
			
		||||
     * @param ores List of ore blocks destroyed by the explosion
 | 
			
		||||
     * @param debris List of non-ore blocks destroyed by the explosion
 | 
			
		||||
     * @param yield Percentage of blocks to drop
 | 
			
		||||
     * @param oreBonus Percentage bonus for ore drops
 | 
			
		||||
     * @param debrisReduction Percentage reduction for non-ore drops
 | 
			
		||||
     * @param extraDrops Number of times to drop each block
 | 
			
		||||
     * @return A list of blocks dropped from the explosion
 | 
			
		||||
     */
 | 
			
		||||
    private static List<Block> explosionYields(List<Block> ores, List<Block> debris, float yield, float oreBonus, float debrisReduction, int extraDrops) {
 | 
			
		||||
        Iterator<Block> oresIterator = ores.iterator();
 | 
			
		||||
        List<Block> blocksDropped = new ArrayList<Block>();
 | 
			
		||||
 | 
			
		||||
        while (oresIterator.hasNext()) {
 | 
			
		||||
            Block temp = oresIterator.next();
 | 
			
		||||
            Location tempLocation = temp.getLocation();
 | 
			
		||||
            Material tempType = temp.getType();
 | 
			
		||||
 | 
			
		||||
            if (random.nextFloat() < (yield + oreBonus)) {
 | 
			
		||||
                blocksDropped.add(temp);
 | 
			
		||||
                Mining.miningDrops(temp, tempLocation, tempType);
 | 
			
		||||
 | 
			
		||||
                if (!mcMMO.placeStore.isTrue(temp)) {
 | 
			
		||||
                    for (int i = 1 ; i < extraDrops ; i++) {
 | 
			
		||||
                        blocksDropped.add(temp);
 | 
			
		||||
                        Mining.miningDrops(temp, tempLocation, tempType);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (yield - debrisReduction > 0) {
 | 
			
		||||
            Iterator<Block> debrisIterator = debris.iterator();
 | 
			
		||||
 | 
			
		||||
            while (debrisIterator.hasNext()) {
 | 
			
		||||
                Block temp = debrisIterator.next();
 | 
			
		||||
                Location tempLocation = temp.getLocation();
 | 
			
		||||
                Material tempType = temp.getType();
 | 
			
		||||
 | 
			
		||||
                if (random.nextFloat() < (yield - debrisReduction))
 | 
			
		||||
                    Mining.miningDrops(temp, tempLocation, tempType);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return blocksDropped;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handler for explosion drops and XP gain.
 | 
			
		||||
     *
 | 
			
		||||
     * @param player Player triggering the explosion
 | 
			
		||||
     * @param event Event whose explosion is being processed
 | 
			
		||||
     */
 | 
			
		||||
    public static void dropProcessing(Player player, EntityExplodeEvent event) {
 | 
			
		||||
        if(player == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        final int RANK_1_LEVEL = blastMiningRank1;
 | 
			
		||||
        final int RANK_2_LEVEL = blastMiningRank2;
 | 
			
		||||
        final int RANK_3_LEVEL = blastMiningRank3;
 | 
			
		||||
        final int RANK_4_LEVEL = blastMiningRank4;
 | 
			
		||||
        final int RANK_5_LEVEL = blastMiningRank5;
 | 
			
		||||
        final int RANK_6_LEVEL = blastMiningRank6;
 | 
			
		||||
        final int RANK_7_LEVEL = blastMiningRank7;
 | 
			
		||||
        final int RANK_8_LEVEL = blastMiningRank8;
 | 
			
		||||
 | 
			
		||||
        int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING);
 | 
			
		||||
        float yield = event.getYield();
 | 
			
		||||
        List<Block> blocks = event.blockList();
 | 
			
		||||
        Iterator<Block> iterator = blocks.iterator();
 | 
			
		||||
 | 
			
		||||
        List<Block> ores = new ArrayList<Block>();
 | 
			
		||||
        List<Block> debris = new ArrayList<Block>();
 | 
			
		||||
        List<Block> xp = new ArrayList<Block>();
 | 
			
		||||
 | 
			
		||||
        while (iterator.hasNext()) {
 | 
			
		||||
            Block temp = iterator.next();
 | 
			
		||||
 | 
			
		||||
            if (BlockChecks.isOre(temp)) {
 | 
			
		||||
                ores.add(temp);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                debris.add(temp);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Normal explosion
 | 
			
		||||
        if (skillLevel < RANK_1_LEVEL) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        event.setYield(0);
 | 
			
		||||
 | 
			
		||||
        //Triple Drops, No debris, +70% ores
 | 
			
		||||
        if (skillLevel >= RANK_8_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .70f, .30f, 3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Triple Drops, No debris, +65% ores
 | 
			
		||||
        else if (skillLevel >= RANK_7_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .65f, .30f, 3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Double Drops, No Debris, +60% ores
 | 
			
		||||
        else if (skillLevel >= RANK_6_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .60f, .30f, 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Double Drops, No Debris, +55% ores
 | 
			
		||||
        else if (skillLevel >= RANK_5_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .55f, .30f, 2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //No debris, +50% ores
 | 
			
		||||
        else if (skillLevel >= RANK_4_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .50f, .30f, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //No debris, +45% ores
 | 
			
		||||
        else if (skillLevel >= RANK_3_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .45f, .30f, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //+40% ores, -20% debris
 | 
			
		||||
        else if (skillLevel >= RANK_2_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .40f, .20f, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //+35% ores, -10% debris
 | 
			
		||||
        else if (skillLevel >= RANK_1_LEVEL) {
 | 
			
		||||
            xp = explosionYields(ores, debris, yield, .35f, .10f, 1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (Block block : xp) {
 | 
			
		||||
            if (!mcMMO.placeStore.isTrue(block)) {
 | 
			
		||||
                Mining.miningXP(player, Users.getProfile(player), block, block.getType());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Increases the blast radius of the explosion.
 | 
			
		||||
     *
 | 
			
		||||
     * @param player Player triggering the explosion
 | 
			
		||||
     * @param event Event whose explosion radius is being changed
 | 
			
		||||
     */
 | 
			
		||||
    public static void biggerBombs(Player player, ExplosionPrimeEvent event) {
 | 
			
		||||
        if(player == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        final int RANK_1_LEVEL = blastMiningRank2;
 | 
			
		||||
        final int RANK_2_LEVEL = blastMiningRank4;
 | 
			
		||||
        final int RANK_3_LEVEL = blastMiningRank6;
 | 
			
		||||
        final int RANK_4_LEVEL = blastMiningRank8;
 | 
			
		||||
 | 
			
		||||
        int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING);
 | 
			
		||||
        float radius = event.getRadius();
 | 
			
		||||
 | 
			
		||||
        if (skillLevel < RANK_1_LEVEL) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= RANK_1_LEVEL) {
 | 
			
		||||
            radius++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= RANK_2_LEVEL) {
 | 
			
		||||
            radius++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= RANK_3_LEVEL) {
 | 
			
		||||
            radius++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= RANK_4_LEVEL) {
 | 
			
		||||
            radius++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        event.setRadius(radius);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Decreases damage dealt by the explosion.
 | 
			
		||||
     *
 | 
			
		||||
     * @param player Player triggering the explosion
 | 
			
		||||
     * @param event Event whose explosion damage is being reduced
 | 
			
		||||
     */
 | 
			
		||||
    public static void demolitionsExpertise(Player player, EntityDamageEvent event) {
 | 
			
		||||
        if(player == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        final int RANK_1_LEVEL = blastMiningRank4;
 | 
			
		||||
        final int RANK_2_LEVEL = blastMiningRank6;
 | 
			
		||||
        final int RANK_3_LEVEL = blastMiningRank8;
 | 
			
		||||
 | 
			
		||||
        int skill = Users.getProfile(player).getSkillLevel(SkillType.MINING);
 | 
			
		||||
        int damage = event.getDamage();
 | 
			
		||||
 | 
			
		||||
        if (skill < RANK_1_LEVEL) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skill >= RANK_3_LEVEL) {
 | 
			
		||||
            damage = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skill >= RANK_2_LEVEL) {
 | 
			
		||||
            damage = damage / 2;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skill >= RANK_1_LEVEL) {
 | 
			
		||||
            damage = damage/4;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        event.setDamage(damage);
 | 
			
		||||
    }
 | 
			
		||||
    public final static int BLAST_MINING_RANK_1 = advancedConfig.getBlastMiningRank1();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_2 = advancedConfig.getBlastMiningRank2();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_3 = advancedConfig.getBlastMiningRank3();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_4 = advancedConfig.getBlastMiningRank4();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_5 = advancedConfig.getBlastMiningRank5();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_6 = advancedConfig.getBlastMiningRank6();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_7 = advancedConfig.getBlastMiningRank7();
 | 
			
		||||
    public final static int BLAST_MINING_RANK_8 = advancedConfig.getBlastMiningRank8();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Detonate TNT for Blast Mining
 | 
			
		||||
@@ -333,4 +108,8 @@ public class BlastMining {
 | 
			
		||||
        profile.setSkillDATS(ability, System.currentTimeMillis()); //Save DATS for Blast Mining
 | 
			
		||||
        profile.setAbilityInformed(ability, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected static Random getRandom() {
 | 
			
		||||
        return random;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,152 @@
 | 
			
		||||
package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.event.entity.EntityExplodeEvent;
 | 
			
		||||
import org.bukkit.inventory.ItemStack;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.BlockChecks;
 | 
			
		||||
import com.gmail.nossr50.util.Misc;
 | 
			
		||||
 | 
			
		||||
public class BlastMiningDropEventHandler {
 | 
			
		||||
    private MiningManager manager;
 | 
			
		||||
    private int skillLevel;
 | 
			
		||||
 | 
			
		||||
    private EntityExplodeEvent event;
 | 
			
		||||
    private float yield;
 | 
			
		||||
    private List<Block> blocks;
 | 
			
		||||
 | 
			
		||||
    private List<Block> ores;
 | 
			
		||||
    private List<Block> debris;
 | 
			
		||||
    private List<Block> droppedOres;
 | 
			
		||||
 | 
			
		||||
    private float oreBonus;
 | 
			
		||||
    private float debrisReduction;
 | 
			
		||||
    private int dropMultiplier;
 | 
			
		||||
 | 
			
		||||
    public BlastMiningDropEventHandler(MiningManager manager, EntityExplodeEvent event) {
 | 
			
		||||
        this.manager = manager;
 | 
			
		||||
        this.skillLevel = manager.getSkillLevel();
 | 
			
		||||
 | 
			
		||||
        this.event = event;
 | 
			
		||||
        this.yield = event.getYield();
 | 
			
		||||
        this.blocks = event.blockList();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sortExplosionBlocks() {
 | 
			
		||||
        for (Block block : blocks) {
 | 
			
		||||
            if (BlockChecks.isOre(block)) {
 | 
			
		||||
                ores.add(block);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                debris.add(block);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void processXPGain() {
 | 
			
		||||
        for (Block block : droppedOres) {
 | 
			
		||||
            if (!mcMMO.placeStore.isTrue(block)) {
 | 
			
		||||
                Mining.miningXP(manager.getPlayer(), manager.getProfile(), block, block.getType());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void processDroppedBlocks() {
 | 
			
		||||
        for (Block block : ores) {
 | 
			
		||||
            Location location = block.getLocation();
 | 
			
		||||
            Material type = block.getType();
 | 
			
		||||
 | 
			
		||||
            if (BlastMining.getRandom().nextFloat() < (yield + oreBonus)) {
 | 
			
		||||
                droppedOres.add(block);
 | 
			
		||||
                Mining.miningDrops(block, location, type);
 | 
			
		||||
 | 
			
		||||
                if (!mcMMO.placeStore.isTrue(block)) {
 | 
			
		||||
                    for (int i = 1 ; i < dropMultiplier ; i++) {
 | 
			
		||||
                        droppedOres.add(block);
 | 
			
		||||
                        Mining.miningDrops(block, location, type);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        float debrisYield  = yield - debrisReduction;
 | 
			
		||||
 | 
			
		||||
        if (debrisYield > 0) {
 | 
			
		||||
            for (Block block : debris) {
 | 
			
		||||
                Location location = block.getLocation();
 | 
			
		||||
                Material type = block.getType();
 | 
			
		||||
 | 
			
		||||
                if (BlastMining.getRandom().nextFloat() < debrisYield) {
 | 
			
		||||
                    Misc.dropItem(location, new ItemStack(type));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void modifyEventYield() {
 | 
			
		||||
        event.setYield(0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void calcuateDropModifiers() {
 | 
			
		||||
        calculateOreBonus();
 | 
			
		||||
        calculateDebrisReduction();
 | 
			
		||||
        calculateDropMultiplier();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void calculateOreBonus() {
 | 
			
		||||
        if (skillLevel >= BlastMining.BLAST_MINING_RANK_8) {
 | 
			
		||||
            oreBonus = .70f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_7) {
 | 
			
		||||
            oreBonus = .65f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_6) {
 | 
			
		||||
            oreBonus = .60f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_5) {
 | 
			
		||||
            oreBonus = .55f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_4) {
 | 
			
		||||
            oreBonus = .50f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_3) {
 | 
			
		||||
            oreBonus = .45f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_2) {
 | 
			
		||||
            oreBonus = .40f;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            debrisReduction = .35f;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void calculateDebrisReduction() {
 | 
			
		||||
        if (skillLevel >= BlastMining.BLAST_MINING_RANK_3) {
 | 
			
		||||
            debrisReduction = .30f;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_2) {
 | 
			
		||||
            debrisReduction = .20f;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            debrisReduction = .10f;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void calculateDropMultiplier() {
 | 
			
		||||
        if (skillLevel >= BlastMining.BLAST_MINING_RANK_7) {
 | 
			
		||||
            dropMultiplier = 3;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_5) {
 | 
			
		||||
            dropMultiplier = 2;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            dropMultiplier = 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.event.entity.EntityDamageEvent;
 | 
			
		||||
 | 
			
		||||
public class DemoltionsExpertiseEventHandler {
 | 
			
		||||
    private int skillLevel;
 | 
			
		||||
 | 
			
		||||
    private EntityDamageEvent event;
 | 
			
		||||
    private int damage;
 | 
			
		||||
    private double damageModifier;
 | 
			
		||||
 | 
			
		||||
    public DemoltionsExpertiseEventHandler(MiningManager manager, EntityDamageEvent event) {
 | 
			
		||||
        this.skillLevel = manager.getSkillLevel();
 | 
			
		||||
 | 
			
		||||
        this.event = event;
 | 
			
		||||
        this.damage = event.getDamage();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void calculateDamageModifier() {
 | 
			
		||||
        if (skillLevel < BlastMining.BLAST_MINING_RANK_4) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel >= BlastMining.BLAST_MINING_RANK_8) {
 | 
			
		||||
            damageModifier = 0;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_6) {
 | 
			
		||||
            damageModifier = 0.5;
 | 
			
		||||
        }
 | 
			
		||||
        else if (skillLevel >= BlastMining.BLAST_MINING_RANK_4) {
 | 
			
		||||
            damageModifier = 0.25;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void modifyEventDamage() {
 | 
			
		||||
        damage = (int) (damage * damageModifier);
 | 
			
		||||
        event.setDamage(damage);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -29,7 +29,7 @@ public class MiningBlockEventHandler {
 | 
			
		||||
        calculateSkillModifier();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void calculateSkillModifier() {
 | 
			
		||||
    private void calculateSkillModifier() {
 | 
			
		||||
        this.skillModifier = Misc.skillCheck(manager.getSkillLevel(), Mining.DOUBLE_DROPS_MAX_BONUS_LEVEL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -48,7 +48,7 @@ public class MiningBlockEventHandler {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void processXP() {
 | 
			
		||||
    protected void processXPGain() {
 | 
			
		||||
        Mining.miningXP(player, manager.getProfile(), block, blockType);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,9 @@ package com.gmail.nossr50.skills.mining;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.entity.EntityDamageEvent;
 | 
			
		||||
import org.bukkit.event.entity.EntityExplodeEvent;
 | 
			
		||||
import org.bukkit.event.entity.ExplosionPrimeEvent;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.datatypes.PlayerProfile;
 | 
			
		||||
@@ -22,6 +25,65 @@ public class MiningManager {
 | 
			
		||||
        this.skillLevel = profile.getSkillLevel(SkillType.MINING);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handler for explosion drops and XP gain.
 | 
			
		||||
     *
 | 
			
		||||
     * @param event Event whose explosion is being processed
 | 
			
		||||
     */
 | 
			
		||||
    public void blastMiningDropProcessing(EntityExplodeEvent event) {
 | 
			
		||||
        if (Misc.isCitizensNPC(player)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (skillLevel < BlastMining.BLAST_MINING_RANK_1) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BlastMiningDropEventHandler eventHandler = new BlastMiningDropEventHandler(this, event);
 | 
			
		||||
 | 
			
		||||
        eventHandler.sortExplosionBlocks();
 | 
			
		||||
        eventHandler.modifyEventYield();
 | 
			
		||||
 | 
			
		||||
        eventHandler.calcuateDropModifiers();
 | 
			
		||||
        eventHandler.processDroppedBlocks();
 | 
			
		||||
 | 
			
		||||
        eventHandler.processXPGain();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Decreases damage dealt by the explosion from TNT activated by Blast Mining.
 | 
			
		||||
     *
 | 
			
		||||
     * @param event Event whose explosion damage is being reduced
 | 
			
		||||
     */
 | 
			
		||||
    public void demolitionsExpertise(EntityDamageEvent event) {
 | 
			
		||||
        if (Misc.isCitizensNPC(player)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        DemoltionsExpertiseEventHandler eventHandler = new DemoltionsExpertiseEventHandler(this, event);
 | 
			
		||||
 | 
			
		||||
        eventHandler.calculateDamageModifier();
 | 
			
		||||
        eventHandler.modifyEventDamage();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Increases the blast radius of the explosion.
 | 
			
		||||
     *
 | 
			
		||||
     * @param player Player triggering the explosion
 | 
			
		||||
     * @param event Event whose explosion radius is being changed
 | 
			
		||||
     */
 | 
			
		||||
    public void biggerBombs(ExplosionPrimeEvent event) {
 | 
			
		||||
        if (Misc.isCitizensNPC(player)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BiggerBombsEventHandler eventHandler = new BiggerBombsEventHandler(this, event);
 | 
			
		||||
 | 
			
		||||
        eventHandler.calculateRadiusIncrease();
 | 
			
		||||
        eventHandler.modifyBlastRadius();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Process Mining block drops.
 | 
			
		||||
     *
 | 
			
		||||
@@ -34,7 +96,7 @@ public class MiningManager {
 | 
			
		||||
 | 
			
		||||
        MiningBlockEventHandler eventHandler = new MiningBlockEventHandler(this, block);
 | 
			
		||||
 | 
			
		||||
        eventHandler.processXP();
 | 
			
		||||
        eventHandler.processXPGain();
 | 
			
		||||
 | 
			
		||||
        if (!Permissions.miningDoubleDrops(player)) {
 | 
			
		||||
            return;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user