diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 518a57a67..8c65dbc88 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -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)))) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index b313cb7b7..2d55ea05c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -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); } } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/BiggerBombsEventHandler.java b/src/main/java/com/gmail/nossr50/skills/mining/BiggerBombsEventHandler.java new file mode 100644 index 000000000..bbc2ca1dd --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/mining/BiggerBombsEventHandler.java @@ -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); + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java index 232dd4cf6..8c372c278 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -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 explosionYields(List ores, List debris, float yield, float oreBonus, float debrisReduction, int extraDrops) { - Iterator oresIterator = ores.iterator(); - List blocksDropped = new ArrayList(); - - 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 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 blocks = event.blockList(); - Iterator iterator = blocks.iterator(); - - List ores = new ArrayList(); - List debris = new ArrayList(); - List xp = new ArrayList(); - - 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; + } } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/BlastMiningDropEventHandler.java b/src/main/java/com/gmail/nossr50/skills/mining/BlastMiningDropEventHandler.java new file mode 100644 index 000000000..19010f8c4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMiningDropEventHandler.java @@ -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 blocks; + + private List ores; + private List debris; + private List 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; + } + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/mining/DemoltionsExpertiseEventHandler.java b/src/main/java/com/gmail/nossr50/skills/mining/DemoltionsExpertiseEventHandler.java new file mode 100644 index 000000000..bb22f6ae4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/mining/DemoltionsExpertiseEventHandler.java @@ -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); + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningBlockEventHandler.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningBlockEventHandler.java index 6abbd0a75..5348816e9 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningBlockEventHandler.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningBlockEventHandler.java @@ -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); } } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index b8740c5c2..68539882e 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -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;