StationObscurum/Assets/FishNet/Runtime/Managing/Client/Object/ClientObjects.RpcLinks.cs

87 lines
2.8 KiB
C#

using FishNet.Managing.Logging;
using FishNet.Managing.Object;
using FishNet.Managing.Utility;
using FishNet.Object;
using FishNet.Object.Helping;
using FishNet.Serializing;
using FishNet.Transporting;
using FishNet.Utility.Extension;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
namespace FishNet.Managing.Client
{
/// <summary>
/// Handles objects and information about objects for the local client. See ManagedObjects for inherited options.
/// </summary>
public partial class ClientObjects : ManagedObjects
{
#region Private.
/// <summary>
/// RPCLinks of currently spawned objects.
/// </summary>
private Dictionary<ushort, RpcLink> _rpcLinks = new Dictionary<ushort, RpcLink>();
#endregion
/// <summary>
/// Parses a received RPCLink.
/// </summary>
/// <param name="reader"></param>
/// <param name="index"></param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal void ParseRpcLink(PooledReader reader, ushort index, Channel channel)
{
int dataLength = Packets.GetPacketLength(ushort.MaxValue, reader, channel);
//Link index isn't stored.
if (!_rpcLinks.TryGetValueIL2CPP(index, out RpcLink link))
{
SkipDataLength(index, reader, dataLength);
return;
}
else
//Found NetworkObject for link.
if (Spawned.TryGetValueIL2CPP(link.ObjectId, out NetworkObject nob))
{
NetworkBehaviour nb = nob.NetworkBehaviours[link.ComponentIndex];
if (link.RpcType == RpcType.Target)
nb.OnTargetRpc(link.RpcHash, reader, channel);
else if (link.RpcType == RpcType.Observers)
nb.OnObserversRpc(link.RpcHash, reader, channel);
else if (link.RpcType == RpcType.Reconcile)
nb.OnReconcileRpc(link.RpcHash, reader, channel);
}
//Could not find NetworkObject.
else
{
SkipDataLength(index, reader, dataLength, link.ObjectId);
}
}
/// <summary>
/// Sets link to rpcLinks key linkIndex.
/// </summary>
/// <param name="linkIndex"></param>
/// <param name="link"></param>
internal void SetRpcLink(ushort linkIndex, RpcLink link)
{
_rpcLinks[linkIndex] = link;
}
/// <summary>
/// Removes link index keys from rpcLinks.
/// </summary>
internal void RemoveLinkIndexes(List<ushort> values)
{
if (values == null)
return;
for (int i = 0; i < values.Count; i++)
_rpcLinks.Remove(values[i]);
}
}
}