From 2a6a5fef59ad3bb664393332c0496055ffbbcd76 Mon Sep 17 00:00:00 2001 From: SoSeDiK Date: Sun, 5 May 2024 20:57:28 +0300 Subject: [PATCH] Add a way to check whether the chest is blocked (#10635) * More Chest Block API * rebased and slight logic fixes --- patches/api/0479-More-Chest-Block-API.patch | 44 +++++++++++ .../server/1047-More-Chest-Block-API.patch | 73 +++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 patches/api/0479-More-Chest-Block-API.patch create mode 100644 patches/server/1047-More-Chest-Block-API.patch diff --git a/patches/api/0479-More-Chest-Block-API.patch b/patches/api/0479-More-Chest-Block-API.patch new file mode 100644 index 0000000000..1fc3614c74 --- /dev/null +++ b/patches/api/0479-More-Chest-Block-API.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SoSeDiK +Date: Wed, 1 May 2024 08:22:13 +0300 +Subject: [PATCH] More Chest Block API + + +diff --git a/src/main/java/org/bukkit/block/Chest.java b/src/main/java/org/bukkit/block/Chest.java +index db6affbc78106b2d93b41953b624a0bca0ca1d72..5d02f9c938d0d7d0f4e491ccfaf6beb0a7a61aa4 100644 +--- a/src/main/java/org/bukkit/block/Chest.java ++++ b/src/main/java/org/bukkit/block/Chest.java +@@ -27,4 +27,14 @@ public interface Chest extends Container, LootableBlockInventory, Lidded { // Pa + */ + @NotNull + Inventory getBlockInventory(); ++ ++ // Paper start - More Chest Block API ++ /** ++ * Checks whether this chest is blocked ++ * by either a block above or a sitting cat ++ * ++ * @return whether this chest is blocked ++ */ ++ boolean isBlocked(); ++ // Paper end - More Chest Block API + } +diff --git a/src/main/java/org/bukkit/block/EnderChest.java b/src/main/java/org/bukkit/block/EnderChest.java +index 1150b449a3f5c40fe10136779c2ccc65ab4d884c..6b66f38e5509f90aad5ee1fffca01003dcbe9896 100644 +--- a/src/main/java/org/bukkit/block/EnderChest.java ++++ b/src/main/java/org/bukkit/block/EnderChest.java +@@ -3,4 +3,13 @@ package org.bukkit.block; + /** + * Represents a captured state of an ender chest. + */ +-public interface EnderChest extends Lidded, TileState { } ++public interface EnderChest extends Lidded, TileState { ++ // Paper start - More Chest Block API ++ /** ++ * Checks whether this ender chest is blocked by a block above ++ * ++ * @return whether this ender chest is blocked ++ */ ++ boolean isBlocked(); ++ // Paper end - More Chest Block API ++} diff --git a/patches/server/1047-More-Chest-Block-API.patch b/patches/server/1047-More-Chest-Block-API.patch new file mode 100644 index 0000000000..7a9542665a --- /dev/null +++ b/patches/server/1047-More-Chest-Block-API.patch @@ -0,0 +1,73 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: SoSeDiK +Date: Wed, 1 May 2024 08:22:13 +0300 +Subject: [PATCH] More Chest Block API + +== AT == +public net.minecraft.world.level.block.ChestBlock isBlockedChestByBlock(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z + +diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +index 5f9858ef8d0ec1a74d469ab4426eb1db068873fd..ca92d49ef2010ba00c623491671dcde8ebe697c1 100644 +--- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +@@ -83,7 +83,7 @@ public class EnderChestBlock extends AbstractChestBlock i + BlockEntity blockEntity = world.getBlockEntity(pos); + if (playerEnderChestContainer != null && blockEntity instanceof EnderChestBlockEntity) { + BlockPos blockPos = pos.above(); +- if (world.getBlockState(blockPos).isRedstoneConductor(world, blockPos)) { ++ if (world.getBlockState(blockPos).isRedstoneConductor(world, blockPos)) { // Paper - diff on change; make sure that EnderChest#isBlocked uses the same logic + return InteractionResult.sidedSuccess(world.isClientSide); + } else if (world.isClientSide) { + return InteractionResult.SUCCESS; +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +index c7d19cef79dbe39edc8cddf0c60c7b59d656e581..984bb158a5de646834031d06bfd0fb9c89a76dff 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +@@ -100,4 +100,29 @@ public class CraftChest extends CraftLootable implements Chest + return getTileEntity().openersCounter.opened; + } + // Paper end - More Lidded Block API ++ ++ // Paper start - More Chest Block API ++ @Override ++ public boolean isBlocked() { ++ // Method mimics vanilla logic in ChestBlock and DoubleBlockCombiner when trying to open chest's container ++ if (!isPlaced()) { ++ return false; ++ } ++ net.minecraft.world.level.LevelAccessor world = getWorldHandle(); ++ if (ChestBlock.isChestBlockedAt(world, getPosition())) { ++ return true; ++ } ++ if (ChestBlock.getBlockType(this.data) == net.minecraft.world.level.block.DoubleBlockCombiner.BlockType.SINGLE) { ++ return false; ++ } ++ net.minecraft.core.Direction direction = ChestBlock.getConnectedDirection(this.data); ++ net.minecraft.core.BlockPos neighbourBlockPos = getPosition().relative(direction); ++ BlockState neighbourBlockState = world.getBlockStateIfLoaded(neighbourBlockPos); ++ return neighbourBlockState != null ++ && neighbourBlockState.is(this.data.getBlock()) ++ && ChestBlock.getBlockType(neighbourBlockState) != net.minecraft.world.level.block.DoubleBlockCombiner.BlockType.SINGLE ++ && ChestBlock.getConnectedDirection(neighbourBlockState) == direction.getOpposite() ++ && ChestBlock.isChestBlockedAt(world, neighbourBlockPos); ++ } ++ // Paper end - More Chest Block API + } +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java +index b64adbba3e52d32d439e64a243cb74f3fbca2ce3..f45ee675a10729845bf376fa95e648b23b9aac12 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java +@@ -58,4 +58,13 @@ public class CraftEnderChest extends CraftBlockEntityState