コード例 #1
0
 internal void HandleSyncList(int cmdHash, NetworkReader reader)
 {
     if (base.gameObject == null)
     {
         string cmdHashHandlerName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
         if (LogFilter.logWarn)
         {
             Debug.LogWarning(string.Concat(new object[] { "SyncList [", cmdHashHandlerName, "] received for deleted object [netId=", this.netId, "]" }));
         }
     }
     else
     {
         NetworkBehaviour.CmdDelegate delegate2;
         System.Type type;
         if (!NetworkBehaviour.GetInvokerForHashSyncList(cmdHash, out type, out delegate2))
         {
             string str2 = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
             if (LogFilter.logError)
             {
                 Debug.LogError(string.Concat(new object[] { "Found no receiver for incoming [", str2, "] on ", base.gameObject, ",  the server and client should have the same NetworkBehaviour instances [netId=", this.netId, "]." }));
             }
         }
         else
         {
             NetworkBehaviour behaviour;
             if (!this.GetInvokeComponent(cmdHash, type, out behaviour))
             {
                 string str3 = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
                 if (LogFilter.logWarn)
                 {
                     Debug.LogWarning(string.Concat(new object[] { "SyncList [", str3, "] handler not found [netId=", this.netId, "]" }));
                 }
             }
             else
             {
                 delegate2(behaviour, reader);
                 NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, 9, NetworkBehaviour.GetCmdHashListName(cmdHash), 1);
             }
         }
     }
 }
コード例 #2
0
 internal static string GetCmdHashRpcName(int cmdHash)
 {
     return(NetworkBehaviour.GetCmdHashPrefixName(cmdHash, "InvokeRpc"));
 }
コード例 #3
0
 internal static string GetCmdHashListName(int cmdHash)
 {
     return(NetworkBehaviour.GetCmdHashPrefixName(cmdHash, "InvokeSyncList"));
 }
コード例 #4
0
 internal void HandleRPC(int cmdHash, NetworkReader reader)
 {
     if (base.gameObject == null)
     {
         if (LogFilter.logWarn)
         {
             Debug.LogWarning(string.Concat(new object[] { "ClientRpc [", NetworkBehaviour.GetCmdHashHandlerName(cmdHash), "] received for deleted object ", this.netId }));
         }
     }
     else if (this.m_NetworkBehaviours.Length == 0)
     {
         if (LogFilter.logWarn)
         {
             Debug.LogWarning("No receiver found for ClientRpc [" + NetworkBehaviour.GetCmdHashHandlerName(cmdHash) + "]. Does the script with the function inherit NetworkBehaviour?");
         }
     }
     else
     {
         for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
         {
             NetworkBehaviour behaviour = this.m_NetworkBehaviours[i];
             if (behaviour.InvokeRPC(cmdHash, reader))
             {
                 NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, 2, NetworkBehaviour.GetCmdHashRpcName(cmdHash), 1);
                 return;
             }
         }
         string invoker = NetworkBehaviour.GetInvoker(cmdHash);
         if (invoker == null)
         {
             invoker = "[unknown:" + cmdHash + "]";
         }
         if (LogFilter.logWarn)
         {
             Debug.LogWarning(string.Concat(new object[] { "Failed to invoke RPC ", invoker, "(", cmdHash, ") on netID ", this.netId }));
         }
         NetworkBehaviour.DumpInvokers();
     }
 }
コード例 #5
0
 internal static bool GetInvokerForHashSyncEvent(int cmdHash, out System.Type invokeClass, out NetworkBehaviour.CmdDelegate invokeFunction)
 {
     return(NetworkBehaviour.GetInvokerForHash(cmdHash, NetworkBehaviour.UNetInvokeType.SyncEvent, out invokeClass, out invokeFunction));
 }
コード例 #6
0
        // invoked by unity runtime immediately after the regular "Update()" function.
        internal void UNetUpdate()
        {
            // check if any behaviours are ready to send
            uint dirtyChannelBits = 0;

            for (int i = 0; i < m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour comp = m_NetworkBehaviours[i];
                int channelId         = comp.GetDirtyChannel();
                if (channelId != -1)
                {
                    dirtyChannelBits |= (uint)(1 << channelId);
                }
            }
            if (dirtyChannelBits == 0)
            {
                return;
            }

            for (int channelId = 0; channelId < NetworkServer.numChannels; channelId++)
            {
                if ((dirtyChannelBits & (uint)(1 << channelId)) != 0)
                {
                    s_UpdateWriter.StartMessage(MsgType.UpdateVars);
                    s_UpdateWriter.Write(netId);

                    bool  wroteData = false;
                    short oldPos;
                    for (int i = 0; i < m_NetworkBehaviours.Length; i++)
                    {
                        oldPos = s_UpdateWriter.Position;
                        NetworkBehaviour comp = m_NetworkBehaviours[i];
                        if (comp.GetDirtyChannel() != channelId)
                        {
                            // component could write more than one dirty-bits, so call the serialize func
                            comp.OnSerialize(s_UpdateWriter, false);
                            continue;
                        }

                        if (comp.OnSerialize(s_UpdateWriter, false))
                        {
                            comp.ClearAllDirtyBits();

#if UNITY_EDITOR
                            UnityEditor.NetworkDetailStats.IncrementStat(
                                UnityEditor.NetworkDetailStats.NetworkDirection.Outgoing,
                                MsgType.UpdateVars, comp.GetType().Name, 1);
#endif

                            wroteData = true;
                        }
                        if (s_UpdateWriter.Position - oldPos > NetworkServer.maxPacketSize)
                        {
                            if (LogFilter.logWarn)
                            {
                                Debug.LogWarning("Large state update of " + (s_UpdateWriter.Position - oldPos) + " bytes for netId:" + netId + " from script:" + comp);
                            }
                        }
                    }

                    if (!wroteData)
                    {
                        // nothing to send.. this could be a script with no OnSerialize function setting dirty bits
                        continue;
                    }

                    s_UpdateWriter.FinishMessage();
                    NetworkServer.SendWriterToReady(gameObject, s_UpdateWriter, channelId);
                }
            }
        }
コード例 #7
0
ファイル: NetworkIdentity.cs プロジェクト: Hengle/JellyTerain
        public void RebuildObservers(bool initialize)
        {
            if (m_Observers == null)
            {
                return;
            }
            bool flag  = false;
            bool flag2 = false;
            HashSet <NetworkConnection> hashSet  = new HashSet <NetworkConnection>();
            HashSet <NetworkConnection> hashSet2 = new HashSet <NetworkConnection>(m_Observers);

            for (int i = 0; i < m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour networkBehaviour = m_NetworkBehaviours[i];
                flag2 |= networkBehaviour.OnRebuildObservers(hashSet, initialize);
            }
            if (!flag2)
            {
                if (!initialize)
                {
                    return;
                }
                for (int j = 0; j < NetworkServer.connections.Count; j++)
                {
                    NetworkConnection networkConnection = NetworkServer.connections[j];
                    if (networkConnection != null && networkConnection.isReady)
                    {
                        AddObserver(networkConnection);
                    }
                }
                for (int k = 0; k < NetworkServer.localConnections.Count; k++)
                {
                    NetworkConnection networkConnection2 = NetworkServer.localConnections[k];
                    if (networkConnection2 != null && networkConnection2.isReady)
                    {
                        AddObserver(networkConnection2);
                    }
                }
                return;
            }
            foreach (NetworkConnection item in hashSet)
            {
                if (item != null)
                {
                    if (!item.isReady)
                    {
                        if (LogFilter.logWarn)
                        {
                            Debug.LogWarning("Observer is not ready for " + base.gameObject + " " + item);
                        }
                    }
                    else if (initialize || !hashSet2.Contains(item))
                    {
                        item.AddToVisList(this);
                        if (LogFilter.logDebug)
                        {
                            Debug.Log("New Observer for " + base.gameObject + " " + item);
                        }
                        flag = true;
                    }
                }
            }
            foreach (NetworkConnection item2 in hashSet2)
            {
                if (!hashSet.Contains(item2))
                {
                    item2.RemoveFromVisList(this, isDestroyed: false);
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Removed Observer for " + base.gameObject + " " + item2);
                    }
                    flag = true;
                }
            }
            if (initialize)
            {
                for (int l = 0; l < NetworkServer.localConnections.Count; l++)
                {
                    if (!hashSet.Contains(NetworkServer.localConnections[l]))
                    {
                        OnSetLocalVisibility(vis: false);
                    }
                }
            }
            if (flag)
            {
                m_Observers = new List <NetworkConnection>(hashSet);
                m_ObserverConnections.Clear();
                for (int m = 0; m < m_Observers.Count; m++)
                {
                    m_ObserverConnections.Add(m_Observers[m].connectionId);
                }
            }
        }
コード例 #8
0
 internal void OnStartServer()
 {
     if (this.m_IsServer)
     {
         return;
     }
     this.m_IsServer = true;
     if (this.m_LocalPlayerAuthority)
     {
         this.m_HasAuthority = false;
     }
     else
     {
         this.m_HasAuthority = true;
     }
     this.m_Observers           = new List <NetworkConnection>();
     this.m_ObserverConnections = new HashSet <int>();
     this.CacheBehaviours();
     if (this.netId.IsEmpty())
     {
         this.m_NetId = NetworkIdentity.GetNextNetworkId();
         if (LogFilter.logDev)
         {
             Debug.Log(string.Concat(new object[]
             {
                 "OnStartServer ",
                 base.gameObject,
                 " GUID:",
                 this.netId
             }));
         }
         NetworkServer.instance.SetLocalObjectOnServer(this.netId, base.gameObject);
         for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
         {
             NetworkBehaviour networkBehaviour = this.m_NetworkBehaviours[i];
             try
             {
                 networkBehaviour.OnStartServer();
             }
             catch (Exception ex)
             {
                 Debug.LogError("Exception in OnStartServer:" + ex.Message + " " + ex.StackTrace);
             }
         }
         if (NetworkClient.active && NetworkServer.localClientActive)
         {
             ClientScene.SetLocalObject(this.netId, base.gameObject);
             this.OnStartClient();
         }
         if (this.m_HasAuthority)
         {
             this.OnStartAuthority();
         }
         return;
     }
     if (LogFilter.logError)
     {
         Debug.LogError(string.Concat(new object[]
         {
             "Object has non-zero netId ",
             this.netId,
             " for ",
             base.gameObject,
             " !!1"
         }));
     }
 }
コード例 #9
0
        internal void UNetUpdate()
        {
            uint num = 0u;

            for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour networkBehaviour = this.m_NetworkBehaviours[i];
                int dirtyChannel = networkBehaviour.GetDirtyChannel();
                if (dirtyChannel != -1)
                {
                    num |= 1u << dirtyChannel;
                }
            }
            if (num == 0u)
            {
                return;
            }
            for (int j = 0; j < NetworkServer.numChannels; j++)
            {
                if ((num & 1u << j) != 0u)
                {
                    NetworkIdentity.s_UpdateWriter.StartMessage(8);
                    NetworkIdentity.s_UpdateWriter.Write(this.netId);
                    bool flag = false;
                    for (int k = 0; k < this.m_NetworkBehaviours.Length; k++)
                    {
                        short            position          = NetworkIdentity.s_UpdateWriter.Position;
                        NetworkBehaviour networkBehaviour2 = this.m_NetworkBehaviours[k];
                        if (networkBehaviour2.GetDirtyChannel() != j)
                        {
                            networkBehaviour2.OnSerialize(NetworkIdentity.s_UpdateWriter, false);
                        }
                        else
                        {
                            if (networkBehaviour2.OnSerialize(NetworkIdentity.s_UpdateWriter, false))
                            {
                                networkBehaviour2.ClearAllDirtyBits();
                                flag = true;
                            }
                            if (NetworkIdentity.s_UpdateWriter.Position - position > (short)NetworkServer.maxPacketSize)
                            {
                                Debug.LogWarning(string.Concat(new object[]
                                {
                                    "Large state update of ",
                                    (int)(NetworkIdentity.s_UpdateWriter.Position - position),
                                    " bytes (max is ",
                                    NetworkServer.maxPacketSize,
                                    " for netId:",
                                    this.netId,
                                    " from script:",
                                    networkBehaviour2
                                }));
                            }
                        }
                    }
                    if (flag)
                    {
                        NetworkIdentity.s_UpdateWriter.FinishMessage();
                        NetworkServer.SendWriterToReady(base.gameObject, NetworkIdentity.s_UpdateWriter, j);
                    }
                }
            }
        }
コード例 #10
0
        /// <summary>
        ///   <para>This causes the set of players that can see this object to be rebuild. The OnRebuildObservers callback function will be invoked on each NetworkBehaviour.</para>
        /// </summary>
        /// <param name="initialize">True if this is the first time.</param>
        public void RebuildObservers(bool initialize)
        {
            if (this.m_Observers == null)
            {
                return;
            }
            bool flag1 = false;
            bool flag2 = false;
            HashSet <NetworkConnection> observers            = new HashSet <NetworkConnection>();
            HashSet <NetworkConnection> networkConnectionSet = new HashSet <NetworkConnection>((IEnumerable <NetworkConnection>) this.m_Observers);

            for (int index = 0; index < this.m_NetworkBehaviours.Length; ++index)
            {
                NetworkBehaviour networkBehaviour = this.m_NetworkBehaviours[index];
                flag2 |= networkBehaviour.OnRebuildObservers(observers, initialize);
            }
            if (!flag2)
            {
                if (!initialize)
                {
                    return;
                }
                foreach (NetworkConnection connection in NetworkServer.connections)
                {
                    if (connection != null && connection.isReady)
                    {
                        this.AddObserver(connection);
                    }
                }
                using (List <NetworkConnection> .Enumerator enumerator = NetworkServer.localConnections.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        NetworkConnection current = enumerator.Current;
                        if (current != null && current.isReady)
                        {
                            this.AddObserver(current);
                        }
                    }
                }
            }
            else
            {
                using (HashSet <NetworkConnection> .Enumerator enumerator = observers.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        NetworkConnection current = enumerator.Current;
                        if (current != null)
                        {
                            if (!current.isReady)
                            {
                                if (LogFilter.logWarn)
                                {
                                    Debug.LogWarning((object)("Observer is not ready for " + (object)this.gameObject + " " + (object)current));
                                }
                            }
                            else if (initialize || !networkConnectionSet.Contains(current))
                            {
                                current.AddToVisList(this);
                                if (LogFilter.logDebug)
                                {
                                    Debug.Log((object)("New Observer for " + (object)this.gameObject + " " + (object)current));
                                }
                                flag1 = true;
                            }
                        }
                    }
                }
                using (HashSet <NetworkConnection> .Enumerator enumerator = networkConnectionSet.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        NetworkConnection current = enumerator.Current;
                        if (!observers.Contains(current))
                        {
                            current.RemoveFromVisList(this, false);
                            if (LogFilter.logDebug)
                            {
                                Debug.Log((object)("Removed Observer for " + (object)this.gameObject + " " + (object)current));
                            }
                            flag1 = true;
                        }
                    }
                }
                if (initialize)
                {
                    using (List <NetworkConnection> .Enumerator enumerator = NetworkServer.localConnections.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            NetworkConnection current = enumerator.Current;
                            if (!observers.Contains(current))
                            {
                                this.OnSetLocalVisibility(false);
                            }
                        }
                    }
                }
                if (!flag1)
                {
                    return;
                }
                this.m_Observers = new List <NetworkConnection>((IEnumerable <NetworkConnection>)observers);
                this.m_ObserverConnections.Clear();
                using (List <NetworkConnection> .Enumerator enumerator = this.m_Observers.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        this.m_ObserverConnections.Add(enumerator.Current.connectionId);
                    }
                }
            }
        }
