mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-01 00:50:41 +01:00
SPIGOT-824: SpongeAbsorbEvent
This commit is contained in:
parent
b50bb15f56
commit
30ab12cf4c
3 changed files with 92 additions and 15 deletions
80
nms-patches/BlockSponge.patch
Normal file
80
nms-patches/BlockSponge.patch
Normal file
|
@ -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<CraftBlockState> 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<org.bukkit.block.BlockState>) (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;
|
||||
}
|
|
@ -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<CraftBlockState> list;
|
||||
private final LinkedHashMap<BlockPosition, CraftBlockState> list;
|
||||
|
||||
public BlockStateListPopulator(World world) {
|
||||
this(world, new ArrayList<CraftBlockState>());
|
||||
this(world, new LinkedHashMap<>());
|
||||
}
|
||||
|
||||
public BlockStateListPopulator(World world, List<CraftBlockState> list) {
|
||||
public BlockStateListPopulator(World world, LinkedHashMap<BlockPosition, CraftBlockState> 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<CraftBlockState> getList() {
|
||||
return list;
|
||||
return new ArrayList<>(list.values());
|
||||
}
|
||||
|
||||
public World getWorld() {
|
||||
|
|
|
@ -39,7 +39,7 @@ public class DummyGeneratorAccess implements GeneratorAccess {
|
|||
|
||||
public static final GeneratorAccess INSTANCE = new DummyGeneratorAccess();
|
||||
|
||||
private DummyGeneratorAccess() {
|
||||
protected DummyGeneratorAccess() {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue