Пример #1
0
        public async Task RunMultiplayer(CreateMultiplayerParameters parameters)
        {
            // check possibility to run a game
            var possibleToRun = _IsAlreadyHasRunGame();

            if (!possibleToRun || !_canRunNewGame)
            {
                _OnCreationError("You already have an active game");
            }
            else
            {
                // set service state
                _canRunNewGame = false;

                // get game setting
                var settings = _GetGameSettings(parameters.Game);

                // create run params
                var runParams = new ZMultiParams
                {
                    Game = parameters.Game,
                    PreferredArchitecture = settings.PreferredArchitecture,
                    Role     = parameters.PlayerRole,
                    ServerId = parameters.ServerModel.Id
                };

                try
                {
                    // create game to run
                    var gameProcess = await _gameFactory.CreateMultiAsync(runParams);

                    // create worker
                    var worker = (IGameWorker)_kernel.Get <MultiplayerGameWorker>();
                    worker.Complete += (sender, e) =>
                    {
                        _canRunNewGame = true;
                    };

                    // pass game created event
                    _OnCreated(worker, "Multiplayer", parameters.ServerModel.Name);

                    // run game
                    await worker.Begin(gameProcess, settings, parameters);
                }
                catch (Exception exc)
                {
                    // raise error event
                    _OnCreationError(exc.Message);

                    // reset service state
                    _canRunNewGame = true;
                }
            }
        }
Пример #2
0
        public async Task <IZGameProcess> CreateMultiAsync(ZMultiParams args)
        {
            ZConnectionHelper.MakeSureConnection();

            if ((args.Game == ZGame.BF3 || args.Game == ZGame.BFH) && args.Role == ZRole.Spectator)
            {
                throw new ArgumentException("BF3\\BFH is not support Spectator mode.");
            }

            var installedGames = await _installedGamesService.GetInstalledGamesAsync();

            if (installedGames == null)
            {
                throw new Exception("Installed games not received. Check your ZClient connection.");
            }

            var architecture = args.PreferredArchitecture ??
                               (installedGames.IsX64 ? ZGameArchitecture.x64 : ZGameArchitecture.x32);
            var compatibleGames = installedGames.InstalledGames
                                  .Where(insGame => insGame.EnumGame == args.Game)
                                  .ToArray();
            var targetGame = compatibleGames.Length > 1
                ? compatibleGames.FirstOrDefault(insGame => insGame.RunnableName.EndsWith(architecture.ToString()))
                : compatibleGames.FirstOrDefault();

            if (targetGame == null)
            {
                throw new Exception($"The target game {args.Game} not found.");
            }

            var commandRun = __runStrings[_MultiKey].ToObject <string>();

            commandRun = commandRun.Replace(_gameIdReplaceable, args.ServerId.ToString());
            commandRun = commandRun.Replace(_personaRefReplaceable, __userContext.UserId.ToString());

            if (args.Role != ZRole.Spectator)
            {
                commandRun = commandRun.Replace(_roleReplaceable, args.Role.ToString().ToLower());
                commandRun = commandRun.Replace(_isSpectatorReplaceable, string.Empty);
            }
            else
            {
                commandRun = commandRun.Replace(_roleReplaceable, ZRole.Soldier.ToString().ToLower());
                commandRun = commandRun.Replace(_isSpectatorReplaceable, _spectatorValue);
            }

            var runGame = _createRunGame(targetGame, commandRun, args.Game, architecture);

            return(runGame);
        }