Esempio n. 1
0
        public void OnNetworkInstantiatedServer(string type, string owner, NetDataWriter writer)
        {
            netStates.Clear();
            netIDs.Clear();

            netStates.Add(SerializeNetworkState(writer));
            netIDs.Add(ID);

            foreach (NetComponent nComponent in Owner.GetAllComponents <NetComponent>())
            {
                // Skip NetworkIdentity component since it's already processed.
                if (nComponent is NetworkIdentity)
                {
                    continue;
                }

                nComponent.Setup(CurrentNetworkID, owner == "SERVER");
                NetworkObjects.TryAdd(CurrentNetworkID, nComponent);
                CurrentNetworkID++;
                if (nComponent is INetPersistable netPersist)
                {
                    netStates.Add(NetLogicHelper.SerializePersistable(netPersist));
                }
                else
                {
                    netStates.Add(null); // Padding for deserialization.
                }

                netIDs.Add(nComponent.ID);
            }
        }
Esempio n. 2
0
    // when scene loads, init all starting network objects
    void LoadObjectsInNewScene()
    {
        List <GameObject> startingEntities =
            GameObject.FindGameObjectWithTag("NetworkStartingEntities")?.GetComponent <NetworkStartingEntities>()?.startingEntities;

        if (startingEntities == null)
        {
            return;
        }
        foreach (GameObject obj in startingEntities)
        {
            if (obj == null)
            {
                continue;
            }
            NetworkObjects.RemoveIncorrectComponents(obj);
            NetworkSync sync = obj.GetComponent <NetworkSync>();
            if (obj == gameObject)
            {
                sync.Initialize(sync.ObjectID, sync.NetworkType);
                continue;
            }
            sync.Initialize(NextObjectID, sync.NetworkType);
            obj.SetActive(true);
        }
    }
Esempio n. 3
0
        public void CompleteInitialization(NetworkObject networkObject)
        {
            lock (NetworkObjects)
            {
                NetworkObjects.Add(networkObject.NetworkId, networkObject);
                NetworkObjectList.Add(networkObject);
            }

            List <Action <NetworkObject> > actions = null;

            lock (missingObjectBuffer)
            {
                missingObjectBuffer.TryGetValue(networkObject.NetworkId, out actions);
                missingObjectBuffer.Remove(networkObject.NetworkId);
            }

            if (actions == null)
            {
                return;
            }

            foreach (var action in actions)
            {
                action(networkObject);
            }
        }
Esempio n. 4
0
    // when scene loads, init all starting network objects
    void LoadObjectsInNewScene(int sceneStartingObjectID)
    {
        List <GameObject> startingEntities =
            GameObject.FindGameObjectWithTag("NetworkStartingEntities")?.GetComponent <NetworkStartingEntities>()?.startingEntities;

        if (startingEntities == null)
        {
            return;
        }
        currentObjectID = sceneStartingObjectID;
        foreach (GameObject obj in startingEntities)
        {
            // GameController doesn't follow the same rules
            NetworkObjects.RemoveIncorrectComponents(obj);
            NetworkSync sync = obj.GetComponent <NetworkSync>();
            if (string.IsNullOrWhiteSpace(sync.NetworkType))
            {
                throw new InvalidTypeException($"NetworkType field is empty in starting network object {obj.name}");
            }
            if (obj == gameObject)
            {
                sync.Initialize(sync.ObjectID, sync.NetworkType);
                continue;
            }
            sync.Initialize(NextObjectID, sync.NetworkType);
            obj.SetActive(false);
        }
        StartCoroutine(LoadObjectsCoroutine(startingEntities));
    }
Esempio n. 5
0
        public void OnNetworkInstantiatedClient(string type, bool isOwner, NetDataReader reader)
        {
            InstantiateData buffer    = new InstantiateData(reader);
            List <byte[]>   netStates = buffer.NetStates;

            uint[] netIDs = buffer.NetIDs;

            // Handle any NetComponents on the GameObject.
            int index = 1;

            foreach (NetComponent nComponent in Owner.GetAllComponents <NetComponent>())
            {
                // Skip NetworkIdentity component since it's already processed.
                if (nComponent is NetworkIdentity)
                {
                    continue;
                }

                nComponent.Setup(netIDs[index], isOwner);
                if (nComponent is INetPersistable persist && netStates[index] != null)
                {
                    NetLogicHelper.RestorePersistable(persist, netStates[index]);
                }

                NetworkObjects.TryAdd(netIDs[index], nComponent);
                index++;
            }
        }
Esempio n. 6
0
 public void Initialize()
 {
     networkObjects = GetComponent <NetworkObjects>();
     // network handlers
     natPunchEvent.NatIntroductionSuccess += (point, addrType, token) =>
     {
         var peer = netManager.Connect(point, ConnectionKey);
         Debug.Log($"NatIntroductionSuccess. Connecting to peer: {point}, type: {addrType}, connection created: {peer != null}");
     };
     netEvent.PeerConnectedEvent     += peer => { Debug.Log("PeerConnected: " + peer.EndPoint); };
     netEvent.ConnectionRequestEvent += request => { request.AcceptIfKey(ConnectionKey); };
     netEvent.NetworkReceiveEvent    += (peer, reader, deliveryMethod) => {
         netPacketProcessor.ReadAllPackets(reader, peer);
     };
     netEvent.PeerDisconnectedEvent += (peer, disconnectInfo) => { Debug.Log($"Peer {peer} Disconnected: {disconnectInfo.Reason}"); };
     // packet handlers
     netPacketProcessor.SubscribeReusable <NetworkMessagePacket, NetPeer>((packet, peer) =>
     {
         messages.SyncFromPacket(packet);
     });
     netPacketProcessor.SubscribeReusable <NetworkObjectDataPacket, NetPeer>((packet, peer) =>
     {
         data.SyncFromPacket(packet);
     });
     // connect
     netManager = new NetManager(netEvent)
     {
         IPv6Enabled     = IPv6Mode.Disabled,
         NatPunchEnabled = true
     };
     netManager.NatPunchModule.Init(natPunchEvent);
     netManager.Start();
     LoadObjectsInNewScene(0);
 }
        void Awake()
        {
            Initialize(_NetworkPlayerPrefab, this.transform);

            NetworkObjects.ObserveAdd().Subscribe(addEvent =>
            {
                ulong objectId = addEvent.Key;
                Debug.Log("Added ObjectID: " + objectId + ", Players.Count: " + NetworkObjects.Count);

                NetworkPlayer player = addEvent.Value;
                player.transform.SetParent(this.transform);

                if (player.IsOwner)
                {
                    _LocalPlayerObjectId = objectId;
                    _OnSpawnedLocalPlayerSubject.OnNext(player);
                }
            })
            .AddTo(this);

            NetworkObjects.ObserveRemove().Subscribe(removeEvent =>
            {
                ulong objectId = removeEvent.Key;
                Debug.Log("Removed ObjectID: " + objectId + ", Players.Count: " + NetworkObjects.Count);

                if (_LocalPlayerObjectId.Equals(objectId))
                {
                    _OnDespawnedLocalPlayerSubject.OnNext(Unit.Default);
                }
            })
            .AddTo(this);

            INetworkManager networkManager = _NetworkManagerObject.GetComponent <INetworkManager>();

            if (networkManager != null)
            {
                networkManager.OnClientConnectedAsObservable()
                .Where(_ => networkManager.IsServer)
                .Subscribe(clientId =>
                {
                    SpawnWithClientOwnership(clientId);
                })
                .AddTo(this);

                networkManager.OnClientDisconnectedAsObservable()
                .Where(_ => networkManager.IsServer)
                .Subscribe(clientId =>
                {
                    DespawnObjects(clientId);
                })
                .AddTo(this);
            }
            else
            {
                Debug.LogError("[SimpleMultiplayer] NetworkManager is null.");
            }
        }
Esempio n. 8
0
        public void NetClean()
        {
            List <uint> goNetIDs = NetIDs;

            for (int i = 0; i < goNetIDs.Count; i++)
            {
                NetworkObjects.TryRemove(goNetIDs[i], out _);
                SpawnedNetObjects.TryRemove(goNetIDs[i], out _);
            }
            Owner.OnDestroyInternal();
        }
Esempio n. 9
0
 public void CompleteInitialization(NetworkObject networkObject)
 {
     lock (NetworkObjects)
     {
         if (!NetworkObjects.ContainsKey(networkObject.NetworkId))
         {
             NetworkObjects.Add(networkObject.NetworkId, networkObject);
             NetworkObjectList.Add(networkObject);
         }
     }
 }
Esempio n. 10
0
        /// <summary>
        /// Used to manually remove a networkobject from the networker
        /// </summary>
        /// <param name="networkObject"></param>
        public void ManualRemove(NetworkObject networkObject)
        {
            lock (NetworkObjects)
            {
                NetworkObjects.Remove(networkObject.NetworkId);
            }

            lock (NetworkObjectList)
            {
                NetworkObjectList.Remove(networkObject);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// Used to manually remove a bunch of networkobjects from the networker
        /// </summary>
        /// <param name="networkObjects"></param>
        public void ManualRemove(List <NetworkObject> networkObjects)
        {
            foreach (NetworkObject obj in networkObjects)
            {
                lock (NetworkObjects)
                {
                    NetworkObjects.Remove(obj.NetworkId);
                }
            }

            foreach (NetworkObject obj in networkObjects)
            {
                lock (NetworkObjectList)
                {
                    NetworkObjectList.Remove(obj);
                }
            }
        }
        void Awake()
        {
            Initialize(_NetworkStatePrefab, this.transform);

            if (_NetworkServer != null)
            {
                _NetworkServer.OnServerStartedAsObservable()
                .Subscribe(_ =>
                {
                    SpawnWithServerOwnership();
                })
                .AddTo(this);
            }

            NetworkObjects.ObserveAdd().Subscribe(addEvent =>
            {
                _NetworkStateInstance = addEvent.Value;
                _OnInitializedStateInstanceSubject.OnNext(_NetworkStateInstance);
                _OnInitializedStateInstanceSubject.OnCompleted();
            })
            .AddTo(this);
        }
Esempio n. 13
0
        private void HandleBinaryFrameMessage(FrameStream frame, NetworkingPlayer player)
        {
            byte routerId = ((Binary)frame).RouterId;

            if (routerId == RouterIds.RPC_ROUTER_ID || routerId == RouterIds.BINARY_DATA_ROUTER_ID || routerId == RouterIds.CREATED_OBJECT_ROUTER_ID)
            {
                uint          id           = frame.StreamData.GetBasicType <uint>();
                NetworkObject targetObject = null;

                lock (NetworkObjects)
                {
                    NetworkObjects.TryGetValue(id, out targetObject);
                }

                if (targetObject == null)
                {
                    BufferMessageForMissingObject(id, routerId, frame, player);
                }
                else
                {
                    ExecuteRouterAction(routerId, targetObject, (Binary)frame, player);
                }
            }
            else if (routerId == RouterIds.NETWORK_OBJECT_ROUTER_ID)
            {
                NetworkObject.CreateNetworkObject(this, player, (Binary)frame);
            }
            else if (routerId == RouterIds.ACCEPT_MULTI_ROUTER_ID)
            {
                NetworkObject.CreateMultiNetworkObject(this, player, (Binary)frame);
            }
            else if (binaryMessageReceived != null)
            {
                binaryMessageReceived(player, (Binary)frame, this);
            }
        }
Esempio n. 14
0
        /// <summary>
        /// 这个可以调用的messageReceived事件调用的包装器
        /// A wrapper for the messageReceived event call that chindren of this can call
        /// </summary>
        protected void OnMessageReceived(NetworkingPlayer player, FrameStream frame)
        {
            // 客户端被服务器接收
            if (frame.GroupId == MessageGroupIds.NETWORK_ID_REQUEST && this is IClient)
            {
                Time.SetStartTime(frame.TimeStep);
                // 读取玩家ID, 创建客户端自己的NetworkingPlayer
                Me = new NetworkingPlayer(frame.StreamData.GetBasicType <uint>(), "0.0.0.0", false, null, this);
                Me.AssignPort(Port);
                OnServerAccepted();
                return;
            }

            // 收到ping
            if (frame.GroupId == MessageGroupIds.PING || frame.GroupId == MessageGroupIds.PONG)
            {
                // 发送ping时的 发送者时间
                long     receivedTimestep = frame.StreamData.GetBasicType <long>();
                DateTime received         = new DateTime(receivedTimestep);

                // 现在接收到反馈ping的时间 - 自己发送ping是的时间
                TimeSpan ms = DateTime.UtcNow - received;

                if (frame.GroupId == MessageGroupIds.PING)
                {
                    // 反馈ping, 将发送ping时的 发送者时间 一起发给他
                    Pong(player, received);
                }
                else
                {
                    // 接收都ping的反馈
                    OnPingRecieved(ms.TotalMilliseconds, player);
                }

                return;
            }

            // 二进制消息
            if (frame is Binary)
            {
                if (frame.RoomId == 0)
                {
                    byte routerId = ((Binary)frame).RouterId;
                    if (routerId == RouterIds.RPC_ROUTER_ID || routerId == RouterIds.BINARY_DATA_ROUTER_ID || routerId == RouterIds.CREATED_OBJECT_ROUTER_ID)
                    {
                        uint          id           = frame.StreamData.GetBasicType <uint>();
                        NetworkObject targetObject = null;

                        lock (NetworkObjects)
                        {
                            NetworkObjects.TryGetValue(id, out targetObject);
                        }

                        if (targetObject == null)
                        {
                            // 收到该网络对象的消息包
                            // 但是该玩家机器上还没有创建网络对象
                            // 就将该消息缓存器来,等待网络对象创建完再掉用
                            lock (missingObjectBuffer)
                            {
                                if (!missingObjectBuffer.ContainsKey(id))
                                {
                                    missingObjectBuffer.Add(id, new List <Action <NetworkObject> >());
                                }

                                missingObjectBuffer[id].Add((networkObject) =>
                                {
                                    ExecuteRouterAction(routerId, networkObject, (Binary)frame, player);
                                });
                            }

                            // TODO:  If the server is missing an object, it should have a timed buffer
                            // that way useless messages are not setting around in memory
                            // TODO:如果服务器缺少一个对象,它应该有一个定时缓冲区
                            //这种无用的消息不会在内存中设置

                            return;
                        }

                        ExecuteRouterAction(routerId, targetObject, (Binary)frame, player);
                    }
                    // 创建网络对象
                    else if (routerId == RouterIds.NETWORK_OBJECT_ROUTER_ID)
                    {
                        NetworkObject.CreateNetworkObject(this, player, (Binary)frame);
                    }
                    // 在服务器接受客户端时,将服务器现有的所有网络对象 发给该玩家,让他创建
                    else if (routerId == RouterIds.ACCEPT_MULTI_ROUTER_ID)
                    {
                        NetworkObject.CreateMultiNetworkObject(this, player, (Binary)frame);
                    }
                    else if (binaryMessageReceived != null)
                    {
                        binaryMessageReceived(player, (Binary)frame, this);
                    }
                }
                else if (binaryMessageReceived != null)
                {
                    binaryMessageReceived(player, (Binary)frame, this);
                }
            }
            // 文本消息
            else if (frame is Text && textMessageReceived != null)
            {
                textMessageReceived(player, (Text)frame, this);
            }

            if (messageReceived != null)
            {
                messageReceived(player, frame, this);
            }
        }
Esempio n. 15
0
 public ComboRoute(NetworkObjects.Route p)
 {
     this.p = p;
 }
Esempio n. 16
0
 private static LineP getStartLine(Parcour parcour, NetworkObjects.Route type)
 {
     Line nl = null;
     try
     {
         switch (type)
         {
             case NetworkObjects.Route.A:
                 {
                     nl = parcour.Line.Single(p => p.Type == (int)LineType.START_A); break;
                 }
             case NetworkObjects.Route.B:
                 {
                     nl = parcour.Line.Single(p => p.Type == (int)LineType.START_B); break;
                 }
             case NetworkObjects.Route.C:
                 {
                     nl = parcour.Line.Single(p => p.Type == (int)LineType.START_C); break;
                 }
             case NetworkObjects.Route.D:
                 {
                     nl = parcour.Line.Single(p => p.Type == (int)LineType.START_D); break;
                 }
         }
     }
     catch { }
     LineP l=null;
     if (nl != null)
     {
         l = new LineP();
         l.start = new Vector(nl.A.longitude, nl.A.latitude, 0);
         l.end = new Vector(nl.B.longitude, nl.B.latitude, 0);
         l.orientation = new Vector(nl.O.longitude, nl.O.latitude, 0);
     }
     return l;
 }
        /// <summary>
        /// Register a networked object with this networker
        /// </summary>
        /// <param name="networkObject">The object that is to be registered with this networker</param>
        /// <returns><c>true</c> if the object was registered successfully, else <c>false</c> if it has already been registered</returns>
        public bool RegisterNetworkObject(NetworkObject networkObject, uint forceId = 0)
        {
            uint id = currentNetworkObjectId;

            lock (NetworkObjects)
            {
                // If we are forcing this object
                if (forceId != 0)
                {
                    if (NetworkObjects.ContainsKey(forceId))
                    {
                        return(false);
                    }

                    id = forceId;

                    if (!networkObject.RegisterOnce(id))
                    {
                        throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                    }

                    //AddNetworkObject(forceId, networkObject);
                    //NetworkObjectList.Add(networkObject);
                }
                else
                {
                    do
                    {
                        if (NetworkObjects.ContainsKey(++currentNetworkObjectId))
                        {
                            continue;
                        }

                        if (!networkObject.RegisterOnce(currentNetworkObjectId))
                        {
                            // Backtrack since the next call to this method will increment before checking
                            currentNetworkObjectId--;

                            throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                        }

                        //AddNetworkObject(currentNetworkObjectId, networkObject);
                        //NetworkObjectList.Add(networkObject);
                        break;
                    } while (IsBound);
                }
            }

            // Assign the network id to the network object
            networkObject.RegisterOnce(id);

            // When this object is destroyed it needs to remove itself from the list
            networkObject.onDestroy += (NetWorker sender) =>
            {
                lock (NetworkObjects)
                {
                    NetworkObjects.Remove(networkObject.NetworkId);
                    NetworkObjectList.Remove(networkObject);
                }
            };

            return(true);
        }
        /// <summary>
        /// A wrapper for the messageReceived event call that chindren of this can call
        /// </summary>
        protected void OnMessageReceived(NetworkingPlayer player, FrameStream frame)
        {
            if (frame.GroupId == MessageGroupIds.NETWORK_ID_REQUEST && this is IClient)
            {
                Time.SetStartTime(frame.TimeStep);
                Me = new NetworkingPlayer(frame.StreamData.GetBasicType <uint>(), "0.0.0.0", false, null, this);
                Me.AssignPort(Port);
                OnServerAccepted();
                return;
            }

            if (frame.GroupId == MessageGroupIds.PING || frame.GroupId == MessageGroupIds.PONG)
            {
                long     receivedTimestep = frame.StreamData.GetBasicType <long>();
                DateTime received         = new DateTime(receivedTimestep);
                TimeSpan ms = DateTime.UtcNow - received;

                if (frame.GroupId == MessageGroupIds.PING)
                {
                    Pong(player, received);
                }
                else
                {
                    OnPingRecieved(ms.TotalMilliseconds, player);
                }

                return;
            }

            if (frame is Binary)
            {
                byte routerId = ((Binary)frame).RouterId;
                if (routerId == RouterIds.RPC_ROUTER_ID || routerId == RouterIds.BINARY_DATA_ROUTER_ID || routerId == RouterIds.CREATED_OBJECT_ROUTER_ID)
                {
                    uint          id           = frame.StreamData.GetBasicType <uint>();
                    NetworkObject targetObject = null;

                    lock (NetworkObjects)
                    {
                        NetworkObjects.TryGetValue(id, out targetObject);
                    }

                    if (targetObject == null)
                    {
                        lock (missingObjectBuffer)
                        {
                            if (!missingObjectBuffer.ContainsKey(id))
                            {
                                missingObjectBuffer.Add(id, new List <Action <NetworkObject> >());
                            }

                            missingObjectBuffer[id].Add((networkObject) =>
                            {
                                ExecuteRouterAction(routerId, networkObject, (Binary)frame, player);
                            });
                        }

                        // TODO:  If the server is missing an object, it should have a timed buffer
                        // that way useless messages are not setting around in memory

                        return;
                    }

                    ExecuteRouterAction(routerId, targetObject, (Binary)frame, player);
                }
                else if (routerId == RouterIds.NETWORK_OBJECT_ROUTER_ID)
                {
                    NetworkObject.CreateNetworkObject(this, player, (Binary)frame);
                }
                else if (routerId == RouterIds.ACCEPT_MULTI_ROUTER_ID)
                {
                    NetworkObject.CreateMultiNetworkObject(this, player, (Binary)frame);
                }
                else if (binaryMessageReceived != null)
                {
                    binaryMessageReceived(player, (Binary)frame, this);
                }
            }
            else if (frame is Text && textMessageReceived != null)
            {
                textMessageReceived(player, (Text)frame, this);
            }

            if (messageReceived != null)
            {
                messageReceived(player, frame, this);
            }
        }
Esempio n. 19
0
 public RoleCombo(NetworkObjects.Access role)
 {
     this.role = role;
 }