1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2025-12-19 14:59:27 +00:00

Use real copper chests blocks when available for opening inventories

This commit is contained in:
onebeastchris
2025-10-12 16:52:48 +02:00
parent 2dfe846a40
commit 3f7da1d28a
3 changed files with 16 additions and 5 deletions

View File

@@ -25,6 +25,7 @@
package org.geysermc.geyser.inventory.holder;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector3i;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType;
@@ -58,13 +59,19 @@ public class BlockInventoryHolder extends InventoryHolder {
private final BlockState defaultJavaBlockState;
private final ContainerType containerType;
private final Set<Block> validBlocks;
private final @Nullable Class<? extends Block> validBlockClass;
public BlockInventoryHolder(Block defaultJavaBlock, ContainerType containerType, Block... validBlocks) {
this(defaultJavaBlock.defaultBlockState(), containerType, validBlocks);
this(defaultJavaBlock.defaultBlockState(), null, containerType, validBlocks);
}
public BlockInventoryHolder(BlockState defaultJavaBlockState, ContainerType containerType, Block... validBlocks) {
this(defaultJavaBlockState, null, containerType, validBlocks);
}
public BlockInventoryHolder(BlockState defaultJavaBlockState, @Nullable Class<? extends Block> validBlockClass, ContainerType containerType, Block... validBlocks) {
this.defaultJavaBlockState = defaultJavaBlockState;
this.validBlockClass = validBlockClass;
this.containerType = containerType;
if (validBlocks != null) {
Set<Block> validBlocksTemp = new HashSet<>(validBlocks.length + 1);
@@ -162,6 +169,9 @@ public class BlockInventoryHolder extends InventoryHolder {
* @return true if this Java block ID can be used for player inventory.
*/
protected boolean isValidBlock(GeyserSession session, Vector3i position, BlockState blockState) {
if (this.validBlockClass != null && this.validBlockClass.isInstance(blockState.block())) {
return true;
}
return this.validBlocks.contains(blockState.block());
}

View File

@@ -43,6 +43,7 @@ import org.geysermc.geyser.level.block.Blocks;
import org.geysermc.geyser.level.block.property.ChestType;
import org.geysermc.geyser.level.block.property.Properties;
import org.geysermc.geyser.level.block.type.BlockState;
import org.geysermc.geyser.level.block.type.ChestBlock;
import org.geysermc.geyser.level.physics.Direction;
import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.session.GeyserSession;
@@ -204,8 +205,7 @@ public class DoubleChestInventoryTranslator extends ChestInventoryTranslator<Con
if (session.getLastInteractionPlayerPosition().equals(session.getPlayerEntity().getPosition())) {
BlockState state = session.getGeyser().getWorldManager().blockAt(session, session.getLastInteractionBlockPosition());
if (!BlockRegistries.CUSTOM_BLOCK_STATE_OVERRIDES.get().containsKey(state.javaId())) {
if ((state.block() == Blocks.CHEST || state.block() == Blocks.TRAPPED_CHEST)
&& state.getValue(Properties.CHEST_TYPE) != ChestType.SINGLE) {
if (state.block() instanceof ChestBlock && state.getValue(Properties.CHEST_TYPE) != ChestType.SINGLE) {
container.setHolderPosition(session.getLastInteractionBlockPosition());
container.setUsingRealBlock(true, state.block());

View File

@@ -36,6 +36,7 @@ import org.geysermc.geyser.level.block.Blocks;
import org.geysermc.geyser.level.block.property.ChestType;
import org.geysermc.geyser.level.block.property.Properties;
import org.geysermc.geyser.level.block.type.BlockState;
import org.geysermc.geyser.level.block.type.ChestBlock;
import org.geysermc.geyser.level.physics.Axis;
import org.geysermc.geyser.level.physics.Direction;
import org.geysermc.geyser.network.GameProtocol;
@@ -46,8 +47,8 @@ public class SingleChestInventoryTranslator extends ChestInventoryTranslator<Gen
public SingleChestInventoryTranslator(int size) {
super(size, 27);
this.holder = new BlockInventoryHolder(Blocks.CHEST.defaultBlockState().withValue(Properties.CHEST_TYPE, ChestType.SINGLE), ContainerType.CONTAINER,
Blocks.ENDER_CHEST, Blocks.TRAPPED_CHEST, Blocks.BARREL) {
this.holder = new BlockInventoryHolder(Blocks.CHEST.defaultBlockState().withValue(Properties.CHEST_TYPE, ChestType.SINGLE),
ChestBlock.class, ContainerType.CONTAINER, Blocks.ENDER_CHEST, Blocks.BARREL) {
@Override
protected boolean isValidBlock(GeyserSession session, Vector3i position, BlockState blockState) {
if (blockState.is(Blocks.ENDER_CHEST) || blockState.is(Blocks.BARREL)) {