81 lines
2.8 KiB
Java
81 lines
2.8 KiB
Java
package com.simibubi.create.content.contraptions.base;
|
|
|
|
import net.createmod.catnip.utility.Iterate;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.core.Direction.Axis;
|
|
import net.minecraft.core.Direction.AxisDirection;
|
|
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.Mirror;
|
|
import net.minecraft.world.level.block.Rotation;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.block.state.StateDefinition.Builder;
|
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
import net.minecraft.world.level.block.state.properties.Property;
|
|
|
|
public abstract class HorizontalAxisKineticBlock extends KineticBlock {
|
|
|
|
public static final Property<Axis> HORIZONTAL_AXIS = BlockStateProperties.HORIZONTAL_AXIS;
|
|
|
|
public HorizontalAxisKineticBlock(Properties properties) {
|
|
super(properties);
|
|
}
|
|
|
|
@Override
|
|
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
|
|
builder.add(HORIZONTAL_AXIS);
|
|
super.createBlockStateDefinition(builder);
|
|
}
|
|
|
|
@Override
|
|
public BlockState getStateForPlacement(BlockPlaceContext context) {
|
|
Axis preferredAxis = getPreferredHorizontalAxis(context);
|
|
if (preferredAxis != null)
|
|
return this.defaultBlockState().setValue(HORIZONTAL_AXIS, preferredAxis);
|
|
return this.defaultBlockState().setValue(HORIZONTAL_AXIS, context.getHorizontalDirection().getClockWise().getAxis());
|
|
}
|
|
|
|
public static Axis getPreferredHorizontalAxis(BlockPlaceContext context) {
|
|
Direction prefferedSide = null;
|
|
for (Direction side : Iterate.horizontalDirections) {
|
|
BlockState blockState = context.getLevel().getBlockState(context.getClickedPos().relative(side));
|
|
if (blockState.getBlock() instanceof IRotate) {
|
|
if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getLevel(), context.getClickedPos().relative(side),
|
|
blockState, side.getOpposite()))
|
|
if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) {
|
|
prefferedSide = null;
|
|
break;
|
|
} else {
|
|
prefferedSide = side;
|
|
}
|
|
}
|
|
}
|
|
return prefferedSide == null ? null : prefferedSide.getAxis();
|
|
}
|
|
|
|
@Override
|
|
public Axis getRotationAxis(BlockState state) {
|
|
return state.getValue(HORIZONTAL_AXIS);
|
|
}
|
|
|
|
@Override
|
|
public boolean hasShaftTowards(LevelReader world, BlockPos pos, BlockState state, Direction face) {
|
|
return face.getAxis() == state.getValue(HORIZONTAL_AXIS);
|
|
}
|
|
|
|
@Override
|
|
public BlockState rotate(BlockState state, Rotation rot) {
|
|
Axis axis = state.getValue(HORIZONTAL_AXIS);
|
|
return state.setValue(HORIZONTAL_AXIS,
|
|
rot.rotate(Direction.get(AxisDirection.POSITIVE, axis)).getAxis());
|
|
}
|
|
|
|
@Override
|
|
public BlockState mirror(BlockState state, Mirror mirrorIn) {
|
|
return state;
|
|
}
|
|
|
|
}
|