public static async Task Execute(ISession session, CancellationToken token) { try { if (session.LastCaptchaRequest < DateTime.UtcNow.ToUnixTime()) { session.LastCaptchaRequest = DateTime.UtcNow.AddMinutes(5).ToUnixTime(); var resp = await session.Client.Misc.CheckChallenge(); if (resp.ShowChallenge) { session.EventDispatcher.Send(new CheckChallengeEvent { ChallengeUrl = resp.ChallengeUrl, ShowChallenge = resp.ShowChallenge }); } await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, token); await CheckChallengeDoneTask.Execute(session, token); } } catch { //ignore } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (session.Runtime.PokestopsToCheckGym > 0) { return; } await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); var gymsNear = (await GetGyms(session)).OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)) .ToList(); if (gymsNear.Count > 0) { session.Runtime.PokestopsToCheckGym = 13 + session.Client.Rnd.Next(15); var nearestGym = gymsNear.FirstOrDefault(); if (nearestGym != null) { var gymInfo = await session.Client.Fort.GetGymDetails(nearestGym.Id, nearestGym.Latitude, nearestGym.Longitude); var gymDistance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, nearestGym.Latitude, nearestGym.Longitude); session.EventDispatcher.Send(new GymPokeEvent { Id = nearestGym.Id, Name = gymInfo.Name, Distance = gymDistance, Description = gymInfo.Description, GymState = gymInfo.GymState, Lat = nearestGym.Latitude, Lon = nearestGym.Longitude }); } } }
//Please do not change GetPokeStops() in this file, it's specifically set //to only find stops within 40 meters //this is for gpx pathing, we are not going to the pokestops, //so do not make it more than 40 because it will never get close to those stops. public static async Task Execute(ISession session, CancellationToken cancellationToken, bool sendPokeStopsEvent = false) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); var pokestopList = await GetPokeStops(session); if (sendPokeStopsEvent) { session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData).ToList() }); } while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); if (pokeStop.Used) { continue; } if (!session.LogicSettings.LootPokestops) { session.MapCache.UsedPokestop(pokeStop, session); continue; } var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); await DelayingUtils.Delay(session.LogicSettings.DelayPokestop, 5000); if (fortSearch.ExperienceAwarded > 0) { session.Runtime.StopsHit++; session.Runtime.PokestopsToCheckGym--; session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded, Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Latitude = pokeStop.Latitude, Longitude = pokeStop.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls.FirstOrDefault() }); if (fortSearch.PokemonDataEgg != null) { session.EventDispatcher.Send(new EggFoundEvent { Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget, PokeStopName = fortInfo.Name }); } session.MapCache.UsedPokestop(pokeStop, session); session.EventDispatcher.Send(new InventoryNewItemsEvent { Items = fortSearch.ItemsAwarded.ToItemList() }); if (session.Runtime.PokeBallsToCollect > 0) { session.Runtime.PokeBallsToCollect -= fortSearch.ItemsAwarded.ToItemList() .Where(x => x.Item1 == ItemId.ItemPokeBall || x.Item1 == ItemId.ItemGreatBall || x.Item1 == ItemId.ItemUltraBall || x.Item1 == ItemId.ItemMasterBall).Sum(x => x.Item2); } } if (pokeStop.LureInfo != null) {//because we're all f*****g idiots for not catching this sooner await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken); } } }
public static async Task Teleport(ISession session, CancellationToken cancellationToken, Random random) { bool ShownSoftBanMessage = false; int stopsToHit = 20; //We should return to the main loop after some point, might as well limit this. //Not sure where else we could put this? Configs maybe if we incorporate //deciding how many pokestops in a row we want to hit before doing things like recycling? //might increase xp/hr not stopping every 5 stops. - Pocket //TODO: run through this with a fine-tooth comb and optimize it. var pokestopList = await GetPokeStops(session); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData).ToList() }); for (int stopsHit = 0; stopsHit < stopsToHit; stopsHit++) { session.Runtime.BreakOutOfPathing = false; if (pokestopList.Count > 0) { //start at 0 ends with 19 = 20 for the leechers{ cancellationToken.ThrowIfCancellationRequested(); var distanceFromStart = LocationUtils.CalculateDistanceInMeters( session.Client.InitialLatitude, session.Client.InitialLongitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); // Edge case for when the client somehow ends up outside the defined radius if (session.LogicSettings.MaxTravelDistanceInMeters != 0 && distanceFromStart > session.LogicSettings.MaxTravelDistanceInMeters) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart) }); await Task.Delay(1000, cancellationToken); await session.Navigation.Move( new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude), session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, null, null, cancellationToken, session); } if (session.ForceMoveJustDone) { session.ForceMoveJustDone = false; } if (session.ForceMoveTo != null) { await ForceMoveTask.Execute(session, cancellationToken); pokestopList = await GetPokeStops(session); } if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited) { await session.EggWalker.InitEggWalker(cancellationToken); } if (pokestopList.Count <= 0) { if (!pokestopList.Any()) { await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); } session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); } cancellationToken.ThrowIfCancellationRequested(); await ActionQueueTask.Execute(session, cancellationToken); //resort pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); if (session.LogicSettings.UsePokeStopLuckyNumber) { if (pokestopList.Count >= session.LogicSettings.PokestopSkipLuckyNumberMinUse) { int rng = random.Next(session.LogicSettings.PokestopSkipLuckyMin, session.LogicSettings.PokestopSkipLuckyMax); #if DEBUG Logger.Write("Skip Pokestop RNG: " + rng + " against " + session.LogicSettings.PokestopSkipLuckyNumber, LogLevel.Debug); #endif if (rng == session.LogicSettings.PokestopSkipLuckyNumber) { #if DEBUG Logger.Write("Skipping Pokestop due to the rng god's will.", LogLevel.Debug); #endif pokestopList.RemoveAt(0); } } } var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); session.Runtime.TargetStopID = pokeStop.Id; var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); session.EventDispatcher.Send(new FortTargetEvent { Id = fortInfo.FortId, Name = fortInfo.Name, Distance = distance, Latitude = fortInfo.Latitude, Longitude = fortInfo.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls[0] }); if (session.LogicSettings.Teleport) { await session.Client.Player.UpdatePlayerLocation(fortInfo.Latitude, fortInfo.Longitude, session.Client.Settings.DefaultAltitude); } else { await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude), session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, async() => { if (session.LogicSettings.CatchWildPokemon) { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon remove this for time contraints //await CatchIncensePokemonsTask.Execute(session, cancellationToken); } return(true); }, async() => { await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, cancellationToken, session); } if (!session.LogicSettings.LootPokestops) { session.MapCache.UsedPokestop(pokeStop, session); continue; } if (!session.ForceMoveJustDone) { var timesZeroXPawarded = 0; var fortTry = 0; //Current check const int retryNumber = 50; //How many times it needs to check to clear softban const int zeroCheck = 5; //How many times it checks fort before it thinks it's softban if (session.Runtime.BreakOutOfPathing) { continue; } do { cancellationToken.ThrowIfCancellationRequested(); var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) { timesZeroXPawarded = 0; } if (fortSearch.ExperienceAwarded == 0) { timesZeroXPawarded++; if (timesZeroXPawarded > zeroCheck) { if ((int)fortSearch.CooldownCompleteTimestampMs != 0) { break; // Check if successfully looted, if so program can continue as this was "false alarm". } fortTry += 1; if (!ShownSoftBanMessage) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck }); ShownSoftBanMessage = true; } await Task.Delay(session.LogicSettings.DelaySoftbanRetry, cancellationToken); } } else { session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded, Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Latitude = pokeStop.Latitude, Longitude = pokeStop.Longitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull, Description = fortInfo.Description, url = fortInfo.ImageUrls[0] }); if (fortSearch.PokemonDataEgg != null) { session.EventDispatcher.Send(new EggFoundEvent { Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget, PokeStopName = fortInfo.Name }); } if (session.Runtime.PokeBallsToCollect > 0) { session.Runtime.PokeBallsToCollect -= fortSearch.ItemsAwarded.ToItemList() .Where(x => x.Item1 == ItemId.ItemPokeBall || x.Item1 == ItemId.ItemGreatBall || x.Item1 == ItemId.ItemUltraBall || x.Item1 == ItemId.ItemMasterBall).Sum(x => x.Item2); } session.MapCache.UsedPokestop(pokeStop, session); session.EventDispatcher.Send(new InventoryNewItemsEvent { Items = fortSearch.ItemsAwarded.ToItemList() }); break; //Continue with program as loot was succesfull. } } while (fortTry < retryNumber - zeroCheck); //Stop trying if softban is cleaned earlier or if 40 times fort looting failed. ShownSoftBanMessage = false; await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken); //Catch Lure Pokemon if (session.LogicSettings.CatchWildPokemon) { if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken); } // Catch normal map Pokemon if (session.LogicSettings.Teleport) { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); } //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); } await ActionQueueTask.Execute(session, cancellationToken); await MaintenanceTask.Execute(session, cancellationToken); } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } } }
public static async Task NoTeleport(ISession session, CancellationToken cancellationToken, Random random) { cancellationToken.ThrowIfCancellationRequested(); var distanceFromStart = LocationUtils.CalculateDistanceInMeters( session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); // Edge case for when the client somehow ends up outside the defined radius if (session.LogicSettings.MaxTravelDistanceInMeters != 0 && distanceFromStart > session.LogicSettings.MaxTravelDistanceInMeters) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart) }); await Task.Delay(1000, cancellationToken); await session.Navigation.Move( new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude), session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, null, null, cancellationToken, session); } var pokestopList = await GetPokeStops(session); //var stopsHit = 0; //Replaced with RuntimeSettings.stopsHit; //var displayStatsHit = 0; session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData).ToList() }); if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited) { await session.EggWalker.InitEggWalker(cancellationToken); } if (pokestopList.Count <= 0) { if (!pokestopList.Any()) { await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); } session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); } if (session.ForceMoveToResume != null && session.ForceMoveTo == null) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.UnDoneForceMove, session.ForceMoveToResume.Latitude, session.ForceMoveToResume.Longitude) }); session.ForceMoveTo = session.ForceMoveToResume; } var bestRoute = new List <GeoCoordinate>(); while (pokestopList.Any()) { session.Runtime.BreakOutOfPathing = false; cancellationToken.ThrowIfCancellationRequested(); if (session.ForceMoveTo != null) { await ForceMoveTask.Execute(session, cancellationToken); } if (session.ForceMoveJustDone) { session.ForceMoveJustDone = false; pokestopList = await GetPokeStops(session); session.Client.Player.SetInitial(session.Client.CurrentLatitude, session.Client.CurrentLongitude, session.Client.CurrentAltitude); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData).ToList() }); } if (session.LogicSettings.UseCustomRoute && session.LogicSettings.CustomRoute != null && session.LogicSettings.CustomRoute.RoutePoints.Count > 2) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.CustomRouteEnabled) }); break; } await ActionQueueTask.Execute(session, cancellationToken); //resort pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); if (session.LogicSettings.UsePokeStopLuckyNumber) { if (pokestopList.Count >= session.LogicSettings.PokestopSkipLuckyNumberMinUse) { int rng = random.Next(session.LogicSettings.PokestopSkipLuckyMin, session.LogicSettings.PokestopSkipLuckyMax); #if DEBUG Logger.Write("Skip Pokestop RNG: " + rng + " against " + session.LogicSettings.PokestopSkipLuckyNumber, LogLevel.Debug); #endif if (rng == session.LogicSettings.PokestopSkipLuckyNumber) { #if DEBUG Logger.Write("Skipping Pokestop due to the rng god's will.", LogLevel.Debug); #endif if (pokestopList.Count > 0) { pokestopList.RemoveAt(0); } } } } if (pokestopList.Count == 0) { break; } var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); //prolly no longer needed since MobBot Routing is dead. //Lunatiq //if (session.LogicSettings.RoutingService == RoutingService.GoogleDirections || session.LogicSettings.RoutingService == RoutingService.MapzenValhalla) //{ bestRoute = RoutingUtils.GetBestRoute(pokeStop, pokestopList.Where(x => !session.MapCache.CheckPokestopUsed(x)), 20); session.EventDispatcher.Send(new PokestopsOptimalPathEvent { Coords = bestRoute.Select(x => Tuple.Create(x.Latitude, x.Longitude)).ToList() }); //} session.Runtime.TargetStopID = pokeStop.Id; var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); session.EventDispatcher.Send(new FortTargetEvent { Id = fortInfo.FortId, Name = fortInfo.Name, Distance = distance, Latitude = fortInfo.Latitude, Longitude = fortInfo.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls?.Count > 0 ? fortInfo.ImageUrls[0] : "" }); await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude), session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, async() => { if (session.LogicSettings.CatchWildPokemon) { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon remove this for time constraints //await CatchIncensePokemonsTask.Execute(session, cancellationToken); } return(true); }, async() => { await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, cancellationToken, session, waypointsToVisit : bestRoute); if (!session.ForceMoveJustDone) { var timesZeroXPawarded = 0; var fortTry = 0; //Current check const int retryNumber = 50; //How many times it needs to check to clear softban const int zeroCheck = 5; //How many times it checks fort before it thinks it's softban if (session.Runtime.BreakOutOfPathing) { continue; } do { cancellationToken.ThrowIfCancellationRequested(); if (pokeStop.CooldownCompleteTimestampMS < DateTime.UtcNow.ToUnixTime()) { break; //already looted somehow } var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { await RecycleItemsTask.Execute(session, cancellationToken); } if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) { timesZeroXPawarded = 0; } if (fortSearch.ExperienceAwarded == 0) { timesZeroXPawarded++; if (timesZeroXPawarded > zeroCheck) { if ((int)fortSearch.CooldownCompleteTimestampMs != 0) { break; // Check if successfully looted, if so program can continue as this was "false alarm". } fortTry += 1; if (session.LogicSettings.Teleport) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck }); await Task.Delay(session.LogicSettings.DelaySoftbanRetry, cancellationToken); } else { await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 400); } } } else { session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded, Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Latitude = pokeStop.Latitude, Longitude = pokeStop.Longitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull, Description = fortInfo.Description, url = fortInfo.ImageUrls?[0] }); session.Runtime.StopsHit++; session.EventDispatcher.Send(new InventoryNewItemsEvent { Items = fortSearch.ItemsAwarded.ToItemList() }); if (fortSearch.PokemonDataEgg != null) { session.EventDispatcher.Send(new EggFoundEvent { Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget, PokeStopName = fortInfo.Name }); } if (session.Runtime.PokeBallsToCollect > 0) { session.Runtime.PokeBallsToCollect -= fortSearch.ItemsAwarded.ToItemList() .Where(x => x.Item1 == ItemId.ItemPokeBall || x.Item1 == ItemId.ItemGreatBall || x.Item1 == ItemId.ItemUltraBall || x.Item1 == ItemId.ItemMasterBall).Sum(x => x.Item2); } session.MapCache.UsedPokestop(pokeStop, session); break; //Continue with program as loot was succesfull. } } while (fortTry < 1); //retryNumber - zeroCheck && fortSearch.CooldownCompleteTimestampMs < DateTime.UtcNow.ToUnixTime()); //Stop trying if softban is cleaned earlier or if 40 times fort looting failed. await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken); //Catch Lure Pokemon if (session.LogicSettings.CatchWildPokemon) { if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken); } if (session.LogicSettings.Teleport) { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); } } } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); //Refresh inventory so that the player stats are fresh //await session.Inventory.RefreshCachedInventory(); too much inventory refresh await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); if (!session.LogicSettings.CatchWildPokemon) { return; } if (session.Runtime.PokeBallsToCollect > 0) { return; } //session.EventDispatcher.Send(new DebugEvent() //{ // Message = session.Translation.GetTranslation(TranslationString.LookingForPokemon) //}); var pokemons = await GetNearbyPokemons(session); if (session.LogicSettings.UsePokemonToNotCatchFilter) { pokemons = pokemons.Where(x => !session.LogicSettings.PokemonsNotToCatch.Contains(x.PokemonId)).ToList(); } session.EventDispatcher.Send(new PokemonsFoundEvent { Pokemons = pokemons.Select(x => x.BaseMapPokemon) }); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.FoundPokemons; pokemons = pokemons.OrderByDescending(x => x.PokemonId.HowRare()).ToList(); foreach (var pokemon in pokemons) { if (pokemon.ExpirationTimestampMs > DateTime.UtcNow.ToUnixTime()) { continue; } cancellationToken.ThrowIfCancellationRequested(); var pokeBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemPokeBall); var greatBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemGreatBall); var ultraBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemUltraBall); var masterBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemMasterBall); if (pokeBallsCount + greatBallsCount + ultraBallsCount + masterBallsCount == 0) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.ZeroPokeballInv) }); session.State = prevState; session.Runtime.PokeBallsToCollect = 10; session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); continue; } if (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemon.PokemonId)) { if (!pokemon.Caught) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonSkipped, session.Translation.GetPokemonName(pokemon.PokemonId)) }); } pokemon.Caught = true; session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); continue; } var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokemon.Latitude, pokemon.Longitude); await Task.Delay(distance > 100? 3000 : 500, cancellationToken); var encounter = await session.Client.Encounter.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnPointId); try { switch (encounter.Status) { case EncounterResponse.Types.Status.EncounterSuccess: var catchRes = await CatchPokemonTask.Execute(session, encounter, pokemon, cancellationToken); if (!catchRes) { session.Runtime.PokeBallsToCollect = 10; session.State = prevState; foreach (var p in pokemons) { session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = p.EncounterId }); } return; } break; case EncounterResponse.Types.Status.PokemonInventoryFull: if (session.LogicSettings.TransferDuplicatePokemon) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferring) }); session.State = BotState.Idle; await TransferDuplicatePokemonTask.Execute(session, cancellationToken); session.State = BotState.FoundPokemons; } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } break; default: session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblem, encounter.Status) }); break; } } catch (Exception) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.ErrorCatchNearby) }); await Task.Delay(5000, cancellationToken); } session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); // always wait the delay amount between catches, ideally to prevent you from making another call too early after a catch event await Task.Delay(session.LogicSettings.DelayBetweenPokemonCatch, cancellationToken); } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var pokestopList = await GetPokeStops(session); if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited) { await session.EggWalker.InitEggWalker(cancellationToken); } if (pokestopList.Count <= 0) { if (!pokestopList.Any()) { await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); } session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); if (session.ForceMoveJustDone) { session.ForceMoveJustDone = false; } if (session.ForceMoveTo != null) { await ForceMoveTask.Execute(session, cancellationToken); } await Task.Delay(60000, cancellationToken); await session.Navigation.Move(new GeoCoordinate(session.Client.CurrentLatitude + session.Client.Rnd.NextInRange(-0.0001, 0.0001), session.Client.CurrentLongitude + session.Client.Rnd.NextInRange(-0.0001, 0.0001)), session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, async() => { await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, cancellationToken, session); pokestopList = await GetPokeStops(session); } session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData) }); if (session.ForceMoveToResume != null && session.ForceMoveTo == null) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.UnDoneForceMove, session.ForceMoveToResume.Latitude, session.ForceMoveToResume.Longitude) }); session.ForceMoveTo = session.ForceMoveToResume; } var bestRoute = new List <GeoCoordinate>(); session.Runtime.PokestopsToCheckGym = 13 + session.Client.Rnd.Next(15); while (pokestopList.Any()) { if (session.ForceMoveJustDone) { session.ForceMoveJustDone = false; } if (session.LogicSettings.UseCustomRoute && session.LogicSettings.CustomRoute != null && session.LogicSettings.CustomRoute.RoutePoints.Count > 2) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.CustomRouteEnabled) }); break; } if (session.ForceMoveTo != null) { await ForceMoveTask.Execute(session, cancellationToken); } var newPokestopList = (await GetPokeStops(session)).OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).Where(x => pokestopList.All(i => i.Id != x.Id) && LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, x.Latitude, x.Longitude) < session.LogicSettings.MaxTravelDistanceInMeters).ToList(); session.EventDispatcher.Send(new PokeStopListEvent { Forts = newPokestopList.Select(x => x.BaseFortData) }); pokestopList.AddRange(newPokestopList); var pokeStop = pokestopList.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).FirstOrDefault(x => !session.MapCache.CheckPokestopUsed(x)); if (pokeStop == null) { await Task.Delay(60000, cancellationToken); continue; } //No Longer Usable, MobBot is dead - Lunatiq //if (session.LogicSettings.RoutingService == RoutingService.GoogleDirections || session.LogicSettings.RoutingService == RoutingService.MapzenValhalla ) //{ bestRoute = RoutingUtils.GetBestRoute(pokeStop, pokestopList.Where(x => !session.MapCache.CheckPokestopUsed(x)), 20); session.EventDispatcher.Send(new PokestopsOptimalPathEvent { Coords = bestRoute.Select(x => Tuple.Create(x.Latitude, x.Longitude)).ToList() }); //} var tooFarPokestops = pokestopList.Where(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude) > session.LogicSettings.MaxTravelDistanceInMeters).ToList(); foreach (var tooFar in tooFarPokestops) { pokestopList.Remove(tooFar); } //var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, // session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); //session.EventDispatcher.Send(new FortTargetEvent {Name = fortInfo.Name, Distance = distance}); if (session.LogicSettings.Teleport) { await session.Client.Player.UpdatePlayerLocation(fortInfo.Latitude, fortInfo.Longitude, session.Client.Settings.DefaultAltitude); } else { await MoveToPokestop(session, cancellationToken, pokeStop, bestRoute); } bestRoute.Clear(); await ActionQueueTask.Execute(session, cancellationToken); if (!session.LogicSettings.LootPokestops) { session.MapCache.UsedPokestop(pokeStop, session); continue; } #region old fort logic //if (!session.ForceMoveJustDone) //{ // var timesZeroXPawarded = 0; // var fortTry = 0; //Current check // const int retryNumber = 50; //How many times it needs to check to clear softban // const int zeroCheck = 5; //How many times it checks fort before it thinks it's softban // //var shownSoftBanMessage = false; // do // { // cancellationToken.ThrowIfCancellationRequested(); // if (session.MapCache.CheckPokestopUsed(pokeStop)) break; //already used somehow // var fortSearch = // await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); // if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) timesZeroXPawarded = 0; // if (fortSearch.ExperienceAwarded == 0) // { // if (TimesZeroXPawarded == 0) // await MoveToPokestop(session, cancellationToken, pokeStop, null); // timesZeroXPawarded++; // if ((int) fortSearch.CooldownCompleteTimestampMs != 0) // { // break; // // Check if successfully looted, if so program can continue as this was "false alarm". // } // if (timesZeroXPawarded <= zeroCheck) continue; // session.MapCache.UsedPokestop(pokeStop, session); //f**k that pokestop - skip it // break; // } // else // { // session.EventDispatcher.Send(new FortUsedEvent // { // Id = pokeStop.Id, // Name = fortInfo.Name, // Exp = fortSearch.ExperienceAwarded, // Gems = fortSearch.GemsAwarded, // Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), // Latitude = pokeStop.Latitude, // Longitude = pokeStop.Longitude, // InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull, // Description = fortInfo.Description, // url = fortInfo.ImageUrls.FirstOrDefault() // }); // if (fortSearch.PokemonDataEgg != null) // { // session.EventDispatcher.Send(new EggFoundEvent // { // Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget, // PokeStopName = fortInfo.Name // }); // } // session.EventDispatcher.Send(new InventoryNewItemsEvent // { // Items = fortSearch.ItemsAwarded.ToItemList() // }); // if (session.Runtime.PokeBallsToCollect > 0) // { // session.Runtime.PokeBallsToCollect -= fortSearch.ItemsAwarded.ToItemList() // .Where(x => x.Item1 == ItemId.ItemPokeBall || // x.Item1 == ItemId.ItemGreatBall || x.Item1 == ItemId.ItemUltraBall || // x.Item1 == ItemId.ItemMasterBall).Sum(x => x.Item2); // } // session.MapCache.UsedPokestop(pokeStop, session); // session.Runtime.StopsHit++; // pokeStop.CooldownCompleteTimestampMS = DateTime.UtcNow.AddMinutes(5).ToUnixTime(); // if (session.LogicSettings.CatchWildPokemon) // { // await CatchWildPokemonsTask.Execute(session, cancellationToken); // } // break; //Continue with program as loot was succesfull. // } // } while (fortTry < retryNumber - zeroCheck); // //Stop trying if softban is cleaned earlier or if 40 times fort looting failed. // if (session.LogicSettings.Teleport) // await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken); // else // await Task.Delay(1000, cancellationToken); // //Catch Lure Pokemon // if (pokeStop.LureInfo != null && session.LogicSettings.CatchWildPokemon) // { // await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken); // } // if (session.LogicSettings.Teleport && session.LogicSettings.CatchWildPokemon) // await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //} #endregion session.Runtime.PokestopsToCheckGym--; if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } }