diff --git a/Changelog.txt b/Changelog.txt index feda3bcbe..59a0cf098 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -34,12 +34,14 @@ Version 1.5.01-dev = Fixed bug where the console would not correctly show party chat colors = Fixed bug where party chat was using non thread safe methods = Fixed bug where Blast Mining unlock levels could be to high in certain occasions + = Fixed bug where Blast Minings ability "Demolition Expert" would not work ! Changed SecondaryAbilityEvent to implement Cancellable and it now gets fired for damage related secondary abilities ! Changed the way mcMMO handles bonus damage, updated for the new damage event API ! Changed player data saving. Save tasks are now asynchronous ! Vanished players no longer get hit by AoE effects ! Changed Alchemy config option 'Prevent_Hopper_Transfer' renamed to 'Prevent_Hopper_Transfer_Ingredients' ! Changed Alchemy XP distribution. XP is granted based on the stage of the potion. + ! Changed behavior of the Blast Mining ability "Demolition Expert"; now only decreases damage for the ability user ! Updated for new getOnlinePlayers() behavior - Removed salvage ability from Repair, salvage has it's own (child) skill now diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index ce1cf59c7..6d8580c9a 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -53,6 +53,7 @@ import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager; import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.fishing.Fishing; import com.gmail.nossr50.skills.herbalism.Herbalism; +import com.gmail.nossr50.skills.mining.BlastMining; import com.gmail.nossr50.skills.mining.MiningManager; import com.gmail.nossr50.skills.taming.Taming; import com.gmail.nossr50.skills.taming.TamingManager; @@ -192,6 +193,11 @@ public class EntityListener implements Listener { attacker = (Entity) animalTamer; } } + else if (attacker instanceof TNTPrimed && defender instanceof Player) { + if (BlastMining.processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) { + return; + } + } if (defender instanceof Player && attacker instanceof Player) { Player defendingPlayer = (Player) defender; @@ -285,19 +291,6 @@ public class EntityListener implements Listener { } break; - case BLOCK_EXPLOSION: - MiningManager miningManager = mcMMOPlayer.getMiningManager(); - - if (miningManager.canUseDemolitionsExpertise()) { - event.setDamage(miningManager.processDemolitionsExpertise(event.getDamage())); - - if (event.getFinalDamage() == 0) { - event.setCancelled(true); - return; - } - } - break; - default: break; } 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 c10039ca9..24d5d3775 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java @@ -4,9 +4,15 @@ import java.util.Arrays; import java.util.List; import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.util.player.UserManager; public class BlastMining { // The order of the values is extremely important, a few methods depend on it to work properly @@ -84,4 +90,32 @@ public class BlastMining { return 0; } + + public static boolean processBlastMiningExplosion(EntityDamageByEntityEvent event, TNTPrimed tnt, Player defender) { + if (!tnt.hasMetadata(mcMMO.tntMetadataKey) || !UserManager.hasPlayerDataKey(defender)) { + return false; + } + + // We can make this assumption because we (should) be the only ones using this exact metadata + Player player = mcMMO.p.getServer().getPlayerExact(tnt.getMetadata(mcMMO.tntMetadataKey).get(0).asString()); + + if (!player.equals(defender)) { + return false; + } + + MiningManager miningManager = UserManager.getPlayer(defender).getMiningManager(); + + if (!miningManager.canUseDemolitionsExpertise()) { + return false; + } + + event.setDamage(DamageModifier.BASE, miningManager.processDemolitionsExpertise(event.getDamage())); + + if (event.getFinalDamage() == 0) { + event.setCancelled(true); + return false; + } + + return true; + } }