--- 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 { @@ -33,6 +39,7 @@ queue.add(new Tuple<>(blockposition, 0)); int i = 0; + BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator while (!queue.isEmpty()) { Tuple tuple = (Tuple) queue.poll(); @@ -49,20 +56,20 @@ 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) { - iblockdata.a(world, blockposition2, 0); - world.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); + // iblockdata.a(world, blockposition2, 0); + blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); // CraftBukkit ++i; if (j < 6) { queue.add(new Tuple<>(blockposition2, j + 1)); @@ -75,6 +82,37 @@ break; } } + // CraftBukkit start + List 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) (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) { + iblockdata.a(world, blockposition2, 0); + } + } + world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag()); + } + } + // CraftBukkit end return i > 0; }