Beispiel #1
0
 public void OnNetworkReceive(
     NetPeer peer,
     NetPacketReader reader,
     DeliveryMethod deliveryMethod)
 {
     if (!reader.IsNull)
     {
         peer.GetConnection().Receive(reader.GetRemainingBytesSegment());
     }
 }
Beispiel #2
0
        public void OnNetworkReceive(
            NetPeer peer,
            NetPacketReader reader,
            DeliveryMethod deliveryMethod)
        {
            if (reader.IsNull)
            {
                throw new InvalidNetworkPackageException($"Received empty package from ${peer}.");
            }

            peer.GetConnection()?.Receive(reader.GetRemainingBytesSegment());
        }
 public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod method)
 {
     byte[] data = reader.GetRemainingBytes();
     peer.GetConnection().serverPlayer.HandleReceive(new ByteReader(data), method == DeliveryMethod.ReliableOrdered);
 }
 public void OnNetworkLatencyUpdate(NetPeer peer, int latency)
 {
     peer.GetConnection().Latency = latency;
 }
        public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
        {
            IConnection conn = peer.GetConnection();

            server.OnDisconnected(conn, MpDisconnectReason.ClientLeft);
        }
Beispiel #6
0
 public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
 {
     m_Server.Disconnected(
         (ConnectionServer)peer.GetConnection(),
         disconnectInfo.GetReason(false));
 }
