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 ++++++++++++++++++++++ .../craftbukkit/util/BlockStateListPopulator.java | 25 +++---- .../craftbukkit/util/DummyGeneratorAccess.java | 2 +- 3 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 nms-patches/BlockSponge.patch 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; + } diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java index 3db85a3b..165843dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java +++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.util; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import net.minecraft.server.BlockPosition; @@ -10,39 +11,35 @@ import net.minecraft.server.World; import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.block.CraftBlockState; -public class BlockStateListPopulator { +public class BlockStateListPopulator extends DummyGeneratorAccess { private final World world; - private final List list; + private final LinkedHashMap list; public BlockStateListPopulator(World world) { - this(world, new ArrayList()); + this(world, new LinkedHashMap<>()); } - public BlockStateListPopulator(World world, List list) { + public BlockStateListPopulator(World world, LinkedHashMap list) { this.world = world; this.list = list; } - public void setTypeUpdate(BlockPosition position, IBlockData data) { - CraftBlockState state = CraftBlockState.getBlockState(world, position); - state.setData(data); - list.add(state); - } - - public void setTypeAndData(BlockPosition position, IBlockData data, int flag) { + @Override + public boolean setTypeAndData(BlockPosition position, IBlockData data, int flag) { CraftBlockState state = CraftBlockState.getBlockState(world, position, flag); state.setData(data); - list.add(state); + list.put(position, state); + return true; } public void updateList() { - for (BlockState state : list) { + for (BlockState state : list.values()) { state.update(true); } } public List getList() { - return list; + return new ArrayList<>(list.values()); } public World getWorld() { diff --git a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java index 2d6e7089..897c8cc5 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java +++ b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java @@ -39,7 +39,7 @@ public class DummyGeneratorAccess implements GeneratorAccess { public static final GeneratorAccess INSTANCE = new DummyGeneratorAccess(); - private DummyGeneratorAccess() { + protected DummyGeneratorAccess() { } @Override -- cgit v1.2.3