コード例 #11
0
        private static void OnSyncListMessage(NetworkMessage netMsg)
        {
            NetworkIdentity   identity;
            NetworkInstanceId netId = netMsg.reader.ReadNetworkId();
            int cmdHash             = (int)netMsg.reader.ReadPackedUInt32();

            if (LogFilter.logDebug)
            {
                Debug.Log("ClientScene::OnSyncListMessage " + netId);
            }
            if (s_NetworkScene.GetNetworkIdentity(netId, out identity))
            {
                identity.HandleSyncList(cmdHash, netMsg.reader);
            }
            else if (LogFilter.logWarn)
            {
                Debug.LogWarning("Did not find target for SyncList message for " + netId);
            }
            NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Outgoing, 9, NetworkBehaviour.GetCmdHashHandlerName(cmdHash), 1);
        }
コード例 #12
0
 internal void HandleRPC(int cmdHash, NetworkReader reader)
 {
     if ((UnityEngine.Object) this.gameObject == (UnityEngine.Object)null)
     {
         string cmdHashHandlerName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
         if (!LogFilter.logWarn)
         {
             return;
         }
         Debug.LogWarning((object)("ClientRpc [" + cmdHashHandlerName + "] received for deleted object [netId=" + (object)this.netId + "]"));
     }
     else
     {
         System.Type invokeClass;
         NetworkBehaviour.CmdDelegate invokeFunction;
         if (!NetworkBehaviour.GetInvokerForHashClientRpc(cmdHash, out invokeClass, out invokeFunction))
         {
             string cmdHashHandlerName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
             if (!LogFilter.logError)
             {
                 return;
             }
             Debug.LogError((object)("Found no receiver for incoming [" + cmdHashHandlerName + "] on " + (object)this.gameObject + ",  the server and client should have the same NetworkBehaviour instances [netId=" + (object)this.netId + "]."));
         }
         else
         {
             NetworkBehaviour invokeComponent;
             if (!this.GetInvokeComponent(cmdHash, invokeClass, out invokeComponent))
             {
                 string cmdHashHandlerName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
                 if (!LogFilter.logWarn)
                 {
                     return;
                 }
                 Debug.LogWarning((object)("ClientRpc [" + cmdHashHandlerName + "] handler not found [netId=" + (object)this.netId + "]"));
             }
             else
             {
                 invokeFunction(invokeComponent, reader);
                 NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, (short)2, NetworkBehaviour.GetCmdHashRpcName(cmdHash), 1);
             }
         }
     }
 }
コード例 #13
0
        private static void OnSyncEventMessage(NetworkMessage netMsg)
        {
            int cmdHash             = (int)netMsg.reader.ReadPackedUInt32();
            NetworkInstanceId netId = netMsg.reader.ReadNetworkId();

            if (LogFilter.logDebug)
            {
                Debug.Log((object)("ClientScene::OnSyncEventMessage " + (object)netId));
            }
            NetworkIdentity uv;

            if (ClientScene.s_NetworkScene.GetNetworkIdentity(netId, out uv))
            {
                uv.HandleSyncEvent(cmdHash, netMsg.reader);
            }
            else if (LogFilter.logWarn)
            {
                Debug.LogWarning((object)("Did not find target for SyncEvent message for " + (object)netId));
            }
            NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Outgoing, (short)7, NetworkBehaviour.GetCmdHashHandlerName(cmdHash), 1);
        }
コード例 #14
0
 internal void HandleSyncList(int cmdHash, NetworkReader reader)
 {
     if (base.gameObject == null)
     {
         if (LogFilter.logWarn)
         {
             Debug.LogWarning(string.Concat(new object[] { "SyncList [", NetworkBehaviour.GetCmdHashHandlerName(cmdHash), "] received for deleted object ", this.netId }));
         }
     }
     else
     {
         for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
         {
             NetworkBehaviour behaviour = this.m_NetworkBehaviours[i];
             if (behaviour.InvokeSyncList(cmdHash, reader))
             {
                 NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, 9, NetworkBehaviour.GetCmdHashListName(cmdHash), 1);
                 break;
             }
         }
     }
 }
