コード例 #1
0
        void ITick.Tick(S server)
        {
            if ((WarGame.RunTime - lastPing) > PingInterval || isInitialPing)
            {
                isInitialPing = false;
                lastPing      = WarGame.RunTime;

                //Ignore client timeout in singleplayer games to make debugging easier
                if (server.LobbyInfo.NonBotClients.Count() < 2 && !server.Dedicated)
                {
                    foreach (var c in server.Conns.ToList())
                    {
                        server.SendOrderTo(c, "Ping", WarGame.RunTime.ToString());
                    }
                }
                else
                {
                    foreach (var c in server.Conns.ToList())
                    {
                        if (c == null || c.Socket == null)
                        {
                            continue;
                        }

                        var client = server.GetClient(c);
                        if (client == null)
                        {
                            server.DropClient(c);
                            server.SendMessage("A player has been dropped after timing out.");
                            continue;
                        }

                        if (c.TimeSinceLastResponse < ConnTimeout)
                        {
                            server.SendOrderTo(c, "Ping", WarGame.RunTime.ToString());
                            if (!c.TimeoutMessageShown && c.TimeSinceLastResponse > PingInterval * 2)
                            {
                                server.SendMessage(client.Name + " is experiencing connection problems.");
                                c.TimeoutMessageShown = true;
                            }
                        }
                        else
                        {
                            server.SendMessage(client.Name + " has benn dropped after timing out.");
                            server.DropClient(c);
                        }
                    }
                }

                if (WarGame.RunTime - lastConnReport > ConnReportInterval)
                {
                    lastConnReport = WarGame.RunTime;

                    var timeouts = server.Conns.Where(c => c.TimeSinceLastResponse > ConnReportInterval && c.TimeSinceLastResponse < ConnTimeout).OrderBy(c => c.TimeSinceLastResponse);

                    foreach (var c in timeouts)
                    {
                        if (c == null || c.Socket == null)
                        {
                            continue;
                        }

                        var client = server.GetClient(c);
                        if (client != null)
                        {
                            server.SendMessage("{0} will be dropped in {1} seconds.".F(client.Name, (ConnTimeout - c.TimeSinceLastResponse) / 1000));
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: LobbyCommands.cs プロジェクト: hadow/Commander
 void IClientJoined.ClientJoined(S server, EW.Server.Connection conn)
 {
     var client = server.GetClient(conn);
 }