public virtual void AddPendingObject(GameObject pGameObject)
        {
            if (pGameObject.scene.name != gameObject.scene.name)
            {
                return;
            }

            NetworkBehavior behavior = pGameObject.GetComponent <NetworkBehavior>();

            if (behavior == null)
            {
                return;
            }

            INetworkSceneObject networkSceneObject = behavior as INetworkSceneObject;

            if (networkSceneObject == null)
            {
                return;
            }

            uint networkId = networkSceneObject.GetNetworkId();

            if (_pendingObjects.ContainsKey(networkId))
            {
                return;
            }

            _pendingObjects.Add(networkId, behavior);
        }
        public virtual void InstantiatePendingObject(NodeNetworkSceneTemplate pNodeTemplate, NetworkBehavior pBehavior)
        {
            if (pNodeTemplate == null || pBehavior == null)
            {
                return;
            }

            INetworkSceneObject networkSceneObject = pBehavior as INetworkSceneObject;
            NetworkObject       nObj = networkSceneObject.GetNetworkObject();

            if (nObj == null)
            {
                return;
            }

            if (pNodeTemplate.NodeId == NodeManager.Instance.CurrentNode.NodeId)
            {
                NetworkBehavior behavior = NodeManager.Instance.InstantiateInScene(pNodeTemplate.SceneName, nObj.CreateCode, (pBehavior as IRPCSerializable), _teleportTarget.position, _teleportTarget.rotation);
                if (behavior == null)
                {
                    return;
                }

                pBehavior.gameObject.SetActive(false);
                SendNetworkSceneToPlayer(networkSceneObject, pNodeTemplate);
                DestroyPendingObject(networkSceneObject);
            }
            else
            {
                ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum> callback = NodeManager.Instance.InstantiateInNode(pNodeTemplate.NodeId, pNodeTemplate.SceneName, nObj.CreateCode, (pBehavior as IRPCSerializable), _teleportTarget.position, _teleportTarget.rotation);
                if (callback.State == ServiceCallbackStateEnum.AWAITING_RESPONSE)
                {
                    // While the request is progressing this NetworkSceneTeleporter could have been destroyed.
                    NetworkSceneTeleporter tmpTeleporter = this;
                    callback.OnResponseOfT += (pResponseTime, pResponseDataOfT, pSender) => {
                        if (tmpTeleporter == null || pBehavior == null || networkSceneObject == null || pNodeTemplate == null)
                        {
                            return;
                        }

                        if (pResponseDataOfT == ServiceCallbackStateEnum.RESPONSE_SUCCESS)
                        {
                            pBehavior.gameObject.SetActive(false);
                            tmpTeleporter.SendNetworkSceneToPlayer(networkSceneObject, pNodeTemplate);
                            tmpTeleporter.DestroyPendingObject(networkSceneObject);
                        }
                    };
                }
            }
        }
        public virtual bool SendNetworkSceneToPlayer(INetworkSceneObject pNetworkSceneObject, NodeNetworkSceneTemplate pNodeTemplate)
        {
            if (pNetworkSceneObject == null || pNetworkSceneObject.Manager == null || pNodeTemplate == null)
            {
                return(false);
            }

            INetworkScenePlayer networkScenePlayer = pNetworkSceneObject as INetworkScenePlayer;

            if (networkScenePlayer == null)
            {
                return(false);
            }

            return(pNetworkSceneObject.Manager.ChangePlayerNetworkScene(pNodeTemplate, networkScenePlayer.Player));
        }
        public virtual bool DestroyPendingObject(INetworkSceneObject pNetworkSceneObject)
        {
            if (pNetworkSceneObject == null)
            {
                return(false);
            }

            NetworkObject nObj = pNetworkSceneObject.GetNetworkObject();

            if (nObj == null)
            {
                return(false);
            }

            nObj.Destroy();
            return(true);
        }
        public virtual void SetINetworkSceneObject(INetworkBehavior pNetworkBehavior, NetworkObject pNetworkObject = null)
        {
            if (pNetworkBehavior == null)
            {
                return;
            }

            INetworkSceneObject nObj = pNetworkBehavior as INetworkSceneObject;

            if (nObj == null)
            {
                return;
            }

            nObj.Manager = this;
            if (pNetworkObject != null)
            {
                nObj.SetNetworkObject(pNetworkObject);
            }
        }