From 89f22c60cc4494333ef0327ab86cc48d3a60d748 Mon Sep 17 00:00:00 2001 From: LordGrimmauld Date: Wed, 10 Jun 2020 18:54:56 +0200 Subject: [PATCH] reinforced rail collision --- .../tracks/ReinforcedRailBlock.java | 181 ++++++++++-------- 1 file changed, 101 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java index 44d009141..2f330f86c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/tracks/ReinforcedRailBlock.java @@ -20,87 +20,108 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class ReinforcedRailBlock extends AbstractRailBlock{ - - public static IProperty RAIL_SHAPE = - EnumProperty.create("shape", RailShape.class, RailShape.EAST_WEST, RailShape.NORTH_SOUTH); - - public static IProperty CONNECTS_N = BooleanProperty.create("connects_n"); - public static IProperty CONNECTS_S = BooleanProperty.create("connects_s"); +import javax.annotation.Nonnull; - public ReinforcedRailBlock(Properties properties) { - super(true, properties); - } +public class ReinforcedRailBlock extends AbstractRailBlock { - @Override - public IProperty getShapeProperty() { - return RAIL_SHAPE; - } - - @Override - protected void fillStateContainer(Builder builder) { - builder.add(RAIL_SHAPE, CONNECTS_N, CONNECTS_S); - super.fillStateContainer(builder); - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - boolean alongX = context.getPlacementHorizontalFacing().getAxis() == Axis.X; - return super.getStateForPlacement(context).with(RAIL_SHAPE, alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH).with(CONNECTS_N, false).with(CONNECTS_S, false); - } + public static IProperty RAIL_SHAPE = + EnumProperty.create("shape", RailShape.class, RailShape.EAST_WEST, RailShape.NORTH_SOUTH); - @Override - public boolean canMakeSlopes(BlockState state, IBlockReader world, BlockPos pos) { - return false; - } - - @Override - protected void updateState(BlockState state, World world, BlockPos pos, Block block) { - super.updateState(state, world, pos, block); - world.setBlockState(pos, getUpdatedState(world, pos, state, true)); - } - - @Override - protected BlockState getUpdatedState(World world, BlockPos pos, BlockState state, - boolean p_208489_4_) { - - boolean alongX = state.get(RAIL_SHAPE) == RailShape.EAST_WEST; - BlockPos sPos = pos.add(alongX ? -1 : 0, 0, alongX ? 0 : 1); - BlockPos nPos = pos.add(alongX ? 1 : 0, 0, alongX ? 0 : -1); - - return super.getUpdatedState(world, pos, state, p_208489_4_).with(CONNECTS_S, world.getBlockState(sPos).getBlock() instanceof ReinforcedRailBlock && - (world.getBlockState(sPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))) - .with(CONNECTS_N, world.getBlockState(nPos).getBlock() instanceof ReinforcedRailBlock && - (world.getBlockState(nPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))); - } - - @Override - public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos, - ISelectionContext context) { //FIXME - if (context.getEntity() instanceof AbstractMinecartEntity) - return VoxelShapes.empty(); - return VoxelShapes.fullCube(); - } - - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.BLOCK; - } - - @Override - public boolean isNormalCube(BlockState state, IBlockReader worldIn, BlockPos pos) { - return false; - } - - @Override - public boolean isValidPosition(BlockState p_196260_1_, IWorldReader p_196260_2_, BlockPos p_196260_3_) { - return true; - } - - @Override - public void neighborChanged(BlockState state, World world, BlockPos pos, Block block, BlockPos pos2, boolean p_220069_6_) { - if (!world.isRemote) { - this.updateState(state, world, pos, block); - } - } + public static IProperty CONNECTS_N = BooleanProperty.create("connects_n"); + public static IProperty CONNECTS_S = BooleanProperty.create("connects_s"); + + public ReinforcedRailBlock(Properties properties) { + super(true, properties); + } + + + @Nonnull + @Override + public IProperty getShapeProperty() { + return RAIL_SHAPE; + } + + @Override + protected void fillStateContainer(Builder builder) { + builder.add(RAIL_SHAPE, CONNECTS_N, CONNECTS_S); + super.fillStateContainer(builder); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + boolean alongX = context.getPlacementHorizontalFacing().getAxis() == Axis.X; + return super.getStateForPlacement(context).with(RAIL_SHAPE, alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH).with(CONNECTS_N, false).with(CONNECTS_S, false); + } + + @Override + public boolean canMakeSlopes(@Nonnull BlockState state, @Nonnull IBlockReader world, @Nonnull BlockPos pos) { + return false; + } + + @Override + protected void updateState(@Nonnull BlockState state, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull Block block) { + super.updateState(state, world, pos, block); + world.setBlockState(pos, getUpdatedState(world, pos, state, true)); + } + + @Override + @Nonnull + protected BlockState getUpdatedState(@Nonnull World world, BlockPos pos, BlockState state, + boolean p_208489_4_) { + + boolean alongX = state.get(RAIL_SHAPE) == RailShape.EAST_WEST; + BlockPos sPos = pos.add(alongX ? -1 : 0, 0, alongX ? 0 : 1); + BlockPos nPos = pos.add(alongX ? 1 : 0, 0, alongX ? 0 : -1); + + return super.getUpdatedState(world, pos, state, p_208489_4_).with(CONNECTS_S, world.getBlockState(sPos).getBlock() instanceof ReinforcedRailBlock && + (world.getBlockState(sPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))) + .with(CONNECTS_N, world.getBlockState(nPos).getBlock() instanceof ReinforcedRailBlock && + (world.getBlockState(nPos).get(RAIL_SHAPE) == state.get(RAIL_SHAPE))); + } + + @Override + @Nonnull + public VoxelShape getCollisionShape(@Nonnull BlockState state, @Nonnull IBlockReader worldIn, @Nonnull BlockPos pos, + ISelectionContext context) { //FIXME + if (context.getEntity() instanceof AbstractMinecartEntity) + return VoxelShapes.empty(); + return getShape(state, worldIn, pos, null); + } + + @Override + @Nonnull + public VoxelShape getShape(BlockState state, @Nonnull IBlockReader reader, @Nonnull BlockPos pos, ISelectionContext context) { + boolean alongX = state.get(RAIL_SHAPE) == RailShape.EAST_WEST; + return VoxelShapes.or(super.getShape(state, reader, pos, context), VoxelShapes.or(makeCuboidShape(0, 0, 0, alongX ? 16 : 1, 12, alongX ? 1 : 16), makeCuboidShape(alongX ? 0 : 15, 0, alongX ? 15 : 0, 16, 12, 16))); + } + + @Override + @Nonnull + public PushReaction getPushReaction(BlockState state) { + return PushReaction.BLOCK; + } + + @Override + public boolean isNormalCube(BlockState state, IBlockReader worldIn, BlockPos pos) { + return false; + } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + return !(world.getBlockState(pos.down()).getBlock() instanceof AbstractRailBlock || world.getBlockState(pos.up()).getBlock() instanceof AbstractRailBlock); + } + + @Override + public void neighborChanged(@Nonnull BlockState state, World world, @Nonnull BlockPos pos, @Nonnull Block block, @Nonnull BlockPos pos2, boolean p_220069_6_) { + if (!world.isRemote) { + if ((world.getBlockState(pos.down()).getBlock() instanceof AbstractRailBlock)) { + if (!p_220069_6_) { + spawnDrops(state, world, pos); + } + world.removeBlock(pos, false); + } else { + this.updateState(state, world, pos, block); + } + } + } }