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