using System; using System.Collections.Generic; using NitroxModel.Packets; namespace NitroxClient.Communication; public class PacketReceiver { private readonly Queue receivedPackets = new(16); private readonly object receivedPacketsLock = new(); public void Add(Packet packet) { lock (receivedPacketsLock) { receivedPackets.Enqueue(packet); } } public Packet GetNextPacket() { lock (receivedPacketsLock) { return receivedPackets.Count == 0 ? null : receivedPackets.Dequeue(); } } /// /// Applies an operation on each packet waiting to be processed and removes it from the queue. /// public void ConsumePackets(Action consumer, TExtra extraParameter) { Packet packet = GetNextPacket(); while (packet != null) { consumer(packet, extraParameter); packet = GetNextPacket(); } } }