aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSoSeDiK <[email protected]>2024-05-05 20:57:28 +0300
committerGitHub <[email protected]>2024-05-05 10:57:28 -0700
commit2a6a5fef59ad3bb664393332c0496055ffbbcd76 (patch)
tree480add3ef189db6a58b321bddbd835117250b87a
parent21d91ce634481f58a8e94f6c02651dbaaeb4408f (diff)
downloadPaper-2a6a5fef59ad3bb664393332c0496055ffbbcd76.tar.gz
Paper-2a6a5fef59ad3bb664393332c0496055ffbbcd76.zip
Add a way to check whether the chest is blocked (#10635)
* More Chest Block API * rebased and slight logic fixes
-rw-r--r--patches/api/0479-More-Chest-Block-API.patch44
-rw-r--r--patches/server/1047-More-Chest-Block-API.patch73
2 files changed, 117 insertions, 0 deletions
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 <[email protected]>
+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 <[email protected]>
+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<EnderChestBlockEntity> 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<ChestBlockEntity> 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<EnderChestBlockEntity
+ return getTileEntity().openersCounter.opened;
+ }
+ // Paper end - More Lidded Block API
++
++ // Paper start - More Chest Block API
++ @Override
++ public boolean isBlocked() {
++ // Uses the same logic as EnderChestBlock's check for opening container
++ final net.minecraft.core.BlockPos abovePos = this.getPosition().above();
++ return this.isPlaced() && this.getWorldHandle().getBlockState(abovePos).isRedstoneConductor(this.getWorldHandle(), abovePos);
++ }
++ // Paper end - More Chest Block API
+ }