#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