Create-Design-n-Decor/src/main/java/com/mangomilk/design_decor/blocks/SignBlock.java
2023-10-14 17:38:54 -08:00

112 linhas
4,8 KiB
Java

package com.mangomilk.design_decor.blocks;
import com.simibubi.create.content.equipment.wrench.IWrenchable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DirectionalBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import javax.annotation.Nullable;
public class SignBlock extends DirectionalBlock implements IWrenchable {
public static final VoxelShape SHAPE_UP = Block.box(0.0D, 15.0D, 0.0D, 16.0D, 16.0D, 16.0D);
public static final VoxelShape SHAPE_DOWN = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 1.0D, 16.0D);
public static final VoxelShape SHAPE_NORTH = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 1.0D);
public static final VoxelShape SHAPE_WEST = Block.box(0.0D, 0.0D, 0.0D, 1.0D, 16.0D, 16.0D);
public static final VoxelShape SHAPE_EAST = Block.box(15.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D);
public static final VoxelShape SHAPE_SOUTH = Block.box(0.0D, 0.0D, 15.0D, 16.0D, 16.0D, 16.0D);
public static final VoxelShape SHAPE_UP_OUTLINE = Block.box(1.0D, 15.0D, 1.0D, 15.0D, 16.0D, 15.0D);
public static final VoxelShape SHAPE_DOWN_OUTLINE = Block.box(1.0D, 0.0D, 1.0D, 15.0D, 1.0D, 15.0D);
public static final VoxelShape SHAPE_WEST_OUTLINE = Block.box(0.0D, 1.0D, 1.0D, 1.0D, 15.0D, 15.0D);
public static final VoxelShape SHAPE_EAST_OUTLINE = Block.box(15.0D, 1.0D, 1.0D, 16.0D, 15.0D, 15.0D);
public static final VoxelShape SHAPE_SOUTH_OUTLINE = Block.box(1.0D, 1.0D, 15.0D, 15.0D, 15.0D, 16.0D);
public static final VoxelShape SHAPE_NORTH_OUTLINE = Block.box(1.0D, 1.0D, 0.0D, 15.0D, 15.0D, 1.0D);
public SignBlock(Properties p_52591_) {
super(p_52591_);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.UP));
}
public VoxelShape getShape(BlockState p_54561_, BlockGetter p_54562_, BlockPos p_54563_, CollisionContext p_54564_) {
switch (p_54561_.getValue(FACING)) {
case NORTH:
return SHAPE_NORTH_OUTLINE;
case SOUTH:
return SHAPE_SOUTH_OUTLINE;
case EAST:
return SHAPE_EAST_OUTLINE;
case WEST:
return SHAPE_WEST_OUTLINE;
case UP:
return SHAPE_UP_OUTLINE;
case DOWN:
return SHAPE_DOWN_OUTLINE;
default:
return SHAPE_NORTH_OUTLINE;
}
}
@Override
public VoxelShape getBlockSupportShape(BlockState pState, BlockGetter pReader, BlockPos pPos) {
switch (pState.getValue(FACING)) {
case NORTH:
return SHAPE_NORTH;
case SOUTH:
return SHAPE_SOUTH;
case EAST:
return SHAPE_EAST;
case WEST:
return SHAPE_WEST;
case UP:
return SHAPE_UP;
case DOWN:
return SHAPE_DOWN;
default:
return SHAPE_NORTH;
}
}
public BlockState updateShape(BlockState p_57503_, Direction p_57504_, BlockState p_57505_, LevelAccessor p_57506_, BlockPos p_57507_, BlockPos p_57508_) {
return !this.canSurvive(p_57503_, p_57506_, p_57507_) ? Blocks.AIR.defaultBlockState() : super.updateShape(p_57503_, p_57504_, p_57505_, p_57506_, p_57507_, p_57508_);
}
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> p_55125_) {
p_55125_.add(FACING);
}
@Nullable
public BlockState getStateForPlacement(BlockPlaceContext p_58126_) {
BlockState blockstate = this.defaultBlockState();
LevelReader levelreader = p_58126_.getLevel();
BlockPos blockpos = p_58126_.getClickedPos();
Direction[] adirection = p_58126_.getNearestLookingDirections();
for(Direction direction : adirection) {
blockstate = blockstate.setValue(FACING, direction);
if (blockstate.canSurvive(levelreader, blockpos)) {
return blockstate;
}
}
return null;
}
public boolean canSurvive(BlockState p_58133_, LevelReader p_58134_, BlockPos p_58135_) {
Direction direction = p_58133_.getValue(FACING);
BlockPos blockpos = p_58135_.relative(direction);
BlockState blockstate = p_58134_.getBlockState(blockpos);
return !blockstate.isAir();
}
}