76 lines
2.7 KiB
Kotlin
76 lines
2.7 KiB
Kotlin
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<RedstoneControllerBlockEntity>(
|
|
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<Block, BlockState>) {
|
|
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()
|
|
}
|
|
|
|
}
|