60 lines
2.1 KiB
Kotlin
60 lines
2.1 KiB
Kotlin
package net.shadowfacts.phycon.networking
|
|
|
|
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs
|
|
import net.fabricmc.fabric.api.networking.v1.PacketSender
|
|
import net.minecraft.network.Packet
|
|
import net.minecraft.network.PacketByteBuf
|
|
import net.minecraft.server.MinecraftServer
|
|
import net.minecraft.server.network.ServerPlayNetworkHandler
|
|
import net.minecraft.server.network.ServerPlayerEntity
|
|
import net.minecraft.util.Identifier
|
|
import net.minecraft.util.registry.Registry
|
|
import net.minecraft.util.registry.RegistryKey
|
|
import net.shadowfacts.phycon.PhysicalConnectivity
|
|
import net.shadowfacts.phycon.api.util.IPAddress
|
|
import net.shadowfacts.phycon.network.block.redstone.RedstoneControllerBlockEntity
|
|
import net.shadowfacts.phycon.util.RedstoneMode
|
|
|
|
/**
|
|
* @author shadowfacts
|
|
*/
|
|
object C2SConfigureRedstoneController: ServerReceiver {
|
|
// todo: it would be nice if there wasn't so much duplication with C2SConfigureActivationMode
|
|
|
|
override val CHANNEL = Identifier(PhysicalConnectivity.MODID, "configure_redstone_controller")
|
|
|
|
operator fun invoke(be: RedstoneControllerBlockEntity): Packet<*> {
|
|
val buf = PacketByteBufs.create()
|
|
|
|
buf.writeIdentifier(be.world!!.registryKey.value)
|
|
buf.writeBlockPos(be.pos)
|
|
buf.writeString(be.redstoneMode.name)
|
|
be.managedDevices.forEach {
|
|
buf.writeInt(it?.address ?: 0)
|
|
}
|
|
|
|
return createPacket(buf)
|
|
}
|
|
|
|
override fun receive(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) {
|
|
val dimID = buf.readIdentifier()
|
|
val pos = buf.readBlockPos()
|
|
val mode = RedstoneMode.valueOf(buf.readString())
|
|
val managedDevices = Array<IPAddress?>(5) { null }
|
|
(0..4).map {
|
|
val v = buf.readInt()
|
|
managedDevices[it] = if (v == 0) null else IPAddress(v)
|
|
}
|
|
|
|
server.execute {
|
|
// todo: check if the player is close enough
|
|
val key = RegistryKey.of(Registry.DIMENSION, dimID)
|
|
val world = server.getWorld(key) ?: return@execute
|
|
val device = world.getBlockEntity(pos) as? RedstoneControllerBlockEntity ?: return@execute
|
|
device.redstoneMode = mode
|
|
device.managedDevices = managedDevices
|
|
device.markDirty()
|
|
}
|
|
}
|
|
}
|