aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0954-More-Chest-Block-API.patch
blob: d7c00f61e18a472c97bd947b278a29cdf96279e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: SoSeDiK <mrsosedik@gmail.com>
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 b376f7d3b632d6aaea5c4d93382238074559d56a..ef0d469176ee74b6bb5f9e9cc508735145fda5b8 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
         PlayerEnderChestContainer playerEnderChestContainer = player.getEnderChestInventory();
         if (playerEnderChestContainer != null && world.getBlockEntity(pos) instanceof EnderChestBlockEntity 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.SUCCESS;
             } else {
                 if (world instanceof ServerLevel serverLevel) {
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
index 6e98a00d526b734992ce39b15768c5820dce4ca8..cc7bf4d39b834fba472bc163226a01a0cd4b6010 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
@@ -99,4 +99,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
 }