#if UNITY_EDITOR || DEVELOPMENT_BUILD #define DEVELOPMENT #endif using FishNet.Managing.Object; using FishNet.Managing.Utility; using FishNet.Object; using FishNet.Serializing; using FishNet.Transporting; using GameKit.Dependencies.Utilities; using System.Collections.Generic; using FishNet.Serializing.Helping; namespace FishNet.Managing.Client { /// /// Handles objects and information about objects for the local client. See ManagedObjects for inherited options. /// public partial class ClientObjects : ManagedObjects { #region Private. /// /// RPCLinks of currently spawned objects. /// private Dictionary _rpcLinks = new(); #endregion /// /// Parses a received RPCLink. /// /// /// internal void ParseRpcLink(PooledReader reader, ushort index, Channel channel) { #if DEVELOPMENT NetworkBehaviour.ReadDebugForValidatedRpc(base.NetworkManager, reader, out int startReaderRemaining, out string rpcInformation, out uint expectedReadAmount); #endif int dataLength; //Link index isn't stored. if (!_rpcLinks.TryGetValueIL2CPP(index, out RpcLink link)) { dataLength = Packets.GetPacketLength(ushort.MaxValue, reader, channel); SkipDataLength(index, reader, dataLength); } //Found NetworkObject for link. else if (Spawned.TryGetValueIL2CPP(link.ObjectId, out NetworkObject nob)) { //Still call GetPacketLength to remove any extra bytes at the front of the reader. NetworkBehaviour nb = nob.NetworkBehaviours[link.ComponentIndex]; if (link.RpcPacketId == PacketId.TargetRpc) { Packets.GetPacketLength((ushort)PacketId.TargetRpc, reader, channel); nb.ReadTargetRpc(fromRpcLink: true, link.RpcHash, reader, channel); } else if (link.RpcPacketId == PacketId.ObserversRpc) { Packets.GetPacketLength((ushort)PacketId.ObserversRpc, reader, channel); nb.ReadObserversRpc(fromRpcLink: true, link.RpcHash, reader, channel); } else if (link.RpcPacketId == PacketId.Reconcile) { Packets.GetPacketLength((ushort)PacketId.Reconcile, reader, channel); nb.OnReconcileRpc(link.RpcHash, reader, channel); } } //Could not find NetworkObject. else { dataLength = Packets.GetPacketLength(index, reader, channel); SkipDataLength(index, reader, dataLength, link.ObjectId); } #if DEVELOPMENT NetworkBehaviour.TryPrintDebugForValidatedRpc(fromRpcLink: true, base.NetworkManager, reader, startReaderRemaining, rpcInformation, expectedReadAmount, channel); #endif } /// /// Sets link to rpcLinks key linkIndex. /// /// /// internal void SetRpcLink(ushort linkIndex, RpcLink link) { _rpcLinks[linkIndex] = link; } /// /// Removes link index keys from rpcLinks. /// internal void RemoveLinkIndexes(List values) { if (values == null) return; for (int i = 0; i < values.Count; i++) _rpcLinks.Remove(values[i]); } } }