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 343c0b89e..1ca83a1ee 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; } } -@@ -164,4 +188,13 @@ +@@ -164,4 +188,15 @@ public void b(IBlockData iblockdata) { this.blockState = iblockdata; } @@ -57,7 +57,9 @@ + // CraftBukkit start - add method + public InventoryHolder getOwner() { + if (level == null) return null; -+ org.bukkit.block.BlockState state = level.getWorld().getBlockAt(worldPosition.getX(), worldPosition.getY(), worldPosition.getZ()).getState(); ++ 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(); + 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 14e5f618e..26409a4f5 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 class CraftBlockEntityState extends CraftBlockState implements TileState { +public abstract 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 71d42d6ac..f9e23e29e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -106,12 +106,8 @@ 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) { - // SPIGOT-6754: Temporarily restore previous behaviour for tile entities with removed blocks - if (tileEntity != null) { - // block with unhandled TileEntity: - return new CraftBlockEntityState<>(world, tileEntity); - } - Preconditions.checkState(tileEntity == null, "Unexpected BlockState for %s", CraftMagicNumbers.getMaterial(blockData.getBlock())); + // 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())); return new CraftBlockState(world, blockPosition, blockData); } };