53 lines
1.9 KiB
Java
53 lines
1.9 KiB
Java
package net.minecraft.world.item;
|
|
|
|
import java.util.Map;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.world.item.context.BlockPlaceContext;
|
|
import net.minecraft.world.level.LevelReader;
|
|
import net.minecraft.world.level.block.Block;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.phys.shapes.CollisionContext;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class StandingAndWallBlockItem extends BlockItem {
|
|
protected final Block wallBlock;
|
|
private final Direction attachmentDirection;
|
|
|
|
public StandingAndWallBlockItem(Block block, Block wallBlock, Direction attachmentDirection, Item.Properties properties) {
|
|
super(block, properties);
|
|
this.wallBlock = wallBlock;
|
|
this.attachmentDirection = attachmentDirection;
|
|
}
|
|
|
|
protected boolean canPlace(LevelReader level, BlockState state, BlockPos pos) {
|
|
return state.canSurvive(level, pos);
|
|
}
|
|
|
|
@Nullable
|
|
@Override
|
|
protected BlockState getPlacementState(BlockPlaceContext context) {
|
|
BlockState blockState = this.wallBlock.getStateForPlacement(context);
|
|
BlockState blockState2 = null;
|
|
LevelReader levelReader = context.getLevel();
|
|
BlockPos blockPos = context.getClickedPos();
|
|
|
|
for (Direction direction : context.getNearestLookingDirections()) {
|
|
if (direction != this.attachmentDirection.getOpposite()) {
|
|
BlockState blockState3 = direction == this.attachmentDirection ? this.getBlock().getStateForPlacement(context) : blockState;
|
|
if (blockState3 != null && this.canPlace(levelReader, blockState3, blockPos)) {
|
|
blockState2 = blockState3;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return blockState2 != null && levelReader.isUnobstructed(blockState2, blockPos, CollisionContext.empty()) ? blockState2 : null;
|
|
}
|
|
|
|
@Override
|
|
public void registerBlocks(Map<Block, Item> blockToItemMap, Item item) {
|
|
super.registerBlocks(blockToItemMap, item);
|
|
blockToItemMap.put(this.wallBlock, item);
|
|
}
|
|
}
|