#if UNITY_EDITOR || DEVELOPMENT_BUILD #define DEVELOPMENT #endif #if DEVELOPMENT using FishNet.Managing.Logging; using FishNet.Object; using FishNet.Serializing; using FishNet.Transporting; using System; using System.Collections.Generic; using System.Text; using FishNet.Transporting.Tugboat; namespace FishNet.Managing.Debugging { internal class PacketIdHistory { /// /// Last several non-split packetIds to be received on the client. /// private readonly Queue _serverPacketsReceived = new(); /// /// Last several non-split packetIds to be received on the server. /// private readonly Queue _clientPacketsReceived = new(); /// /// StringBuilder to limit garbage allocation. /// private static StringBuilder _stringBuilder = new(); /// /// Maximum number of packets allowed to be queued. /// private const int PACKET_COUNT = 5; /// /// Resets data. /// internal void ResetState(bool packetsFromServer) { if (packetsFromServer) _serverPacketsReceived.Clear(); else _clientPacketsReceived.Clear(); } /// /// Adds a packet to data. /// internal void ReceivedPacket(PacketId pId, bool packetFromServer) { Queue queue = (packetFromServer) ? _serverPacketsReceived : _clientPacketsReceived; queue.Enqueue(pId); while (queue.Count > PACKET_COUNT) queue.Dequeue(); } /// /// Prints current data. /// internal string GetReceivedPacketIds(bool packetsFromServer, bool resetReceived = false) { string packetOriginTxt = (packetsFromServer) ? "from Server" : "from Client"; _stringBuilder.Clear(); Queue queue = GetQueue(packetsFromServer); _stringBuilder.AppendLine($"The last {queue.Count} packets to arrive {packetOriginTxt} are:"); foreach (PacketId item in queue) _stringBuilder.AppendLine($"{item.ToString()}"); //Attach nob information. _stringBuilder.Append($"The last parsed NetworkObject is "); NetworkObject lastNob = Reader.LastNetworkObject; if (lastNob != null) _stringBuilder.Append($"Id {lastNob.ObjectId} on gameObject {lastNob.name}"); else _stringBuilder.Append("Unset"); //Attach nb information. _stringBuilder.Append($", and NetworkBehaviour "); NetworkBehaviour lastNb = Reader.LastNetworkBehaviour; if (lastNb == null) _stringBuilder.Append("Unset"); else _stringBuilder.Append($"{lastNb.GetType().Name}"); _stringBuilder.Append("."); if (resetReceived) ResetState(packetsFromServer); return _stringBuilder.ToString(); } /// /// Returns which packet queue to use. /// private Queue GetQueue(bool packetsFromServer) => (packetsFromServer) ? _serverPacketsReceived : _clientPacketsReceived; } } #endif