72 lines
2.5 KiB
Kotlin
72 lines
2.5 KiB
Kotlin
package net.shadowfacts.phycon.block.redstone_controller
|
|
|
|
import net.minecraft.nbt.CompoundTag
|
|
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: DeviceBlockEntity(PhyBlockEntities.REDSTONE_CONTROLLER),
|
|
ClientConfigurableDevice {
|
|
|
|
var managedDevices = Array<IPAddress?>(5) { null }
|
|
var redstoneMode = RedstoneMode.HIGH
|
|
|
|
private var redstonePowered = false
|
|
|
|
override fun handle(packet: Packet) {
|
|
}
|
|
|
|
fun redstoneStateChanged() {
|
|
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: CompoundTag) {
|
|
super.toCommonTag(tag)
|
|
writeDeviceConfiguration(tag)
|
|
}
|
|
|
|
override fun fromCommonTag(tag: CompoundTag) {
|
|
super.fromCommonTag(tag)
|
|
loadDeviceConfiguration(tag)
|
|
}
|
|
|
|
override fun writeDeviceConfiguration(tag: CompoundTag) {
|
|
tag.putIntArray("ManagedDevices", managedDevices.mapNotNull { it?.address })
|
|
tag.putString("RedstoneMode", redstoneMode.name)
|
|
}
|
|
|
|
override fun loadDeviceConfiguration(tag: CompoundTag) {
|
|
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"))
|
|
}
|
|
|
|
}
|