public async Task Run() { _csconfig.Validate(); var clients = new List <Tuple <AccountCharacter, Client> >(); foreach (var account in _csconfig.Accounts) { var client = new Client(); var accountAndClient = Tuple.Create(account, client); client.OnReceivedPacketEvent(InComingPacket.EventMessage, (packet) => HandleEventMessage(client, new EventNotifyPacket(packet))); if (GetIsLeadClient(accountAndClient)) { client.OnReceivedPacketEvent(InComingPacket.PlayerInGame, (packet) => NewPlayerJoinGame(client, new PlayerInGamePacket(packet))); } _externalMessagingClient.RegisterClient(client); clients.Add(accountAndClient); } int gameCount = 1; while (true) { ; var leaveTasks = clients.Select(async(c, i) => { return(await LeaveGameAndRejoinMCPWithRetry(c.Item2, c.Item1)); }).ToList(); var leaveResults = await Task.WhenAll(leaveTasks); if (leaveResults.Any(r => !r)) { Log.Warning($"One or more characters failed to leave and rejoin"); continue; } await Task.Delay(TimeSpan.FromSeconds(2)); var leadClient = clients.First(c => GetIsLeadClient(c)); var result = await RealmConnectHelpers.CreateGameWithRetry(gameCount, leadClient.Item2, _config, leadClient.Item1); gameCount = result.Item2; if (!result.Item1) { continue; } await GameLoop(clients, gameCount); gameCount++; } }