コード例 #15
0
 /// <summary>
 /// <para>This causes the set of players that can see this object to be rebuild. The OnRebuildObservers callback function will be invoked on each NetworkBehaviour.</para>
 /// </summary>
 /// <param name="initialize">True if this is the first time.</param>
 public void RebuildObservers(bool initialize)
 {
     if (this.m_Observers != null)
     {
         bool flag  = false;
         bool flag2 = false;
         HashSet <NetworkConnection> observers = new HashSet <NetworkConnection>();
         HashSet <NetworkConnection> set2      = new HashSet <NetworkConnection>(this.m_Observers);
         for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
         {
             NetworkBehaviour behaviour = this.m_NetworkBehaviours[i];
             flag2 |= behaviour.OnRebuildObservers(observers, initialize);
         }
         if (!flag2)
         {
             if (initialize)
             {
                 for (int j = 0; j < NetworkServer.connections.Count; j++)
                 {
                     NetworkConnection conn = NetworkServer.connections[j];
                     if ((conn != null) && conn.isReady)
                     {
                         this.AddObserver(conn);
                     }
                 }
                 for (int k = 0; k < NetworkServer.localConnections.Count; k++)
                 {
                     NetworkConnection connection2 = NetworkServer.localConnections[k];
                     if ((connection2 != null) && connection2.isReady)
                     {
                         this.AddObserver(connection2);
                     }
                 }
             }
         }
         else
         {
             foreach (NetworkConnection connection3 in observers)
             {
                 if (connection3 != null)
                 {
                     if (!connection3.isReady)
                     {
                         if (LogFilter.logWarn)
                         {
                             Debug.LogWarning(string.Concat(new object[] { "Observer is not ready for ", base.gameObject, " ", connection3 }));
                         }
                     }
                     else if (initialize || !set2.Contains(connection3))
                     {
                         connection3.AddToVisList(this);
                         if (LogFilter.logDebug)
                         {
                             Debug.Log(string.Concat(new object[] { "New Observer for ", base.gameObject, " ", connection3 }));
                         }
                         flag = true;
                     }
                 }
             }
             foreach (NetworkConnection connection4 in set2)
             {
                 if (!observers.Contains(connection4))
                 {
                     connection4.RemoveFromVisList(this, false);
                     if (LogFilter.logDebug)
                     {
                         Debug.Log(string.Concat(new object[] { "Removed Observer for ", base.gameObject, " ", connection4 }));
                     }
                     flag = true;
                 }
             }
             if (initialize)
             {
                 for (int m = 0; m < NetworkServer.localConnections.Count; m++)
                 {
                     if (!observers.Contains(NetworkServer.localConnections[m]))
                     {
                         this.OnSetLocalVisibility(false);
                     }
                 }
             }
             if (flag)
             {
                 this.m_Observers = new List <NetworkConnection>(observers);
                 this.m_ObserverConnections.Clear();
                 for (int n = 0; n < this.m_Observers.Count; n++)
                 {
                     this.m_ObserverConnections.Add(this.m_Observers[n].connectionId);
                 }
             }
         }
     }
 }
コード例 #16
0
        public void RebuildObservers(bool initialize)
        {
            if (this.m_Observers == null)
            {
                return;
            }
            bool flag  = false;
            bool flag2 = false;
            HashSet <NetworkConnection> hashSet  = new HashSet <NetworkConnection>();
            HashSet <NetworkConnection> hashSet2 = new HashSet <NetworkConnection>(this.m_Observers);

            for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour networkBehaviour = this.m_NetworkBehaviours[i];
                flag2 |= networkBehaviour.OnRebuildObservers(hashSet, initialize);
            }
            if (!flag2)
            {
                if (initialize)
                {
                    foreach (NetworkConnection current in NetworkServer.connections)
                    {
                        if (current != null)
                        {
                            if (current.isReady)
                            {
                                this.AddObserver(current);
                            }
                        }
                    }
                    foreach (NetworkConnection current2 in NetworkServer.localConnections)
                    {
                        if (current2 != null)
                        {
                            if (current2.isReady)
                            {
                                this.AddObserver(current2);
                            }
                        }
                    }
                }
                return;
            }
            foreach (NetworkConnection current3 in hashSet)
            {
                if (current3 != null)
                {
                    if (!current3.isReady)
                    {
                        if (LogFilter.logWarn)
                        {
                            Debug.LogWarning(string.Concat(new object[]
                            {
                                "Observer is not ready for ",
                                base.gameObject,
                                " ",
                                current3
                            }));
                        }
                    }
                    else if (initialize || !hashSet2.Contains(current3))
                    {
                        current3.AddToVisList(this);
                        if (LogFilter.logDebug)
                        {
                            Debug.Log(string.Concat(new object[]
                            {
                                "New Observer for ",
                                base.gameObject,
                                " ",
                                current3
                            }));
                        }
                        flag = true;
                    }
                }
            }
            foreach (NetworkConnection current4 in hashSet2)
            {
                if (!hashSet.Contains(current4))
                {
                    current4.RemoveFromVisList(this, false);
                    if (LogFilter.logDebug)
                    {
                        Debug.Log(string.Concat(new object[]
                        {
                            "Removed Observer for ",
                            base.gameObject,
                            " ",
                            current4
                        }));
                    }
                    flag = true;
                }
            }
            if (initialize)
            {
                foreach (NetworkConnection current5 in NetworkServer.localConnections)
                {
                    if (!hashSet.Contains(current5))
                    {
                        this.OnSetLocalVisibility(false);
                    }
                }
            }
            if (!flag)
            {
                return;
            }
            this.m_Observers = new List <NetworkConnection>(hashSet);
            this.m_ObserverConnections.Clear();
            foreach (NetworkConnection current6 in this.m_Observers)
            {
                this.m_ObserverConnections.Add(current6.connectionId);
            }
        }
コード例 #17
0
        internal void OnStartServer(bool allowNonZeroNetId)
        {
            if (m_IsServer)
            {
                return;
            }
            m_IsServer = true;

            if (m_LocalPlayerAuthority)
            {
                // local player on server has NO authority
                m_HasAuthority = false;
            }
            else
            {
                // enemy on server has authority
                m_HasAuthority = true;
            }

            m_Observers           = new List <NetworkConnection>();
            m_ObserverConnections = new HashSet <int>();
            CacheBehaviours();

            // If the instance/net ID is invalid here then this is an object instantiated from a prefab and the server should assign a valid ID
            if (netId.IsEmpty())
            {
                m_NetId = GetNextNetworkId();
            }
            else
            {
                if (allowNonZeroNetId)
                {
                    //allowed
                }
                else
                {
                    if (LogFilter.logError)
                    {
                        Debug.LogError("Object has non-zero netId " + netId + " for " + gameObject);
                    }
                    return;
                }
            }

            if (LogFilter.logDev)
            {
                Debug.Log("OnStartServer " + gameObject + " GUID:" + netId);
            }
            NetworkServer.instance.SetLocalObjectOnServer(netId, gameObject);

            for (int i = 0; i < m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour comp = m_NetworkBehaviours[i];
                try
                {
                    comp.OnStartServer();
                }
                catch (Exception e)
                {
                    Debug.LogError("Exception in OnStartServer:" + e.Message + " " + e.StackTrace);
                }
            }

            if (NetworkClient.active && NetworkServer.localClientActive)
            {
                // there will be no spawn message, so start the client here too
                ClientScene.SetLocalObject(netId, gameObject);
                OnStartClient();
            }

            if (m_HasAuthority)
            {
                OnStartAuthority();
            }
        }
コード例 #18
0
 internal static bool GetInvokerForHashClientRpc(int cmdHash, out Type invokeClass, out NetworkBehaviour.CmdDelegate invokeFunction)
 {
     return(NetworkBehaviour.GetInvokerForHash(cmdHash, NetworkBehaviour.UNetInvokeType.ClientRpc, out invokeClass, out invokeFunction));
 }
