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