package net.shadowfacts.extrahoppers.block.wood import net.minecraft.block.* import net.minecraft.block.entity.Hopper import net.minecraft.entity.Entity import net.minecraft.entity.EntityContext import net.minecraft.entity.LivingEntity import net.minecraft.entity.player.PlayerEntity import net.minecraft.item.ItemPlacementContext import net.minecraft.item.ItemStack import net.minecraft.state.StateManager import net.minecraft.state.property.Properties import net.minecraft.util.* import net.minecraft.util.hit.BlockHitResult 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 import net.minecraft.world.World import net.shadowfacts.extrahoppers.block.base.BlockWithEntity /** * @author shadowfacts */ class WoodHopperBlock: BlockWithEntity(Settings.of(Material.WOOD)) { companion object { val ID = Identifier("extrahoppers", "wood_hopper") val FACING = Properties.HOPPER_FACING // todo: redstone support // val ENABLED = Properties.ENABLED val TOP_SHAPE = createCuboidShape(0.0, 10.0, 0.0, 16.0, 16.0, 16.0) val MIDDLE_SHAPE = createCuboidShape(4.0, 4.0, 4.0, 12.0, 10.0, 12.0) val OUTSIDE_SHAPE = VoxelShapes.union(MIDDLE_SHAPE, TOP_SHAPE) val DEFAULT_SHAPE = VoxelShapes.combineAndSimplify(OUTSIDE_SHAPE, Hopper.INSIDE_SHAPE, BooleanBiFunction.ONLY_FIRST) val DOWN_SHAPE = VoxelShapes.union(DEFAULT_SHAPE, createCuboidShape(6.0, 0.0, 6.0, 10.0, 4.0, 10.0)) val EAST_SHAPE = VoxelShapes.union(DEFAULT_SHAPE, createCuboidShape(12.0, 4.0, 6.0, 16.0, 8.0, 10.0)) val NORTH_SHAPE = VoxelShapes.union(DEFAULT_SHAPE, createCuboidShape(6.0, 4.0, 0.0, 10.0, 8.0, 4.0)) val SOUTH_SHAPE = VoxelShapes.union(DEFAULT_SHAPE, createCuboidShape(6.0, 4.0, 12.0, 10.0, 8.0, 16.0)) val WEST_SHAPE = VoxelShapes.union(DEFAULT_SHAPE, createCuboidShape(0.0, 4.0, 6.0, 4.0, 8.0, 10.0)) val DOWN_RAY_TRACE_SHAPE = Hopper.INSIDE_SHAPE val EAST_RAY_TRACE_SHAPE = VoxelShapes.union(Hopper.INSIDE_SHAPE, createCuboidShape(12.0, 8.0, 6.0, 16.0, 10.0, 10.0)) val NORTH_RAY_TRACE_SHAPE = VoxelShapes.union(Hopper.INSIDE_SHAPE, createCuboidShape(6.0, 8.0, 0.0, 10.0, 10.0, 4.0)) val SOUTH_RAY_TRACE_SHAPE = VoxelShapes.union(Hopper.INSIDE_SHAPE, createCuboidShape(6.0, 8.0, 12.0, 10.0, 10.0, 16.0)) val WEST_RAY_TRACE_SHAPE = VoxelShapes.union(Hopper.INSIDE_SHAPE, createCuboidShape(0.0, 8.0, 6.0, 4.0, 10.0, 10.0)) } override fun appendProperties(builder: StateManager.Builder) { builder.add(FACING) } override fun getOutlineShape(state: BlockState, world: BlockView, pos: BlockPos, entityContext: EntityContext): VoxelShape { return when (state.get(FACING)) { Direction.DOWN -> DOWN_SHAPE Direction.NORTH -> NORTH_SHAPE Direction.SOUTH -> SOUTH_SHAPE Direction.WEST -> WEST_SHAPE Direction.EAST -> EAST_SHAPE else -> DEFAULT_SHAPE } } override fun getRayTraceShape(state: BlockState, world: BlockView, pos: BlockPos): VoxelShape { return when (state.get(FACING)) { Direction.DOWN -> DOWN_RAY_TRACE_SHAPE Direction.NORTH -> NORTH_RAY_TRACE_SHAPE Direction.SOUTH -> SOUTH_RAY_TRACE_SHAPE Direction.WEST -> WEST_RAY_TRACE_SHAPE Direction.EAST -> EAST_RAY_TRACE_SHAPE else -> Hopper.INSIDE_SHAPE } } override fun getPlacementState(context: ItemPlacementContext): BlockState { val hitFacing = context.side.opposite val facing = if (hitFacing.axis == Direction.Axis.Y) Direction.DOWN else hitFacing return defaultState.with(FACING, facing) } override fun createBlockEntity(world: BlockView): WoodHopperBlockEntity { return WoodHopperBlockEntity() } override fun onUse(state: BlockState, world: World, pos: BlockPos, player: PlayerEntity, hand: Hand, hitResult: BlockHitResult): ActionResult { // todo: container return super.onUse(state, world, pos, player, hand, hitResult) } override fun onBlockRemoved(oldState: BlockState, world: World, pos: BlockPos, newState: BlockState, bl: Boolean) { if (oldState.block != newState.block) { getBlockEntity(world, pos)?.also { // todo: spawn items // ItemScatterer.spawn(world, pos, it) world.updateHorizontalAdjacent(pos, this) } } super.onBlockRemoved(oldState, world, pos, newState, bl) } override fun getRenderType(blockState: BlockState?): BlockRenderType { return BlockRenderType.MODEL } override fun onEntityCollision(state: BlockState, world: World, pos: BlockPos, entity: Entity) { getBlockEntity(world, pos)?.also { // todo: handle entity collision } } override fun canPlaceAtSide(blockState: BlockState?, blockView: BlockView?, blockPos: BlockPos?, blockPlacementEnvironment: BlockPlacementEnvironment?): Boolean { return false } }