Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }