93 lines
4.3 KiB
Kotlin
93 lines
4.3 KiB
Kotlin
package net.shadowfacts.extrahoppers.block.base
|
|
|
|
import net.minecraft.block.Block
|
|
import net.minecraft.block.BlockPlacementEnvironment
|
|
import net.minecraft.block.BlockState
|
|
import net.minecraft.block.entity.Hopper
|
|
import net.minecraft.entity.EntityContext
|
|
import net.minecraft.item.ItemPlacementContext
|
|
import net.minecraft.state.StateManager
|
|
import net.minecraft.state.property.Properties
|
|
import net.minecraft.util.BooleanBiFunction
|
|
import net.minecraft.util.ItemScatterer
|
|
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
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
abstract class BaseHopperBlock<T: BaseHopperBlockEntity>(settings: Settings): BlockWithEntity<T>(settings) {
|
|
|
|
companion object {
|
|
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<Block, BlockState>) {
|
|
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 onBlockRemoved(oldState: BlockState, world: World, pos: BlockPos, newState: BlockState, bl: Boolean) {
|
|
if (oldState.block != newState.block) {
|
|
getBlockEntity(world, pos)?.also {
|
|
ItemScatterer.spawn(world, pos, it)
|
|
world.updateHorizontalAdjacent(pos, this)
|
|
}
|
|
super.onBlockRemoved(oldState, world, pos, newState, bl)
|
|
}
|
|
}
|
|
|
|
override fun canPlaceAtSide(blockState: BlockState?, blockView: BlockView?, blockPos: BlockPos?, blockPlacementEnvironment: BlockPlacementEnvironment?): Boolean {
|
|
return false
|
|
}
|
|
|
|
}
|