78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.Object;
 | |
| using FishNet.Transporting;
 | |
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace FishNet.Managing.Server
 | |
| {
 | |
| 
 | |
|     public sealed partial class ServerManager : MonoBehaviour
 | |
|     {
 | |
| 
 | |
| 
 | |
|         #region Internal
 | |
|         /// <summary>
 | |
|         /// Current RPCLinks.
 | |
|         /// </summary>
 | |
|         internal Dictionary<ushort, RpcLink> RpcLinks = new Dictionary<ushort, RpcLink>();
 | |
|         /// <summary>
 | |
|         /// RPCLink indexes which can be used.
 | |
|         /// </summary>
 | |
|         private Queue<ushort> _availableRpcLinkIndexes = new Queue<ushort>();
 | |
|         #endregion
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes RPC Links for NetworkBehaviours.
 | |
|         /// </summary>
 | |
|         private void InitializeRpcLinks()
 | |
|         {
 | |
|             /* Brute force enum values. 
 | |
|              * Linq Last/Max lookup throws for IL2CPP. */
 | |
|             ushort highestValue = 0;
 | |
|             Array pidValues = Enum.GetValues(typeof(PacketId));
 | |
|             foreach (PacketId pid in pidValues)
 | |
|                 highestValue = Math.Max(highestValue, (ushort)pid);
 | |
| 
 | |
|             highestValue += 1;
 | |
|             for (ushort i = highestValue; i < ushort.MaxValue; i++)
 | |
|                 _availableRpcLinkIndexes.Enqueue(i);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Sets the next RPC Link to use.
 | |
|         /// </summary>
 | |
|         /// <returns>True if a link was available and set.</returns>
 | |
|         internal bool GetRpcLink(out ushort value)
 | |
|         {
 | |
|             if (_availableRpcLinkIndexes.Count > 0)
 | |
|             {
 | |
|                 value = _availableRpcLinkIndexes.Dequeue();
 | |
|                 return true;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 value = 0;
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Sets data to RpcLinks for linkIndex.
 | |
|         /// </summary>
 | |
|         internal void SetRpcLink(ushort linkIndex, RpcLink data)
 | |
|         {
 | |
|             RpcLinks[linkIndex] = data;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns RPCLinks to availableRpcLinkIndexes.
 | |
|         /// </summary>
 | |
|         internal void StoreRpcLinks(Dictionary<uint, RpcLinkType> links)
 | |
|         {
 | |
|             foreach (RpcLinkType rlt in links.Values)
 | |
|                 _availableRpcLinkIndexes.Enqueue(rlt.LinkIndex);
 | |
|         }
 | |
|     }
 | |
| 
 | |
| } |