Exemplo n.º 1
0
        void GameThread()
        {
            if (needLoadData)
            {
                FLLog.Info("Server", "Loading Game Data...");
                GameData.LoadData(null);
                FLLog.Info("Server", "Finished Loading Game Data");
            }
            InitBaselinePrices();
            Database = new ServerDatabase(this);
            Listener?.Start();
            double lastTime = 0;

            processingLoop = new ServerLoop(Process);
            processingLoop.Start();
            Listener?.Stop();
        }
Exemplo n.º 2
0
        void NetThread()
        {
            EventBasedNetListener listener = new EventBasedNetListener();
            int unique = Environment.TickCount;

            listener.ConnectionRequestEvent += request =>
            {
                if (Server.ConnectedPeersCount > MaxConnections)
                {
                    request.Reject();
                }
                else
                {
                    request.AcceptIfKey(AppIdentifier);
                }
            };
            listener.PeerConnectedEvent += peer =>
            {
                FLLog.Info("Server", $"Connected: {peer.EndPoint}");
                BeginAuthentication(peer);
            };
            listener.PeerDisconnectedEvent += (peer, info) =>
            {
                FLLog.Info("Server", $"Disconnected: {peer.EndPoint}");
                if (peer.Tag is Player player)
                {
                    player.Disconnected();
                    lock (game.ConnectedPlayers)
                    {
                        game.ConnectedPlayers.Remove(player);
                    }
                }
            };
            listener.NetworkReceiveUnconnectedEvent += (point, reader, type) =>
            {
                try
                {
                    if (type == UnconnectedMessageType.Broadcast)
                    {
                        if (!reader.TryGetString(out string str))
                        {
                            return;
                        }
                        if (str != LNetConst.BROADCAST_KEY)
                        {
                            return;
                        }
                        var dw = new NetDataWriter();
                        dw.Put((int)1);
                        dw.Put(unique);
                        dw.Put(game.ServerName);
                        dw.Put(game.ServerDescription);
                        dw.Put(game.GameData.DataVersion);
                        dw.Put(Server.ConnectedPeersCount);
                        dw.Put(MaxConnections);
                        Server.SendUnconnectedMessage(dw, point);
                    }
                    else if (type == UnconnectedMessageType.BasicMessage)
                    {
                        if (!reader.TryGetUInt(out uint magic))
                        {
                            return;
                        }
                        if (magic != LNetConst.PING_MAGIC)
                        {
                            return;
                        }
                        var dw = new NetDataWriter();
                        dw.Put((int)0);
                        Server.SendUnconnectedMessage(dw, point);
                    }
                }
                finally
                {
                    reader.Recycle();
                }
            };
            listener.NetworkReceiveEvent += (peer, reader, channel, method) =>
            {
                try
                {
                    var pkt = Packets.Read(reader);
                    if (peer.Tag == TagConnecting)
                    {
                        if (pkt is AuthenticationReplyPacket)
                        {
                            var auth = (AuthenticationReplyPacket)pkt;
                            if (auth.Guid == Guid.Empty)
                            {
                                var dw = new NetDataWriter();
                                dw.Put("bad GUID");
                                peer.Disconnect(dw);
                            }
                            else
                            {
                                var p = new Player(new RemotePacketClient(peer),
                                                   game, auth.Guid);
                                peer.Tag = p;
                                Task.Run(() => p.DoAuthSuccess());
                                lock (game.ConnectedPlayers)
                                {
                                    game.ConnectedPlayers.Add(p);
                                }
                            }
                        }
                        else
                        {
                            var dw = new NetDataWriter();
                            dw.Put("Invalid packet");
                            peer.Disconnect(dw);
                        }
                    }
                    else
                    {
                        var player = (Player)peer.Tag;
                        //Task.Run(() => player.ProcessPacket(pkt));
                        player.ProcessPacket(pkt);
                    }
                }
                catch (Exception)
                {
                    throw;
                    var dw = new NetDataWriter();
                    dw.Put("Packet processing error");
                    peer.Disconnect(dw);
                    if (peer.Tag is Player p)
                    {
                        p.Disconnected();
                    }
                }
                finally
                {
                    reader.Recycle();
                }
            };
            listener.DeliveryEvent += (peer, data) =>
            {
                if (data is Action onAck)
                {
                    onAck();
                }
            };
            Server          = new NetManager(listener);
            Server.IPv6Mode = IPv6Mode.SeparateSocket;
            Server.UnconnectedMessagesEnabled = true;
            Server.BroadcastReceiveEnabled    = true;
            Server.ChannelsCount  = 3;
            Server.UnsyncedEvents = true;
            Server.Start(Port);
            FLLog.Info("Server", "Listening on port " + Port);
            var        sw       = Stopwatch.StartNew();
            var        last     = 0.0;
            ServerLoop sendLoop = null;

            sendLoop = new ServerLoop((time) =>
            {
                foreach (var p in Server.ConnectedPeerList)
                {
                    if (p.Tag is Player player)
                    {
                        (player.Client as RemotePacketClient)?.Update(time.TotalSeconds);
                    }
                }

                if (!running)
                {
                    sendLoop.Stop();
                }
            });
            sendLoop.Start();
            Server.Stop();
        }