mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-29 12:27:59 +01:00
Add a way to check whether the chest is blocked (#10635)
* More Chest Block API * rebased and slight logic fixes
This commit is contained in:
parent
254ed14dc9
commit
b00b419da9
44
patches/api/More-Chest-Block-API.patch
Normal file
44
patches/api/More-Chest-Block-API.patch
Normal file
@ -0,0 +1,44 @@
|
||||
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
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/block/Chest.java b/src/main/java/org/bukkit/block/Chest.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/block/Chest.java
|
||||
+++ b/src/main/java/org/bukkit/block/Chest.java
|
||||
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/block/EnderChest.java
|
||||
+++ b/src/main/java/org/bukkit/block/EnderChest.java
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
+}
|
73
patches/server/More-Chest-Block-API.patch
Normal file
73
patches/server/More-Chest-Block-API.patch
Normal file
@ -0,0 +1,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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
|
||||
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
|
||||
@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java
|
||||
@@ -0,0 +0,0 @@ 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user