From 9fb3aa4c7ae8086c3c91122d716acc0464b2f300 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 29 Nov 2021 11:03:16 +1100 Subject: [PATCH] SPIGOT-6817: Revert back to old block state behaviour again --- .../minecraft/world/level/block/entity/TileEntity.patch | 6 ++---- .../bukkit/craftbukkit/block/CraftBlockEntityState.java | 2 +- .../org/bukkit/craftbukkit/block/CraftBlockStates.java | 8 ++++++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntity.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntity.patch index 06f4c5070..ac5d27fe9 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntity.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntity.patch @@ -49,7 +49,7 @@ return nbttagcompound; } -@@ -202,4 +226,15 @@ +@@ -202,4 +226,13 @@ public void setBlockState(IBlockData iblockdata) { this.blockState = iblockdata; } @@ -57,9 +57,7 @@ + // CraftBukkit start - add method + public InventoryHolder getOwner() { + if (level == null) return null; -+ org.bukkit.block.Block block = level.getWorld().getBlockAt(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ()); -+ if (block.getType() == org.bukkit.Material.AIR) return null; -+ org.bukkit.block.BlockState state = block.getState(); ++ org.bukkit.block.BlockState state = level.getWorld().getBlockAt(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ()).getState(); + if (state instanceof InventoryHolder) return (InventoryHolder) state; + return null; + } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java index 44203fddd..adfb03968 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java @@ -6,7 +6,7 @@ import org.bukkit.World; import org.bukkit.block.TileState; import org.bukkit.persistence.PersistentDataContainer; -public abstract class CraftBlockEntityState extends CraftBlockState implements TileState { +public class CraftBlockEntityState extends CraftBlockState implements TileState { private final T tileEntity; private final T snapshot; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index fb76979cc..e7cf31f32 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -106,8 +106,12 @@ public final class CraftBlockStates { private static final BlockStateFactory DEFAULT_FACTORY = new BlockStateFactory(CraftBlockState.class) { @Override public CraftBlockState createBlockState(World world, BlockPosition blockPosition, IBlockData blockData, TileEntity tileEntity) { - // When a block is being destroyed, the TileEntity may temporarily still exist while the block's type has already been set to AIR. We ignore the TileEntity in this case. - Preconditions.checkState(tileEntity == null || CraftMagicNumbers.getMaterial(blockData.getBlock()) == Material.AIR, "Unexpected BlockState for %s", CraftMagicNumbers.getMaterial(blockData.getBlock())); + // SPIGOT-6754, SPIGOT-6817: Restore previous behaviour for tile entities with removed blocks (loot generation post-destroy) + if (tileEntity != null) { + // block with unhandled TileEntity: + return new CraftBlockEntityState<>(world, tileEntity); + } + Preconditions.checkState(tileEntity == null, "Unexpected BlockState for %s", CraftMagicNumbers.getMaterial(blockData.getBlock())); return new CraftBlockState(world, blockPosition, blockData); } };