package net.shadowfacts.extrahoppers.block.gold import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.entity.EntityContext import net.minecraft.item.ItemPlacementContext import net.minecraft.state.StateManager import net.minecraft.state.property.DirectionProperty import net.minecraft.util.BooleanBiFunction import net.minecraft.util.Identifier import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction import net.minecraft.util.shape.VoxelShape import net.minecraft.util.shape.VoxelShapes import net.minecraft.world.BlockView /** * @author shadowfacts */ class InvertedGoldHopperBlock: GoldHopperBlock() { companion object { val ID = Identifier("extrahoppers", "inverted_gold_hopper") val INVERTED_FACING = DirectionProperty.of("inverted_facing") { direction: Direction -> direction != Direction.DOWN } val INVERTED_TOP_SHAPE = createCuboidShape(0.0, 6.0, 0.0, 16.0, 0.0, 16.0) val INVERTED_MIDDLE_SHAPE = createCuboidShape(4.0, 12.0, 4.0, 12.0, 6.0, 12.0) val INVERTED_INSIDE_SHAPE = createCuboidShape(2.0, 5.0, 2.0, 14.0, 0.0, 14.0) val INVERTED_OUTSIDE_SHAPE = VoxelShapes.union(INVERTED_MIDDLE_SHAPE, INVERTED_TOP_SHAPE) val INVERTED_DEFAULT_SHAPE = VoxelShapes.combineAndSimplify(INVERTED_OUTSIDE_SHAPE, INVERTED_INSIDE_SHAPE, BooleanBiFunction.ONLY_FIRST) val INVERTED_DOWN_SHAPE = VoxelShapes.union(INVERTED_DEFAULT_SHAPE, createCuboidShape(6.0, 16.0, 6.0, 10.0, 12.0, 10.0)) val INVERTED_EAST_SHAPE = VoxelShapes.union(INVERTED_DEFAULT_SHAPE, createCuboidShape(12.0, 12.0, 6.0, 16.0, 8.0, 10.0)) val INVERTED_NORTH_SHAPE = VoxelShapes.union(INVERTED_DEFAULT_SHAPE, createCuboidShape(6.0, 12.0, 0.0, 10.0, 8.0, 4.0)) val INVERTED_SOUTH_SHAPE = VoxelShapes.union(INVERTED_DEFAULT_SHAPE, createCuboidShape(6.0, 12.0, 12.0, 10.0, 8.0, 16.0)) val INVERTED_WEST_SHAPE = VoxelShapes.union(INVERTED_DEFAULT_SHAPE, createCuboidShape(0.0, 12.0, 6.0, 4.0, 8.0, 10.0)) val INVERTED_DOWN_RAY_TRACE_SHAPE = INVERTED_INSIDE_SHAPE val INVERTED_EAST_RAY_TRACE_SHAPE = VoxelShapes.union(INVERTED_INSIDE_SHAPE, createCuboidShape(12.0, 8.0, 6.0, 16.0, 6.0, 10.0)) val INVERTED_NORTH_RAY_TRACE_SHAPE = VoxelShapes.union(INVERTED_INSIDE_SHAPE, createCuboidShape(6.0, 8.0, 0.0, 10.0, 6.0, 4.0)) val INVERTED_SOUTH_RAY_TRACE_SHAPE = VoxelShapes.union(INVERTED_INSIDE_SHAPE, createCuboidShape(6.0, 8.0, 12.0, 10.0, 6.0, 16.0)) val INVERTED_WEST_RAY_TRACE_SHAPE = VoxelShapes.union(INVERTED_INSIDE_SHAPE, createCuboidShape(0.0, 8.0, 6.0, 4.0, 6.0, 10.0)) } override fun appendProperties(builder: StateManager.Builder) { builder.add(INVERTED_FACING) } override fun getOutlineShape(state: BlockState, world: BlockView, pos: BlockPos, entityContext: EntityContext): VoxelShape { return when (state.get(INVERTED_FACING)) { Direction.DOWN -> INVERTED_DOWN_SHAPE Direction.NORTH -> INVERTED_NORTH_SHAPE Direction.SOUTH -> INVERTED_SOUTH_SHAPE Direction.WEST -> INVERTED_WEST_SHAPE Direction.EAST -> INVERTED_EAST_SHAPE else -> INVERTED_DEFAULT_SHAPE } } override fun getRayTraceShape(state: BlockState, world: BlockView, pos: BlockPos): VoxelShape { return when (state.get(INVERTED_FACING)) { Direction.DOWN -> INVERTED_DOWN_RAY_TRACE_SHAPE Direction.NORTH -> INVERTED_NORTH_RAY_TRACE_SHAPE Direction.SOUTH -> INVERTED_SOUTH_RAY_TRACE_SHAPE Direction.WEST -> INVERTED_WEST_RAY_TRACE_SHAPE Direction.EAST -> INVERTED_EAST_RAY_TRACE_SHAPE else -> INVERTED_INSIDE_SHAPE } } override fun getPlacementState(context: ItemPlacementContext): BlockState { val hitFacing = context.side.opposite val facing = if (hitFacing.axis == Direction.Axis.Y) Direction.UP else hitFacing return defaultState.with(INVERTED_FACING, facing) } override fun createBlockEntity(world: BlockView) = GoldHopperBlockEntity(true) }