コード例 #1
0
        public static async Task CatchFromService(ISession session, CancellationToken cancellationToken, EncounterInfo encounterId)
        {
            //default to excellent throw
            var normalizedRecticleSize = 1.95;
            //default spin
            var spinModifier = 1.0;

            //round to 2 decimals
            normalizedRecticleSize = Math.Round(normalizedRecticleSize, 2);

            CatchPokemonResponse caughtPokemonResponse;
            double lat = session.Client.CurrentLatitude;
            double lon = session.Client.CurrentLongitude;

            CatchPokemonResponse.Types.CatchStatus lastThrow = CatchPokemonResponse.Types.CatchStatus.CatchSuccess;
            CatchPokemonTask.AmountOfBerries = 0;
            do
            {
                cancellationToken.ThrowIfCancellationRequested();

                await LocationUtils.UpdatePlayerLocationWithAltitude(session,
                                                                     new GeoCoordinate(encounterId.Latitude, encounterId.Longitude, session.Client.CurrentAltitude), 0); // Speed set to 0 for random speed.

                await Task.Delay(1000, cancellationToken);

                var encounter = await session.Client.Encounter.EncounterPokemon(encounterId.EncounterId, encounterId.SpawnPointId);

                await Task.Delay(1000, cancellationToken);

                await LocationUtils.UpdatePlayerLocationWithAltitude(session,
                                                                     new GeoCoordinate(lat, lon, session.Client.CurrentAltitude), 0); // Speed set to 0 for random speed.

                float  probability = encounter.CaptureProbability.CaptureProbability_[0];
                int    cp          = encounter.WildPokemon.PokemonData.Cp;
                int    maxcp       = PokemonInfo.CalculateMaxCp(encounter.WildPokemon.PokemonData);
                double lvl         = PokemonInfo.GetLevel(encounter.WildPokemon.PokemonData);

                PokemonData encounteredPokemon;

                // Catch if it's a WildPokemon (MSniping not allowed for Incense pokemons)
                if (encounter is EncounterResponse && (encounter?.Status == EncounterResponse.Types.Status.EncounterSuccess))
                {
                    encounteredPokemon = encounter.WildPokemon?.PokemonData;
                }
                else
                {
                    return;  // No success to work with
                }
                var bestBall = await CatchPokemonTask.GetBestBall(session, encounteredPokemon, probability);

                if (((session.LogicSettings.UseBerriesOperator.ToLower().Equals("and") &&
                      encounterId.Iv >= session.LogicSettings.UseBerriesMinIv &&
                      cp >= session.LogicSettings.UseBerriesMinCp &&
                      probability < session.LogicSettings.UseBerriesBelowCatchProbability) ||
                     (session.LogicSettings.UseBerriesOperator.ToLower().Equals("or") && (
                          encounterId.Iv >= session.LogicSettings.UseBerriesMinIv ||
                          cp >= session.LogicSettings.UseBerriesMinCp ||
                          probability < session.LogicSettings.UseBerriesBelowCatchProbability))) &&
                    lastThrow != CatchPokemonResponse.Types.CatchStatus.CatchMissed) // if last throw is a miss, no double berry
                {
                    CatchPokemonTask.AmountOfBerries++;
                    if (CatchPokemonTask.AmountOfBerries <= session.LogicSettings.MaxBerriesToUsePerPokemon)
                    {
                        await CatchPokemonTask.UseBerry(session,
                                                        encounter.WildPokemon.EncounterId,
                                                        encounter.WildPokemon.SpawnPointId);
                    }
                }

                caughtPokemonResponse = await session.Client.Encounter.CatchPokemon(encounterId.EncounterId, encounterId.SpawnPointId,
                                                                                    bestBall, normalizedRecticleSize, spinModifier, true);


                Logger.Write($"({caughtPokemonResponse.Status.ToString()})  {encounterId.PokemonId.ToString()}  IV: {encounterId.Iv}%  Lvl: {lvl}  CP: ({cp}/{maxcp})", LogLevel.Service, caughtPokemonResponse.Status == CatchPokemonResponse.Types.CatchStatus.CatchSuccess ? ConsoleColor.Green : ConsoleColor.Red);
                //CatchPokemonTask.AmountOfBerries
                await Task.Delay(1000, cancellationToken);

                lastThrow = caughtPokemonResponse.Status;
            } while (lastThrow == CatchPokemonResponse.Types.CatchStatus.CatchMissed || lastThrow == CatchPokemonResponse.Types.CatchStatus.CatchEscape);
        }