public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Evolve; var all = await session.Inventory.GetPokemons(); var pokemons = all.OrderByDescending(x => x.Cp).ThenBy(n => n.StaminaMax); var pokemon = pokemons.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { return; } if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent() { Message = $"Pokemon {(string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname)} is signed to defend a GYM!" }); return; } var evolveResponse = await session.Client.Inventory.EvolvePokemon(pokemon.Id); session.EventDispatcher.Send(new PokemonEvolveEvent { Uid = pokemon.Id, Id = pokemon.PokemonId, Exp = evolveResponse.ExperienceAwarded, Result = evolveResponse.Result }); if (evolveResponse.EvolvedPokemonData != null) { var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == evolveResponse.EvolvedPokemonData.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonEvolveDoneEvent { Uid = evolveResponse.EvolvedPokemonData.Id, Id = evolveResponse.EvolvedPokemonData.PokemonId, Cp = evolveResponse.EvolvedPokemonData.Cp, Perfection = evolveResponse.EvolvedPokemonData.CalculatePokemonPerfection(), Family = family.FamilyId, Candy = family.Candy_ }); } await DelayingUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 25000); session.State = prevState; }
public static async Task Execute(ISession session, ItemId item, int amount, CancellationToken cancellationToken) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } try { var prevState = session.State; session.State = BotState.Recycle; cancellationToken.ThrowIfCancellationRequested(); await session.Inventory.RefreshCachedInventory(); var itemCount = await session.Inventory.GetItemAmountByType(item); if (itemCount < amount) { amount = itemCount; } await RemoveItems(amount, item, cancellationToken, session); await session.Inventory.RefreshCachedInventory(); session.State = prevState; } catch (OperationCanceledException) { //ignore } catch (Exception ex) { Logger.Write("[RECYCLE FAILURE] " + ex.Message); } }
public static async Task Execute(ISession session, CancellationToken cancellationToken, ulong pokemonId) { try { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); var all = await session.Inventory.GetPokemons(); var pokemon = all.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); await session.Inventory.SetFavoritePokemon(pokemon.Id, pokemon.Favorite == 0); await Task.Delay(session.LogicSettings.DelayTransferPokemon, cancellationToken); session.EventDispatcher.Send(new PokemonFavoriteEvent { Uid = pokemon.Id, Pokemon = pokemon.PokemonId, Cp = pokemon.Cp, Iv = pokemon.CalculatePokemonPerfection(), Candies = family.Candy_, Favoured = pokemon.Favorite == 0 }); pokemon.Favorite = pokemon.Favorite == 0 ? 1 : 0; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); } catch (Exception) { session.EventDispatcher.Send(new ErrorEvent { Message = session.Translation.GetTranslation(TranslationString.OperationCanceled) }); } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var prevState = session.State; await session.Inventory.RefreshCachedInventory(); var currentTotalItems = await session.Inventory.GetTotalItemCount(); var recycleInventoryAtUsagePercentage = session.LogicSettings.RecycleInventoryAtUsagePercentage > 1 ? session.LogicSettings.RecycleInventoryAtUsagePercentage / 100 : session.LogicSettings.RecycleInventoryAtUsagePercentage; if (session.Profile.PlayerData.MaxItemStorage * recycleInventoryAtUsagePercentage > currentTotalItems) { return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } session.State = BotState.Recycle; cancellationToken.ThrowIfCancellationRequested(); var items = await session.Inventory.GetItemsToRecycle(session); foreach (var item in items) { cancellationToken.ThrowIfCancellationRequested(); session.EventDispatcher.Send(new ItemRecycledEvent { Id = item.ItemId, Count = item.Count }); await session.Client.Inventory.RecycleItem(item.ItemId, item.Count); await Task.Delay(session.LogicSettings.DelayRecycleItem, cancellationToken); } await OptimizedRecycleBalls(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecyclePotions(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecycleRevives(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecycleBerries(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await session.Inventory.RefreshCachedInventory(); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.LevelPoke; // get the families and the pokemons settings to do some actual smart stuff like checking if you have enough candy in the first place var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonUpgradeSettings = await session.Inventory.GetPokemonUpgradeSettings(); var playerLevel = await session.Inventory.GetPlayerStats(); List <PokemonData> allPokemon = new List <PokemonData>(); // priority for upgrading if (session.LogicSettings.LevelUpByCPorIv?.ToLower() == "iv") { allPokemon = session.Inventory.GetHighestsPerfect(session.Profile.PlayerData.MaxPokemonStorage).Result.ToList(); } else if (session.LogicSettings.LevelUpByCPorIv?.ToLower() == "cp") { allPokemon = session.Inventory.GetPokemons().Result.OrderByDescending(p => p.Cp).ToList(); } // iterate on whatever meets both minimums // to disable one or the other, set to 0 foreach (var pokemon in allPokemon.Where(p => string.IsNullOrEmpty(p.DeployedFortId) && session.Inventory.GetPerfect(p) >= session.LogicSettings.UpgradePokemonIvMinimum && p.Cp >= session.LogicSettings.UpgradePokemonCpMinimum)) { int pokeLevel = (int)PokemonInfo.GetLevel(pokemon); var currentPokemonSettings = pokemonSettings.FirstOrDefault(q => pokemon != null && q.PokemonId.Equals(pokemon.PokemonId)); var family = pokemonFamilies.FirstOrDefault(q => currentPokemonSettings != null && q.FamilyId.Equals(currentPokemonSettings.FamilyId)); int candyToEvolveTotal = GetCandyMinToKeep(pokemonSettings, currentPokemonSettings); // you can upgrade up to player level+2 right now // may need translation for stardust??? if (pokeLevel < playerLevel?.FirstOrDefault().Level + pokemonUpgradeSettings.FirstOrDefault().AllowedLevelsAbovePlayer && family.Candy_ > pokemonUpgradeSettings.FirstOrDefault()?.CandyCost[pokeLevel] && family.Candy_ >= candyToEvolveTotal && session.Profile.PlayerData.Currencies.FirstOrDefault(c => c.Name.ToLower().Contains("stardust")).Amount >= pokemonUpgradeSettings.FirstOrDefault()?.StardustCost[pokeLevel]) { await DoUpgrade(session, pokemon); } } session.State = prevState; }
public static async Task Execute(ISession session, ulong pokemonId) { if (!await CheckBotStateTask.Execute(session, default(CancellationToken))) return; var id = pokemonId; var prevState = session.State; session.State = BotState.Transfer; var all = await session.Inventory.GetPokemons(); var pokemons = all.OrderByDescending(x => x.Cp).ThenBy(n => n.StaminaMax); var pokemon = pokemons.FirstOrDefault(p => p.Id == id); if (pokemon == null) return; if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent() { Message = $"Pokemon {(string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname)} is signed to defend a GYM!" }); return; } var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); await session.Client.Inventory.TransferPokemon(id); await session.Inventory.DeletePokemonFromInvById(id); var bestPokemonOfType = (session.LogicSettings.PrioritizeIvOverCp ? await session.Inventory.GetHighestPokemonOfTypeByIv(pokemon) : await session.Inventory.GetHighestPokemonOfTypeByCp(pokemon)) ?? pokemon; var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); family.Candy_++; // Broadcast event as everyone would benefit session.EventDispatcher.Send(new TransferPokemonEvent { Uid = pokemon.Id, Id = pokemon.PokemonId, Perfection = PoGoUtils.PokemonInfo.CalculatePokemonPerfection(pokemon), Cp = pokemon.Cp, BestCp = bestPokemonOfType.Cp, BestPerfection = PoGoUtils.PokemonInfo.CalculatePokemonPerfection(bestPokemonOfType), FamilyCandies = family.Candy_, Family = family.FamilyId }); await Task.Delay(session.LogicSettings.DelayTransferPokemon); session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Renaming; var pokemons = await session.Inventory.GetPokemons(); foreach (var pokemon in pokemons) { cancellationToken.ThrowIfCancellationRequested(); var perfection = Math.Round(pokemon.CalculatePokemonPerfection()); var pokemonName = session.Translation.GetPokemonName(pokemon.PokemonId); // iv number + templating part + pokemonName <= 12 var nameLength = 12 - (perfection.ToString(CultureInfo.InvariantCulture).Length + session.LogicSettings.RenameTemplate.Length - 6); if (pokemonName.Length > nameLength) { pokemonName = pokemonName.Substring(0, nameLength); } var newNickname = string.Format(session.LogicSettings.RenameTemplate, pokemonName, perfection); var oldNickname = pokemon.Nickname.Length != 0 ? pokemon.Nickname : session.Translation.GetPokemonName(pokemon.PokemonId); // If "RenameOnlyAboveIv" = true only rename pokemon with IV over "KeepMinIvPercentage" // Favorites will be skipped if ((!session.LogicSettings.RenameOnlyAboveIv || perfection >= session.LogicSettings.KeepMinIvPercentage) && newNickname != oldNickname && pokemon.Favorite == 0) { await session.Client.Inventory.NicknamePokemon(pokemon.Id, newNickname); await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonRename, session.Translation.GetPokemonName(pokemon.PokemonId), pokemon.Id, oldNickname, newNickname) }); } } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchWildPokemon) { return; } if (session.Runtime.PokeBallsToCollect > 0) { return; } Logger.Write(session.Translation.GetTranslation(TranslationString.LookingForPokemon), LogLevel.Debug, session: session); var pokemons = await GetWildPokemons(session); if (pokemons != null && pokemons.Any()) { session.EventDispatcher.Send(new NoticeEvent { Message = "Found some hiding pokemons in the area, trying to catch'em now!" }); session.EventDispatcher.Send(new PokemonsWildFoundEvent { Pokemons = pokemons }); foreach (var pokemon in pokemons) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } if (session.LogicSettings.Teleport) { await session.Client.Player.UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude, session.Client.Settings.DefaultAltitude); } else { await MoveToPokemon(pokemon, session, cancellationToken); } } } }
public static async Task Execute(ISession session, ItemId item, int amount, CancellationToken cancellationToken) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Recycle; cancellationToken.ThrowIfCancellationRequested(); await session.Inventory.RefreshCachedInventory(); var itemCount = await session.Inventory.GetItemAmountByType(item); if (itemCount < amount) { amount = itemCount; } await RemoveItems(amount, item, cancellationToken, session); await session.Inventory.RefreshCachedInventory(); session.State = prevState; }
public static async Task Execute(ISession session, FortData currentFortData, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchWildPokemon) { return; } if (session.Runtime.PokeBallsToCollect > 0) { return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); session.EventDispatcher.Send(new DebugEvent() { Message = session.Translation.GetTranslation(TranslationString.LookingForLurePokemon) }); var fortId = currentFortData.Id; if (currentFortData.LureInfo == null) { return; } var pokemonId = currentFortData.LureInfo.ActivePokemonId; if (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemonId)) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonSkipped, session.Translation.GetPokemonName(pokemonId)) }); } else { var encounterId = currentFortData.LureInfo.EncounterId; var encounter = await session.Client.Encounter.EncounterLurePokemon(encounterId, fortId); if (encounter.Result == DiskEncounterResponse.Types.Result.Success) { //var pokemons = await session.MapCache.MapPokemons(session); //var pokemon = pokemons.FirstOrDefault(i => i.PokemonId == encounter.PokemonData.PokemonId); session.EventDispatcher.Send(new DebugEvent() { Message = "Found a Lure Pokemon." }); MapPokemon _pokemon = new MapPokemon { EncounterId = currentFortData.LureInfo.EncounterId, ExpirationTimestampMs = currentFortData.LureInfo.LureExpiresTimestampMs, Latitude = currentFortData.Latitude, Longitude = currentFortData.Longitude, PokemonId = currentFortData.LureInfo.ActivePokemonId, SpawnPointId = currentFortData.LureInfo.FortId }; if (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(_pokemon.PokemonId)) { session.EventDispatcher.Send(new NoticeEvent() { Message = session.Translation.GetTranslation(TranslationString.PokemonIgnoreFilter, session.Translation.GetPokemonName(_pokemon.PokemonId)) }); } else { session.EventDispatcher.Send(new PokemonsFoundEvent { Pokemons = new[] { _pokemon } }); PokemonCacheItem pokemon = new PokemonCacheItem(_pokemon); var catchRes = await CatchPokemonTask.Execute(session, encounter, pokemon, cancellationToken, currentFortData, encounterId); if (!catchRes) { session.Runtime.PokeBallsToCollect = 10; return; } currentFortData.LureInfo = null; session.EventDispatcher.Send(new PokemonDisappearEvent { Pokemon = _pokemon }); } //await CatchPokemonTask.Execute(session, encounter, pokemon, 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) }); } // always wait the delay amount between catches, ideally to prevent you from making another call too early after a catch event await Task.Delay(session.LogicSettings.DelayBetweenPokemonCatch); } }
public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } var all = await session.Inventory.GetPokemons(); var pokemons = all.OrderByDescending(x => x.Cp).ThenBy(n => n.StaminaMax); var pokemon = pokemons.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } var prevState = session.State; session.State = BotState.Evolve; var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.PokeInGym, string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname) }); session.State = prevState; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } if (family.Candy_ < setting.CandyToEvolve) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.CandyMiss, session.Translation.GetPokemonName(pokemon.PokemonId), $"{family.Candy_}/{setting.CandyToEvolve}") }); session.State = prevState; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } var isBuddy = pokemonId == session.Profile.PlayerData.BuddyPokemon.Id; var evolveResponse = await session.Client.Inventory.EvolvePokemon(pokemon.Id); session.EventDispatcher.Send(new PokemonEvolveEvent { Uid = pokemon.Id, Id = pokemon.PokemonId, Exp = evolveResponse.ExperienceAwarded, Result = evolveResponse.Result }); if (evolveResponse.EvolvedPokemonData != null) { family.Candy_ -= (setting.CandyToEvolve - 1); setting = pokemonSettings.Single(q => q.PokemonId == evolveResponse.EvolvedPokemonData.PokemonId); family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); var evolvedPokemonData = evolveResponse.EvolvedPokemonData; session.EventDispatcher.Send(new PokemonEvolveDoneEvent { Uid = evolvedPokemonData.Id, Id = evolvedPokemonData.PokemonId, Cp = evolvedPokemonData.Cp, Perfection = evolvedPokemonData.CalculatePokemonPerfection(), Family = family.FamilyId, Level = evolvedPokemonData.GetLevel(), Candy = family.Candy_, Type1 = setting.Type, Type2 = setting.Type2, Stats = setting.Stats, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(evolvedPokemonData, session.Runtime.CurrentLevel), Stamina = evolvedPokemonData.Stamina, IvSta = evolvedPokemonData.IndividualStamina, Move1 = evolvedPokemonData.Move1, Move2 = evolvedPokemonData.Move2, PossibleCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(evolvedPokemonData, 40), CandyToEvolve = setting.CandyToEvolve, IvAtk = evolvedPokemonData.IndividualAttack, IvDef = evolvedPokemonData.IndividualDefense, Weight = evolvedPokemonData.WeightKg, Cpm = evolvedPokemonData.CpMultiplier + evolvedPokemonData.AdditionalCpMultiplier, StaminaMax = evolvedPokemonData.StaminaMax, Evolutions = setting.EvolutionIds.ToArray() }); if (isBuddy) { session.BuddyPokemon = evolveResponse.EvolvedPokemonData; //TODO: CHECK THAT, Or should resend that poke as buddy } } session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); await DelayingUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 25000); session.State = prevState; }
public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken, bool toMax = false) { try { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } } catch (TaskCanceledException) { //ignore } catch (Exception ex) { Logger.Write($"[MANUAL TASAK FAIL] ERROR: {ex.Message}"); } var prevState = session.State; session.State = BotState.LevelPoke; var all = await session.Inventory.GetPokemons(); var pokemon = all.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { session.State = prevState; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.PokeInGym, string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname) }); session.State = prevState; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } if (pokemon.GetLevel() >= session.Runtime.CurrentLevel + 1.5) { session.State = prevState; session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } bool success; var max = false; UpgradePokemonResponse latestSuccessResponse = null; do { success = false; var upgradeResult = await session.Inventory.UpgradePokemon(pokemon.Id); await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); switch (upgradeResult.Result) { case UpgradePokemonResponse.Types.Result.Success: success = true; latestSuccessResponse = upgradeResult; session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeSuccess, session.Translation.GetPokemonName(upgradeResult.UpgradedPokemon.PokemonId), upgradeResult.UpgradedPokemon.Cp) }); if (upgradeResult.UpgradedPokemon.GetLevel() >= session.Runtime.CurrentLevel + 1.5) { max = true; } break; case UpgradePokemonResponse.Types.Result.ErrorInsufficientResources: session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeFailed) }); break; case UpgradePokemonResponse.Types.Result.ErrorUpgradeNotAvailable: session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeUnavailable, session.Translation.GetPokemonName(pokemon.PokemonId), pokemon.Cp, PokemonInfo.CalculateMaxCp(pokemon)) }); break; default: session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeFailedError, session.Translation.GetPokemonName(pokemon.PokemonId)) }); break; } } while (success && toMax && !cancellationToken.IsCancellationRequested && !max); if (latestSuccessResponse != null && !cancellationToken.IsCancellationRequested) { var mon = latestSuccessResponse.UpgradedPokemon; var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonStatsChangedEvent { Name = !string.IsNullOrEmpty(mon.Nickname) ? mon.Nickname : session.Translation.GetPokemonName(mon.PokemonId), Uid = pokemonId, Id = mon.PokemonId, Family = family.FamilyId, Candy = family.Candy_, Cp = mon.Cp, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(mon, session.Runtime.CurrentLevel), Iv = mon.CalculatePokemonPerfection(), Favourite = mon.Favorite == 1, Weight = mon.WeightKg, Cpm = mon.CpMultiplier + mon.AdditionalCpMultiplier, Level = mon.GetLevel(), IvDef = mon.IndividualDefense, IvAtk = mon.IndividualAttack, Stamina = mon.Stamina, StaminaMax = mon.StaminaMax }); session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Busy; var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemons = await session.Inventory.GetPokemons(); //pokemons not in gym, not favorited, and IV above FavoriteMinIv % var pokemonsToBeFavorited = pokemons.Where(p => p.DeployedFortId == string.Empty && p.Favorite == 0 && (p.CalculatePokemonPerfection() > session.LogicSettings.FavoriteMinIvPercentage)).ToList(); //favorite foreach (var pokemon in pokemonsToBeFavorited) { if (pokemon.Favorite == 0) { var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); await session.Inventory.SetFavoritePokemon(pokemon.Id, true); session.EventDispatcher.Send(new PokemonFavoriteEvent { Uid = pokemon.Id, Pokemon = pokemon.PokemonId, Cp = pokemon.Cp, Iv = pokemon.CalculatePokemonPerfection(), Candies = family.Candy_, Favoured = true }); } await Task.Delay(session.LogicSettings.DelayTransferPokemon, cancellationToken); } //pokemons not in gym, favorited, and IV lower than FavoriteMinIv % var pokemonsToBeUnFavorited = pokemons.Where(p => p.DeployedFortId == string.Empty && p.Favorite == 1 && (p.CalculatePokemonPerfection() < session.LogicSettings.FavoriteMinIvPercentage)).ToList(); //unfavorite foreach (var pokemon in pokemonsToBeUnFavorited) { if (pokemon.Favorite == 1) { var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); await session.Inventory.SetFavoritePokemon(pokemon.Id, false); session.EventDispatcher.Send(new PokemonFavoriteEvent { Uid = pokemon.Id, Pokemon = pokemon.PokemonId, Cp = pokemon.Cp, Iv = pokemon.CalculatePokemonPerfection(), Candies = family.Candy_, Favoured = false }); } await Task.Delay(session.LogicSettings.DelayTransferPokemon, cancellationToken); } session.State = prevState; }
public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken, bool toMax = false) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.LevelPoke; var all = await session.Inventory.GetPokemons(); var pokemon = all.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { return; } if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent() { Message = $"Pokemon {(string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname)} is signed to defend a GYM!" }); return; } bool success; UpgradePokemonResponse latestSuccessResponse = null; do { success = false; var upgradeResult = await session.Inventory.UpgradePokemon(pokemon.Id); switch (upgradeResult.Result) { case UpgradePokemonResponse.Types.Result.Success: success = true; latestSuccessResponse = upgradeResult; session.EventDispatcher.Send(new NoticeEvent() { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeSuccess, session.Translation.GetPokemonName(upgradeResult.UpgradedPokemon.PokemonId), upgradeResult.UpgradedPokemon.Cp) }); break; case UpgradePokemonResponse.Types.Result.ErrorInsufficientResources: session.EventDispatcher.Send(new NoticeEvent() { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeFailed) }); break; case UpgradePokemonResponse.Types.Result.ErrorUpgradeNotAvailable: session.EventDispatcher.Send(new NoticeEvent() { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeUnavailable, session.Translation.GetPokemonName(pokemon.PokemonId), pokemon.Cp, PokemonInfo.CalculateMaxCp(pokemon)) }); break; default: session.EventDispatcher.Send(new NoticeEvent() { Message = session.Translation.GetTranslation(TranslationString.PokemonUpgradeFailedError, session.Translation.GetPokemonName(pokemon.PokemonId)) }); break; } await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); } while (success && toMax); if (latestSuccessResponse != null) { var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonStatsChangedEvent { Name = !string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.Nickname : session.Translation.GetPokemonName(pokemon.PokemonId), Uid = pokemonId, Id = pokemon.PokemonId, Family = family.FamilyId, Candy = family.Candy_, Cp = latestSuccessResponse.UpgradedPokemon.Cp, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(latestSuccessResponse.UpgradedPokemon, session.Runtime.CurrentLevel), Iv = latestSuccessResponse.UpgradedPokemon.CalculatePokemonPerfection(), Favourite = pokemon.Favorite == 1 }); } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); // Refresh inventory so that the player stats are fresh // await session.Inventory.RefreshCachedInventory(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Transfer; var duplicatePokemons = await session.Inventory.GetDuplicatePokemonToTransfer(session.LogicSettings.KeepPokemonsThatCanEvolve, session.LogicSettings.PrioritizeIvOverCp, session.LogicSettings.PokemonsNotToTransfer); if (session.Profile.PlayerData.BuddyPokemon != null) { duplicatePokemons = duplicatePokemons.Where(x => x.Id != session.Profile.PlayerData.BuddyPokemon.Id); } var currentPokemonCount = await session.Inventory.GetPokemonsCount(); var maxPokemonCount = session.Profile.PlayerData.MaxPokemonStorage; session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.CurrentPokemonUsage, currentPokemonCount, maxPokemonCount) }); var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); if (duplicatePokemons != null) { foreach (var duplicatePokemon in duplicatePokemons) { cancellationToken.ThrowIfCancellationRequested(); if (!string.IsNullOrEmpty(duplicatePokemon.DeployedFortId)) { continue; } await session.Client.Inventory.TransferPokemon(duplicatePokemon.Id); await session.Inventory.DeletePokemonFromInvById(duplicatePokemon.Id); var bestPokemonOfType = (session.LogicSettings.PrioritizeIvOverCp ? await session.Inventory.GetHighestPokemonOfTypeByIv(duplicatePokemon) : await session.Inventory.GetHighestPokemonOfTypeByCp(duplicatePokemon)) ?? duplicatePokemon; var setting = pokemonSettings?.Single(q => q.PokemonId == duplicatePokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting?.FamilyId); family.Candy_++; session.EventDispatcher.Send(new TransferPokemonEvent { Uid = duplicatePokemon.Id, Id = duplicatePokemon.PokemonId, Perfection = duplicatePokemon.CalculatePokemonPerfection(), Cp = duplicatePokemon.Cp, BestCp = bestPokemonOfType.Cp, BestPerfection = bestPokemonOfType.CalculatePokemonPerfection(), FamilyCandies = family.Candy_, Family = family.FamilyId }); await Task.Delay(session.LogicSettings.DelayTransferPokemon, cancellationToken); } } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!session.LogicSettings.CatchWildPokemon) { return; } if (session.Runtime.PokeBallsToCollect > 0) { return; } Logger.Write(session.Translation.GetTranslation(TranslationString.LookingForPokemon), LogLevel.Debug, session: session); var pokemons = await GetWildPokemons(session); pokemons = pokemons?.Where(x => session.LogicSettings.PokemonsNotToCatch.All(v => v != x.PokemonData?.PokemonId)) .OrderByDescending(x => x.PokemonData?.PokemonId.HowRare()); if (pokemons != null && pokemons.Any()) { var hiddenPokeNames = pokemons.Select( x => x.PokemonData?.Id != null ? session.Translation.GetPokemonName(x.PokemonData.PokemonId) : "") .Aggregate((x, v) => x + ", " + v); session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.FoundHiding) + " - " + hiddenPokeNames }); session.EventDispatcher.Send(new PokemonsWildFoundEvent { Pokemons = pokemons }); foreach (var pokemon in pokemons) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } if (session.LogicSettings.Teleport) { await session.Client.Player.UpdatePlayerLocation(pokemon.Latitude, pokemon.Longitude, session.Client.Settings.DefaultAltitude); } else { await MoveToPokemon(pokemon, session, cancellationToken); } session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); if (!session.ForceMoveJustDone) { continue; } foreach (var p in pokemons) { session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = p.EncounterId }); } break; } } }
public static async Task <bool> Execute(ISession session, dynamic encounter, PokemonCacheItem pokemon, CancellationToken cancellationToken, FortData currentFortData = null, ulong encounterId = 0) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return(false); } if (encounter is EncounterResponse && pokemon == null) { throw new ArgumentException("Parameter pokemon must be set, if encounter is of type EncounterResponse", nameof(pokemon)); } var prevState = session.State; session.State = BotState.Catch; var canUseBerry = true; CatchPokemonResponse caughtPokemonResponse; var attemptCounter = 1; do { if (session.LogicSettings.MaxPokeballsPerPokemon > 0 && attemptCounter > session.LogicSettings.MaxPokeballsPerPokemon) { break; } float probability = encounter?.CaptureProbability?.CaptureProbability_[0]; ItemId 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 }); session.State = prevState; return(false); } var useBerryBelowCatchProbability = session.LogicSettings.UseBerryBelowCatchProbability > 1 ? session.LogicSettings.UseBerryBelowCatchProbability / 100 : session.LogicSettings.UseBerryBelowCatchProbability; var isLowProbability = probability < useBerryBelowCatchProbability; var isHighCp = encounter != null && (encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData?.Cp : encounter.PokemonData?.Cp) > session.LogicSettings.UseBerryMinCp; var isHighPerfection = PokemonInfo.CalculatePokemonPerfection(encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData) >= session.LogicSettings.UseBerryMinIv; if (isLowProbability && ((session.LogicSettings.PrioritizeIvOverCp && isHighPerfection) || isHighCp) && canUseBerry) { await UseBerry(session, encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.EncounterId : encounterId, encounter is EncounterResponse || encounter is IncenseEncounterResponse ?pokemon.SpawnPointId : currentFortData?.Id); canUseBerry = false; await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 1000); } 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); double normalizedRecticleSize, spinModifier; if (session.LogicSettings.HumanizeThrows) { normalizedRecticleSize = Rng.NextInRange(session.LogicSettings.ThrowAccuracyMin, session.LogicSettings.ThrowAccuracyMax) * 1.85 + 0.1; // 0.1..1.95 spinModifier = Rng.NextDouble() > session.LogicSettings.ThrowSpinFrequency ? 0.0 : 1.0; } else { normalizedRecticleSize = 1.95; spinModifier = 1.00; } Func <ItemId, string> returnRealBallName = a => { switch (a) { case ItemId.ItemPokeBall: return(session.Translation.GetTranslation(TranslationString.Pokeball)); case ItemId.ItemGreatBall: return(session.Translation.GetTranslation(TranslationString.GreatPokeball)); case ItemId.ItemUltraBall: return(session.Translation.GetTranslation(TranslationString.UltraPokeball)); case ItemId.ItemMasterBall: return(session.Translation.GetTranslation(TranslationString.MasterPokeball)); default: return(session.Translation.GetTranslation(TranslationString.CommonWordUnknown)); } }; Func <double, string> getThrowType = a => { if (a < 1.0) { return("Normal "); } if (a < 1.3) { return("Nice! "); } if (a < 1.7) { return("Great! "); } return(a > 1.6 ? "Excellent! " : "unknown "); }; var hit = Rng.NextDouble() > session.LogicSettings.MissChance; Logging.Logger.Write($"Throwing {(Math.Abs(spinModifier - 1) < 0.00001 ?"Spinning " : "" )}{getThrowType(normalizedRecticleSize)}{returnRealBallName(pokeball)} - {(hit ? "WILL HIT" : "WILL MISS")}", Logging.LogLevel.Caught, session: session); 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, hitPokemon : hit); session.EventDispatcher.Send(new ItemLostEvent { Id = pokeball, Count = 1 }); 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) { if (pokemon != null) { pokemon.Caught = true; } evt.Uid = caughtPokemonResponse.CapturedPokemonId; var totalExp = caughtPokemonResponse.CaptureAward.Xp.Sum(); 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 => 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.Family = family.FamilyId; evt.FamilyCandies = family.Candy_; } else { evt.FamilyCandies = caughtPokemonResponse.CaptureAward.Candy.Sum(); } session.MapCache.PokemonCaught(pokemon); } else if (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchFlee) { pokemon.Caught = true; } else if (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchEscape) { canUseBerry = true; } 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; var pokeData = (encounter is EncounterResponse ? encounter.WildPokemon?.PokemonData : encounter?.PokemonData) as PokemonData; if (pokeData != null) { evt.Level = PokemonInfo.GetLevel(pokeData); evt.Cp = pokeData.Cp; evt.MaxCp = PokemonInfo.CalculateMaxCp(pokeData); evt.Perfection = Math.Round(pokeData.CalculatePokemonPerfection(), 2); evt.Probability = Math.Round(probability * 100, 2); evt.Move1 = pokeData.Move1; evt.Move2 = pokeData.Move2; } 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++; await Task.Delay(session.LogicSettings.DelayCatchPokemon); } while (caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchMissed || caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchEscape); session.State = prevState; return(true); }
//Please do not change GetPokeStops() in this file, it's specifically set //to only find stops within 40 meters //this is for gpx pathing, we are not going to the pokestops, //so do not make it more than 40 because it will never get close to those stops. public static async Task Execute(ISession session, CancellationToken cancellationToken, bool sendPokeStopsEvent = false) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); var pokestopList = await GetPokeStops(session); if (sendPokeStopsEvent) { session.EventDispatcher.Send(new PokeStopListEvent { Forts = pokestopList.Select(x => x.BaseFortData).ToList() }); } while (pokestopList.Any()) { cancellationToken.ThrowIfCancellationRequested(); pokestopList = pokestopList.OrderBy( i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList(); var pokeStop = pokestopList[0]; pokestopList.RemoveAt(0); if (pokeStop.Used) { continue; } if (!session.LogicSettings.LootPokestops) { session.MapCache.UsedPokestop(pokeStop, session); continue; } var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude); await DelayingUtils.Delay(session.LogicSettings.DelayPokestop, 5000); if (fortSearch.ExperienceAwarded > 0) { session.Runtime.StopsHit++; session.Runtime.PokestopsToCheckGym--; session.EventDispatcher.Send(new FortUsedEvent { Id = pokeStop.Id, Name = fortInfo.Name, Exp = fortSearch.ExperienceAwarded, Gems = fortSearch.GemsAwarded, Items = StringUtils.GetSummedFriendlyNameOfItemAwardList(fortSearch.ItemsAwarded), Latitude = pokeStop.Latitude, Longitude = pokeStop.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls.FirstOrDefault() }); if (fortSearch.PokemonDataEgg != null) { session.EventDispatcher.Send(new EggFoundEvent { Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget, PokeStopName = fortInfo.Name }); } session.MapCache.UsedPokestop(pokeStop, session); session.EventDispatcher.Send(new InventoryNewItemsEvent { Items = fortSearch.ItemsAwarded.ToItemList() }); if (session.Runtime.PokeBallsToCollect > 0) { session.Runtime.PokeBallsToCollect -= fortSearch.ItemsAwarded.ToItemList() .Where(x => x.Item1 == ItemId.ItemPokeBall || x.Item1 == ItemId.ItemGreatBall || x.Item1 == ItemId.ItemUltraBall || x.Item1 == ItemId.ItemMasterBall).Sum(x => x.Item2); } } if (pokeStop.LureInfo != null) {//because we're all f*****g idiots for not catching this sooner await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); //Refresh inventory so that the player stats are fresh //await session.Inventory.RefreshCachedInventory(); too much inventory refresh await CheckChallengeDoneTask.Execute(session, cancellationToken); await CheckChallengeTask.Execute(session, cancellationToken); if (!session.LogicSettings.CatchWildPokemon) { return; } if (session.Runtime.PokeBallsToCollect > 0) { return; } //session.EventDispatcher.Send(new DebugEvent() //{ // Message = session.Translation.GetTranslation(TranslationString.LookingForPokemon) //}); var pokemons = await GetNearbyPokemons(session); if (session.LogicSettings.UsePokemonToNotCatchFilter) { pokemons = pokemons.Where(x => !session.LogicSettings.PokemonsNotToCatch.Contains(x.PokemonId)).ToList(); } session.EventDispatcher.Send(new PokemonsFoundEvent { Pokemons = pokemons.Select(x => x.BaseMapPokemon) }); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.FoundPokemons; pokemons = pokemons.OrderByDescending(x => x.PokemonId.HowRare()).ToList(); foreach (var pokemon in pokemons) { if (pokemon.ExpirationTimestampMs > DateTime.UtcNow.ToUnixTime()) { continue; } cancellationToken.ThrowIfCancellationRequested(); var pokeBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemPokeBall); var greatBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemGreatBall); var ultraBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemUltraBall); var masterBallsCount = await session.Inventory.GetItemAmountByType(ItemId.ItemMasterBall); if (pokeBallsCount + greatBallsCount + ultraBallsCount + masterBallsCount == 0) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.ZeroPokeballInv) }); session.State = prevState; session.Runtime.PokeBallsToCollect = 10; session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); continue; } if (session.LogicSettings.UsePokemonToNotCatchFilter && session.LogicSettings.PokemonsNotToCatch.Contains(pokemon.PokemonId)) { if (!pokemon.Caught) { session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonSkipped, session.Translation.GetPokemonName(pokemon.PokemonId)) }); } pokemon.Caught = true; session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); continue; } var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokemon.Latitude, pokemon.Longitude); await Task.Delay(distance > 100? 3000 : 500, cancellationToken); var encounter = await session.Client.Encounter.EncounterPokemon(pokemon.EncounterId, pokemon.SpawnPointId); try { switch (encounter.Status) { case EncounterResponse.Types.Status.EncounterSuccess: var catchRes = await CatchPokemonTask.Execute(session, encounter, pokemon, cancellationToken); if (!catchRes) { session.Runtime.PokeBallsToCollect = 10; session.State = prevState; foreach (var p in pokemons) { session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = p.EncounterId }); } return; } break; case EncounterResponse.Types.Status.PokemonInventoryFull: if (session.LogicSettings.TransferDuplicatePokemon) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferring) }); session.State = BotState.Idle; await TransferDuplicatePokemonTask.Execute(session, cancellationToken); session.State = BotState.FoundPokemons; } else { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InvFullTransferManually) }); } break; default: session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblem, encounter.Status) }); break; } } catch (Exception) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.ErrorCatchNearby) }); await Task.Delay(5000, cancellationToken); } session.EventDispatcher.Send(new PokemonDisappearEvent { EncounterId = pokemon.EncounterId }); // always wait the delay amount between catches, ideally to prevent you from making another call too early after a catch event await Task.Delay(session.LogicSettings.DelayBetweenPokemonCatch, cancellationToken); } session.State = prevState; }
public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken, string customName = null, bool toDefault = false) { if (customName == null) { return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var id = pokemonId; var all = await session.Inventory.GetPokemons(); var pokemons = all.OrderByDescending(x => x.Cp).ThenBy(n => n.StaminaMax); var pokemon = pokemons.FirstOrDefault(p => p.Id == id); if (pokemon == null) { return; } var pokemonDefaultName = session.Translation.GetPokemonName(pokemon.PokemonId); var currentNickname = pokemon.Nickname.Length != 0 ? pokemon.Nickname : session.Translation.GetPokemonName(pokemon.PokemonId); if (toDefault) { customName = pokemonDefaultName; } if (currentNickname == customName) { return; } var resp = await session.Client.Inventory.NicknamePokemon(id, customName); var prevState = session.State; session.State = BotState.Renaming; await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 2000); session.EventDispatcher.Send(new NoticeEvent { Message = session.Translation.GetTranslation(TranslationString.PokemonRename, session.Translation.GetPokemonName(pokemon.PokemonId), pokemon.Id, currentNickname, customName) }); if (resp.Result == NicknamePokemonResponse.Types.Result.Success) { var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonStatsChangedEvent { Name = customName, Uid = pokemonId, Id = pokemon.PokemonId, Family = family.FamilyId, Candy = family.Candy_, Cp = pokemon.Cp, Iv = pokemon.CalculatePokemonPerfection(), Favourite = pokemon.Favorite == 1 }); } session.State = prevState; }
public static async Task Execute(ISession session, ulong pokemonId, CancellationToken cancellationToken) { if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Evolve; var all = await session.Inventory.GetPokemons(); var pokemons = all.OrderByDescending(x => x.Cp).ThenBy(n => n.StaminaMax); var pokemon = pokemons.FirstOrDefault(p => p.Id == pokemonId); if (pokemon == null) { return; } var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); var pokemonSettings = (await session.Inventory.GetPokemonSettings()).ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == pokemon.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); if (!string.IsNullOrEmpty(pokemon.DeployedFortId)) { session.EventDispatcher.Send(new WarnEvent() { Message = $"Pokemon {(string.IsNullOrEmpty(pokemon.Nickname) ? pokemon.PokemonId.ToString() : pokemon.Nickname)} is signed to defend a GYM!" }); return; } if (family.Candy_ < setting.CandyToEvolve) { session.EventDispatcher.Send(new WarnEvent() { Message = $"Miss some candies to evolve ({family.Candy_}/{setting.CandyToEvolve}), cancelling..." }); return; } var evolveResponse = await session.Client.Inventory.EvolvePokemon(pokemon.Id); session.EventDispatcher.Send(new PokemonEvolveEvent { Uid = pokemon.Id, Id = pokemon.PokemonId, Exp = evolveResponse.ExperienceAwarded, Result = evolveResponse.Result }); if (evolveResponse.EvolvedPokemonData != null) { family.Candy_ -= setting.CandyToEvolve; setting = pokemonSettings.Single(q => q.PokemonId == evolveResponse.EvolvedPokemonData.PokemonId); family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonEvolveDoneEvent { Uid = evolveResponse.EvolvedPokemonData.Id, Id = evolveResponse.EvolvedPokemonData.PokemonId, Cp = evolveResponse.EvolvedPokemonData.Cp, Perfection = evolveResponse.EvolvedPokemonData.CalculatePokemonPerfection(), Family = family.FamilyId, Level = PokemonInfo.GetLevel(evolveResponse.EvolvedPokemonData), Candy = family.Candy_, Type1 = setting.Type, Type2 = setting.Type2, Stats = setting.Stats, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, session.Runtime.CurrentLevel), Stamina = pokemon.Stamina, MaxStamina = pokemon.StaminaMax, Move1 = evolveResponse.EvolvedPokemonData.Move1, Move2 = evolveResponse.EvolvedPokemonData.Move2, PossibleCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, session.Runtime.CurrentLevel), CandyToEvolve = setting.CandyToEvolve }); } await DelayingUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 25000); session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Evolve; // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); var pokemonToEvolveTask = await session.Inventory.GetPokemonToEvolve(session.LogicSettings.PokemonsToEvolve); var pokemonToEvolve = pokemonToEvolveTask.Where(x => string.IsNullOrEmpty(x.DeployedFortId)).ToList(); if (pokemonToEvolve.Any()) { var inventoryContent = await session.Inventory.GetItems(); var luckyEggs = inventoryContent.Where(p => p.ItemId == ItemId.ItemLuckyEgg); var luckyEgg = luckyEggs.FirstOrDefault(); //maybe there can be a warning message as an else condition of luckyEgg checks, like; //"There is no Lucky Egg, so, your UseLuckyEggsMinPokemonAmount setting bypassed." if (session.LogicSettings.UseLuckyEggsWhileEvolving && luckyEgg != null && luckyEgg.Count > 0) { if (pokemonToEvolve.Count >= session.LogicSettings.UseLuckyEggsMinPokemonAmount) { await UseLuckyEgg(session); } else { // Wait until we have enough pokemon session.EventDispatcher.Send(new UseLuckyEggMinPokemonEvent { Diff = session.LogicSettings.UseLuckyEggsMinPokemonAmount - pokemonToEvolve.Count, CurrCount = pokemonToEvolve.Count, MinPokemon = session.LogicSettings.UseLuckyEggsMinPokemonAmount }); return; } } var pokemonFamilies = session.Inventory.GetPokemonFamilies().Result; foreach (var pokemon in pokemonToEvolve) { // no cancellationToken.ThrowIfCancellationRequested here, otherwise the lucky egg would be wasted. var evolveResponse = await session.Client.Inventory.EvolvePokemon(pokemon.Id); session.EventDispatcher.Send(new PokemonEvolveEvent { Uid = pokemon.Id, Id = pokemon.PokemonId, Exp = evolveResponse.ExperienceAwarded, Result = evolveResponse.Result }); if (evolveResponse.EvolvedPokemonData != null) { var pokemonSettings = session.Inventory.GetPokemonSettings().Result.ToList(); var setting = pokemonSettings.Single(q => q.PokemonId == evolveResponse.EvolvedPokemonData.PokemonId); var family = pokemonFamilies.First(q => q.FamilyId == setting.FamilyId); session.EventDispatcher.Send(new PokemonEvolveDoneEvent { Uid = evolveResponse.EvolvedPokemonData.Id, Id = evolveResponse.EvolvedPokemonData.PokemonId, Cp = evolveResponse.EvolvedPokemonData.Cp, Perfection = evolveResponse.EvolvedPokemonData.CalculatePokemonPerfection(), Family = family.FamilyId, Candy = family.Candy_, Level = PokemonInfo.GetLevel(pokemon), Move1 = pokemon.Move1, Move2 = pokemon.Move2, Type1 = setting.Type, Type2 = setting.Type2, Stats = setting.Stats, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, session.Runtime.CurrentLevel), Stamina = pokemon.Stamina, MaxStamina = pokemon.StaminaMax, PossibleCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, 40), CandyToEvolve = setting.CandyToEvolve }); } await DelayingEvolveUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 0, session.LogicSettings.DelayEvolveVariation, cancellationToken); } } session.State = prevState; }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var prevState = session.State; await session.Inventory.RefreshCachedInventory(); var currentTotalItems = await session.Inventory.GetTotalItemCount(); var recycleInventoryAtUsagePercentage = session.LogicSettings.RecycleInventoryAtUsagePercentage > 1 ? session.LogicSettings.RecycleInventoryAtUsagePercentage / 100 : session.LogicSettings.RecycleInventoryAtUsagePercentage; if (session.Profile.PlayerData.MaxItemStorage * recycleInventoryAtUsagePercentage > currentTotalItems && session.Runtime.StopsHit < 100) { return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } session.State = BotState.Recycle; cancellationToken.ThrowIfCancellationRequested(); var items = await session.Inventory.GetItemsToRecycle(session); foreach (var item in items) { cancellationToken.ThrowIfCancellationRequested(); session.EventDispatcher.Send(new ItemRecycledEvent { Id = item.ItemId, Count = item.Count }); await session.Client.Inventory.RecycleItem(item.ItemId, item.Count); await Task.Delay(session.LogicSettings.DelayRecycleItem, cancellationToken); } int totalItemsToStore = session.LogicSettings.TotalAmountOfPokeballsToKeep + session.LogicSettings.TotalAmountOfPotionsToKeep + session.LogicSettings.TotalAmountOfRazzToKeep + session.LogicSettings.TotalAmountOfRevivesToKeep; int extraItemsInInventory = await session.Inventory.GetItemAmountByType(ItemId.ItemIncenseOrdinary); extraItemsInInventory += await session.Inventory.GetItemAmountByType(ItemId.ItemTroyDisk); extraItemsInInventory += await session.Inventory.GetItemAmountByType(ItemId.ItemIncubatorBasic); extraItemsInInventory += 2; //unlimited incubator + camera extraItemsInInventory += await session.Inventory.GetItemAmountByType(ItemId.ItemLuckyEgg); if (totalItemsToStore + extraItemsInInventory > session.Profile.PlayerData.MaxItemStorage * recycleInventoryAtUsagePercentage) { session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.InventorySettingsFailed, recycleInventoryAtUsagePercentage.ToString("P1"), (session.Profile.PlayerData.MaxItemStorage * recycleInventoryAtUsagePercentage).ToString("N1"), totalItemsToStore, extraItemsInInventory) }); } await OptimizedRecycleBalls(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecyclePotions(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecycleRevives(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await OptimizedRecycleBerries(session, cancellationToken); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); await session.Inventory.RefreshCachedInventory(); await Task.Delay(session.LogicSettings.DelayBetweenPlayerActions, cancellationToken); session.State = prevState; }