public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); var pokemonToEvolveTask = await session.Inventory.GetPokemonToEvolve(session.LogicSettings.PokemonsToEvolve); var pokemonToEvolve = pokemonToEvolveTask.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; } } 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 { Id = pokemon.PokemonId, Exp = evolveResponse.ExperienceAwarded, Result = evolveResponse.Result }); await DelayingEvolveUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 0, session.LogicSettings.DelayEvolveVariation); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); // Refresh inventory so that the player stats are fresh await session.Inventory.RefreshCachedInventory(); var 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 }); } await DelayingEvolveUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 0, session.LogicSettings.DelayEvolveVariation); } } }
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, 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(); var usedItems = await session.Inventory.GetUsedItems(); var eggUsed = usedItems?.Any(x => x.ItemId == ItemId.ItemLuckyEgg && x.ExpireMs > DateTime.UtcNow.ToUnixTime()) ?? false; //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 && !eggUsed) { if (pokemonToEvolve.Count >= session.LogicSettings.UseLuckyEggsMinPokemonAmount) { await UseLuckyEgg(session); session.State = BotState.LuckyEgg; } 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 }); session.State = prevState; 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 = pokemon.GetLevel(), Move1 = evolveResponse.EvolvedPokemonData.Move1, Move2 = evolveResponse.EvolvedPokemonData.Move2, Type1 = setting.Type, Type2 = setting.Type2, Stats = setting.Stats, MaxCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, session.Runtime.CurrentLevel), Stamina = pokemon.Stamina, IvSta = pokemon.IndividualStamina, PossibleCp = (int)PokemonInfo.GetMaxCpAtTrainerLevel(pokemon, 40), CandyToEvolve = setting.CandyToEvolve, IvAtk = pokemon.IndividualAttack, IvDef = pokemon.IndividualDefense, Weight = pokemon.WeightKg, Cpm = pokemon.CpMultiplier, StaminaMax = pokemon.StaminaMax, Evolutions = setting.EvolutionIds.ToArray() }); } await DelayingEvolveUtils.Delay(session.LogicSettings.DelayEvolvePokemon, 0, session.LogicSettings.DelayEvolveVariation, cancellationToken); } } session.State = prevState; }