Example #1
0
        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);
            }
        }
Example #4
0
        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;
        }
Example #5
0
        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;
        }