/// <summary> /// Starts the main game process. /// </summary> /// <param name="processId">The index of the game process to start (for RA2 support; /// GameOptions.ini -> GameExecutableNames= allows multiple names).</param> public static void StartGameProcess(int processId) { string gameExecutableName = ClientConfiguration.Instance.GetGameExecutableName(processId); string extraCommandLine = ClientConfiguration.Instance.ExtraExeCommandLineParameters; File.Delete(ProgramConstants.GamePath + "DTA.LOG"); File.Delete(ProgramConstants.GamePath + "TI.LOG"); File.Delete(ProgramConstants.GamePath + "TS.LOG"); GameProcessStarting?.Invoke(); if (UserINISettings.Instance.WindowedMode) { Logger.Log("Windowed mode is enabled - using QRes."); Process QResProcess = new Process(); QResProcess.StartInfo.FileName = ProgramConstants.QRES_EXECUTABLE; QResProcess.StartInfo.UseShellExecute = false; if (!string.IsNullOrEmpty(extraCommandLine)) { QResProcess.StartInfo.Arguments = "c=16 /R " + "\"" + ProgramConstants.GamePath + gameExecutableName + "\" " + extraCommandLine + " -SPAWN"; } else { QResProcess.StartInfo.Arguments = "c=16 /R " + "\"" + ProgramConstants.GamePath + gameExecutableName + "\" " + "-SPAWN"; } QResProcess.EnableRaisingEvents = true; QResProcess.Exited += new EventHandler(Process_Exited); try { QResProcess.Start(); } catch (Exception ex) { Logger.Log("Error launching QRes: " + ex.Message); MessageBox.Show("Error launching " + ProgramConstants.QRES_EXECUTABLE + ". Please check that your anti-virus isn't blocking the CnCNet Client. " + "You can also try running the client as an administrator." + Environment.NewLine + Environment.NewLine + "You are unable to participate in this match." + Environment.NewLine + Environment.NewLine + "Returned error: " + ex.Message, "Error launching game", MessageBoxButtons.OK); Process_Exited(QResProcess, EventArgs.Empty); return; } if (Environment.ProcessorCount > 1) { QResProcess.ProcessorAffinity = (IntPtr)2; } } else { Process DtaProcess = new Process(); DtaProcess.StartInfo.FileName = gameExecutableName; DtaProcess.StartInfo.UseShellExecute = false; if (!string.IsNullOrEmpty(extraCommandLine)) { DtaProcess.StartInfo.Arguments = " " + extraCommandLine + " -SPAWN"; } else { DtaProcess.StartInfo.Arguments = "-SPAWN"; } DtaProcess.EnableRaisingEvents = true; DtaProcess.Exited += new EventHandler(Process_Exited); try { DtaProcess.Start(); } catch (Exception ex) { Logger.Log("Error launching " + gameExecutableName + ": " + ex.Message); MessageBox.Show("Error launching " + gameExecutableName + ". Please check that your anti-virus isn't blocking the CnCNet Client. " + "You can also try running the client as an administrator." + Environment.NewLine + Environment.NewLine + "You are unable to participate in this match." + Environment.NewLine + Environment.NewLine + "Returned error: " + ex.Message, "Error launching game", MessageBoxButtons.OK); Process_Exited(DtaProcess, EventArgs.Empty); return; } if (Environment.ProcessorCount > 1) { DtaProcess.ProcessorAffinity = (IntPtr)2; } } GameProcessStarted?.Invoke(); Logger.Log("Waiting for qres.dat or " + gameExecutableName + " to exit."); }
/// <summary> /// Starts the main game process. /// </summary> public static void StartGameProcess(GameSessionManager sessionManager) { GameSessionManager = sessionManager; Logger.Log("About to launch main game executable."); // Re-process INI files PreprocessorBackgroundTask.Instance.Run(); // Wait for INI preprocessing to complete. Time-out if it seems to have stalled. // TODO ideally this should be handled in the UI so the client doesn't appear just frozen for the user. int waitTimes = 0; while (PreprocessorBackgroundTask.Instance.IsRunning) { Thread.Sleep(1000); waitTimes++; if (waitTimes > 10) { MessageBox.Show("INI preprocessing not complete. Please try " + "launching the game again. If the problem persists, " + "contact the game or mod authors for support."); return; } } OSVersion osVersion = ClientConfiguration.Instance.GetOperatingSystemVersion(); string gameExecutableName; string additionalExecutableName = string.Empty; if (osVersion == OSVersion.UNIX) { gameExecutableName = ClientConfiguration.Instance.UnixGameExecutableName; } else { string launcherExecutableName = ClientConfiguration.Instance.GameLauncherExecutableName; if (string.IsNullOrEmpty(launcherExecutableName)) { gameExecutableName = ClientConfiguration.Instance.GetGameExecutableName(); } else { gameExecutableName = launcherExecutableName; additionalExecutableName = "\"" + ClientConfiguration.Instance.GetGameExecutableName() + "\" "; } } string extraCommandLine = ClientConfiguration.Instance.ExtraExeCommandLineParameters; File.Delete(ProgramConstants.GamePath + "DTA.LOG"); File.Delete(ProgramConstants.GamePath + "TI.LOG"); File.Delete(ProgramConstants.GamePath + "TS.LOG"); GameProcessStarting?.Invoke(); if (UserINISettings.Instance.WindowedMode && UseQres) { Logger.Log("Windowed mode is enabled - using QRes."); Process QResProcess = new Process(); QResProcess.StartInfo.FileName = ProgramConstants.QRES_EXECUTABLE; QResProcess.StartInfo.UseShellExecute = false; if (!string.IsNullOrEmpty(extraCommandLine)) { QResProcess.StartInfo.Arguments = "c=16 /R " + "\"" + ProgramConstants.GamePath + gameExecutableName + "\" " + additionalExecutableName + "-SPAWN " + extraCommandLine; } else { QResProcess.StartInfo.Arguments = "c=16 /R " + "\"" + ProgramConstants.GamePath + gameExecutableName + "\" " + additionalExecutableName + "-SPAWN"; } QResProcess.EnableRaisingEvents = true; QResProcess.Exited += new EventHandler(Process_Exited); Logger.Log("Launch executable: " + QResProcess.StartInfo.FileName); Logger.Log("Launch arguments: " + QResProcess.StartInfo.Arguments); try { QResProcess.Start(); } catch (Exception ex) { Logger.Log("Error launching QRes: " + ex.Message); MessageBox.Show("Error launching " + ProgramConstants.QRES_EXECUTABLE + ". Please check that your anti-virus isn't blocking the CnCNet Client. " + "You can also try running the client as an administrator." + Environment.NewLine + Environment.NewLine + "You are unable to participate in this match." + Environment.NewLine + Environment.NewLine + "Returned error: " + ex.Message, "Error launching game", MessageBoxButtons.OK); Process_Exited(QResProcess, EventArgs.Empty); return; } if (Environment.ProcessorCount > 1 && SingleCoreAffinity) { QResProcess.ProcessorAffinity = (IntPtr)2; } } else { Process DtaProcess = new Process(); DtaProcess.StartInfo.FileName = gameExecutableName; DtaProcess.StartInfo.UseShellExecute = false; if (!string.IsNullOrEmpty(extraCommandLine)) { DtaProcess.StartInfo.Arguments = " " + additionalExecutableName + "-SPAWN " + extraCommandLine; } else { DtaProcess.StartInfo.Arguments = additionalExecutableName + "-SPAWN"; } DtaProcess.EnableRaisingEvents = true; DtaProcess.Exited += new EventHandler(Process_Exited); Logger.Log("Launch executable: " + DtaProcess.StartInfo.FileName); Logger.Log("Launch arguments: " + DtaProcess.StartInfo.Arguments); try { DtaProcess.Start(); Logger.Log("GameProcessLogic: Process started."); } catch (Exception ex) { Logger.Log("Error launching " + gameExecutableName + ": " + ex.Message); MessageBox.Show("Error launching " + gameExecutableName + ". Please check that your anti-virus isn't blocking the CnCNet Client. " + "You can also try running the client as an administrator." + Environment.NewLine + Environment.NewLine + "You are unable to participate in this match." + Environment.NewLine + Environment.NewLine + "Returned error: " + ex.Message, "Error launching game", MessageBoxButtons.OK); Process_Exited(DtaProcess, EventArgs.Empty); return; } if (Environment.ProcessorCount > 1 && SingleCoreAffinity) { DtaProcess.ProcessorAffinity = (IntPtr)2; } } GameProcessStarted?.Invoke(); Logger.Log("Waiting for qres.dat or " + gameExecutableName + " to exit."); }