mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-27 13:06:02 +01:00
Rework EntityExplodeEvent. Fixes BUKKIT-4140. Adds BUKKIT-4141
This commit is contained in:
parent
708b0e6ae1
commit
83c3aa188b
@ -34,6 +34,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex {
|
||||
private Entity bT;
|
||||
public int bR = 0;
|
||||
public EntityEnderCrystal bS = null;
|
||||
private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN); // CraftBukkit - reusable source for CraftTNTPrimed.getSource()
|
||||
|
||||
public EntityEnderDragon(World world) {
|
||||
super(world);
|
||||
@ -439,9 +440,29 @@ public class EntityEnderDragon extends EntityLiving implements IComplex {
|
||||
// This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down.
|
||||
// We should consider adding an event extension for it, or perhaps returning true if the event is cancelled.
|
||||
return flag;
|
||||
} else if (event.getYield() == 0F) {
|
||||
// Yield zero ==> no drops
|
||||
for (org.bukkit.block.Block block : event.blockList()) {
|
||||
this.world.setAir(block.getX(), block.getY(), block.getZ());
|
||||
}
|
||||
} else {
|
||||
for (org.bukkit.block.Block block : event.blockList()) {
|
||||
craftWorld.explodeBlock(block, event.getYield());
|
||||
int blockId = block.getTypeId();
|
||||
|
||||
if (blockId == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int blockX = block.getX();
|
||||
int blockY = block.getY();
|
||||
int blockZ = block.getZ();
|
||||
|
||||
if (Block.byId[blockId].a(explosionSource)) {
|
||||
Block.byId[blockId].dropNaturally(this.world, blockX, blockY, blockZ, block.getData(), event.getYield(), 0);
|
||||
}
|
||||
Block.byId[blockId].wasExploded(world, blockX, blockY, blockZ, explosionSource);
|
||||
|
||||
this.world.setAir(blockX, blockY, blockZ);
|
||||
}
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
@ -262,13 +262,11 @@ public class Explosion {
|
||||
this.world.addParticle("smoke", d0, d1, d2, d3, d4, d5);
|
||||
}
|
||||
|
||||
|
||||
// CraftBukkit - stop explosions from putting out fire
|
||||
if (l > 0 && l != Block.FIRE.id) {
|
||||
if (l > 0) {
|
||||
Block block = Block.byId[l];
|
||||
|
||||
if (block.a(this)) {
|
||||
// CraftBukkit
|
||||
// CraftBukkit - add yield
|
||||
block.dropNaturally(this.world, i, j, k, this.world.getData(i, j, k), event.getYield(), 0);
|
||||
}
|
||||
|
||||
|
@ -1097,23 +1097,6 @@ public class CraftWorld implements World {
|
||||
return ((WorldNBTStorage) world.getDataManager()).getDirectory();
|
||||
}
|
||||
|
||||
public void explodeBlock(Block block, float yield) {
|
||||
// First of all, don't explode fire
|
||||
if (block.getType().equals(org.bukkit.Material.AIR) || block.getType().equals(org.bukkit.Material.FIRE)) {
|
||||
return;
|
||||
}
|
||||
int blockId = block.getTypeId();
|
||||
int blockX = block.getX();
|
||||
int blockY = block.getY();
|
||||
int blockZ = block.getZ();
|
||||
// following code is lifted from Explosion.a(boolean), and modified
|
||||
net.minecraft.server.Block.byId[blockId].dropNaturally(this.world, blockX, blockY, blockZ, block.getData(), yield, 0);
|
||||
block.setType(org.bukkit.Material.AIR);
|
||||
// not sure what this does, seems to have something to do with the 'base' material of a block.
|
||||
// For example, WOODEN_STAIRS does something with WOOD in this method
|
||||
net.minecraft.server.Block.byId[blockId].wasExploded(this.world, blockX, blockY, blockZ, null);
|
||||
}
|
||||
|
||||
public void sendPluginMessage(Plugin source, String channel, byte[] message) {
|
||||
StandardMessenger.validatePluginMessage(server.getMessenger(), source, channel, message);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user