Drop extended BlockStateListPopulator and fix SpongeAbsorbEvent handling

This patch, while would have been nice, would just take too much
in order to re-implement it to retain and handle all of the state
changes possible, and complicates retaining state properly

Fix SpongeAbsortEvent handling

Only process drops when the block is actually going to be removed
This commit is contained in:
Shane Freeder 2018-11-10 05:19:45 +00:00
parent 1f5ddf73ba
commit dc253f1ad0
3 changed files with 38 additions and 133 deletions

View File

@ -1,132 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Thu, 8 Nov 2018 04:53:00 +0000
Subject: [PATCH] Extend BlockStateListPopulator
extends BlockStateListPopulator to suppport checking block types in the
physical world it's representing, allowing for blocks making modifications
to the world to maintain proper state.
diff --git a/src/main/java/net/minecraft/server/BlockSponge.java b/src/main/java/net/minecraft/server/BlockSponge.java
index 987af9c3de..6e52d46952 100644
--- a/src/main/java/net/minecraft/server/BlockSponge.java
+++ b/src/main/java/net/minecraft/server/BlockSponge.java
@@ -0,0 +0,0 @@ public class BlockSponge extends Block {
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);
+ iblockdata.a(blockList, blockposition2, 0); // Paper
blockList.setTypeAndData(blockposition2, Blocks.AIR.getBlockData(), 3); // CraftBukkit
++i;
if (j < 6) {
@@ -0,0 +0,0 @@ public class BlockSponge extends Block {
for (CraftBlockState block : blocks) {
BlockPosition blockposition2 = new BlockPosition(block.getX(), block.getY(), block.getZ());
+ /* // Paper start
IBlockData iblockdata = world.getType(blockposition2);
Material material = iblockdata.getMaterial();
if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
iblockdata.a(world, blockposition2, 0);
}
+ */ // Paper end
world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag());
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
index 165843ddfe..8482abd054 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
@@ -0,0 +0,0 @@ import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
+import net.minecraft.server.Block;
import net.minecraft.server.BlockPosition;
+import net.minecraft.server.FluidType;
import net.minecraft.server.IBlockData;
+import net.minecraft.server.TickList;
+import net.minecraft.server.TickListPriority;
import net.minecraft.server.World;
import org.bukkit.block.BlockState;
@@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.block.CraftBlockState;
public class BlockStateListPopulator extends DummyGeneratorAccess {
private final World world;
private final LinkedHashMap<BlockPosition, CraftBlockState> list;
+ // Paper start
+ private final TickList<FluidType> fluidTickList = new TickList<FluidType>() {
+ @Override
+ public boolean a(BlockPosition var1, FluidType var2) {
+ return BlockStateListPopulator.super.I().a(var1, var2);
+ }
+
+ @Override
+ public void a(BlockPosition var1, FluidType var2, int var3, TickListPriority var4) {
+
+ }
+
+ @Override
+ public boolean b(BlockPosition var1, FluidType var2) {
+ return false;
+ }
+ };
+
+ private TickList<Block> blockTickList = new TickList<Block>() {
+ @Override
+ public boolean a(BlockPosition var1, Block var2) {
+ return BlockStateListPopulator.super.J().a(var1, var2);
+ }
+
+ @Override
+ public void a(BlockPosition var1, Block var2, int var3, TickListPriority var4) {
+
+ }
+
+ @Override
+ public boolean b(BlockPosition var1, Block var2) {
+ return false;
+ }
+ };
+ // Paper end
public BlockStateListPopulator(World world) {
this(world, new LinkedHashMap<>());
@@ -0,0 +0,0 @@ public class BlockStateListPopulator extends DummyGeneratorAccess {
public World getWorld() {
return world;
}
+
+ // Paper start
+ @Override
+ public IBlockData getType(BlockPosition bp) {
+ CraftBlockState craftState = list.get(bp);
+ if (craftState != null) {
+ return craftState.getHandle();
+ } else {
+ return world.getType(bp);
+ }
+ }
+
+ // Do nothing, this will be ran when the block is actually placed into the world
+ @Override
+ public void update(BlockPosition bp, Block block) {}
+
+ // Dumb tick lists, we rely upon block placement into the world updating this info
+ // no obfhelpers intentional, design of these classes do not favor them, and easier
+ // to just rework on upgrade...
+ @Override
+ public TickList<FluidType> I() {
+ return fluidTickList;
+ }
+
+ @Override
+ public TickList<Block> J() {
+ return blockTickList;
+ }
+
+ // paper end
}
--

View File

@ -0,0 +1,37 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Sat, 10 Nov 2018 05:15:21 +0000
Subject: [PATCH] Fix SpongeAbsortEvent handling
Only process drops when the block is actually going to be removed
diff --git a/src/main/java/net/minecraft/server/BlockSponge.java b/src/main/java/net/minecraft/server/BlockSponge.java
index 987af9c3de..adb863eb55 100644
--- a/src/main/java/net/minecraft/server/BlockSponge.java
+++ b/src/main/java/net/minecraft/server/BlockSponge.java
@@ -0,0 +0,0 @@ public class BlockSponge extends Block {
Material material = iblockdata.getMaterial();
if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) {
- iblockdata.a(world, blockposition2, 0);
+ // Paper start
+ if (block.getHandle().getMaterial() == Material.AIR) {
+ iblockdata.dropNaturally(world, blockposition2, 0);
+ }
+ // Paper end
}
world.setTypeAndData(blockposition2, block.getHandle(), block.getFlag());
diff --git a/src/main/java/net/minecraft/server/IBlockData.java b/src/main/java/net/minecraft/server/IBlockData.java
index 2d855aae69..bc345a2c39 100644
--- a/src/main/java/net/minecraft/server/IBlockData.java
+++ b/src/main/java/net/minecraft/server/IBlockData.java
@@ -0,0 +0,0 @@ public interface IBlockData extends IBlockDataHolder<IBlockData> {
this.getBlock().a(this, world, blockposition, entity);
}
+ default void dropNaturally(World world, BlockPosition blockPosition, int i) { a(world, blockPosition, i);} // Paper - OBFHELPER
default void a(World world, BlockPosition blockposition, int i) {
this.dropNaturally(world, blockposition, 1.0F, i);
}
--

View File

@ -9,7 +9,7 @@ In Offline Mode, will return an Offline UUID
This is a more performant way to obtain a UUID for a name than loading an OfflinePlayer
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 0e582e4e5c..04a76802b8 100644
index 9d4cc5a483..e4f53cba65 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -0,0 +0,0 @@ public final class CraftServer implements Server {