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:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user