コード例 #1
0
ファイル: CSBot.cs プロジェクト: perryh/Diablo2Clientless1.09
        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++;
            }
        }