From 30ab12cf4ceea49628d27e66fb06f00b9b29aa57 Mon Sep 17 00:00:00 2001 From: Articdive Date: Mon, 23 Jul 2018 17:20:52 +1000 Subject: SPIGOT-824: SpongeAbsorbEvent --- nms-patches/BlockSponge.patch | 80 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 nms-patches/BlockSponge.patch (limited to 'nms-patches') diff --git a/nms-patches/BlockSponge.patch b/nms-patches/BlockSponge.patch new file mode 100644 index 00000000..a73f8781 --- /dev/null +++ b/nms-patches/BlockSponge.patch @@ -0,0 +1,80 @@ +--- 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.LinkedList; ++// 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 @@ + + linkedlist.add(new Tuple(blockposition, Integer.valueOf(0))); + int i = 0; ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator + + while (!linkedlist.isEmpty()) { + Tuple tuple = (Tuple) linkedlist.poll(); +@@ -49,20 +56,20 @@ + Material material = iblockdata.getMaterial(); + + if (fluid.a(TagsFluid.a)) { +- if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).a(world, blockposition2, iblockdata) != FluidTypes.a) { ++ if (iblockdata.getBlock() instanceof IFluidSource && ((IFluidSource) iblockdata.getBlock()).a(blockList, blockposition2, iblockdata) != FluidTypes.a) { // CraftBukkit + ++i; + if (j < 6) { + linkedlist.add(new Tuple(blockposition2, Integer.valueOf(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) { + linkedlist.add(new Tuple(blockposition2, Integer.valueOf(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) { + linkedlist.add(new Tuple(blockposition2, Integer.valueOf(j + 1))); +@@ -75,6 +82,31 @@ + break; + } + } ++ // CraftBukkit start ++ List blocks = blockList.getList(); ++ 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 = new BlockPosition(block.getX(), block.getY(), block.getZ()); ++ IBlockData iblockdata = world.getType(blockposition2); ++ Material material = iblockdata.getMaterial(); ++ ++ 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; + } -- cgit v1.2.3