63 lines
2.1 KiB
C#
63 lines
2.1 KiB
C#
using FishNet.Object;
|
|
using FishNet.Serializing;
|
|
using FishNet.Transporting;
|
|
using UnityEngine;
|
|
|
|
namespace FishNet.Managing.Utility
|
|
{
|
|
|
|
public class Packets
|
|
{
|
|
/// <summary>
|
|
/// Returns written data length for packet.
|
|
/// </summary>
|
|
internal static int GetPacketLength(ushort packetId, PooledReader reader, Channel channel)
|
|
{
|
|
/* Broadcast is a special circumstance where data
|
|
* will not be purged even if unreliable.
|
|
* This is because a broadcast receiver may not
|
|
* be set, which could be intentional. Because of this
|
|
* length is always sent to skip
|
|
* past the broadcast data.
|
|
*
|
|
* Reliables also need length read in the instance a client
|
|
* sends data to an object which server is despawning. Without
|
|
* parsing length the remainer data from client will be corrupt. */
|
|
PacketId pid = (PacketId)packetId;
|
|
if (channel == Channel.Reliable ||
|
|
pid == PacketId.Broadcast ||
|
|
pid == PacketId.SyncVar
|
|
)
|
|
{
|
|
return reader.ReadInt32();
|
|
}
|
|
//Unreliable purges remaining.
|
|
else if (channel == Channel.Unreliable)
|
|
{
|
|
return (int)MissingObjectPacketLength.PurgeRemaiming;
|
|
}
|
|
/* Unhandled. This shouldn't be possible
|
|
* since both reliable and unreliable is checked.
|
|
* There are no other options. This is merely here
|
|
* for a sanity check. */
|
|
else
|
|
{
|
|
LogError($"Operation is unhandled for packetId {(PacketId)packetId} on channel {channel}.");
|
|
return (int)MissingObjectPacketLength.PurgeRemaiming;
|
|
}
|
|
|
|
//Logs an error message.
|
|
void LogError(string message)
|
|
{
|
|
if (reader.NetworkManager != null)
|
|
reader.NetworkManager.LogError(message);
|
|
else
|
|
NetworkManager.StaticLogError(message);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} |