More Chest Block API

== AT ==
public net.minecraft.world.level.block.ChestBlock isBlockedChestByBlock(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z
This commit is contained in:
SoSeDiK 2024-05-01 08:22:13 +03:00
parent 31725bc039
commit b50682ab2b
3 changed files with 45 additions and 0 deletions

View file

@ -0,0 +1,11 @@
--- a/net/minecraft/world/level/block/EnderChestBlock.java
+++ b/net/minecraft/world/level/block/EnderChestBlock.java
@@ -78,7 +78,7 @@
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) {

View file

@ -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
}

View file

@ -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
}