コード例 #19
0
        public void RebuildObservers(bool initialize)
        {
            if (m_Observers == null)
            {
                return;
            }

            bool changed = false;
            bool result  = false;
            HashSet <NetworkConnection> newObservers = new HashSet <NetworkConnection>();
            HashSet <NetworkConnection> oldObservers = new HashSet <NetworkConnection>(m_Observers);

            for (int i = 0; i < m_NetworkBehaviours.Length; i++)
            {
                NetworkBehaviour comp = m_NetworkBehaviours[i];
                result |= comp.OnRebuildObservers(newObservers, initialize);
            }
            if (!result)
            {
                // none of the behaviours rebuilt our observers, use built-in rebuild method
                if (initialize)
                {
                    for (int i = 0; i < NetworkServer.connections.Count; i++)
                    {
                        var conn = NetworkServer.connections[i];
                        if (conn == null)
                        {
                            continue;
                        }
                        if (conn.isReady)
                        {
                            AddObserver(conn);
                        }
                    }

                    for (int i = 0; i < NetworkServer.localConnections.Count; i++)
                    {
                        var conn = NetworkServer.localConnections[i];
                        if (conn == null)
                        {
                            continue;
                        }
                        if (conn.isReady)
                        {
                            AddObserver(conn);
                        }
                    }
                }
                return;
            }

            // apply changes from rebuild
            foreach (var conn in newObservers)
            {
                if (conn == null)
                {
                    continue;
                }

                if (!conn.isReady)
                {
                    if (LogFilter.logWarn)
                    {
                        Debug.LogWarning("Observer is not ready for " + gameObject + " " + conn);
                    }
                    continue;
                }

                if (initialize || !oldObservers.Contains(conn))
                {
                    // new observer
                    conn.AddToVisList(this);
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("New Observer for " + gameObject + " " + conn);
                    }
                    changed = true;
                }
            }

            foreach (var conn in oldObservers)
            {
                if (!newObservers.Contains(conn))
                {
                    // removed observer
                    conn.RemoveFromVisList(this, false);
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Removed Observer for " + gameObject + " " + conn);
                    }
                    changed = true;
                }
            }

            // special case for local client.
            if (initialize)
            {
                for (int i = 0; i < NetworkServer.localConnections.Count; i++)
                {
                    if (!newObservers.Contains(NetworkServer.localConnections[i]))
                    {
                        OnSetLocalVisibility(false);
                    }
                }
            }

            if (!changed)
            {
                return;
            }

            m_Observers = new List <NetworkConnection>(newObservers);

            // rebuild hashset once we have the final set of new observers
            m_ObserverConnections.Clear();
            for (int i = 0; i < m_Observers.Count; i++)
            {
                m_ObserverConnections.Add(m_Observers[i].connectionId);
            }
        }
コード例 #20
0
 public static string DumpParams(this UnityEngine.Networking.NetworkBehaviour behaviour)
 {
     return(string.Format("isClient: {0}\nisServer: {1}\nhasAuthority: {2}",
                          behaviour.isClient, behaviour.isServer, behaviour.hasAuthority));
 }
コード例 #21
0
 public void InitializeBehaviour(NetworkBehaviour beh, int cmdHash)
 {
     m_Behaviour = beh;
     m_CmdHash   = cmdHash;
 }
コード例 #22
0
 internal void HandleCommand(int cmdHash, NetworkReader reader)
 {
     if (base.gameObject == null)
     {
         string cmdHashHandlerName = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
         if (LogFilter.logWarn)
         {
             Debug.LogWarning(string.Concat(new object[] { "Command [", cmdHashHandlerName, "] received for deleted object [netId=", this.netId, "]" }));
         }
     }
     else
     {
         bool flag = false;
         for (int i = 0; i < this.m_NetworkBehaviours.Length; i++)
         {
             NetworkBehaviour behaviour = this.m_NetworkBehaviours[i];
             if (behaviour.InvokeCommand(cmdHash, reader))
             {
                 flag = true;
                 break;
             }
         }
         if (!flag)
         {
             string str2 = NetworkBehaviour.GetCmdHashHandlerName(cmdHash);
             if (LogFilter.logError)
             {
                 Debug.LogError(string.Concat(new object[] { "Found no receiver for incoming command [", str2, "] on ", base.gameObject, ",  the server and client should have the same NetworkBehaviour instances [netId=", this.netId, "]." }));
             }
         }
         NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, 5, NetworkBehaviour.GetCmdHashCmdName(cmdHash), 1);
     }
 }