Beispiel #7
0
        /// <summary> Message loop to check type of message and handle it accordingly </summary>
        public void MessageLoop()
        {
            while ((_msg = _peer.ReadMessage()) != null)
            {
                s_bpsBytes += _msg.LengthBytes;
                switch (_msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryRequest:
                    //Debug.WriteLine("ReceivePeersData DiscoveryRequest");
                    _peer.SendDiscoveryResponse(null, _msg.SenderEndPoint);
                    break;

                case NetIncomingMessageType.DiscoveryResponse:
                    // just connect to first server discovered
                    //Debug.WriteLine("ReceivePeersData DiscoveryResponse CONNECT");
                    if (_peer.Connections.Any(x => x.RemoteEndPoint.Address.Equals(_msg.SenderEndPoint.Address)))
                    {
                        Debug.WriteLine("allreadyConnected");
                    }
                    else
                    {
                        _peer.Connect(_msg.SenderEndPoint);
                    }
                    break;

                case NetIncomingMessageType.ConnectionApproval:
                    //Debug.WriteLine("ReceivePeersData ConnectionApproval");
                    _msg.SenderConnection.Approve();
                    //broadcast this to all connected clients
                    SendPeerInfo(_msg.SenderEndPoint.Address, _msg.SenderEndPoint.Port);
                    break;

                case NetIncomingMessageType.Data:
                    //another client sent us data
                    //Read TypeData First
                    Enums.MessageType mType = (Enums.MessageType)_msg.ReadByte();

                    if (mType == Enums.MessageType.String)
                    {
                        var metadata = _msg.ReadString();
                        if (metadata == "StartEvent")
                        {
                            var map = _msg.ReadString();
                            _isMaster           = false;
                            MasterNetConnection = _peer.Connections.FirstOrDefault(x => x.RemoteEndPoint.Address.ToString() == _msg.SenderEndPoint.Address.ToString());
                            Game1.Inst.Scene.Raise("startgame", map);
                        }
                        else if (metadata == "metadata")
                        {
                            Game1.Inst.Scene.Raise("network_data_text", _msg.ReadString());
                        }
                    }
                    else if (mType == Enums.MessageType.PeerInformation)
                    {
                        int       byteLenth    = _msg.ReadInt32();
                        byte[]    addressBytes = _msg.ReadBytes(byteLenth);
                        IPAddress ip           = new IPAddress(addressBytes);
                        int       port         = _msg.ReadInt32();
                        //connect
                        IPEndPoint endPoint = new IPEndPoint(ip, port);
                        Debug.WriteLine("Data::PeerInfo::Detecting if we're connected");
                        if (_peer.GetConnection(endPoint) == null)
                        {    //are we already connected?
                            //Don't try to connect to ourself!
                            if (_peer.Configuration.LocalAddress.GetHashCode() != endPoint.Address.GetHashCode() ||
                                _peer.Configuration.Port.GetHashCode() != endPoint.Port.GetHashCode())
                            {
                                Debug.WriteLine(string.Format("Data::PeerInfo::Initiate new connection to: {0}:{1}", endPoint.Address.ToString(), endPoint.Port.ToString()));
                                _peer.Connect(endPoint);
                            }
                        }
                    }
                    else if (mType == Enums.MessageType.Entity || mType == Enums.MessageType.EntityLight)
                    {
                        var    cbody      = new CBody();
                        var    ctransform = new CTransform();
                        string modelname  = "";
                        bool   isPlayer   = false;
                        int    id         = 0;
                        id = mType == Enums.MessageType.EntityLight ? _msg.ReadEntityLight(ref cbody, ref ctransform, ref modelname, ref isPlayer) : _msg.ReadEntity(ref cbody, ref ctransform, ref modelname, ref isPlayer);
                        Game1.Inst.Scene.Raise("entityupdate", new EntitySync {
                            ID = id, CBody = cbody, CTransform = ctransform, ModelFileName = modelname, IsPlayer = isPlayer
                        });
                    }
                    else if (mType == Enums.MessageType.CTransform)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadCTransform();
                        //Game1.Inst.Scene.Raise("network_data", data);
                    }
                    else if (mType == Enums.MessageType.Vector3)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadCTransform();
                        //Game1.Inst.Scene.Raise("network_data", data);
                    }
                    else if (mType == Enums.MessageType.CText)
                    {
                        var id   = _msg.ReadInt32();
                        var data = _msg.ReadCText();
                        Game1.Inst.Scene.Raise("network_menu_data_received", new MenuItem {
                            CText = data, Id = id
                        });
                    }
                    else if (mType == Enums.MessageType.Int32)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadInt32();
                        if (metadata == "network_game_end")
                        {
                            Game1.Inst.Scene.Raise("game_end", data);
                        }
                    }
                    else if (mType == Enums.MessageType.PlayerInfo)
                    {
                        var date = _msg.ReadInt64();
                        if (!players.Any(x => x.IP == _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString()))
                        {
                            players.Add(new NetworkPlayer {
                                IP = _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString(), Time = new DateTime(date), You = false
                            });
                            Game1.Inst.Scene.Raise("update_peers", players.OrderBy(x => x.Time).ToList());
                        }
                    }
                    //Console.WriteLine("END ReceivePeersData Data");
                    break;

                case NetIncomingMessageType.UnconnectedData:
                    Debug.WriteLine("UnconnectedData: " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.VerboseDebugMessage:
                    Debug.WriteLine(NetIncomingMessageType.VerboseDebugMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.DebugMessage:
                    Debug.WriteLine(NetIncomingMessageType.DebugMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.WarningMessage:
                    Debug.WriteLine(NetIncomingMessageType.WarningMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    Debug.WriteLine(NetIncomingMessageType.ErrorMessage + " " + _msg.ReadString());
                    break;

                default:
                    Debug.WriteLine("ReceivePeersData Unknown type: " + _msg.MessageType.ToString());
                    try
                    {
                        Debug.WriteLine(_msg.SenderConnection);
                        if (_msg.SenderConnection.Status == NetConnectionStatus.Disconnected)
                        {
                            //Maybe try to reconnect
                        }
                        Debug.WriteLine(_msg.ReadString());
                    }
                    catch
                    {
                        Debug.WriteLine("Couldn't parse unknown to string.");
                    }
                    break;
                }
            }
        }
Beispiel #8
0
        public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
        {
            ConnectionBase conn = peer.GetConnection();

            server.playerManager.OnDisconnected(conn, MpDisconnectReason.ClientLeft);
        }
Beispiel #9
0
        /// <summary>
        /// Called by the Update method when status change messages are received.
        /// Connection, disconnection and approval requests, for example.
        /// </summary>
        /// <param name="message">The incoming message.</param>
        private void ProcessStatusChangedMessage(NetIncomingMessage message)
        {
            NetConnectionStatus newStatus = (NetConnectionStatus)message.ReadByte();

            switch (newStatus)
            {
            case NetConnectionStatus.Connected:

                // get ClientId provided by the server if we're a client
                if (Role == NetworkRole.Client)
                {
                    var serverConnection = network.GetConnection(message.SenderEndPoint);
                    var remoteHail       = serverConnection.RemoteHailMessage;
                    if (remoteHail != null)
                    {
                        ClientId = remoteHail.ReadByte();
                    }

                    // add the server to our client Id map, its ID is always 1
                    // old connection may still be around if it wasn't cleaned up
                    if (clientIdConnectionMap.ContainsKey(1))
                    {
                        clientIdConnectionMap[1] = serverConnection;
                    }
                    else
                    {
                        clientIdConnectionMap.Add(1, serverConnection);
                    }

                    log.Info($"Connected to: {message.SenderEndPoint} with Client ID {ClientId}");
                    Connected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier);
                }
                // send all game objects to new peer
                if (Role == NetworkRole.Server)
                {
                    var id = clientIdConnectionMap.Where(kvp => kvp.Value == message.SenderConnection).FirstOrDefault();
                    log.Info($"New client connected from: {message.SenderEndPoint} with id {id}");
                    SendCreateAllEntities(message.SenderConnection);
                    ClientConnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier);
                }

                RefreshConnectionCollection();
                break;

            case NetConnectionStatus.Disconnected:
                if (Role == NetworkRole.Client)
                {
                    log.Info("Disconnected from server.");
                    Disconnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier);
                }
                if (Role == NetworkRole.Server)
                {
                    log.Info("Client disconnected.");
                    ClientDisconnected?.Invoke(message.SenderConnection.RemoteUniqueIdentifier);
                    DestroyUnownedEntities();
                }
                RefreshConnectionCollection();
                break;

            case NetConnectionStatus.RespondedAwaitingApproval:
                SendApprovalMessage(message.SenderConnection);
                break;
            }
        }
Beispiel #10
0
        public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
        {
            IConnection conn = peer.GetConnection();

            server.OnDisconnected(conn);
        }
Beispiel #11
0
 public Context CreateRemoteContext(IPEndPoint target) =>
 new Context(NetPeer.GetConnection(target));
Beispiel #12
0
 public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
 {
     m_Server.Disconnected(
         (ConnectionServer)peer.GetConnection(),
         EDisconnectReason.ClientLeft);
 }