mirror of
https://github.com/PaperMC/Paper.git
synced 2025-08-10 00:52:22 -07:00
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:
@@ -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) {
|
@@ -99,4 +99,29 @@ public class CraftChest extends CraftLootable<ChestBlockEntity> implements Chest
|
|||||||
return getTileEntity().openersCounter.opened;
|
return getTileEntity().openersCounter.opened;
|
||||||
}
|
}
|
||||||
// Paper end - More Lidded Block API
|
// 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
|
||||||
}
|
}
|
||||||
|
@@ -58,4 +58,13 @@ public class CraftEnderChest extends CraftBlockEntityState<EnderChestBlockEntity
|
|||||||
return getTileEntity().openersCounter.opened;
|
return getTileEntity().openersCounter.opened;
|
||||||
}
|
}
|
||||||
// Paper end - More Lidded Block API
|
// 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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user