package net.shadowfacts.phycon.block.extractor import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.block.Material import net.minecraft.block.ShapeContext import net.minecraft.entity.LivingEntity import net.minecraft.item.ItemPlacementContext import net.minecraft.item.ItemStack import net.minecraft.sound.BlockSoundGroup import net.minecraft.state.StateManager import net.minecraft.state.property.Properties 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 import net.minecraft.world.World import net.minecraft.world.WorldAccess import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.api.Interface import net.shadowfacts.phycon.block.DeviceBlock import java.util.* /** * @author shadowfacts */ class ExtractorBlock: DeviceBlock( Settings.of(Material.METAL) .strength(1.5f) .sounds(BlockSoundGroup.METAL) ) { companion object { val ID = Identifier(PhysicalConnectivity.MODID, "extractor") val FACING = Properties.FACING private val EXTRACTOR_SHAPES = mutableMapOf() init { val components = arrayOf( doubleArrayOf(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), doubleArrayOf(2.0, 2.0, 2.0, 14.0, 4.0, 14.0), doubleArrayOf(4.0, 4.0, 4.0, 12.0, 6.0, 12.0), doubleArrayOf(6.0, 6.0, 6.0, 10.0, 16.0, 10.0) ) val directions = arrayOf( Triple(Direction.DOWN, null, false), Triple(Direction.UP, null, true), Triple(Direction.NORTH, 2, false), Triple(Direction.SOUTH, 2, true), Triple(Direction.WEST, 1, false), Triple(Direction.EAST, 1, true), ) for ((dir, rotate, flip) in directions) { val shapes = components.map { it -> val arr = it.copyOf() if (rotate != null) { for (i in 0 until 3) { arr[i] = it[(i + rotate) % 3] arr[3 + i] = it[3 + ((i + rotate) % 3)] } } if (flip) { for (i in arr.indices) { arr[i] = 16.0 - arr[i] } } createCuboidShape(arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]) } EXTRACTOR_SHAPES[dir] = shapes.reduce { a, b -> VoxelShapes.union(a, b) } } } } override fun getNetworkConnectedSides(state: BlockState, world: WorldAccess, pos: BlockPos): Collection { return EnumSet.of(state[FACING].opposite) } override fun getNetworkInterfaceForSide(side: Direction, state: BlockState, world: WorldAccess, pos: BlockPos): Interface? { return if (side == state[FACING].opposite) { getBlockEntity(world, pos) } else { null } } override fun appendProperties(builder: StateManager.Builder) { super.appendProperties(builder) builder.add(FACING) } override fun createBlockEntity(world: BlockView) = ExtractorBlockEntity() override fun getPlacementState(context: ItemPlacementContext): BlockState { val facing = if (context.player?.isSneaking == true) context.side.opposite else context.playerLookDirection.opposite return defaultState.with(FACING, facing) } override fun getOutlineShape(state: BlockState, world: BlockView, pos: BlockPos, context: ShapeContext): VoxelShape { return EXTRACTOR_SHAPES[state[FACING]]!! } override fun onPlaced(world: World, pos: BlockPos, state: BlockState, entity: LivingEntity?, stack: ItemStack) { if (!world.isClient) { getBlockEntity(world, pos)!!.updateInventory() } } override fun neighborUpdate(state: BlockState, world: World, pos: BlockPos, neighbor: Block, neighborPos: BlockPos, bl: Boolean) { if (!world.isClient) { getBlockEntity(world, pos)!!.updateInventory() } } }