--- a/net/minecraft/server/BlockSponge.java +++ b/net/minecraft/server/BlockSponge.java @@ -2,6 +2,12 @@ import com.google.common.collect.Lists; import java.util.Queue; +// CraftBukkit start +import java.util.List; +import org.bukkit.craftbukkit.block.CraftBlockState; +import org.bukkit.craftbukkit.util.BlockStateListPopulator; +import org.bukkit.event.block.SpongeAbsorbEvent; +// CraftBukkit end public class BlockSponge extends Block { @@ -35,6 +41,7 @@ queue.add(new Tuple<>(blockposition, 0)); int i = 0; + BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator while (!queue.isEmpty()) { Tuple<BlockPosition, Integer> tuple = (Tuple) queue.poll(); @@ -46,27 +53,31 @@ for (int l = 0; l < k; ++l) { EnumDirection enumdirection = aenumdirection[l]; BlockPosition blockposition2 = blockposition1.shift(enumdirection); - IBlockData iblockdata = world.getType(blockposition2); - Fluid fluid = world.getFluid(blockposition2); + // CraftBukkit start + IBlockData iblockdata = blockList.getType(blockposition2); + Fluid fluid = blockList.getFluid(blockposition2); + // CraftBukkit end Material material = iblockdata.getMaterial(); if (fluid.a(TagsFluid.WATER)) { - if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(world, blockposition2, iblockdata) != FluidTypes.EMPTY) { + if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(blockList, blockposition2, iblockdata) != FluidTypes.EMPTY) { // CraftBukkit ++i; if (j < 6) { queue.add(new Tuple<>(blockposition2, j + 1)); } } else if (iblockdata.getBlock() instanceof BlockFluids) { - world.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); + blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); // CraftBukkit ++i; if (j < 6) { queue.add(new Tuple<>(blockposition2, j + 1)); } } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { - TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null; + // CraftBukkit start + // TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null; - a(iblockdata, world, blockposition2, tileentity); - world.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); + // a(iblockdata, world, blockposition2, tileentity); + blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); + // CraftBukkit end ++i; if (j < 6) { queue.add(new Tuple<>(blockposition2, j + 1)); @@ -79,6 +90,39 @@ break; } } + // CraftBukkit start + List<CraftBlockState> blocks = blockList.getList(); // Is a clone + if (!blocks.isEmpty()) { + final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + + SpongeAbsorbEvent event = new SpongeAbsorbEvent(bblock, (List<org.bukkit.block.BlockState>) (List) blocks); + world.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return false; + } + + for (CraftBlockState block : blocks) { + BlockPosition blockposition2 = block.getPosition(); + IBlockData iblockdata = world.getType(blockposition2); + Fluid fluid = world.getFluid(blockposition2); + Material material = iblockdata.getMaterial(); + + if (fluid.a(TagsFluid.WATER)) { + if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).removeFluid(blockList, blockposition2, iblockdata) != FluidTypes.EMPTY) { + // NOP + } else if (iblockdata.getBlock() instanceof BlockFluids) { + // NOP + } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { + TileEntity tileentity = iblockdata.getBlock().isTileEntity() ? world.getTileEntity(blockposition2) : null; + + a(iblockdata, world, blockposition2, tileentity); + } + } + world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag()); + } + } + // CraftBukkit end return i > 0; }