public void Run(CancellationToken cancellationToken) { if (_session.LogicSettings.EvolveAllPokemonAboveIv || _session.LogicSettings.EvolveAllPokemonWithEnoughCandy || _session.LogicSettings.UseLuckyEggsWhileEvolving || _session.LogicSettings.KeepPokemonsThatCanEvolve) { EvolvePokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.AutomaticallyLevelUpPokemon) { LevelUpPokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.UseLuckyEggConstantly) { UseLuckyEggConstantlyTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.UseIncenseConstantly) { UseIncenseConstantlyTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.TransferDuplicatePokemon) { TransferDuplicatePokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.TransferWeakPokemon) { TransferWeakPokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.RenamePokemon) { RenamePokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.AutoFavoritePokemon) { FavoritePokemonTask.Execute(_session, cancellationToken).Wait(cancellationToken); } RecycleItemsTask.Execute(_session, cancellationToken).Wait(cancellationToken); if (_session.LogicSettings.UseEggIncubators) { UseIncubatorsTask.Execute(_session, cancellationToken).Wait(cancellationToken); } if (_session.LogicSettings.UseGpxPathing) { FarmPokestopsGpxTask.Execute(_session, cancellationToken).Wait(cancellationToken); } else { FarmPokestopsTask.Execute(_session, cancellationToken).Wait(cancellationToken); } GetPokeDexCount.Execute(_session, cancellationToken).Wait(cancellationToken); }
public static async Task Execute(ISession session, FortData currentFortData, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchPokemon) { return; } Logger.Write(session.Translation.GetTranslation(TranslationString.LookingForLurePokemon), LogLevel.Debug); var fortId = currentFortData.Id; var pokemonId = currentFortData.LureInfo.ActivePokemonId; if ((session.LogicSettings.UsePokemonSniperFilterOnly && !session.LogicSettings.PokemonToSnipe.Pokemon.Contains(pokemonId)) || (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemonId))) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonSkipped, pokemonId) }); } else { var encounterId = currentFortData.LureInfo.EncounterId; var encounter = await session.Client.Encounter.EncounterLurePokemon(encounterId, fortId); if (encounter.Result == DiskEncounterResponse.Types.Result.Success && session.LogicSettings.CatchPokemon) { await CatchPokemonTask.Execute(session, cancellationToken, encounter, null, currentFortData, encounterId); } else if (encounter.Result == DiskEncounterResponse.Types.Result.PokemonInventoryFull) { if (session.LogicSettings.TransferDuplicatePokemon) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferring) }); await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } } else { if (encounter.Result.ToString().Contains("NotAvailable")) { return; } session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblemLurePokemon, encounter.Result) }); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchPokemon) { return; } Logger.Write(session.Translation.GetTranslation(TranslationString.LookingForIncensePokemon), LogLevel.Debug); var incensePokemon = await session.Client.Map.GetIncensePokemons(); if (incensePokemon.Result == GetIncensePokemonResponse.Types.Result.IncenseEncounterAvailable) { var pokemon = new MapPokemon { EncounterId = incensePokemon.EncounterId, ExpirationTimestampMs = incensePokemon.DisappearTimestampMs, Latitude = incensePokemon.Latitude, Longitude = incensePokemon.Longitude, PokemonId = incensePokemon.PokemonId, SpawnPointId = incensePokemon.EncounterLocation }; OnPokemonEncounterEvent(new List <MapPokemon> { pokemon }); if ((session.LogicSettings.UsePokemonSniperFilterOnly && !session.LogicSettings.PokemonToSnipe.Pokemon.Contains(pokemon.PokemonId)) || (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemon.PokemonId))) { Logger.Write(session.Translation.GetTranslation(TranslationString.PokemonIgnoreFilter, session.Translation.GetPokemonTranslation(pokemon.PokemonId))); } else { var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokemon.Latitude, pokemon.Longitude); await Task.Delay(distance > 100? 500 : 100, cancellationToken); var encounter = await session.Client.Encounter.EncounterIncensePokemon(pokemon.EncounterId, pokemon.SpawnPointId); if (encounter.Result == IncenseEncounterResponse.Types.Result.IncenseEncounterSuccess && session.LogicSettings.CatchPokemon) { await CatchPokemonTask.Execute(session, cancellationToken, encounter, pokemon); } else if (encounter.Result == IncenseEncounterResponse.Types.Result.PokemonInventoryFull) { if (session.LogicSettings.TransferDuplicatePokemon) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferring) }); await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblem, encounter.Result) }); } } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchPokemon) { return; } Logger.Write(session.Translation.GetTranslation(TranslationString.LookingForPokemon), LogLevel.Debug); var pokemons = await GetNearbyPokemons(session); OnPokemonEncounterEvent(pokemons.ToList()); foreach (var pokemon in pokemons) { cancellationToken.ThrowIfCancellationRequested(); var allitems = await session.Inventory.GetItems(); var pokeBallsCount = allitems.FirstOrDefault(i => i.ItemId == ItemId.ItemPokeBall)?.Count; var greatBallsCount = allitems.FirstOrDefault(i => i.ItemId == ItemId.ItemGreatBall)?.Count; var ultraBallsCount = allitems.FirstOrDefault(i => i.ItemId == ItemId.ItemUltraBall)?.Count; var masterBallsCount = allitems.FirstOrDefault(i => i.ItemId == ItemId.ItemMasterBall)?.Count; /* * 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) { Logger.Write(session.Translation.GetTranslation(TranslationString.ZeroPokeballInv)); return; } if ((session.LogicSettings.UsePokemonSniperFilterOnly && !session.LogicSettings.PokemonToSnipe.Pokemon.Contains(pokemon.PokemonId)) || (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemon.PokemonId))) { Logger.Write(session.Translation.GetTranslation(TranslationString.PokemonSkipped, session.Translation.GetPokemonTranslation(pokemon.PokemonId))); continue; } var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokemon.Latitude, pokemon.Longitude); await Task.Delay(distance > 100? 500 : 100, cancellationToken); var encounter = await session.Client.Encounter.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnPointId); if (encounter.Status == EncounterResponse.Types.Status.EncounterSuccess && session.LogicSettings.CatchPokemon) { await CatchPokemonTask.Execute(session, cancellationToken, encounter, pokemon); } else if (encounter.Status == EncounterResponse.Types.Status.PokemonInventoryFull) { if (session.LogicSettings.TransferDuplicatePokemon) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferring) }); await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblem, encounter.Status) }); } // If pokemon is not last pokemon in list, create delay between catches, else keep moving. if (!Equals(pokemons.ElementAtOrDefault(pokemons.Count() - 1), pokemon)) { await Task.Delay(session.LogicSettings.DelayBetweenPokemonCatch, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken, dynamic encounter, MapPokemon pokemon, FortData currentFortData = null, ulong encounterId = 0) { AmountOfBerries = 0; cancellationToken.ThrowIfCancellationRequested(); // If the encounter is null nothing will work below, so exit now if (encounter == null) { return; } float probability = encounter.CaptureProbability?.CaptureProbability_[0]; // Check for pokeballs before proceeding var pokeball = await GetBestBall(session, encounter, probability); if (pokeball == ItemId.ItemUnknown) { return; } //Calculate CP and IV var pokemonCp = encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData?.Cp : encounter.PokemonData?.Cp; var pokemonIv = PokemonInfo.CalculatePokemonPerfection(encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData); // Calculate distance away var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, encounter is EncounterResponse || encounter is IncenseEncounterResponse ? pokemon.Latitude : currentFortData.Latitude, encounter is EncounterResponse || encounter is IncenseEncounterResponse ? pokemon.Longitude : currentFortData.Longitude); CatchPokemonResponse caughtPokemonResponse; var attemptCounter = 1; do { if (session.LogicSettings.MaxPokeballsPerPokemon > 0 && attemptCounter > session.LogicSettings.MaxPokeballsPerPokemon) { break; } pokeball = await GetBestBall(session, encounter, probability); if (pokeball == ItemId.ItemUnknown) { session.EventDispatcher.Send(new NoPokeballEvent { Id = encounter is EncounterResponse ? pokemon.PokemonId : encounter?.PokemonData.PokemonId, Cp = (encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData?.Cp : encounter?.PokemonData?.Cp) ?? 0 }); return; } // Determine whether to use berries or not if ((session.LogicSettings.UseBerriesOperator.ToLower().Equals("and") && pokemonIv >= session.LogicSettings.UseBerriesMinIv && pokemonCp >= session.LogicSettings.UseBerriesMinCp && probability < session.LogicSettings.UseBerriesBelowCatchProbability) || (session.LogicSettings.UseBerriesOperator.ToLower().Equals("or") && ( pokemonIv >= session.LogicSettings.UseBerriesMinIv || pokemonCp >= session.LogicSettings.UseBerriesMinCp || probability < session.LogicSettings.UseBerriesBelowCatchProbability))) { AmountOfBerries++; if (AmountOfBerries <= session.LogicSettings.MaxBerriesToUsePerPokemon) { await UseBerry(session, encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.EncounterId : encounterId, encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.SpawnPointId : currentFortData?.Id); } } //default to excellent throw var normalizedRecticleSize = 1.95; //default spin var spinModifier = 1.0; //Humanized throws if (session.LogicSettings.EnableHumanizedThrows) { //thresholds: https://gist.github.com/anonymous/077d6dea82d58b8febde54ae9729b1bf var spinTxt = "Curve"; var hitTxt = "Excellent"; if (pokemonCp > session.LogicSettings.ForceExcellentThrowOverCp || pokemonIv > session.LogicSettings.ForceExcellentThrowOverIv) { normalizedRecticleSize = Random.NextDouble() * (1.95 - 1.7) + 1.7; } else if (pokemonCp >= session.LogicSettings.ForceGreatThrowOverCp || pokemonIv >= session.LogicSettings.ForceGreatThrowOverIv) { normalizedRecticleSize = Random.NextDouble() * (1.95 - 1.3) + 1.3; hitTxt = "Great"; } else { var regularThrow = 100 - (session.LogicSettings.ExcellentThrowChance + session.LogicSettings.GreatThrowChance + session.LogicSettings.NiceThrowChance); var rnd = Random.Next(1, 101); if (rnd <= regularThrow) { normalizedRecticleSize = Random.NextDouble() * (1 - 0.1) + 0.1; hitTxt = "Ordinary"; } else if (rnd <= regularThrow + session.LogicSettings.NiceThrowChance) { normalizedRecticleSize = Random.NextDouble() * (1.3 - 1) + 1; hitTxt = "Nice"; } else if (rnd <= regularThrow + session.LogicSettings.NiceThrowChance + session.LogicSettings.GreatThrowChance) { normalizedRecticleSize = Random.NextDouble() * (1.7 - 1.3) + 1.3; hitTxt = "Great"; } if (Random.NextDouble() * 100 > session.LogicSettings.CurveThrowChance) { spinModifier = 0.0; spinTxt = "Straight"; } } //round to 2 decimals normalizedRecticleSize = Math.Round(normalizedRecticleSize, 2); Logger.Write($"(Threw ball) {hitTxt} hit. {spinTxt}-ball...", LogLevel.Debug); } caughtPokemonResponse = await session.Client.Encounter.CatchPokemon( encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.EncounterId : encounterId, encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.SpawnPointId : currentFortData.Id, pokeball, normalizedRecticleSize, spinModifier); var lat = encounter is EncounterResponse || encounter is IncenseEncounterResponse ? pokemon.Latitude : currentFortData.Latitude; var lng = encounter is EncounterResponse || encounter is IncenseEncounterResponse ? pokemon.Longitude : currentFortData.Longitude; var evt = new PokemonCaptureEvent { Status = caughtPokemonResponse.Status, Latitude = lat, Longitude = lng }; if (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchSuccess) { var totalExp = 0; foreach (var xp in caughtPokemonResponse.CaptureAward.Xp) { totalExp += xp; } var profile = await session.Client.Player.GetPlayer(); evt.Exp = totalExp; evt.Stardust = profile.PlayerData.Currencies.ToArray()[1].Amount; var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var setting = pokemonSettings.FirstOrDefault(q => pokemon != null && q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.FirstOrDefault(q => setting != null && q.FamilyId == setting.FamilyId); if (family != null) { family.Candy_ += caughtPokemonResponse.CaptureAward.Candy.Sum(); evt.FamilyCandies = family.Candy_; } else { evt.FamilyCandies = caughtPokemonResponse.CaptureAward.Candy.Sum(); } if (session.LogicSettings.TransferDuplicatePokemonOnCapture && session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } } evt.CatchType = encounter is EncounterResponse ? session.Translation.GetTranslation(TranslationString.CatchTypeNormal) : encounter is DiskEncounterResponse ? session.Translation.GetTranslation(TranslationString.CatchTypeLure) : session.Translation.GetTranslation(TranslationString.CatchTypeIncense); evt.Id = encounter is EncounterResponse ? pokemon.PokemonId : encounter?.PokemonData.PokemonId; evt.Level = PokemonInfo.GetLevel(encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData); evt.Cp = encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData?.Cp : encounter?.PokemonData?.Cp ?? 0; evt.MaxCp = PokemonInfo.CalculateMaxCp(encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData); evt.Perfection = Math.Round( PokemonInfo.CalculatePokemonPerfection(encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData)); evt.Probability = Math.Round(probability * 100, 2); evt.Distance = distance; evt.Pokeball = pokeball; evt.Attempt = attemptCounter; await session.Inventory.RefreshCachedInventory(); evt.BallAmount = await session.Inventory.GetItemAmountByType(pokeball); session.EventDispatcher.Send(evt); attemptCounter++; DelayingUtils.Delay(session.LogicSettings.DelayBetweenPokemonCatch, 0); } while (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchMissed || caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchEscape); }
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; for (var curTrkSeg = 0; curTrkSeg < trackSegments.Count; curTrkSeg++) { cancellationToken.ThrowIfCancellationRequested(); var trackPoints = track.Segments.ElementAt(curTrkSeg).TrackPoints; for (var curTrkPt = 0; 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); session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList }); 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); } } await session.Navigation.HumanPathWalking( trackPoints.ElementAt(curTrkPt), 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 }
private static async Task Snipe(ISession session, IEnumerable <PokemonId> pokemonIds, double latitude, double longitude, CancellationToken cancellationToken) { if (LocsVisited.Contains(new PokemonLocation(latitude, longitude))) { return; } var CurrentLatitude = session.Client.CurrentLatitude; var CurrentLongitude = session.Client.CurrentLongitude; var catchedPokemon = false; session.EventDispatcher.Send(new SnipeModeEvent { Active = true }); List <MapPokemon> catchablePokemon; try { await session.Client.Player.UpdatePlayerLocation(latitude, longitude, session.Client.CurrentAltitude, session.Client.CurrentSpeed); session.EventDispatcher.Send(new UpdatePositionEvent { Longitude = longitude, Latitude = latitude }); var mapObjects = session.Client.Map.GetMapObjects().Result; catchablePokemon = mapObjects.Item1.MapCells.SelectMany(q => q.CatchablePokemons) .Where(q => pokemonIds.Contains(q.PokemonId)) .OrderByDescending(pokemon => PokemonInfo.CalculateMaxCpMultiplier(pokemon.PokemonId)) .ToList(); } finally { await session.Client.Player.UpdatePlayerLocation(CurrentLatitude, CurrentLongitude, session.Client.CurrentAltitude, session.Client.CurrentSpeed); } if (catchablePokemon.Count == 0) { // Pokemon not found but we still add to the locations visited, so we don't keep sniping // locations with no pokemon. if (!LocsVisited.Contains(new PokemonLocation(latitude, longitude))) { LocsVisited.Add(new PokemonLocation(latitude, longitude)); } } foreach (var pokemon in catchablePokemon) { EncounterResponse encounter; try { await session.Client.Player.UpdatePlayerLocation(latitude, longitude, session.Client.CurrentAltitude, session.Client.CurrentSpeed); encounter = session.Client.Encounter.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnPointId).Result; } finally { await session.Client.Player.UpdatePlayerLocation(CurrentLatitude, CurrentLongitude, session.Client.CurrentAltitude, session.Client.CurrentSpeed); } if (encounter.Status == EncounterResponse.Types.Status.EncounterSuccess) { if (!LocsVisited.Contains(new PokemonLocation(latitude, longitude))) { LocsVisited.Add(new PokemonLocation(latitude, longitude)); } //Also add exact pokemon location to LocsVisited, some times the server one differ a little. if (!LocsVisited.Contains(new PokemonLocation(pokemon.Latitude, pokemon.Longitude))) { LocsVisited.Add(new PokemonLocation(pokemon.Latitude, pokemon.Longitude)); } session.EventDispatcher.Send(new UpdatePositionEvent { Latitude = CurrentLatitude, Longitude = CurrentLongitude }); await CatchPokemonTask.Execute(session, cancellationToken, encounter, pokemon); catchedPokemon = true; } else if (encounter.Status == EncounterResponse.Types.Status.PokemonInventoryFull) { if (session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation( TranslationString.EncounterProblem, encounter.Status) }); } if (!Equals(catchablePokemon.ElementAtOrDefault(catchablePokemon.Count - 1), pokemon)) { await Task.Delay(session.LogicSettings.DelayBetweenPokemonCatch, cancellationToken); } } if (!catchedPokemon) { session.EventDispatcher.Send(new SnipeEvent { Message = session.Translation.GetTranslation(TranslationString.NoPokemonToSnipe) }); } _lastSnipe = DateTime.Now; session.EventDispatcher.Send(new SnipeModeEvent { Active = false }); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, 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)), null, session, cancellationToken); } var pokestopList = await GetPokeStops(session); //get optimized route var pokeStops = RouteOptimizeUtil.Optimize(pokestopList.ToArray(), session.Client.CurrentLatitude, session.Client.CurrentLongitude); 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 }); foreach (var pokeStop in pokeStops) { cancellationToken.ThrowIfCancellationRequested(); 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 }); var targetLocation = new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude, LocationUtils.getElevation(pokeStop.Latitude, pokeStop.Longitude)); await session.Navigation.Move(targetLocation, async() => { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken); return(true); }, session, cancellationToken); //Check if pokestop is in range, if not, move to pokestop without google routing if ( LocationUtils.CalculateDistanceInMeters(targetLocation, new GeoCoordinate(session.Client.CurrentLatitude, session.Client.CurrentLongitude)) >= 30) { await session.Navigation.Move(targetLocation, null, session, cancellationToken, true); } //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, 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; } OnLootPokestopEvent(pokeStop); 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); } } }