コード例 #1
0
        private static void ExecuteSwitcher(ISession session, EncounteredEvent encounterEV)
        {
            //if distance is very far. that is snip pokemon
            var accountManager = TinyIoCContainer.Current.Resolve <MultiAccountManager>();

            session.Cache.Add(CatchPokemonTask.GetUsernameEncounterCacheKey(session.Settings.Username, encounterEV.EncounterId), encounterEV, DateTime.Now.AddMinutes(15));

            var evalNextBot = accountManager.FindAvailableAccountForPokemonSwitch(encounterEV.EncounterId);

            if (evalNextBot == null)
            {
                return;
            }

            if (session.Stats.IsSnipping
                //assume that all pokemon catch from 250+m is snipe
                || LocationUtils.CalculateDistanceInMeters(
                    encounterEV.Latitude,
                    encounterEV.Longitude,
                    session.Client.CurrentLatitude,
                    session.Client.CurrentLongitude
                    ) > 1000)
            {
                var snipePokemonFiler = session.LogicSettings.PokemonSnipeFilters.GetFilter <SnipeFilter>(encounterEV.PokemonId);

                if (session.LogicSettings.PokemonSnipeFilters.ContainsKey(encounterEV.PokemonId))
                {
                    var filter = session.LogicSettings.PokemonSnipeFilters[encounterEV.PokemonId];
                    if (accountManager.AllowMultipleBot() &&
                        filter.AllowMultiAccountSnipe &&
                        filter.IsMatch(encounterEV.IV,
                                       (PokemonMove)Enum.Parse(typeof(PokemonMove), encounterEV.Move1),
                                       (PokemonMove)Enum.Parse(typeof(PokemonMove), encounterEV.Move2),
                                       encounterEV.Level, true))
                    {
                        //throw
                        throw new ActiveSwitchByPokemonException()
                              {
                                  EncounterData          = encounterEV,
                                  LastLatitude           = encounterEV.Latitude,
                                  LastLongitude          = encounterEV.Longitude,
                                  LastEncounterPokemonId = encounterEV.PokemonId,
                                  Snipe = true,
                                  Bot   = evalNextBot
                              };
                    }
                }

                return;
            }

            if (MultipleBotConfig.IsMultiBotActive(session.LogicSettings, accountManager) &&
                session.LogicSettings.MultipleBotConfig.OnRarePokemon &&
                (
                    session.LogicSettings.MultipleBotConfig.MinIVToSwitch < encounterEV.IV ||
                    (
                        session.LogicSettings.BotSwitchPokemonFilters.ContainsKey(encounterEV.PokemonId) &&
                        (
                            session.LogicSettings.BotSwitchPokemonFilters[encounterEV.PokemonId].IV < encounterEV.IV ||
                            (session.LogicSettings.BotSwitchPokemonFilters[encounterEV.PokemonId].LV > 0 && session
                             .LogicSettings.BotSwitchPokemonFilters[encounterEV.PokemonId]
                             .LV < encounterEV.Level)
                        )
                    )
                ))
            {
                if (evalNextBot != null)
                {
                    //cancel all running task.
                    session.CancellationTokenSource.Cancel();
                    throw new ActiveSwitchByPokemonException()
                          {
                              LastLatitude           = encounterEV.Latitude,
                              LastLongitude          = encounterEV.Longitude,
                              LastEncounterPokemonId = encounterEV.PokemonId,
                              Bot = evalNextBot
                          };
                }
            }
        }