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(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() } } }