forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using FishNet.Connection;
 | 
						|
using System.Runtime.CompilerServices;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace FishNet.Object
 | 
						|
{
 | 
						|
    public sealed partial class NetworkObject : MonoBehaviour
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Called after all data is synchronized with this NetworkObject.
 | 
						|
        /// </summary>
 | 
						|
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 | 
						|
        private void InitializeCallbacks(bool asServer, bool invokeSyncTypeCallbacks)
 | 
						|
        {
 | 
						|
            /* Note: When invoking OnOwnership here previous owner will
 | 
						|
             * always be an empty connection, since the object is just
 | 
						|
             * now initializing. */
 | 
						|
 | 
						|
            if (!asServer)
 | 
						|
                ClientInitialized = true;
 | 
						|
 | 
						|
            //Set that client or server is active before callbacks.
 | 
						|
            SetActiveStatus(true, asServer);
 | 
						|
 | 
						|
            //Invoke OnStartNetwork.
 | 
						|
            for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                NetworkBehaviours[i].InvokeOnNetwork(true);
 | 
						|
 | 
						|
            //As server.
 | 
						|
            if (asServer)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnStartServer();
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnOwnershipServer(FishNet.Managing.NetworkManager.EmptyConnection);
 | 
						|
                if (invokeSyncTypeCallbacks)
 | 
						|
                    InvokeSyncTypeCallbacks(true);
 | 
						|
            }
 | 
						|
            //As client.
 | 
						|
            else
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnStartClient();
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnOwnershipClient(FishNet.Managing.NetworkManager.EmptyConnection);
 | 
						|
                if (invokeSyncTypeCallbacks)
 | 
						|
                    InvokeSyncTypeCallbacks(false);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Invokes pending SyncType callbacks.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="asServer"></param>
 | 
						|
        internal void InvokeSyncTypeCallbacks(bool asServer)
 | 
						|
        {
 | 
						|
            for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                NetworkBehaviours[i].InvokeSyncTypeCallbacks(asServer);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Invokes events to be called after OnServerStart.
 | 
						|
        /// This is made one method to save instruction calls.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name=""></param>
 | 
						|
        internal void InvokePostOnServerStart(NetworkConnection conn)
 | 
						|
        {
 | 
						|
            for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                NetworkBehaviours[i].SendBufferedRpcs(conn);
 | 
						|
 | 
						|
            for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                NetworkBehaviours[i].OnSpawnServer(conn);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on the server before it sends a despawn message to a client.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="conn">Connection spawn was sent to.</param>
 | 
						|
        internal void InvokeOnServerDespawn(NetworkConnection conn)
 | 
						|
        {
 | 
						|
            for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                NetworkBehaviours[i].OnDespawnServer(conn);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Invokes OnStop callbacks.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="asServer"></param>
 | 
						|
        internal void InvokeStopCallbacks(bool asServer)
 | 
						|
        {
 | 
						|
            if (asServer)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnStopServer();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnStopClient();
 | 
						|
            }
 | 
						|
 | 
						|
            /* Invoke OnStopNetwork if server is calling
 | 
						|
            * or if client and not as server. */
 | 
						|
            if (asServer || (!asServer && !IsServer))
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].InvokeOnNetwork(false);
 | 
						|
            }
 | 
						|
 | 
						|
            if (asServer)
 | 
						|
                IsServer = false;
 | 
						|
            else
 | 
						|
                IsClient = false;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Invokes OnOwnership callbacks.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="prevOwner"></param>
 | 
						|
        private void InvokeOwnership(NetworkConnection prevOwner, bool asServer)
 | 
						|
        {
 | 
						|
            if (asServer)
 | 
						|
            {
 | 
						|
                for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                    NetworkBehaviours[i].OnOwnershipServer(prevOwner);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                /* If local client is owner and not server then only
 | 
						|
                 * invoke if the prevOwner is different. This prevents
 | 
						|
                 * the owner change callback from happening twice when
 | 
						|
                 * using TakeOwnership. 
 | 
						|
                 * 
 | 
						|
                 * Further explained, the TakeOwnership sets local client
 | 
						|
                 * as owner client-side, which invokes the OnOwnership method.
 | 
						|
                 * Then when the server approves the owner change it would invoke
 | 
						|
                 * again, which is not needed. */
 | 
						|
                bool blockInvoke = ((IsOwner && !IsServer) && (prevOwner == Owner));
 | 
						|
                if (!blockInvoke)
 | 
						|
                {
 | 
						|
                    for (int i = 0; i < NetworkBehaviours.Length; i++)
 | 
						|
                        NetworkBehaviours[i].OnOwnershipClient(prevOwner);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 |