/// <summary>
        /// Start the dedicated server process
        /// </summary>
        public override void StartServer()
        {
            srv_bClosing = false;

            if (srv_proc != null)
            {
                SSNL.Log(this, "Warning: Killing still-existing server process with ID " + srv_proc.Id);
                srv_proc.Kill();
                srv_proc = null;
            }
            SSNL.Log(this, "Starting");

            // generate rcon password
            srv_strRconPassword = "";
            string strAllowedCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

            for (int i = 0; i < 16; i++)
            {
                srv_strRconPassword += strAllowedCharacters[SSNL.Rnd.Next(0, strAllowedCharacters.Length)];
            }

            // get server flags in advance
            string strServerFlags = GetServerFlags();

            if (strServerFlags != "")
            {
                strServerFlags = " [" + strServerFlags + "]";
            }

            // write config file
            string strConfigFilename = GetWorkingDirectory() + "..\\SSNL\\_Server_" + srv_rowServer["ID"] + ".lua";

            if (File.Exists(strConfigFilename))
            {
                File.Delete(strConfigFilename);
            }
            using (StreamWriter writer = new StreamWriter(File.Create(strConfigFilename))) {
                writer.WriteLine("prj_strMultiplayerSessionName = \"" + GetName() + strServerFlags + "\"");
                writer.WriteLine("gam_bAllowJoinInProgress = " + (srv_rowServer["Duel"] == "1" ? "0" : "1"));
                writer.WriteLine("prj_strDisabledVoteTypes=\"" + GetDisallowedVotes() + "\"");

                srv_strBans = "";
                dynamic resBans = SSNL.DB.Query("SELECT * FROM `bans` WHERE `Server`=-1 OR `Server`=" + srv_rowServer["ID"]);
                // steamID;steamID;steamID#endingTimestamp;steamID#endingTimestamp
                foreach (dynamic ban in resBans)
                {
                    string strBanListing = ban["SteamID"];
                    if (ban["Time"] != "0")
                    {
                        strBanListing += "#" + CalculateBanUTC(ban["BanTime"], ban["Time"]) + "#";
                    }
                    srv_strBans += strBanListing + ";";
                }
                writer.WriteLine("ser_strBanList = \"" + srv_strBans + "\"");
                //writer.WriteLine("dofile \"SSNL/Global.lua\"");
            }

            // build start arguments
            string strStartArguments = "";

            strStartArguments += "+gamemode " + GetGameMode() + " ";
            //strStartArguments += "+sessionname \"" + GetName() + strServerFlags + "\" ";
            strStartArguments += "+exec \"" + strConfigFilename.Replace(GetWorkingDirectory() + "..\\", "") + "\" ";
            strStartArguments += "+maxplayers " + GetMaxPlayers() + " ";
            strStartArguments += "+port " + GetPort() + " ";
            strStartArguments += "+level " + GetFirstLevel() + " ";
            strStartArguments += "+maplistfile " + GetLevelListFile() + " ";
            strStartArguments += "+rconpass " + GetRconPassword() + " ";
            strStartArguments += "+fps 150 ";
            strStartArguments += "+gam_bAllowPowerupItems " + (GetPups() ? "1" : "0") + " ";
            strStartArguments += srv_rowServer["Extra"];

            // start process
            srv_proc = Process.Start(new ProcessStartInfo()
            {
                WorkingDirectory = srv_rowGame["WorkingDirectory"],
                FileName         = srv_rowGame["Executable"],
                Arguments        = strStartArguments.Trim(),
                WindowStyle      = ProcessWindowStyle.Hidden,
            });

            // start rcon connection
            if (!srv_bRestarting)
            {
                new Thread(new ThreadStart(ConnectionThread)).Start();
                new Thread(new ThreadStart(WaitThread)).Start();
            }

            // save initial stats
            SaveStats();
        }
Exemple #2
0
        public override void StartServer()
        {
            srv_bClosing = false;

            if (srv_proc != null)
            {
                SSNL.Log(this, "Warning: Killing still-existing server process with ID " + srv_proc.Id);
                srv_proc.Kill();
                srv_proc = null;
            }
            SSNL.Log(this, "Starting");
            SSNL.DB.Query("UPDATE `servers` SET `_LogLocation`=0 WHERE `ID`=" + srv_rowServer["ID"]);
            srv_iLastLogLocation = 0;

            // generate rcon password
            srv_strRconPassword = "";
            string strAllowedCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

            for (int i = 0; i < 16; i++)
            {
                srv_strRconPassword += strAllowedCharacters[SSNL.Rnd.Next(0, strAllowedCharacters.Length)];
            }

            // create dedicated scripts directory
            string strDirectory = GetWorkingDirectory() + "../Scripts/Dedicated/SSNL_" + srv_rowServer["ID"];

            if (!Directory.Exists(strDirectory))
            {
                Directory.CreateDirectory(strDirectory);
            }

            // init.ini
            if (File.Exists(strDirectory + "/init.ini"))
            {
                File.Delete(strDirectory + "/init.ini");
            }
            using (StreamWriter writer = new StreamWriter(File.Create(strDirectory + "/init.ini"))) {
                writer.WriteLine("gam_strSessionName = \"" + GetName() + "\";");
                writer.WriteLine("net_iPort = " + GetPort() + ";");
                writer.WriteLine("gam_iStartMode = " + GetStartMode() + ";");
                writer.WriteLine("gam_iStartDifficulty = 1;"); // normal diff only for now :I
                writer.WriteLine("gam_ctMaxPlayers = " + GetMaxPlayers() + ";");
                writer.WriteLine("net_strAdminPassword = \"" + srv_strRconPassword + "\";");
                writer.WriteLine("gam_bWaitAllPlayers = 0;");
                writer.WriteLine("gam_iCredits = 0;");
                writer.WriteLine("gam_bWeaponsStay = 0;");
                writer.WriteLine("gam_iTimeLimit = 15;");
                writer.WriteLine("gam_iFragLimit = 20;");
                writer.WriteLine("ded_tmTimeout = 5;");
                writer.WriteLine("ser_bWaitFirstPlayer = 1;");

                /*string strBans = "";
                 *
                 * writer.WriteLine("ser_strBanList = \"" + strBans + "\"");
                 * writer.WriteLine("dofile \"SSNL/Global.lua\"");*/
            }

            // 1_begin.ini
            if (File.Exists(strDirectory + "/1_begin.ini"))
            {
                File.Delete(strDirectory + "/1_begin.ini");
            }
            using (StreamWriter writer = new StreamWriter(File.Create(strDirectory + "/1_begin.ini"))) {
                writer.WriteLine("ded_strLevel = \"" + GetFirstLevel() + "\";");
            }

            // 1_end.ini
            if (File.Exists(strDirectory + "/1_end.ini"))
            {
                File.Delete(strDirectory + "/1_end.ini");
            }
            using (StreamWriter writer = new StreamWriter(File.Create(strDirectory + "/1_end.ini"))) {
                writer.WriteLine("Say(\"Level finished.\");");
            }

            // start process
            srv_proc = Process.Start(new ProcessStartInfo()
            {
                WorkingDirectory = srv_rowGame["WorkingDirectory"],
                FileName         = srv_rowGame["Executable"],
                Arguments        = "SSNL_" + srv_rowServer["ID"],
                WindowStyle      = ProcessWindowStyle.Hidden,
            });

            // start rcon connection
            if (!srv_bRestarting)
            {
                new Thread(new ThreadStart(WaitThread)).Start();
            }

            // save initial stats
            SaveStats();
        }