271 lines
12 KiB
Java
271 lines
12 KiB
Java
package net.minecraft.world.level.block;
|
|
|
|
import com.mojang.serialization.MapCodec;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.level.block.state.BlockBehaviour;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.block.state.StateDefinition;
|
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
import net.minecraft.world.level.block.state.properties.BooleanProperty;
|
|
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
|
import net.minecraft.world.level.block.state.properties.Property;
|
|
import net.minecraft.world.level.block.state.properties.RailShape;
|
|
|
|
public class PoweredRailBlock extends BaseRailBlock {
|
|
public static final MapCodec<PoweredRailBlock> CODEC = simpleCodec(PoweredRailBlock::new);
|
|
public static final EnumProperty<RailShape> SHAPE = BlockStateProperties.RAIL_SHAPE_STRAIGHT;
|
|
public static final BooleanProperty POWERED = BlockStateProperties.POWERED;
|
|
|
|
@Override
|
|
public MapCodec<PoweredRailBlock> codec() {
|
|
return CODEC;
|
|
}
|
|
|
|
protected PoweredRailBlock(BlockBehaviour.Properties p_55218_) {
|
|
super(true, p_55218_);
|
|
this.registerDefaultState(this.stateDefinition.any().setValue(SHAPE, RailShape.NORTH_SOUTH).setValue(POWERED, false).setValue(WATERLOGGED, false));
|
|
}
|
|
|
|
protected boolean findPoweredRailSignal(Level p_55220_, BlockPos p_55221_, BlockState p_55222_, boolean p_55223_, int p_55224_) {
|
|
if (p_55224_ >= 8) {
|
|
return false;
|
|
} else {
|
|
int i = p_55221_.getX();
|
|
int j = p_55221_.getY();
|
|
int k = p_55221_.getZ();
|
|
boolean flag = true;
|
|
RailShape railshape = p_55222_.getValue(SHAPE);
|
|
switch (railshape) {
|
|
case NORTH_SOUTH:
|
|
if (p_55223_) {
|
|
k++;
|
|
} else {
|
|
k--;
|
|
}
|
|
break;
|
|
case EAST_WEST:
|
|
if (p_55223_) {
|
|
i--;
|
|
} else {
|
|
i++;
|
|
}
|
|
break;
|
|
case ASCENDING_EAST:
|
|
if (p_55223_) {
|
|
i--;
|
|
} else {
|
|
i++;
|
|
j++;
|
|
flag = false;
|
|
}
|
|
|
|
railshape = RailShape.EAST_WEST;
|
|
break;
|
|
case ASCENDING_WEST:
|
|
if (p_55223_) {
|
|
i--;
|
|
j++;
|
|
flag = false;
|
|
} else {
|
|
i++;
|
|
}
|
|
|
|
railshape = RailShape.EAST_WEST;
|
|
break;
|
|
case ASCENDING_NORTH:
|
|
if (p_55223_) {
|
|
k++;
|
|
} else {
|
|
k--;
|
|
j++;
|
|
flag = false;
|
|
}
|
|
|
|
railshape = RailShape.NORTH_SOUTH;
|
|
break;
|
|
case ASCENDING_SOUTH:
|
|
if (p_55223_) {
|
|
k++;
|
|
j++;
|
|
flag = false;
|
|
} else {
|
|
k--;
|
|
}
|
|
|
|
railshape = RailShape.NORTH_SOUTH;
|
|
}
|
|
|
|
return this.isSameRailWithPower(p_55220_, new BlockPos(i, j, k), p_55223_, p_55224_, railshape)
|
|
? true
|
|
: flag && this.isSameRailWithPower(p_55220_, new BlockPos(i, j - 1, k), p_55223_, p_55224_, railshape);
|
|
}
|
|
}
|
|
|
|
protected boolean isSameRailWithPower(Level p_55226_, BlockPos p_55227_, boolean p_55228_, int p_55229_, RailShape p_55230_) {
|
|
BlockState blockstate = p_55226_.getBlockState(p_55227_);
|
|
if (!blockstate.is(this)) {
|
|
return false;
|
|
} else {
|
|
RailShape railshape = blockstate.getValue(SHAPE);
|
|
if (p_55230_ != RailShape.EAST_WEST
|
|
|| railshape != RailShape.NORTH_SOUTH && railshape != RailShape.ASCENDING_NORTH && railshape != RailShape.ASCENDING_SOUTH) {
|
|
if (p_55230_ != RailShape.NORTH_SOUTH
|
|
|| railshape != RailShape.EAST_WEST && railshape != RailShape.ASCENDING_EAST && railshape != RailShape.ASCENDING_WEST) {
|
|
if (!blockstate.getValue(POWERED)) {
|
|
return false;
|
|
} else {
|
|
return p_55226_.hasNeighborSignal(p_55227_) ? true : this.findPoweredRailSignal(p_55226_, p_55227_, blockstate, p_55228_, p_55229_ + 1);
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void updateState(BlockState p_55232_, Level p_55233_, BlockPos p_55234_, Block p_55235_) {
|
|
boolean flag = p_55232_.getValue(POWERED);
|
|
boolean flag1 = p_55233_.hasNeighborSignal(p_55234_)
|
|
|| this.findPoweredRailSignal(p_55233_, p_55234_, p_55232_, true, 0)
|
|
|| this.findPoweredRailSignal(p_55233_, p_55234_, p_55232_, false, 0);
|
|
if (flag1 != flag) {
|
|
p_55233_.setBlock(p_55234_, p_55232_.setValue(POWERED, flag1), 3);
|
|
p_55233_.updateNeighborsAt(p_55234_.below(), this);
|
|
if (p_55232_.getValue(SHAPE).isSlope()) {
|
|
p_55233_.updateNeighborsAt(p_55234_.above(), this);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Property<RailShape> getShapeProperty() {
|
|
return SHAPE;
|
|
}
|
|
|
|
@Override
|
|
protected BlockState rotate(BlockState p_55240_, Rotation p_55241_) {
|
|
switch (p_55241_) {
|
|
case CLOCKWISE_180:
|
|
switch ((RailShape)p_55240_.getValue(SHAPE)) {
|
|
case ASCENDING_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_WEST);
|
|
case ASCENDING_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_EAST);
|
|
case ASCENDING_NORTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_SOUTH);
|
|
case ASCENDING_SOUTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_NORTH);
|
|
case SOUTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_WEST);
|
|
case SOUTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_EAST);
|
|
case NORTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_EAST);
|
|
case NORTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_WEST);
|
|
}
|
|
case COUNTERCLOCKWISE_90:
|
|
switch ((RailShape)p_55240_.getValue(SHAPE)) {
|
|
case NORTH_SOUTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.EAST_WEST);
|
|
case EAST_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_SOUTH);
|
|
case ASCENDING_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_NORTH);
|
|
case ASCENDING_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_SOUTH);
|
|
case ASCENDING_NORTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_WEST);
|
|
case ASCENDING_SOUTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_EAST);
|
|
case SOUTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_EAST);
|
|
case SOUTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_EAST);
|
|
case NORTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_WEST);
|
|
case NORTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_WEST);
|
|
}
|
|
case CLOCKWISE_90:
|
|
switch ((RailShape)p_55240_.getValue(SHAPE)) {
|
|
case NORTH_SOUTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.EAST_WEST);
|
|
case EAST_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_SOUTH);
|
|
case ASCENDING_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_SOUTH);
|
|
case ASCENDING_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_NORTH);
|
|
case ASCENDING_NORTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_EAST);
|
|
case ASCENDING_SOUTH:
|
|
return p_55240_.setValue(SHAPE, RailShape.ASCENDING_WEST);
|
|
case SOUTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_WEST);
|
|
case SOUTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_WEST);
|
|
case NORTH_WEST:
|
|
return p_55240_.setValue(SHAPE, RailShape.NORTH_EAST);
|
|
case NORTH_EAST:
|
|
return p_55240_.setValue(SHAPE, RailShape.SOUTH_EAST);
|
|
}
|
|
default:
|
|
return p_55240_;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected BlockState mirror(BlockState p_55237_, Mirror p_55238_) {
|
|
RailShape railshape = p_55237_.getValue(SHAPE);
|
|
switch (p_55238_) {
|
|
case LEFT_RIGHT:
|
|
switch (railshape) {
|
|
case ASCENDING_NORTH:
|
|
return p_55237_.setValue(SHAPE, RailShape.ASCENDING_SOUTH);
|
|
case ASCENDING_SOUTH:
|
|
return p_55237_.setValue(SHAPE, RailShape.ASCENDING_NORTH);
|
|
case SOUTH_EAST:
|
|
return p_55237_.setValue(SHAPE, RailShape.NORTH_EAST);
|
|
case SOUTH_WEST:
|
|
return p_55237_.setValue(SHAPE, RailShape.NORTH_WEST);
|
|
case NORTH_WEST:
|
|
return p_55237_.setValue(SHAPE, RailShape.SOUTH_WEST);
|
|
case NORTH_EAST:
|
|
return p_55237_.setValue(SHAPE, RailShape.SOUTH_EAST);
|
|
default:
|
|
return super.mirror(p_55237_, p_55238_);
|
|
}
|
|
case FRONT_BACK:
|
|
switch (railshape) {
|
|
case ASCENDING_EAST:
|
|
return p_55237_.setValue(SHAPE, RailShape.ASCENDING_WEST);
|
|
case ASCENDING_WEST:
|
|
return p_55237_.setValue(SHAPE, RailShape.ASCENDING_EAST);
|
|
case ASCENDING_NORTH:
|
|
case ASCENDING_SOUTH:
|
|
default:
|
|
break;
|
|
case SOUTH_EAST:
|
|
return p_55237_.setValue(SHAPE, RailShape.SOUTH_WEST);
|
|
case SOUTH_WEST:
|
|
return p_55237_.setValue(SHAPE, RailShape.SOUTH_EAST);
|
|
case NORTH_WEST:
|
|
return p_55237_.setValue(SHAPE, RailShape.NORTH_EAST);
|
|
case NORTH_EAST:
|
|
return p_55237_.setValue(SHAPE, RailShape.NORTH_WEST);
|
|
}
|
|
}
|
|
|
|
return super.mirror(p_55237_, p_55238_);
|
|
}
|
|
|
|
@Override
|
|
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> p_55243_) {
|
|
p_55243_.add(SHAPE, POWERED, WATERLOGGED);
|
|
}
|
|
} |