From 13dd8dad2a064c82f8dacb239b23427139088598 Mon Sep 17 00:00:00 2001 From: rasmus123d <59487370+RasmusKD@users.noreply.github.com> Date: Wed, 14 Aug 2024 13:14:55 +0200 Subject: [PATCH] Fix illegal blastmining drops Fixed so now spawners actually dont drop from blastmining, mining wont spawn illegal items anymore, before items like suspisous sand, infested_stone and similar illegal items were requiable with blastmining. Removed double drops from non-mining related blocks Added stone types back into the drops w/o double drops Added Javadoc --- .../nossr50/skills/mining/MiningManager.java | 178 +++++++++++------- 1 file changed, 107 insertions(+), 71 deletions(-) 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 937389730..147e02b56 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -31,55 +31,78 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Set; import static com.gmail.nossr50.util.ItemUtils.isPickaxe; public class MiningManager extends SkillManager { - public static final String BUDDING_AMETHYST = "budding_amethyst"; - public static final Collection BLAST_MINING_BLACKLIST = Set.of(Material.SPAWNER); - public MiningManager(@NotNull McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.MINING); } + /** + * Determines if the player can use Demolitions Expertise. + * + * @return true if the player can use Demolitions Expertise, false otherwise + */ public boolean canUseDemolitionsExpertise() { - if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DEMOLITIONS_EXPERTISE)) - return false; - - return getSkillLevel() >= BlastMining.getDemolitionExpertUnlockLevel() && Permissions.demolitionsExpertise(getPlayer()); + return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DEMOLITIONS_EXPERTISE) + && getSkillLevel() >= BlastMining.getDemolitionExpertUnlockLevel() + && Permissions.demolitionsExpertise(getPlayer()); } + /** + * Determines if the player can detonate TNT remotely. + * + * @return true if the player can detonate TNT remotely, false otherwise + */ public boolean canDetonate() { Player player = getPlayer(); - return canUseBlastMining() && player.isSneaking() - && (isPickaxe(getPlayer().getInventory().getItemInMainHand()) || player.getInventory().getItemInMainHand().getType() == mcMMO.p.getGeneralConfig().getDetonatorItem()) + && (isPickaxe(player.getInventory().getItemInMainHand()) + || player.getInventory().getItemInMainHand().getType() == mcMMO.p.getGeneralConfig().getDetonatorItem()) && Permissions.remoteDetonation(player); } + /** + * Determines if the player can use Blast Mining. + * + * @return true if the player can use Blast Mining, false otherwise + */ public boolean canUseBlastMining() { - //Not checking permissions? return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_BLAST_MINING); } + /** + * Determines if the player can use Bigger Bombs. + * + * @return true if the player can use Bigger Bombs, false otherwise + */ public boolean canUseBiggerBombs() { - if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_BIGGER_BOMBS)) - return false; - - return getSkillLevel() >= BlastMining.getBiggerBombsUnlockLevel() && Permissions.biggerBombs(getPlayer()); + return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_BIGGER_BOMBS) + && getSkillLevel() >= BlastMining.getBiggerBombsUnlockLevel() + && Permissions.biggerBombs(getPlayer()); } + /** + * Determines if the player can trigger Double Drops. + * + * @return true if the player can trigger Double Drops, false otherwise + */ public boolean canDoubleDrop() { - return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS); + return RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS) + && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS); } + /** + * Determines if the player can trigger Mother Lode. + * + * @return true if the player can trigger Mother Lode, false otherwise + */ public boolean canMotherLode() { return Permissions.canUseSubSkill(getPlayer(), SubSkillType.MINING_MOTHER_LODE); } - /** * Process double drops & XP gain for Mining. * @@ -98,14 +121,15 @@ public class MiningManager extends SkillManager { SkillUtils.handleDurabilityChange(getPlayer().getInventory().getItemInMainHand(), mcMMO.p.getGeneralConfig().getAbilityToolDamage()); } - if (!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || !canDoubleDrop()) + if (!mcMMO.p.getGeneralConfig().getDoubleDropsEnabled(PrimarySkillType.MINING, blockState.getType()) || !canDoubleDrop()) { return; + } boolean silkTouch = player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.SILK_TOUCH); - if (silkTouch && !mcMMO.p.getAdvancedConfig().getDoubleDropSilkTouchEnabled()) + if (silkTouch && !mcMMO.p.getAdvancedConfig().getDoubleDropSilkTouchEnabled()) { return; - + } //Mining mastery allows for a chance of triple drops if (canMotherLode()) { //Triple Drops failed so do a normal double drops check @@ -118,20 +142,30 @@ public class MiningManager extends SkillManager { } } + /** + * Processes triple drops for Mining. + * + * @param blockState The {@link BlockState} to check ability activation for + * @return true if triple drops were successful, false otherwise + */ private boolean processTripleDrops(@NotNull BlockState blockState) { //TODO: Make this readable if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.MINING_MOTHER_LODE, mmoPlayer)) { BlockUtils.markDropsAsBonus(blockState, 2); return true; - } else { - return false; } + return false; } + /** + * Processes double drops for Mining. + * + * @param blockState The {@link BlockState} to check ability activation for + */ private void processDoubleDrops(@NotNull BlockState blockState) { - //TODO: Make this readable if (ProbabilityUtil.isSkillRNGSuccessful(SubSkillType.MINING_DOUBLE_DROPS, mmoPlayer)) { - boolean useTriple = mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); + boolean useTriple = mmoPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) + && mcMMO.p.getAdvancedConfig().getAllowMiningTripleDrops(); BlockUtils.markDropsAsBonus(blockState, useTriple); } } @@ -165,7 +199,8 @@ public class MiningManager extends SkillManager { mmoPlayer.setAbilityDATS(SuperAbilityType.BLAST_MINING, System.currentTimeMillis()); mmoPlayer.setAbilityInformed(SuperAbilityType.BLAST_MINING, false); - mcMMO.p.getFoliaLib().getImpl().runAtEntityLater(mmoPlayer.getPlayer(), new AbilityCooldownTask(mmoPlayer, SuperAbilityType.BLAST_MINING), (long) SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR); + mcMMO.p.getFoliaLib().getImpl().runAtEntityLater(mmoPlayer.getPlayer(), new AbilityCooldownTask(mmoPlayer, SuperAbilityType.BLAST_MINING), + (long) SuperAbilityType.BLAST_MINING.getCooldown() * Misc.TICK_CONVERSION_FACTOR); } /** @@ -175,66 +210,56 @@ public class MiningManager extends SkillManager { * @param event The {@link EntityExplodeEvent} */ public void blastMiningDropProcessing(float yield, EntityExplodeEvent event) { - if (yield == 0) - return; + if (yield == 0) return; var increasedYieldFromBonuses = yield + (yield * getOreBonus()); - // Strip out only stuff that gives mining XP + List ores = new ArrayList<>(); - List notOres = new ArrayList<>(); + List nonOres = new ArrayList<>(); + for (Block targetBlock : event.blockList()) { BlockState blockState = targetBlock.getState(); - if(mcMMO.getUserBlockTracker().isIneligible(targetBlock)) - continue; + if (mcMMO.getUserBlockTracker().isIneligible(targetBlock)) continue; if (ExperienceConfig.getInstance().getXp(PrimarySkillType.MINING, targetBlock) != 0) { if (BlockUtils.isOre(blockState) && !(targetBlock instanceof Container)) { ores.add(blockState); + } else { + nonOres.add(blockState); } } else { - notOres.add(blockState); + nonOres.add(blockState); } } int xp = 0; int dropMultiplier = getDropMultiplier(); - for(BlockState blockState : notOres) { - if (isDropIllegal(blockState.getType())) - continue; - - if (Probability.ofPercent(50).evaluate()) { - ItemUtils.spawnItem(getPlayer(), - Misc.getBlockCenter(blockState), - new ItemStack(blockState.getType()), - ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); // Initial block that would have been dropped - } + for (BlockState blockState : nonOres) { + Collection drops = blockState.getBlock().getDrops(mmoPlayer.getPlayer().getInventory().getItemInMainHand()); + ItemUtils.spawnItems(getPlayer(), Misc.getBlockCenter(blockState), drops, ItemSpawnReason.BLAST_MINING_DEBRIS_NON_ORES); } + for (BlockState blockState : ores) { // currentOreYield only used for drop calculations for ores float currentOreYield = increasedYieldFromBonuses; - if (isDropIllegal(blockState.getType())) { - continue; - } - // Always give XP for every ore destroyed xp += Mining.getBlockXp(blockState); - while(currentOreYield > 0) { + while (currentOreYield > 0) { if (Probability.ofValue(currentOreYield).evaluate()) { Collection oreDrops = isPickaxe(mmoPlayer.getPlayer().getInventory().getItemInMainHand()) ? blockState.getBlock().getDrops(mmoPlayer.getPlayer().getInventory().getItemInMainHand()) : List.of(new ItemStack(blockState.getType())); ItemUtils.spawnItems(getPlayer(), Misc.getBlockCenter(blockState), - oreDrops, BLAST_MINING_BLACKLIST, ItemSpawnReason.BLAST_MINING_ORES); + oreDrops, ItemSpawnReason.BLAST_MINING_ORES); if (mcMMO.p.getAdvancedConfig().isBlastMiningBonusDropsEnabled()) { for (int i = 1; i < dropMultiplier; i++) { ItemUtils.spawnItems(getPlayer(), Misc.getBlockCenter(blockState), oreDrops, - BLAST_MINING_BLACKLIST, ItemSpawnReason.BLAST_MINING_ORES_BONUS_DROP); } } @@ -243,22 +268,10 @@ public class MiningManager extends SkillManager { } } - // Replace the event blocklist with the newYield list event.setYield(0F); applyXpGain(xp, XPGainReason.PVE); } - /** - * Checks if it would be illegal (in vanilla) to obtain the block - * Certain things should never drop ( such as budding_amethyst ) - * - * @param material target material - * @return true if it's not legal to obtain the block through normal gameplay - */ - public boolean isDropIllegal(@NotNull Material material) { - return material.getKey().getKey().equalsIgnoreCase(BUDDING_AMETHYST); - } - /** * Increases the blast radius of the explosion. * @@ -269,6 +282,12 @@ public class MiningManager extends SkillManager { return (float) (radius + getBlastRadiusModifier()); } + /** + * Processes damage reduction for Demolitions Expertise. + * + * @param damage initial damage + * @return reduced damage + */ public double processDemolitionsExpertise(double damage) { return damage * ((100.0D - getBlastDamageModifier()) / 100.0D); } @@ -283,9 +302,9 @@ public class MiningManager extends SkillManager { } /** - * Gets the Blast Mining tier + * Gets the ore bonus for Blast Mining. * - * @return the Blast Mining tier + * @return the ore bonus as a float value */ public float getOreBonus() { return (float) (mcMMO.p.getAdvancedConfig().getOreBonus(getBlastMiningTier()) / 100F); @@ -296,27 +315,39 @@ public class MiningManager extends SkillManager { return mcMMO.p.getAdvancedConfig().getOreBonus(rank); } + /** + * Gets the debris reduction for Blast Mining. + * + * @param rank the current rank of Blast Mining + * @return the debris reduction as a double value + */ public static double getDebrisReduction(int rank) { return mcMMO.p.getAdvancedConfig().getDebrisReduction(rank); } /** - * Gets the Blast Mining tier + * Gets the debris reduction for the player's current Blast Mining tier. * - * @return the Blast Mining tier + * @return the debris reduction as a double value */ public double getDebrisReduction() { return getDebrisReduction(getBlastMiningTier()); } + /** + * Gets the drop multiplier for Blast Mining. + * + * @param rank the current rank of Blast Mining + * @return the drop multiplier + */ public static int getDropMultiplier(int rank) { return mcMMO.p.getAdvancedConfig().getDropMultiplier(rank); } /** - * Gets the Blast Mining tier + * Gets the drop multiplier for the player's current Blast Mining tier. * - * @return the Blast Mining tier + * @return the drop multiplier */ public int getDropMultiplier() { if (!mcMMO.p.getAdvancedConfig().isBlastMiningBonusDropsEnabled()) { @@ -332,23 +363,28 @@ public class MiningManager extends SkillManager { } /** - * Gets the Blast Mining tier + * Gets the blast radius modifier for the player's current Blast Mining tier. * - * @return the Blast Mining tier + * @return the blast radius modifier */ public double getBlastRadiusModifier() { return BlastMining.getBlastRadiusModifier(getBlastMiningTier()); } /** - * Gets the Blast Mining tier + * Gets the blast damage modifier for the player's current Blast Mining tier. * - * @return the Blast Mining tier + * @return the blast damage modifier */ public double getBlastDamageModifier() { return BlastMining.getBlastDamageDecrease(getBlastMiningTier()); } + /** + * Checks if the Blast Mining cooldown is over. + * + * @return true if the cooldown is over, false otherwise + */ private boolean blastMiningCooldownOver() { int timeRemaining = mmoPlayer.calculateTimeRemaining(SuperAbilityType.BLAST_MINING);