package net.shadowfacts.phycon.networking import net.fabricmc.fabric.api.networking.v1.PacketByteBufs import net.fabricmc.fabric.api.networking.v1.PacketSender import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking import net.minecraft.client.MinecraftClient import net.minecraft.client.network.ClientPlayNetworkHandler import net.minecraft.network.Packet import net.minecraft.network.PacketByteBuf import net.shadowfacts.phycon.PhysicalConnectivityClient import net.shadowfacts.phycon.block.terminal.AbstractTerminalBlockEntity import net.shadowfacts.phycon.block.terminal.AbstractTerminalScreenHandler import net.shadowfacts.phycon.util.TerminalSettings import net.shadowfacts.phycon.util.readItemStackWithoutCount import net.shadowfacts.phycon.util.writeItemStackWithoutCount /** * @author shadowfacts */ object S2CTerminalUpdateDisplayedItems: ClientReceiver { override val CHANNEL = C2STerminalUpdateDisplayedItems.CHANNEL operator fun invoke(terminal: AbstractTerminalBlockEntity, entries: List, query: String, settings: TerminalSettings, scrollPosition: Float, totalEntries: Int): Packet<*> { val buf = PacketByteBufs.create() buf.writeIdentifier(terminal.world!!.registryKey.value) buf.writeBlockPos(terminal.pos) buf.writeVarInt(entries.size) for (e in entries) { buf.writeItemStackWithoutCount(e.stack) buf.writeVarInt(e.amount) } buf.writeString(query) buf.writeNbt(settings.toTag()) buf.writeFloat(scrollPosition) buf.writeInt(totalEntries) return ServerPlayNetworking.createS2CPacket(CHANNEL, buf) } override fun receive(client: MinecraftClient, handler: ClientPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { val dimID = buf.readIdentifier() val pos = buf.readBlockPos() val entryCount = buf.readVarInt() val entries = ArrayList(entryCount) for (i in 0 until entryCount) { entries.add(AbstractTerminalScreenHandler.Entry(buf.readItemStackWithoutCount(), buf.readVarInt())) } val query = buf.readString() PhysicalConnectivityClient.terminalSettings.fromTag(buf.readNbt()!!) val scrollPosition = buf.readFloat() val totalEntries = buf.readInt() client.execute { if (client.player!!.world.registryKey.value != dimID) return@execute val screenHandler = client.player!!.currentScreenHandler if (screenHandler !is AbstractTerminalScreenHandler<*>) return@execute if (screenHandler.terminal.pos != pos) return@execute screenHandler.receivedUpdatedItemsFromServer(entries, query, scrollPosition, totalEntries) } } }