minecraft-source/src/net/minecraft/world/level/block/CrossCollisionBlock.java

154 lines
8.8 KiB
Java

package net.minecraft.world.level.block;
import net.minecraft.world.level.block.state.AbstractStateHolder;
import java.util.stream.Collector;
import net.minecraft.Util;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.phys.shapes.Shapes;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import net.minecraft.world.level.block.state.BlockState;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.core.Direction;
import java.util.Map;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
public class CrossCollisionBlock extends Block implements SimpleWaterloggedBlock {
public static final BooleanProperty NORTH;
public static final BooleanProperty EAST;
public static final BooleanProperty SOUTH;
public static final BooleanProperty WEST;
public static final BooleanProperty WATERLOGGED;
protected static final Map<Direction, BooleanProperty> PROPERTY_BY_DIRECTION;
protected final VoxelShape[] collisionShapeByIndex;
protected final VoxelShape[] shapeByIndex;
private final Object2IntMap<BlockState> stateToIndex;
protected CrossCollisionBlock(final float float1, final float float2, final float float3, final float float4, final float float5, final Properties c) {
super(c);
this.stateToIndex = (Object2IntMap<BlockState>)new Object2IntOpenHashMap();
this.collisionShapeByIndex = this.makeShapes(float1, float2, float5, 0.0f, float5);
this.shapeByIndex = this.makeShapes(float1, float2, float3, 0.0f, float4);
}
protected VoxelShape[] makeShapes(final float float1, final float float2, final float float3, final float float4, final float float5) {
final float float6 = 8.0f - float1;
final float float7 = 8.0f + float1;
final float float8 = 8.0f - float2;
final float float9 = 8.0f + float2;
final VoxelShape cwc11 = Block.box(float6, 0.0, float6, float7, float3, float7);
final VoxelShape cwc12 = Block.box(float8, float4, 0.0, float9, float5, float9);
final VoxelShape cwc13 = Block.box(float8, float4, float8, float9, float5, 16.0);
final VoxelShape cwc14 = Block.box(0.0, float4, float8, float9, float5, float9);
final VoxelShape cwc15 = Block.box(float8, float4, float8, 16.0, float5, float9);
final VoxelShape cwc16 = Shapes.or(cwc12, cwc15);
final VoxelShape cwc17 = Shapes.or(cwc13, cwc14);
final VoxelShape[] arr18 = { Shapes.empty(), cwc13, cwc14, cwc17, cwc12, Shapes.or(cwc13, cwc12), Shapes.or(cwc14, cwc12), Shapes.or(cwc17, cwc12), cwc15, Shapes.or(cwc13, cwc15), Shapes.or(cwc14, cwc15), Shapes.or(cwc17, cwc15), cwc16, Shapes.or(cwc13, cwc16), Shapes.or(cwc14, cwc16), Shapes.or(cwc17, cwc16) };
for (int integer19 = 0; integer19 < 16; ++integer19) {
arr18[integer19] = Shapes.or(cwc11, arr18[integer19]);
}
return arr18;
}
@Override
public boolean propagatesSkylightDown(final BlockState byg, final BlockGetter bjd, final BlockPos fk) {
return !byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.WATERLOGGED);
}
@Override
public VoxelShape getShape(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final CollisionContext cvn) {
return this.shapeByIndex[this.getAABBIndex(byg)];
}
@Override
public VoxelShape getCollisionShape(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final CollisionContext cvn) {
return this.collisionShapeByIndex[this.getAABBIndex(byg)];
}
private static int indexFor(final Direction fp) {
return 1 << fp.get2DDataValue();
}
protected int getAABBIndex(final BlockState byg) {
int integer2;
return this.stateToIndex.computeIntIfAbsent(byg, byg -> {
integer2 = 0;
if (byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.NORTH)) {
integer2 |= indexFor(Direction.NORTH);
}
if (byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.EAST)) {
integer2 |= indexFor(Direction.EAST);
}
if (byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.SOUTH)) {
integer2 |= indexFor(Direction.SOUTH);
}
if (byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.WEST)) {
integer2 |= indexFor(Direction.WEST);
}
return integer2;
});
}
@Override
public FluidState getFluidState(final BlockState byg) {
if (byg.<Boolean>getValue((Property<Boolean>)CrossCollisionBlock.WATERLOGGED)) {
return Fluids.WATER.getSource(false);
}
return super.getFluidState(byg);
}
@Override
public boolean isPathfindable(final BlockState byg, final BlockGetter bjd, final BlockPos fk, final PathComputationType cqo) {
return false;
}
@Override
public BlockState rotate(final BlockState byg, final Rotation btr) {
switch (btr) {
case CLOCKWISE_180: {
return (((((AbstractStateHolder<O, BlockState>)byg).setValue((Property<Comparable>)CrossCollisionBlock.NORTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.SOUTH))).setValue((Property<Comparable>)CrossCollisionBlock.EAST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.WEST))).setValue((Property<Comparable>)CrossCollisionBlock.SOUTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.NORTH))).<Comparable, Comparable>setValue((Property<Comparable>)CrossCollisionBlock.WEST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.EAST));
}
case COUNTERCLOCKWISE_90: {
return (((((AbstractStateHolder<O, BlockState>)byg).setValue((Property<Comparable>)CrossCollisionBlock.NORTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.EAST))).setValue((Property<Comparable>)CrossCollisionBlock.EAST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.SOUTH))).setValue((Property<Comparable>)CrossCollisionBlock.SOUTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.WEST))).<Comparable, Comparable>setValue((Property<Comparable>)CrossCollisionBlock.WEST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.NORTH));
}
case CLOCKWISE_90: {
return (((((AbstractStateHolder<O, BlockState>)byg).setValue((Property<Comparable>)CrossCollisionBlock.NORTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.WEST))).setValue((Property<Comparable>)CrossCollisionBlock.EAST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.NORTH))).setValue((Property<Comparable>)CrossCollisionBlock.SOUTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.EAST))).<Comparable, Comparable>setValue((Property<Comparable>)CrossCollisionBlock.WEST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.SOUTH));
}
default: {
return byg;
}
}
}
@Override
public BlockState mirror(final BlockState byg, final Mirror bsr) {
switch (bsr) {
case LEFT_RIGHT: {
return (((AbstractStateHolder<O, BlockState>)byg).setValue((Property<Comparable>)CrossCollisionBlock.NORTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.SOUTH))).<Comparable, Comparable>setValue((Property<Comparable>)CrossCollisionBlock.SOUTH, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.NORTH));
}
case FRONT_BACK: {
return (((AbstractStateHolder<O, BlockState>)byg).setValue((Property<Comparable>)CrossCollisionBlock.EAST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.WEST))).<Comparable, Comparable>setValue((Property<Comparable>)CrossCollisionBlock.WEST, (Comparable)byg.<V>getValue((Property<V>)CrossCollisionBlock.EAST));
}
default: {
return super.mirror(byg, bsr);
}
}
}
static {
NORTH = PipeBlock.NORTH;
EAST = PipeBlock.EAST;
SOUTH = PipeBlock.SOUTH;
WEST = PipeBlock.WEST;
WATERLOGGED = BlockStateProperties.WATERLOGGED;
PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter(entry -> entry.getKey().getAxis().isHorizontal()).collect(Util.<Direction, BooleanProperty>toMap());
}
}