Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 3
0
        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)
                });
            }
        }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 5
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();

            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;
        }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
        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);
                    }
                }
            }
        }
Exemplo n.º 9
0
        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;
        }
Exemplo n.º 10
0
        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;
        }
Exemplo n.º 13
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;
        }
Exemplo n.º 14
0
        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;
        }
Exemplo n.º 16
0
        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;
                }
            }
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        //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);
                }
            }
        }
Exemplo n.º 19
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(); 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;
        }
Exemplo n.º 20
0
        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;
        }
Exemplo n.º 22
0
        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;
        }
Exemplo n.º 23
0
        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;
        }