/// <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(); }
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(); }