package net.shadowfacts.phycon.block.redstone_controller import net.minecraft.block.BlockState import net.minecraft.nbt.NbtCompound import net.minecraft.util.math.BlockPos import net.shadowfacts.phycon.api.packet.Packet import net.shadowfacts.phycon.api.util.IPAddress import net.shadowfacts.phycon.init.PhyBlockEntities import net.shadowfacts.phycon.block.DeviceBlockEntity import net.shadowfacts.phycon.packet.RemoteActivationPacket import net.shadowfacts.phycon.util.ClientConfigurableDevice import net.shadowfacts.phycon.util.RedstoneMode /** * @author shadowfacts */ class RedstoneControllerBlockEntity(pos: BlockPos, state: BlockState): DeviceBlockEntity(PhyBlockEntities.REDSTONE_CONTROLLER, pos, state), ClientConfigurableDevice { var managedDevices = Array(5) { null } var redstoneMode = RedstoneMode.HIGH set(value) { field = value redstoneStateChanged() } private var redstonePowered = false override fun handle(packet: Packet) { } fun redstoneStateChanged() { if (world == null || world!!.isClient) return val oldPowered = redstonePowered redstonePowered = cachedState[RedstoneControllerBlock.POWERED] val mode: RemoteActivationPacket.Mode? = when (redstoneMode) { RedstoneMode.TOGGLE -> if (oldPowered != redstonePowered) RemoteActivationPacket.Mode.SINGLE else null RedstoneMode.RISING_EDGE -> if (!oldPowered && redstonePowered) RemoteActivationPacket.Mode.SINGLE else null RedstoneMode.FALLING_EDGE -> if (oldPowered && !redstonePowered) RemoteActivationPacket.Mode.SINGLE else null RedstoneMode.HIGH -> if (redstonePowered) RemoteActivationPacket.Mode.ENABLE else RemoteActivationPacket.Mode.DISABLE RedstoneMode.LOW -> if (redstonePowered) RemoteActivationPacket.Mode.DISABLE else RemoteActivationPacket.Mode.ENABLE } if (mode != null) { sendActivatePacket(mode) } } private fun sendActivatePacket(mode: RemoteActivationPacket.Mode) { for (ip in managedDevices) { if (ip == null) continue sendPacket(RemoteActivationPacket(mode, ipAddress, ip)) } } override fun toCommonTag(tag: NbtCompound) { super.toCommonTag(tag) writeDeviceConfiguration(tag) } override fun fromCommonTag(tag: NbtCompound) { super.fromCommonTag(tag) loadDeviceConfiguration(tag) } override fun writeDeviceConfiguration(tag: NbtCompound) { tag.putIntArray("ManagedDevices", managedDevices.mapNotNull { it?.address }) tag.putString("RedstoneMode", redstoneMode.name) } override fun loadDeviceConfiguration(tag: NbtCompound) { val addresses = tag.getIntArray("ManagedDevices") managedDevices = (0..4).map { if (it >= addresses.size) null else IPAddress(addresses[it]) }.toTypedArray() redstoneMode = RedstoneMode.valueOf(tag.getString("RedstoneMode")) } }