mirror of
https://github.com/GeyserMC/Geyser.git
synced 2025-12-21 07:49:32 +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;
|
package org.geysermc.geyser.inventory.holder;
|
||||||
|
|
||||||
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
import org.cloudburstmc.math.vector.Vector3i;
|
import org.cloudburstmc.math.vector.Vector3i;
|
||||||
import org.cloudburstmc.nbt.NbtMap;
|
import org.cloudburstmc.nbt.NbtMap;
|
||||||
import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType;
|
import org.cloudburstmc.protocol.bedrock.data.inventory.ContainerType;
|
||||||
@@ -58,13 +59,19 @@ public class BlockInventoryHolder extends InventoryHolder {
|
|||||||
private final BlockState defaultJavaBlockState;
|
private final BlockState defaultJavaBlockState;
|
||||||
private final ContainerType containerType;
|
private final ContainerType containerType;
|
||||||
private final Set<Block> validBlocks;
|
private final Set<Block> validBlocks;
|
||||||
|
private final @Nullable Class<? extends Block> validBlockClass;
|
||||||
|
|
||||||
public BlockInventoryHolder(Block defaultJavaBlock, ContainerType containerType, Block... validBlocks) {
|
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) {
|
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.defaultJavaBlockState = defaultJavaBlockState;
|
||||||
|
this.validBlockClass = validBlockClass;
|
||||||
this.containerType = containerType;
|
this.containerType = containerType;
|
||||||
if (validBlocks != null) {
|
if (validBlocks != null) {
|
||||||
Set<Block> validBlocksTemp = new HashSet<>(validBlocks.length + 1);
|
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.
|
* @return true if this Java block ID can be used for player inventory.
|
||||||
*/
|
*/
|
||||||
protected boolean isValidBlock(GeyserSession session, Vector3i position, BlockState blockState) {
|
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());
|
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.ChestType;
|
||||||
import org.geysermc.geyser.level.block.property.Properties;
|
import org.geysermc.geyser.level.block.property.Properties;
|
||||||
import org.geysermc.geyser.level.block.type.BlockState;
|
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.level.physics.Direction;
|
||||||
import org.geysermc.geyser.registry.BlockRegistries;
|
import org.geysermc.geyser.registry.BlockRegistries;
|
||||||
import org.geysermc.geyser.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
@@ -204,8 +205,7 @@ public class DoubleChestInventoryTranslator extends ChestInventoryTranslator<Con
|
|||||||
if (session.getLastInteractionPlayerPosition().equals(session.getPlayerEntity().getPosition())) {
|
if (session.getLastInteractionPlayerPosition().equals(session.getPlayerEntity().getPosition())) {
|
||||||
BlockState state = session.getGeyser().getWorldManager().blockAt(session, session.getLastInteractionBlockPosition());
|
BlockState state = session.getGeyser().getWorldManager().blockAt(session, session.getLastInteractionBlockPosition());
|
||||||
if (!BlockRegistries.CUSTOM_BLOCK_STATE_OVERRIDES.get().containsKey(state.javaId())) {
|
if (!BlockRegistries.CUSTOM_BLOCK_STATE_OVERRIDES.get().containsKey(state.javaId())) {
|
||||||
if ((state.block() == Blocks.CHEST || state.block() == Blocks.TRAPPED_CHEST)
|
if (state.block() instanceof ChestBlock && state.getValue(Properties.CHEST_TYPE) != ChestType.SINGLE) {
|
||||||
&& state.getValue(Properties.CHEST_TYPE) != ChestType.SINGLE) {
|
|
||||||
container.setHolderPosition(session.getLastInteractionBlockPosition());
|
container.setHolderPosition(session.getLastInteractionBlockPosition());
|
||||||
container.setUsingRealBlock(true, state.block());
|
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.ChestType;
|
||||||
import org.geysermc.geyser.level.block.property.Properties;
|
import org.geysermc.geyser.level.block.property.Properties;
|
||||||
import org.geysermc.geyser.level.block.type.BlockState;
|
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.Axis;
|
||||||
import org.geysermc.geyser.level.physics.Direction;
|
import org.geysermc.geyser.level.physics.Direction;
|
||||||
import org.geysermc.geyser.network.GameProtocol;
|
import org.geysermc.geyser.network.GameProtocol;
|
||||||
@@ -46,8 +47,8 @@ public class SingleChestInventoryTranslator extends ChestInventoryTranslator<Gen
|
|||||||
|
|
||||||
public SingleChestInventoryTranslator(int size) {
|
public SingleChestInventoryTranslator(int size) {
|
||||||
super(size, 27);
|
super(size, 27);
|
||||||
this.holder = new BlockInventoryHolder(Blocks.CHEST.defaultBlockState().withValue(Properties.CHEST_TYPE, ChestType.SINGLE), ContainerType.CONTAINER,
|
this.holder = new BlockInventoryHolder(Blocks.CHEST.defaultBlockState().withValue(Properties.CHEST_TYPE, ChestType.SINGLE),
|
||||||
Blocks.ENDER_CHEST, Blocks.TRAPPED_CHEST, Blocks.BARREL) {
|
ChestBlock.class, ContainerType.CONTAINER, Blocks.ENDER_CHEST, Blocks.BARREL) {
|
||||||
@Override
|
@Override
|
||||||
protected boolean isValidBlock(GeyserSession session, Vector3i position, BlockState blockState) {
|
protected boolean isValidBlock(GeyserSession session, Vector3i position, BlockState blockState) {
|
||||||
if (blockState.is(Blocks.ENDER_CHEST) || blockState.is(Blocks.BARREL)) {
|
if (blockState.is(Blocks.ENDER_CHEST) || blockState.is(Blocks.BARREL)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user