CreateMod/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalAxisKineticBlock.java
2022-08-18 17:30:48 +02:00

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;
}
}