PhysicalConnectivity/src/main/kotlin/net/shadowfacts/phycon/block/redstone_controller/RedstoneControllerBlockEnti...

80 lines
2.7 KiB
Kotlin
Raw Normal View History

2021-03-01 03:03:29 +00:00
package net.shadowfacts.phycon.block.redstone_controller
2021-02-24 03:05:05 +00:00
2021-12-22 23:59:51 +00:00
import net.minecraft.block.BlockState
import net.minecraft.nbt.NbtCompound
import net.minecraft.util.math.BlockPos
2021-02-24 03:05:05 +00:00
import net.shadowfacts.phycon.api.packet.Packet
import net.shadowfacts.phycon.api.util.IPAddress
import net.shadowfacts.phycon.init.PhyBlockEntities
2021-02-28 18:48:39 +00:00
import net.shadowfacts.phycon.block.DeviceBlockEntity
import net.shadowfacts.phycon.packet.RemoteActivationPacket
2021-03-03 03:32:30 +00:00
import net.shadowfacts.phycon.util.ClientConfigurableDevice
2021-02-24 03:05:05 +00:00
import net.shadowfacts.phycon.util.RedstoneMode
/**
* @author shadowfacts
*/
2021-12-22 23:59:51 +00:00
class RedstoneControllerBlockEntity(pos: BlockPos, state: BlockState): DeviceBlockEntity(PhyBlockEntities.REDSTONE_CONTROLLER, pos, state),
2021-03-03 03:32:30 +00:00
ClientConfigurableDevice {
2021-02-24 03:05:05 +00:00
var managedDevices = Array<IPAddress?>(5) { null }
var redstoneMode = RedstoneMode.HIGH
set(value) {
field = value
redstoneStateChanged()
}
2021-02-24 03:05:05 +00:00
private var redstonePowered = false
override fun handle(packet: Packet) {
}
fun redstoneStateChanged() {
if (world == null || world!!.isClient) return
2021-02-24 03:05:05 +00:00
val oldPowered = redstonePowered
redstonePowered = cachedState[RedstoneControllerBlock.POWERED]
2021-02-24 03:05:05 +00:00
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))
}
}
2021-12-22 23:59:51 +00:00
override fun toCommonTag(tag: NbtCompound) {
super.toCommonTag(tag)
2021-03-03 03:32:30 +00:00
writeDeviceConfiguration(tag)
2021-02-24 03:05:05 +00:00
}
2021-12-22 23:59:51 +00:00
override fun fromCommonTag(tag: NbtCompound) {
super.fromCommonTag(tag)
2021-03-03 03:32:30 +00:00
loadDeviceConfiguration(tag)
}
2021-12-22 23:59:51 +00:00
override fun writeDeviceConfiguration(tag: NbtCompound) {
2021-03-03 03:32:30 +00:00
tag.putIntArray("ManagedDevices", managedDevices.mapNotNull { it?.address })
tag.putString("RedstoneMode", redstoneMode.name)
}
2021-12-22 23:59:51 +00:00
override fun loadDeviceConfiguration(tag: NbtCompound) {
2021-02-24 03:05:05 +00:00
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"))
}
}