//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) { cancellationToken.ThrowIfCancellationRequested(); var pokestopList = await GetPokeStops(session); 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); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0) { 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 }); } else { await RecycleItemsTask.Execute(session, cancellationToken); } if (fortSearch.ItemsAwarded.Count > 0) { await session.Inventory.RefreshCachedInventory(); } } }
//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) { var pokestopList = await GetPokeStops(session); while (pokestopList.Any()) { pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0) { 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 }); } await RecycleItemsTask.Execute(session); if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session); } } }
private static async Task DoActionAtPokeStop(ISession session, CancellationToken cancellationToken, FortData pokeStop, FortDetailsResponse fortInfo, bool doNotTrySpin = false) { //Catch Lure Pokemon if (pokeStop.LureInfo != null) { // added for cooldowns await Task.Delay(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)).ConfigureAwait(false); await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken).ConfigureAwait(false); } // Spin as long as we haven't reached the user defined limits if (!_pokestopLimitReached && !_pokestopTimerReached) { await FarmPokestop(session, pokeStop, fortInfo, cancellationToken, doNotTrySpin).ConfigureAwait(false); } else { // We hit the pokestop limit but not the pokemon limit. So we want to set the cooldown on the pokestop so that // we keep moving and don't walk back and forth between 2 pokestops. pokeStop.CooldownCompleteTimestampMs = DateTime.UtcNow.ToUnixTime() + 5 * 60 * 1000; // 5 minutes to cooldown for pokestop. } if (++_stopsHit >= _storeRi) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { _storeRi = _rc.Next(6, 12); //set new storeRI for new random value _stopsHit = 0; if (session.LogicSettings.UseNearActionRandom) { await HumanRandomActionTask.Execute(session, cancellationToken).ConfigureAwait(false); } else { await RecycleItemsTask.Execute(session, cancellationToken).ConfigureAwait(false); if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } await GetPokeDexCount.Execute(session, cancellationToken).ConfigureAwait(false); } } }
private static async Task FarmPokestop(ISession session, FortData pokeStop, FortDetailsResponse fortInfo, CancellationToken cancellationToken, bool doNotRetry = false) { // If the cooldown is in the future than don't farm the pokestop. if (pokeStop.CooldownCompleteTimestampMs > DateTime.UtcNow.ToUnixTime()) { return; } FortSearchResponse fortSearch; 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 do { cancellationToken.ThrowIfCancellationRequested(); if (SearchThresholdExceeds(session)) { break; } fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) { timesZeroXPawarded = 0; } if (fortSearch.ExperienceAwarded == 0 && fortSearch.Result != FortSearchResponse.Types.Result.InventoryFull) { 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck, Looted = false }); if (doNotRetry) { break; } if (!session.LogicSettings.FastSoftBanBypass) { DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 0); } } } else { if (fortTry != 0) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry + 1, Max = retryNumber - zeroCheck, Looted = true }); } 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, Altitude = session.Client.CurrentAltitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull }); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { await RecycleItemsTask.Execute(session, cancellationToken); _storeRi = 1; } if (session.LogicSettings.UsePokeStopLimit) { session.Stats.AddPokestopTimestamp(DateTime.Now.Ticks); Logger.Write($"(POKESTOP LIMIT) {session.Stats.GetNumPokestopsInLast24Hours()}/{session.LogicSettings.PokeStopLimit}", LogLevel.Info, ConsoleColor.Yellow); } 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 (MultipleBotConfig.IsMultiBotActive(session.LogicSettings)) { if (fortTry >= retryNumber - zeroCheck) { softbanCount++; //only check if PokestopSoftbanCount > 0 if (MultipleBotConfig.IsMultiBotActive(session.LogicSettings) && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount > 0 && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount <= softbanCount) { softbanCount = 0; session.CancellationTokenSource.Cancel(); //Activate switcher by pokestop throw new ActiveSwitchByRuleException() { MatchedRule = SwitchRules.PokestopSoftban, ReachedValue = softbanCount }; } } } else { softbanCount = 0; //reset softban count } if (session.LogicSettings.RandomlyPauseAtStops && !doNotRetry) { if (++_randomStop >= _randomNumber) { _randomNumber = _rc.Next(4, 11); _randomStop = 0; int randomWaitTime = _rc.Next(30, 120); await Task.Delay(randomWaitTime, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var tracks = GetGpxTracks(session); var curTrkPt = 0; var curTrk = 0; var maxTrk = tracks.Count - 1; var curTrkSeg = 0; var eggWalker = new EggWalker(1000, session); while (curTrk <= maxTrk) { cancellationToken.ThrowIfCancellationRequested(); var track = tracks.ElementAt(curTrk); var trackSegments = track.Segments; var maxTrkSeg = trackSegments.Count - 1; while (curTrkSeg <= maxTrkSeg) { cancellationToken.ThrowIfCancellationRequested(); var trackPoints = track.Segments.ElementAt(0).TrackPoints; var maxTrkPt = trackPoints.Count - 1; while (curTrkPt <= maxTrkPt) { cancellationToken.ThrowIfCancellationRequested(); var nextPoint = trackPoints.ElementAt(curTrkPt); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, Convert.ToDouble(nextPoint.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(nextPoint.Lon, CultureInfo.InvariantCulture)); if (distance > 5000) { session.EventDispatcher.Send(new ErrorEvent { Message = session.Translation.GetTranslation(Common.TranslationString.DesiredDestTooFar, nextPoint.Lat, nextPoint.Lon, session.Client.CurrentLatitude, session.Client.CurrentLongitude) }); break; } var pokestopList = await GetPokeStops(session); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); 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); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0) { 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 }); } if (fortSearch.ItemsAwarded.Count > 0) { await session.Inventory.RefreshCachedInventory(); } await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.SnipeAtPokestops) { await SnipePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenameAboveIv) { await RenamePokemonTask.Execute(session, cancellationToken); } } await session.Navigation.HumanPathWalking( trackPoints.ElementAt(curTrkPt), session.LogicSettings.WalkingSpeedInKilometerPerHour, async() => { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, cancellationToken ); await eggWalker.ApplyDistance(distance, cancellationToken); if (curTrkPt >= maxTrkPt) { curTrkPt = 0; } else { curTrkPt++; } } //end trkpts if (curTrkSeg >= maxTrkSeg) { curTrkSeg = 0; } else { curTrkSeg++; } } //end trksegs if (curTrk >= maxTrkSeg) { curTrk = 0; } else { curTrk++; } } //end tracks }
private static async Task FortAction(ISession session, FortData pokeStop, FortDetailsResponse fortInfo, CancellationToken cancellationToken) { //Catch Lure Pokemon if (pokeStop.LureInfo != null) { // added for cooldowns await Task.Delay(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)); await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } await FarmPokestop(session, pokeStop, fortInfo, cancellationToken); if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; if (session.LogicSettings.UseNearActionRandom) { await HumanRandomActionTask.Execute(session, cancellationToken); } else { await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var randomCommand = Enumerable.Range(1, 8).OrderBy(x => ActionRandom.Next()).Take(8).ToList(); for (int i = 0; i < 8; i++) { cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); switch (randomCommand[i]) { case 1: // Handling of Eggs and Incubators preferably needs to happen every time. // While monitoring the previous setting of 50% propability we ended up with // over an hour of execution without setting any new Eggs for incubation (entering // UseEggIncubators). if (session.LogicSettings.UseEggIncubators) { if (ActionRandom.Next(1, 10) > 0) { await UseIncubatorsTask.Execute(session, cancellationToken); } } break; case 2: if (session.LogicSettings.TransferDuplicatePokemon) { if (ActionRandom.Next(1, 10) > 4) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.TransferWeakPokemon) { if (ActionRandom.Next(1, 10) > 4) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } } if (ActionRandom.Next(1, 10) > 4) { if (session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } } break; case 3: if (session.LogicSettings.UseLuckyEggConstantly) { if (ActionRandom.Next(1, 10) > 4) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } } break; case 4: if (session.LogicSettings.UseIncenseConstantly) { if (ActionRandom.Next(1, 10) > 4) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } } break; case 5: if (session.LogicSettings.RenamePokemon) { if (ActionRandom.Next(1, 10) > 4) { await RenamePokemonTask.Execute(session, cancellationToken); } } break; case 6: if (session.LogicSettings.AutoFavoritePokemon) { if (ActionRandom.Next(1, 10) > 4) { await FavoritePokemonTask.Execute(session, cancellationToken); } } break; case 7: if (ActionRandom.Next(1, 10) > 4) { await RecycleItemsTask.Execute(session, cancellationToken); } break; case 8: if (session.LogicSettings.AutomaticallyLevelUpPokemon) { if (ActionRandom.Next(1, 10) > 4) { await LevelUpPokemonTask.Execute(session, cancellationToken); } } break; } } GetPokeDexCount.Execute(session, cancellationToken); }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var pokestopList = await GetPokeStops(session); while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); await SnipeMSniperTask.CheckMSniperLocation(session, cancellationToken); pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); // randomize next pokestop between first and second by distance var pokestopListNum = 0; if (pokestopList.Count > 1) { pokestopListNum = rc.Next(0, 2); } var pokeStop = pokestopList[pokestopListNum]; pokestopList.RemoveAt(pokestopListNum); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); // we only move to the PokeStop, and send the associated FortTargetEvent, when not using GPX // also, GPX pathing uses its own EggWalker and calls the CatchPokemon tasks internally. if (!session.LogicSettings.UseGpxPathing) { var eggWalker = new EggWalker(1000, session); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.UseGoogleWalk && !session.LogicSettings.UseYoursWalk) { session.EventDispatcher.Send(new FortTargetEvent { Name = fortInfo.Name, Distance = distance, Route = "NecroBot" }); } else { BaseWalkStrategy.FortInfo = fortInfo; } await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude, LocationUtils.getElevation(pokeStop.Latitude, pokeStop.Longitude)), async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); // we have moved this distance, so apply it immediately to the egg walker. await eggWalker.ApplyDistance(distance, cancellationToken); } //Catch Lure Pokemon if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } FortSearchResponse fortSearch; 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 do { cancellationToken.ThrowIfCancellationRequested(); if (SearchThresholdExceeds(session)) { break; } 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck, Looted = false }); if (!session.LogicSettings.FastSoftBanBypass) { DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 0); } } } else { if (fortTry != 0) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry + 1, Max = retryNumber - zeroCheck, Looted = true }); } 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 }); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { storeRI = 1; } session.Stats.PokeStopTimestamps.Add(DateTime.Now.Ticks); 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.RandomlyPauseAtStops) { if (++RandomStop >= RandomNumber) { RandomNumber = rc.Next(4, 11); RandomStop = 0; int RandomWaitTime = rc.Next(30, 120); Thread.Sleep(RandomWaitTime); } } if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.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(); 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) { Logger.Write( session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart), LogLevel.Warning); await session.Navigation.Move( new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, LocationUtils.getElevation(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude)), session.LogicSettings.WalkingSpeedInKilometerPerHour, null, cancellationToken, session.LogicSettings.DisableHumanWalking); } var pokestopList = await GetPokeStops(session); var stopsHit = 0; var rc = new Random(); //initialize pokestop random cleanup counter first time storeRI = rc.Next(8, 15); var eggWalker = new EggWalker(1000, session); if (pokestopList.Count <= 0) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); } session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); //resort var pokestopListWithDetails = pokestopList .Select(p => { Boolean useNav = session.LogicSettings.UseOsmNavigation && LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, p.Latitude, p.Longitude) > session.LogicSettings.OsmMinDistanceInMeter; String uri = useNav ? string.Format(_CultureEnglish, "http://www.yournavigation.org/api/1.0/gosmore.php?flat={0:0.000000}&flon={1:0.000000}&tlat={2:0.000000}&tlon={3:0.000000}&v=foot", session.Client.CurrentLatitude, session.Client.CurrentLongitude, p.Latitude, p.Longitude) : null; XDocument doc = useNav ? XDocument.Load(uri) : null; XNamespace kmlns = useNav ? XNamespace.Get("http://earth.google.com/kml/2.0") : null; var points = !useNav ? null : doc.Element(kmlns + "kml") .Element(kmlns + "Document") .Element(kmlns + "Folder") .Element(kmlns + "Placemark") .Element(kmlns + "LineString") .Element(kmlns + "coordinates") .Value .Trim() .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) .Select(pp => { String[] parts = pp.Split(','); return(new { Latitude = double.Parse(parts[1], _CultureEnglish), Longitude = double.Parse(parts[0], _CultureEnglish), }); }) .ToArray(); Double dist = useNav ? new Func <double>(() => { Double d = 0d; for (int i = 1; i < points.Length; i++) { d += LocationUtils.CalculateDistanceInMeters ( points[i - 1].Latitude, points[i - 1].Longitude, points[i].Latitude, points[i].Longitude ); } return(d); })() : LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, p.Latitude, p.Longitude); return(new { PokeStop = p, UseOSM = useNav, Distance = dist, NavigationDocumentUri = uri, NavigationDocument = doc, NavigationDocumentNamespace = kmlns, Points = points }); }) .OrderBy(p => p.Distance) .ToList(); // randomize next pokestop between first and second by distance var pokestopListNum = 0; if (pokestopList.Count > 1) { pokestopListNum = rc.Next(0, 2); } var pokeStop = pokestopListWithDetails[pokestopListNum]; pokestopList.Remove(pokeStop.PokeStop); var distance = pokeStop.Distance; var fortInfo = await session.Client.Fort.GetFort(pokeStop.PokeStop.Id, pokeStop.PokeStop.Latitude, pokeStop.PokeStop.Longitude); session.EventDispatcher.Send(new FortTargetEvent { Name = fortInfo.Name, Distance = distance }); if (pokeStop.UseOSM) { var points = pokeStop.Points; if (points.Any()) { foreach (var step in points) { await MoveToLocationAsync(session, cancellationToken, step.Latitude, step.Longitude); } } } //Why no else? Just to be sure =) await MoveToLocationAsync(session, cancellationToken, pokeStop.PokeStop.Latitude, pokeStop.PokeStop.Longitude); //Catch Lure Pokemon if (pokeStop.PokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop.PokeStop, cancellationToken); } FortSearchResponse fortSearch; 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 do { cancellationToken.ThrowIfCancellationRequested(); fortSearch = await session.Client.Fort.SearchFort(pokeStop.PokeStop.Id, pokeStop.PokeStop.Latitude, pokeStop.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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck, Looted = false }); if (!session.LogicSettings.FastSoftBanBypass) { DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 0); } } } else { if (fortTry != 0) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry + 1, Max = retryNumber - zeroCheck, Looted = true }); } session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.PokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded, Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Latitude = pokeStop.PokeStop.Latitude, Longitude = pokeStop.PokeStop.Longitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull }); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { storeRI = 1; } 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. await eggWalker.ApplyDistance(distance, cancellationToken); if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.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(); var randomCommand = Enumerable.Range(1, 9).OrderBy(x => ActionRandom.Next()).Take(9).ToList(); for (int i = 0; i < 9; i++) { cancellationToken.ThrowIfCancellationRequested(); switch (randomCommand[i]) { case 1: if (session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { if (ActionRandom.Next(1, 10) > 4) { await EvolvePokemonTask.Execute(session, cancellationToken); } } break; case 2: if (session.LogicSettings.UseEggIncubators) { if (ActionRandom.Next(1, 10) > 4) { await UseIncubatorsTask.Execute(session, cancellationToken); } } break; case 3: if (session.LogicSettings.TransferDuplicatePokemon) { if (ActionRandom.Next(1, 10) > 4) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } } break; case 4: if (session.LogicSettings.UseLuckyEggConstantly) { if (ActionRandom.Next(1, 10) > 4) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } } break; case 5: if (session.LogicSettings.UseIncenseConstantly) { if (ActionRandom.Next(1, 10) > 4) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } } break; case 6: if (session.LogicSettings.RenamePokemon) { if (ActionRandom.Next(1, 10) > 4) { await RenamePokemonTask.Execute(session, cancellationToken); } } break; case 7: if (session.LogicSettings.AutoFavoritePokemon) { if (ActionRandom.Next(1, 10) > 4) { await FavoritePokemonTask.Execute(session, cancellationToken); } } break; case 8: if (ActionRandom.Next(1, 10) > 4) { await RecycleItemsTask.Execute(session, cancellationToken); } break; case 9: if (session.LogicSettings.AutomaticallyLevelUpPokemon) { if (ActionRandom.Next(1, 10) > 4) { await LevelUpPokemonTask.Execute(session, cancellationToken); } } break; } } await GetPokeDexCount.Execute(session, cancellationToken); }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var pokestopsTuple = await GetPokeStops(session); var allPokestops = pokestopsTuple.Item1; var pokestopList = pokestopsTuple.Item2; while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); await SnipeMSniperTask.CheckMSniperLocation(session, cancellationToken); pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); // randomize next pokestop between first and second by distance var pokestopListNum = 0; if (pokestopList.Count > 1) { pokestopListNum = rc.Next(0, 2); } var pokeStop = pokestopList[pokestopListNum]; pokestopList.RemoveAt(pokestopListNum); // this logic should only be called when we reach a pokestop either via GPX path or normal walking // as when walk-sniping, we want to get to the snipe ASAP rather than stop for lured pokemon upon // calling FarmPokestop; in that situation we are also always within 40m of the pokestop, so no // need to walk to it var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); // we only move to the PokeStop, and send the associated FortTargetEvent, when not using GPX // also, GPX pathing uses its own EggWalker and calls the CatchPokemon tasks internally. if (!session.LogicSettings.UseGpxPathing) { var eggWalker = new EggWalker(1000, session); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.UseGoogleWalk && !session.LogicSettings.UseYoursWalk) { session.EventDispatcher.Send(new FortTargetEvent { Name = fortInfo.Name, Distance = distance, Route = "NecroBot" }); } else { BaseWalkStrategy.FortInfo = fortInfo; } await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude, LocationUtils.getElevation(session, pokeStop.Latitude, pokeStop.Longitude)), async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); // we have moved this distance, so apply it immediately to the egg walker. await eggWalker.ApplyDistance(distance, cancellationToken); } //Catch Lure Pokemon if (pokeStop.LureInfo != null) { // added for cooldowns await Task.Delay(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)); await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } await FarmPokestop(session, pokeStop, fortInfo, cancellationToken); if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; if (session.LogicSettings.UseNearActionRandom) { await HumanRandomActionTask.Execute(session, cancellationToken); } else { await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); } } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.EnableHumanWalkingSnipe) { //refactore to move this code inside the task later. await HumanWalkSnipeTask.Execute(session, cancellationToken, async (double lat, double lng) => { //idea of this function is to spin pokestop on way. maybe risky. var reachablePokestops = allPokestops.Where(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude) < 40).ToList(); reachablePokestops = reachablePokestops.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); foreach (var ps in reachablePokestops) { if (!session.LogicSettings.UseGpxPathing || pokestopList.Contains(ps)) { pokestopList.Remove(ps); } var fi = await session.Client.Fort.GetFort(ps.Id, ps.Latitude, ps.Longitude); await FarmPokestop(session, ps, fi, cancellationToken); } }, async() => { // if using GPX we have to move back to the original pokestop, to resume the path. // we do not try to use pokestops on the way back, as we will have used them getting // here. if (session.LogicSettings.UseGpxPathing) { var eggWalker = new EggWalker(1000, session); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); var geo = new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude); await session.Navigation.Move(geo, async() => { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); await eggWalker.ApplyDistance(distance, cancellationToken); return; } var nearestStop = pokestopList.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).FirstOrDefault(); var walkedDistance = LocationUtils.CalculateDistanceInMeters(nearestStop.Latitude, nearestStop.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); if (walkedDistance > session.LogicSettings.HumanWalkingSnipeWalkbackDistanceLimit) { await Task.Delay(3000); var nearbyPokeStops = await UpdateFortsData(session); var notexists = nearbyPokeStops.Where(p => !pokestopList.Any(x => x.Id == p.Id)).ToList(); pokestopList.AddRange(notexists); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); session.EventDispatcher.Send(new HumanWalkSnipeEvent() { Type = HumanWalkSnipeEventTypes.PokestopUpdated, Pokestops = notexists, NearestDistance = walkedDistance }); } }); } } }
public static async Task Execute(ISession session) { 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) { Logger.Write( session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart), LogLevel.Warning); await Task.Delay(1000); await session.Navigation.HumanLikeWalking( new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude), session.LogicSettings.WalkingSpeedInKilometerPerHour, null); } var pokestopList = await GetPokeStops(session); var stopsHit = 0; var eggWalker = new EggWalker(1000, session); if (pokestopList.Count <= 0) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); } session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); while (pokestopList.Any()) { //resort pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); 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 }); await session.Navigation.HumanLikeWalking(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude), session.LogicSettings.WalkingSpeedInKilometerPerHour, async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session); return(true); }); //Catch Lure Pokemon if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop); } FortSearchResponse fortSearch; 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 do { 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck }); 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) }); 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. await Task.Delay(1000); await eggWalker.ApplyDistance(distance); if (++stopsHit % 5 == 0) //TODO: OR item/pokemon bag is full { stopsHit = 0; if (fortSearch.ItemsAwarded.Count > 0) { await session.Inventory.RefreshCachedInventory(); } await RecycleItemsTask.Execute(session); if (session.LogicSettings.SnipeAtPokestops) { await SnipePokemonTask.Execute(session); } if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv) { await EvolvePokemonTask.Execute(session); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session); } if (session.LogicSettings.RenameAboveIv) { await RenamePokemonTask.Execute(session); } } } }
private static async Task FarmPokestop(ISession session, FortData pokeStop, FortDetailsResponse fortInfo, CancellationToken cancellationToken, bool doNotRetry = false) { // If the cooldown is in the future than don't farm the pokestop. if (pokeStop.CooldownCompleteTimestampMs > DateTime.UtcNow.ToUnixTime()) { return; } if (session.Stats.SearchThresholdExceeds(session, true)) { if (session.LogicSettings.AllowMultipleBot && session.LogicSettings.MultipleBotConfig.SwitchOnPokestopLimit) { throw new Exceptions.ActiveSwitchByRuleException(SwitchRules.SpinPokestopReached, session.LogicSettings.PokeStopLimit); } return; } //await session.Client.Map.GetMapObjects(); FortSearchResponse fortSearch; var timesZeroXPawarded = 0; var fortTry = 0; //Current check int retryNumber = session.LogicSettings.ByPassSpinCount; //How many times it needs to check to clear softban int zeroCheck = Math.Min(5, retryNumber); //How many times it checks fort before it thinks it's softban do { cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); int retry = 3; do { fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.Result == FortSearchResponse.Types.Result.OutOfRange) { if (retry < 2) { await session.Client.Map.GetMapObjects(true); } var distance = LocationUtils.CalculateDistanceInMeters(pokeStop.Latitude, pokeStop.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); #if DEBUG Logger.Write($"Loot pokestop result :{fortSearch.Result} , distance to pokestop : {distance:0.00}m"); #endif if (distance > 30) { await LocationUtils.UpdatePlayerLocationWithAltitude(session, new GeoCoordinatePortable.GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude), 0); } retry--; //await session.Client.Map.GetMapObjects(true); } }while (fortSearch.Result == FortSearchResponse.Types.Result.OutOfRange && retry > 0); if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) { timesZeroXPawarded = 0; } if (fortSearch.ExperienceAwarded == 0 && fortSearch.Result != FortSearchResponse.Types.Result.InventoryFull) { 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck, Looted = false }); if (doNotRetry) { break; } if (!session.LogicSettings.FastSoftBanBypass) { DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 0); } } } else { softbanCount = 0; if (fortTry != 0) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry + 1, Max = retryNumber - zeroCheck, Looted = true }); } 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, Altitude = session.Client.CurrentAltitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull, Fort = pokeStop }); if (fortSearch.Result == FortSearchResponse.Types.Result.Success) { mapEmptyCount = 0; foreach (var item in fortSearch.ItemsAwarded) { await session.Inventory.UpdateInventoryItem(item.ItemId); } if (fortSearch.PokemonDataEgg != null) { fortSearch.PokemonDataEgg.IsEgg = true; } // Update the cache var fortFromCache = session.Client.Map.LastGetMapObjectResponse.MapCells.SelectMany(x => x.Forts).FirstOrDefault(f => f.Id == pokeStop.Id); long newCooldown = TimeUtil.GetCurrentTimestampInMilliseconds() + (5 * 60 * 1000); /* 5 min */ fortFromCache.CooldownCompleteTimestampMs = newCooldown; pokeStop.CooldownCompleteTimestampMs = newCooldown; } MSniperServiceTask.UnblockSnipe(false); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { await RecycleItemsTask.Execute(session, cancellationToken); _storeRi = 1; } if (session.LogicSettings.UsePokeStopLimit) { session.Stats.AddPokestopTimestamp(DateTime.Now.Ticks); session.EventDispatcher.Send(new PokestopLimitUpdate(session.Stats.GetNumPokestopsInLast24Hours(), session.LogicSettings.PokeStopLimit)); } 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.AllowMultipleBot) { if (fortTry >= retryNumber - zeroCheck) { softbanCount++; //only check if PokestopSoftbanCount > 0 if (MultipleBotConfig.IsMultiBotActive(session.LogicSettings) && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount > 0 && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount <= softbanCount && TinyIoCContainer.Current.Resolve <MultiAccountManager>().AllowSwitch()) { softbanCount = 0; //Activate switcher by pokestop throw new ActiveSwitchByRuleException() { MatchedRule = SwitchRules.PokestopSoftban, ReachedValue = session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount }; } } } else { softbanCount = 0; //reset softban count } if (session.LogicSettings.RandomlyPauseAtStops && !doNotRetry) { if (++_randomStop >= _randomNumber) { _randomNumber = _rc.Next(4, 11); _randomStop = 0; int randomWaitTime = _rc.Next(30, 120); await Task.Delay(randomWaitTime, cancellationToken); } } }
public static async Task FarmPokestop(ISession session, FortData pokeStop, FortDetailsResponse fortInfo, CancellationToken cancellationToken, bool doNotRetry = false) { var manager = TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>(); // If the cooldown is in the future than don't farm the pokestop. if (pokeStop.CooldownCompleteTimestampMs > DateTime.UtcNow.ToUnixTime()) { return; } if (session.Stats.SearchThresholdExceeds(session, true)) { if (manager.AllowMultipleBot() && session.LogicSettings.MultipleBotConfig.SwitchOnPokestopLimit) { throw new Exceptions.ActiveSwitchByRuleException(SwitchRules.SpinPokestopReached, session.LogicSettings.PokeStopLimit); } return; } //await session.Client.Map.GetMapObjects().ConfigureAwait(false); FortSearchResponse fortSearch; var timesZeroXPawarded = 0; var fortTry = 0; //Current check int retryNumber = session.LogicSettings.ByPassSpinCount; //How many times it needs to check to clear softban int zeroCheck = Math.Min(5, retryNumber); //How many times it checks fort before it thinks it's softban var distance = LocationUtils.CalculateDistanceInMeters(pokeStop.Latitude, pokeStop.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); //This should be < ## not > ##. > makes bot jump to pokestop if < then when in range will just spin. if (distance < 50) //if (distance > 30) { await LocationUtils.UpdatePlayerLocationWithAltitude(session, new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude), 0).ConfigureAwait(false); await session.Client.Misc.RandomAPICall().ConfigureAwait(false); } do { cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); int retry = 3; double latitude = pokeStop.Latitude; double longitude = pokeStop.Longitude; do { fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude).ConfigureAwait(false); if (fortSearch.Result == FortSearchResponse.Types.Result.OutOfRange) { if (retry > 2) { await Task.Delay(500).ConfigureAwait(false); } else { await session.Client.Map.GetMapObjects(true).ConfigureAwait(false); } Logger.Debug($"Loot pokestop result: {fortSearch.Result}, distance to pokestop:[{pokeStop.Latitude}, {pokeStop.Longitude}] {distance:0.00}m, retry: #{4 - retry}"); latitude += 0.000003; longitude += 0.000005; await LocationUtils.UpdatePlayerLocationWithAltitude(session, new GeoCoordinate(latitude, longitude), 0).ConfigureAwait(false); retry--; } }while (fortSearch.Result == FortSearchResponse.Types.Result.OutOfRange && retry > 0); Logger.Debug($"Loot pokestop result: {fortSearch.Result}"); if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) { timesZeroXPawarded = 0; } if (fortSearch.ExperienceAwarded == 0 && fortSearch.Result != FortSearchResponse.Types.Result.InventoryFull) { 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck, Looted = false }); if (doNotRetry) { break; } if (!session.LogicSettings.FastSoftBanBypass) { await DelayingUtils.DelayAsync(session.LogicSettings.DelayBetweenPlayerActions, 0, session.CancellationTokenSource.Token).ConfigureAwait(false); } } } else { softbanCount = 0; if (fortTry != 0) { session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry + 1, Max = retryNumber - zeroCheck, Looted = true }); } session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded > 0 ? $"Yes {fortSearch.GemsAwarded}" : "No", Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Badges = fortSearch.AwardedGymBadge != null ? fortSearch.AwardedGymBadge.GymBadgeType.ToString() : "No", BonusLoot = fortSearch.BonusLoot != null ? StringUtils.GetSummedFriendlyNameOfGetLootList(fortSearch.BonusLoot.LootItem) : "No", RaidTickets = fortSearch.RaidTickets > 0 ? $"{fortSearch.RaidTickets} tickets" : "No", TeamBonusLoot = fortSearch.TeamBonusLoot != null ? StringUtils.GetSummedFriendlyNameOfGetLootList(fortSearch.TeamBonusLoot.LootItem) : "No", PokemonDataEgg = fortSearch.PokemonDataEgg != null ? fortSearch.PokemonDataEgg : null, Latitude = pokeStop.Latitude, Longitude = pokeStop.Longitude, Altitude = session.Client.CurrentAltitude, InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull, Fort = pokeStop }); if (fortSearch.Result == FortSearchResponse.Types.Result.Success) { mapEmptyCount = 0; foreach (var item in fortSearch.ItemsAwarded) { await session.Inventory.UpdateInventoryItem(item.ItemId).ConfigureAwait(false); } if (fortSearch.PokemonDataEgg != null) { fortSearch.PokemonDataEgg.IsEgg = true; } // Update the cache var fortFromCache = session.Client.Map.LastGetMapObjectResponse.MapCells.SelectMany(x => x.Forts).FirstOrDefault(f => f.Id == pokeStop.Id); long newCooldown = TimeUtil.GetCurrentTimestampInMilliseconds() + (5 * 60 * 1000); /* 5 min */ fortFromCache.CooldownCompleteTimestampMs = newCooldown; pokeStop.CooldownCompleteTimestampMs = newCooldown; if (session.SaveBallForByPassCatchFlee) { var totalBalls = (await session.Inventory.GetItems().ConfigureAwait(false)).Where(x => x.ItemId == ItemId.ItemPokeBall || x.ItemId == ItemId.ItemGreatBall || x.ItemId == ItemId.ItemUltraBall).Sum(x => x.Count); Logger.Write($"Ball requires for by pass catch flee {totalBalls}/{CatchPokemonTask.BALL_REQUIRED_TO_BYPASS_CATCHFLEE}"); } else { MSniperServiceTask.UnblockSnipe(false); } } if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { await RecycleItemsTask.Execute(session, cancellationToken).ConfigureAwait(false); _storeRi = 1; } if (session.LogicSettings.UsePokeStopLimit) { session.Stats.AddPokestopTimestamp(DateTime.Now.Ticks); session.EventDispatcher.Send(new PokestopLimitUpdate(session.Stats.GetNumPokestopsInLast24Hours(), session.LogicSettings.PokeStopLimit)); } //add pokeStops to Map OnLootPokestopEvent(pokeStop); //end pokeStop to Map 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 (manager.AllowMultipleBot()) { if (fortTry >= retryNumber - zeroCheck) { softbanCount++; //only check if PokestopSoftbanCount > 0 if (MultipleBotConfig.IsMultiBotActive(session.LogicSettings, manager) && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount > 0 && session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount <= softbanCount && TinyIoCContainer.Current.Resolve <MultiAccountManager>().AllowSwitch()) { softbanCount = 0; //Activate switcher by pokestop throw new ActiveSwitchByRuleException() { MatchedRule = SwitchRules.PokestopSoftban, ReachedValue = session.LogicSettings.MultipleBotConfig.PokestopSoftbanCount }; } } } else { softbanCount = 0; //reset softban count } if (session.LogicSettings.RandomlyPauseAtStops && !doNotRetry) { if (++_randomStop >= _randomNumber) { _randomNumber = _rc.Next(4, 11); _randomStop = 0; int randomWaitTime = _rc.Next(30, 120); await Task.Delay(randomWaitTime, cancellationToken).ConfigureAwait(false); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var pokestopList = await GetPokeStops(session); while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); await SnipeMSniperTask.CheckMSniperLocation(session, cancellationToken); pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); // randomize next pokestop between first and second by distance var pokestopListNum = 0; if (pokestopList.Count > 1) { pokestopListNum = rc.Next(0, 2); } var pokeStop = pokestopList[pokestopListNum]; pokestopList.RemoveAt(pokestopListNum); await FortPokestop(session, cancellationToken, pokeStop); if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await RecycleItemsTask.Execute(session, cancellationToken); } } else { await RecycleItemsTask.Execute(session, cancellationToken); } if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await EvolvePokemonTask.Execute(session, cancellationToken); } } else { await EvolvePokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.UseLuckyEggConstantly) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } } else { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } } if (session.LogicSettings.UseIncenseConstantly) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } } else { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } } if (session.LogicSettings.TransferDuplicatePokemon) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } } else { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.TransferWeakPokemon) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } } else { await TransferWeakPokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.RenamePokemon) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await RenamePokemonTask.Execute(session, cancellationToken); } } else { await RenamePokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.AutoFavoritePokemon) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await FavoritePokemonTask.Execute(session, cancellationToken); } } else { await FavoritePokemonTask.Execute(session, cancellationToken); } } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { if (session.LogicSettings.UseNearActionRandom) { if (NearRandom.Next(1, 10) > 4) { await LevelUpPokemonTask.Execute(session, cancellationToken); } } else { await LevelUpPokemonTask.Execute(session, cancellationToken); } } await GetPokeDexCount.Execute(session, cancellationToken); } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } //samuraitruong: temoporary not allow human walk snipe until we implement a good logic to use. if (session.LogicSettings.EnableHumanWalkingSnipe && !session.LogicSettings.UseGpxPathing) { //refactore to move this code inside the task later. await HumanWalkSnipeTask.Execute(session, cancellationToken, async (double lat, double lng) => { //idea of this function is to spin pokestop on way. maybe risky. var reachablePokestops = pokestopList.Where(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude) < 30.0) .ToList(); reachablePokestops = reachablePokestops.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)) .ToList(); foreach (var ps in reachablePokestops) { pokestopList.Remove(ps); await FortPokestop(session, cancellationToken, ps); } }, async() => { var nearestStop = pokestopList.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).FirstOrDefault(); var walkedDistance = LocationUtils.CalculateDistanceInMeters(nearestStop.Latitude, nearestStop.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); if (walkedDistance > session.LogicSettings.HumanWalkingSnipeWalkbackDistanceLimit) { await Task.Delay(3000); var nearbyPokeStops = await UpdateFortsData(session); var notexists = nearbyPokeStops.Where(p => !pokestopList.Any(x => x.Id == p.Id)).ToList(); pokestopList.AddRange(notexists); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); session.EventDispatcher.Send(new HumanWalkSnipeEvent() { Type = HumanWalkSnipeEventTypes.PokestopUpdated, Pokestops = notexists, NearestDistane = walkedDistance }); } }); } } }
private static async Task DoActionAtPokeStop(ISession session, CancellationToken cancellationToken, FortData pokeStop, FortDetailsResponse fortInfo, bool doNotTrySpin = false) { if (pokeStop.Type != FortType.Checkpoint) { return; } //Catch Lure Pokemon if (pokeStop.LureInfo != null) { // added for cooldowns await Task.Delay(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)); await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } // Spin as long as we haven't reached the user defined limits if (!_pokestopLimitReached && !_pokestopTimerReached) { await FarmPokestop(session, pokeStop, fortInfo, cancellationToken, doNotTrySpin); } if (++_stopsHit >= _storeRi) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { _storeRi = _rc.Next(6, 12); //set new storeRI for new random value _stopsHit = 0; if (session.LogicSettings.UseNearActionRandom) { await HumanRandomActionTask.Execute(session, cancellationToken); } else { await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var tracks = GetGpxTracks(session); var eggWalker = new EggWalker(1000, session); for (var curTrk = 0; curTrk < tracks.Count; curTrk++) { cancellationToken.ThrowIfCancellationRequested(); var track = tracks.ElementAt(curTrk); var trackSegments = track.Segments; if (curTrkSeg >= trackSegments.Count) { curTrkSeg = 0; } for (; curTrkSeg < trackSegments.Count; curTrkSeg++) { cancellationToken.ThrowIfCancellationRequested(); var trackPoints = track.Segments.ElementAt(curTrkSeg).TrackPoints; if (curTrkPt >= trackPoints.Count) { curTrkPt = 0; } for (; curTrkPt < trackPoints.Count; curTrkPt++) { cancellationToken.ThrowIfCancellationRequested(); var nextPoint = trackPoints.ElementAt(curTrkPt); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, Convert.ToDouble(nextPoint.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(nextPoint.Lon, CultureInfo.InvariantCulture)); if (distance > 5000) { session.EventDispatcher.Send(new ErrorEvent { Message = session.Translation.GetTranslation(TranslationString.DesiredDestTooFar, nextPoint.Lat, nextPoint.Lon, session.Client.CurrentLatitude, session.Client.CurrentLongitude) }); break; } var pokestopList = await GetPokeStops(session); while (pokestopList.Any()) // warning: this is never entered due to ps cooldowns from UseNearbyPokestopsTask { 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); var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); if (fortSearch.ExperienceAwarded > 0) { 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 }); } else { await RecycleItemsTask.Execute(session, cancellationToken); } if (fortSearch.ItemsAwarded.Count > 0) { await session.Inventory.RefreshCachedInventory(); } } if (DateTime.Now > _lastTasksCall) { _lastTasksCall = DateTime.Now.AddMilliseconds(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)); await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } var geo = new GeoCoordinate(Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lat, CultureInfo.InvariantCulture), Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lon, CultureInfo.InvariantCulture)); await session.Navigation.Move(geo, async() => { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); await eggWalker.ApplyDistance(distance, cancellationToken); } //end trkpts } //end trksegs } //end tracks }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { 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) { Logger.Write( session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart), LogLevel.Warning); await session.Navigation.Move( new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, LocationUtils.getElevation(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude)), session.LogicSettings.WalkingSpeedInKilometerPerHour, null, cancellationToken, session.LogicSettings.DisableHumanWalking); } var pokestopList = await GetPokeStops(session); var stopsHit = 0; var rc = new Random(); //initialize pokestop random cleanup counter first time storeRI = rc.Next(8, 15); var eggWalker = new EggWalker(1000, session); if (pokestopList.Count <= 0) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound) }); } session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); //resort pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); 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 }); await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude, LocationUtils.getElevation(pokeStop.Latitude, pokeStop.Longitude)), session.LogicSettings.WalkingSpeedInKilometerPerHour, async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, cancellationToken, session.LogicSettings.DisableHumanWalking); //Catch Lure Pokemon if (pokeStop.LureInfo != null) { await CatchLurePokemonsTask.Execute(session, pokeStop, cancellationToken); } FortSearchResponse fortSearch; 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 do { cancellationToken.ThrowIfCancellationRequested(); 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; session.EventDispatcher.Send(new FortFailedEvent { Name = fortInfo.Name, Try = fortTry, Max = retryNumber - zeroCheck }); DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 0); } } 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 }); if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull) { storeRI = 1; } 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. await eggWalker.ApplyDistance(distance, cancellationToken); if (++stopsHit >= storeRI) //TODO: OR item/pokemon bag is full //check stopsHit against storeRI random without dividing. { storeRI = rc.Next(6, 12); //set new storeRI for new random value stopsHit = 0; await RecycleItemsTask.Execute(session, cancellationToken); if (fortSearch.ItemsAwarded.Count > 0) { await session.Inventory.RefreshCachedInventory(); } if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var tracks = GetGpxTracks(session); var eggWalker = new EggWalker(1000, session); if (_resumeTrack + _resumeTrackSeg + _resumeTrackPt == 0) { _resumeTrack = session.LogicSettings.ResumeTrack; _resumeTrackSeg = session.LogicSettings.ResumeTrackSeg; _resumeTrackPt = session.LogicSettings.ResumeTrackPt; } for (var curTrk = _resumeTrack; curTrk < tracks.Count; curTrk++) { _resumeTrack = curTrk; cancellationToken.ThrowIfCancellationRequested(); var track = tracks.ElementAt(curTrk); var trackSegments = track.Segments; for (var curTrkSeg = _resumeTrackSeg; curTrkSeg < trackSegments.Count; curTrkSeg++) { _resumeTrackSeg = curTrkSeg; cancellationToken.ThrowIfCancellationRequested(); var trackPoints = trackSegments.ElementAt(curTrkSeg).TrackPoints; for (var curTrkPt = _resumeTrackPt; curTrkPt < trackPoints.Count; curTrkPt++) { _resumeTrackPt = curTrkPt; cancellationToken.ThrowIfCancellationRequested(); var nextPoint = trackPoints.ElementAt(curTrkPt); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, Convert.ToDouble(nextPoint.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(nextPoint.Lon, CultureInfo.InvariantCulture)); if (distance > 5000) { session.EventDispatcher.Send(new ErrorEvent { Message = session.Translation.GetTranslation(TranslationString.DesiredDestTooFar, nextPoint.Lat, nextPoint.Lon, session.Client.CurrentLatitude, session.Client.CurrentLongitude) }); break; } if (DateTime.Now > _lastTasksCall) { _lastTasksCall = DateTime.Now.AddMilliseconds(Math.Min(session.LogicSettings.DelayBetweenPlayerActions, 3000)); await RecycleItemsTask.Execute(session, cancellationToken); if (session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } await GetPokeDexCount.Execute(session, cancellationToken); if (session.LogicSettings.AutomaticallyLevelUpPokemon) { await LevelUpPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseLuckyEggConstantly) { await UseLuckyEggConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.UseIncenseConstantly) { await UseIncenseConstantlyTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.RenamePokemon) { await RenamePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.AutoFavoritePokemon) { await FavoritePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer) { await SnipePokemonTask.Execute(session, cancellationToken); } } var geo = new GeoCoordinate(Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lat, CultureInfo.InvariantCulture), Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lon, CultureInfo.InvariantCulture)); await session.Navigation.Move(geo, async() => { await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); await UseNearbyPokestopsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); await eggWalker.ApplyDistance(distance, cancellationToken); } //end trkpts _resumeTrackPt = 0; } //end trksegs _resumeTrackSeg = 0; } //end tracks _resumeTrack = 0; }