public RequestResult <string> Play() { List <PlayerInfo> players = _profile.PlayerData; for (int i = 0; i < players.Count; i++) { players[i].PlayerID = i; } var result = new RequestResult <string>(); for (int i = 0; i < modules.Count; i++) { modules[i].PrePlay(); } for (int i = 0; i < players.Count; i++) { PlayerInfo player = players[i]; HandlerContext context = _handlerManager.HandlerData.CreateContext(_profile, player); context.PlayerID = player.PlayerID; for (int j = 0; j < modules.Count; j++) { modules[j].PrePlayPlayer(player, i, context); } _handlerManager.Play(context, player); for (int j = 0; j < modules.Count; j++) { modules[j].PlayPlayer(player, i, context); } Thread.Sleep(TimeSpan.FromMilliseconds(_handlerManager.HandlerData.PauseBetweenStarts)); } return(result); }
public RequestResult <string> Play() { List <PlayerInfo> players = profile.PlayerData; for (int i = 0; i < players.Count; i++) { players[i].PlayerID = i; } RequestResult <String> result = new RequestResult <String>(); List <HandlerContext> contexts = new List <HandlerContext>(); for (int i = 0; i < players.Count; i++) { PlayerInfo player = players[i]; HandlerContext context = handlerManager.HandlerData.CreateContext(profile, player, hasKeyboardPlayer); contexts.Add(context); context.PlayerID = player.PlayerID; List <HandlerModule> modules = player.Modules; for (int j = 0; j < modules.Count; j++) { modules[j].PrePlayPlayer(i, context); } } // get all the SymlinkData from each players IOModule // and start the StartGame application to symlink them List <SymlinkGameData> symData = new List <SymlinkGameData>(); for (int i = 0; i < players.Count; i++) { PlayerInfo player = players[i]; IOModule mod = GetModule <IOModule>(player); SymlinkGameData data = mod.SymlinkData; symData.Add(data); } StartGameData symStartData = StartGameUtil.BuildSymlinkGameData(symData.ToArray()); // check if we need to kill mutexes bool killingMutexes = false; if (handlerManager.HandlerData.KillMutex?.Length > 0) { // need to also kill mutexes killingMutexes = true; StartGameData scanKillData = StartGameUtil.BuildScanKillMutexData(Path.GetFileNameWithoutExtension(userGame.ExePath), players.Count, handlerManager.HandlerData.KillMutex); StartGameUtil.RunMultipleTasks(new StartGameData[] { symStartData, scanKillData }, true); // wait for confirmation file that the folders were symlinked // (RunMultipleTasks doesnt wait for process to finish) string dataFile = StartGameUtil.GetStartDataPath(); for (; ;) { if (File.Exists(dataFile)) { try { string txt = File.ReadAllText(dataFile); bool res; if (bool.TryParse(txt, out res)) { break; } } catch { } } Thread.Sleep(250); } File.Delete(dataFile); } else { // just symlink the folders StartGameUtil.RunPreBuiltData(symStartData, true); } for (int i = 0; i < players.Count; i++) { PlayerInfo player = players[i]; HandlerContext context = contexts[i]; handlerManager.Play(context, player); List <HandlerModule> modules = player.Modules; for (int j = 0; j < modules.Count; j++) { modules[j].PlayPlayer(i, context); } Thread.Sleep(TimeSpan.FromMilliseconds(handlerManager.HandlerData.PauseBetweenStarts)); IGameProcessModule procModule = GetModule <IGameProcessModule>(player); if (handlerManager.HandlerData.WaitFullWindowLoad) { for (; ;) { Thread.Sleep(100); // check for window status if (procModule.HasWindowSetup(player)) { break; } } } if (killingMutexes) { // wait for StartGame confirmation that mutexes were killed string dataFile = StartGameUtil.GetStartDataPath(); for (; ;) { if (File.Exists(dataFile)) { try { string txt = File.ReadAllText(dataFile); bool res; if (bool.TryParse(txt, out res)) { break; } } catch { } } Thread.Sleep(250); } File.Delete(dataFile); } } return(result); }