package net.shadowfacts.phycon.block.redstone_controller import net.minecraft.block.Block import net.minecraft.block.BlockState import net.minecraft.block.Material import net.minecraft.item.ItemPlacementContext 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.world.BlockView import net.minecraft.world.World import net.shadowfacts.phycon.PhysicalConnectivity import net.shadowfacts.phycon.block.FaceDeviceBlock /** * @author shadowfacts */ class RedstoneControllerBlock: FaceDeviceBlock( Settings.of(Material.METAL) .strength(1.5f) .sounds(BlockSoundGroup.METAL) ) { companion object { val ID = Identifier(PhysicalConnectivity.MODID, "redstone_controller") val POWERED = Properties.POWERED } override val faceThickness = 3.0 override val faceShapes = mapOf( Direction.DOWN to createCuboidShape(0.0, 0.0, 0.0, 16.0, 3.0, 16.0), Direction.UP to createCuboidShape(0.0, 13.0, 0.0, 16.0, 16.0, 16.0), Direction.NORTH to createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 3.0), Direction.SOUTH to createCuboidShape(0.0, 0.0, 13.0, 16.0, 16.0, 16.0), Direction.WEST to createCuboidShape(0.0, 0.0, 0.0, 3.0, 16.0, 16.0), Direction.EAST to createCuboidShape(13.0, 0.0, 0.0, 16.0, 16.0, 16.0) ) override fun appendProperties(builder: StateManager.Builder) { super.appendProperties(builder) builder.add(POWERED) } override fun createBlockEntity(pos: BlockPos, state: BlockState) = RedstoneControllerBlockEntity(pos, state) override fun getPlacementState(context: ItemPlacementContext): BlockState { val state = super.getPlacementState(context) return state.with(POWERED, isPowered(context.world, context.blockPos, state[FACING])) } override fun neighborUpdate(state: BlockState, world: World, pos: BlockPos, neighborBlock: Block, neighborPos: BlockPos, bl: Boolean) { // this can't be done in getStateForNeighborUpdate because getEmittedRedstonePower is defined in World not WorldAccess if (!world.isClient) { val wasLit = state[POWERED] val isLit = isPowered(world, pos, state[FACING]) if (wasLit != isLit) { toggleLit(state, world, pos) } } } private fun isPowered(world: World, pos: BlockPos, facing: Direction): Boolean { val offset = pos.offset(facing) return world.getEmittedRedstonePower(offset, facing) > 0 } private fun toggleLit(state: BlockState, world: World, pos: BlockPos) { world.setBlockState(pos, state.cycle(POWERED), 2) getBlockEntity(world, pos)!!.redstoneStateChanged() } }