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, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); // Refresh inventory so that the player stats are fresh // await session.Inventory.RefreshCachedInventory(); var duplicatePokemons = await session.Inventory.GetDuplicatePokemonToTransfer(session.LogicSettings.KeepPokemonsThatCanEvolve, session.LogicSettings.PrioritizeIvOverCp, session.LogicSettings.PokemonsNotToTransfer); var pokemonSettings = await session.Inventory.GetPokemonSettings(); var pokemonFamilies = await session.Inventory.GetPokemonFamilies(); 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) }); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } var prevState = session.State; session.State = BotState.Transfer; if (duplicatePokemons != null) { foreach (var duplicatePokemon in duplicatePokemons) { cancellationToken.ThrowIfCancellationRequested(); if (!string.IsNullOrEmpty(duplicatePokemon.DeployedFortId)) { continue; } //if (duplicatePokemon.Cp >= // session.Inventory.GetPokemonTransferFilter(duplicatePokemon.PokemonId).KeepMinCp || // duplicatePokemon.CalculatePokemonPerfection() > // session.Inventory.GetPokemonTransferFilter(duplicatePokemon.PokemonId).KeepMinIvPercentage) //{ // 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(); //Refresh inventory so that the player stats are fresh //await session.Inventory.RefreshCachedInventory(); too much inventory refresh 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) }); foreach (var pokemon in pokemons) { cancellationToken.ThrowIfCancellationRequested(); if (!await CheckBotStateTask.Execute(session, cancellationToken)) { return; } 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) }); return; } 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; 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; return; } break; case 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) }); } break; default: session.EventDispatcher.Send(new WarnEvent { Message = session.Translation.GetTranslation(TranslationString.EncounterProblem, encounter.Status) }); break; } } catch (Exception) { session.EventDispatcher.Send(new WarnEvent { Message = "Error occured while trying to catch nearby pokemon" }); await Task.Delay(5000, cancellationToken); } session.EventDispatcher.Send(new PokemonDisappearEvent { Pokemon = pokemon.BaseMapPokemon }); // 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); } }
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(); await session.Inventory.GetPlayerStats(); var 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)) { if (pokemon.GetLevel() >= session.Runtime.CurrentLevel + 1.5) { continue; } var pokeLevel = (int)pokemon.GetLevel(); var currentPokemonSettings = pokemonSettings.FirstOrDefault(q => q.PokemonId.Equals(pokemon.PokemonId)); var family = pokemonFamilies.FirstOrDefault(q => currentPokemonSettings != null && q.FamilyId.Equals(currentPokemonSettings.FamilyId)); var candyToEvolveTotal = GetCandyMinToKeep(pokemonSettings, currentPokemonSettings); // you can upgrade up to player level+2 right now // may need translation for stardust??? if (family != null && (pokeLevel < session.PlayerStats?.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, CancellationToken cancellationToken, string customName = null, bool toDefault = false) { if (customName == null) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); return; } if (!await CheckBotStateTask.Execute(session, cancellationToken)) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); 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) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); 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) { session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); 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, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, session.Runtime.CurrentLevel), Iv = pokemon.CalculatePokemonPerfection(), Favourite = pokemon.Favorite == 1, Weight = pokemon.WeightKg, Cpm = pokemon.CpMultiplier + pokemon.AdditionalCpMultiplier, Level = pokemon.GetLevel(), IvDef = pokemon.IndividualDefense, IvAtk = pokemon.IndividualAttack }); session.EventDispatcher.Send(new PokemonActionDoneEvent { Uid = pokemonId }); } session.State = prevState; }