Exemplo n.º 1
0
        public static async Task Execute(ISession session, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (session.Runtime.PokestopsToCheckGym > 0)
            {
                return;
            }

            await CheckChallengeDoneTask.Execute(session, cancellationToken);

            await CheckChallengeTask.Execute(session, cancellationToken);

            var gymsNear = (await GetGyms(session)).OrderBy(i =>
                                                            LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                                                    session.Client.CurrentLongitude, i.Latitude, i.Longitude))
                           .ToList();

            if (gymsNear.Count > 0)
            {
                session.Runtime.PokestopsToCheckGym = 13 + session.Client.Rnd.Next(15);
                var nearestGym = gymsNear.FirstOrDefault();
                if (nearestGym != null)
                {
                    var gymInfo =
                        await
                        session.Client.Fort.GetGymDetails(nearestGym.Id, nearestGym.Latitude,
                                                          nearestGym.Longitude);

                    var gymDistance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                              session.Client.CurrentLongitude, nearestGym.Latitude, nearestGym.Longitude);
                    session.EventDispatcher.Send(new GymPokeEvent
                    {
                        Id          = nearestGym.Id,
                        Name        = gymInfo.Name,
                        Distance    = gymDistance,
                        Description = gymInfo.Description,
                        GymState    = gymInfo.GymState,
                        Lat         = nearestGym.Latitude,
                        Lon         = nearestGym.Longitude
                    });
                }
            }
        }
        //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.º 3
0
        public static async Task Teleport(ISession session, CancellationToken cancellationToken, Random random)
        {
            bool ShownSoftBanMessage = false;
            int  stopsToHit          = 20; //We should return to the main loop after some point, might as well limit this.
            //Not sure where else we could put this? Configs maybe if we incorporate
            //deciding how many pokestops in a row we want to hit before doing things like recycling?
            //might increase xp/hr not stopping every 5 stops. - Pocket


            //TODO: run through this with a fine-tooth comb and optimize it.
            var pokestopList = await GetPokeStops(session);

            session.EventDispatcher.Send(new PokeStopListEvent {
                Forts = pokestopList.Select(x => x.BaseFortData).ToList()
            });

            for (int stopsHit = 0; stopsHit < stopsToHit; stopsHit++)
            {
                session.Runtime.BreakOutOfPathing = false;
                if (pokestopList.Count > 0)
                {
                    //start at 0 ends with 19 = 20 for the leechers{
                    cancellationToken.ThrowIfCancellationRequested();

                    var distanceFromStart = LocationUtils.CalculateDistanceInMeters(
                        session.Client.InitialLatitude, session.Client.InitialLongitude,
                        session.Client.CurrentLatitude, session.Client.CurrentLongitude);

                    // Edge case for when the client somehow ends up outside the defined radius
                    if (session.LogicSettings.MaxTravelDistanceInMeters != 0 &&
                        distanceFromStart > session.LogicSettings.MaxTravelDistanceInMeters)
                    {
                        session.EventDispatcher.Send(new WarnEvent
                        {
                            Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart)
                        });
                        await Task.Delay(1000, cancellationToken);

                        await session.Navigation.Move(
                            new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude),
                            session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, null, null, cancellationToken, session);
                    }
                    if (session.ForceMoveJustDone)
                    {
                        session.ForceMoveJustDone = false;
                    }
                    if (session.ForceMoveTo != null)
                    {
                        await ForceMoveTask.Execute(session, cancellationToken);

                        pokestopList = await GetPokeStops(session);
                    }
                    if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited)
                    {
                        await session.EggWalker.InitEggWalker(cancellationToken);
                    }

                    if (pokestopList.Count <= 0)
                    {
                        if (!pokestopList.Any())
                        {
                            await CheckChallengeDoneTask.Execute(session, cancellationToken);

                            await CheckChallengeTask.Execute(session, cancellationToken);
                        }
                        session.EventDispatcher.Send(new WarnEvent
                        {
                            Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound)
                        });
                    }

                    cancellationToken.ThrowIfCancellationRequested();

                    await ActionQueueTask.Execute(session, cancellationToken);

                    //resort
                    pokestopList =
                        pokestopList.OrderBy(
                            i =>
                            LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                    session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList();

                    if (session.LogicSettings.UsePokeStopLuckyNumber)
                    {
                        if (pokestopList.Count >= session.LogicSettings.PokestopSkipLuckyNumberMinUse)
                        {
                            int rng = random.Next(session.LogicSettings.PokestopSkipLuckyMin, session.LogicSettings.PokestopSkipLuckyMax);
#if DEBUG
                            Logger.Write("Skip Pokestop RNG: " + rng + " against " + session.LogicSettings.PokestopSkipLuckyNumber, LogLevel.Debug);
#endif
                            if (rng == session.LogicSettings.PokestopSkipLuckyNumber)
                            {
#if DEBUG
                                Logger.Write("Skipping Pokestop due to the rng god's will.", LogLevel.Debug);
#endif
                                pokestopList.RemoveAt(0);
                            }
                        }
                    }


                    var pokeStop = pokestopList[0];
                    pokestopList.RemoveAt(0);
                    session.Runtime.TargetStopID = pokeStop.Id;
                    var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                           session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude);
                    var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                    session.EventDispatcher.Send(new FortTargetEvent {
                        Id = fortInfo.FortId, Name = fortInfo.Name, Distance = distance, Latitude = fortInfo.Latitude, Longitude = fortInfo.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls[0]
                    });
                    if (session.LogicSettings.Teleport)
                    {
                        await session.Client.Player.UpdatePlayerLocation(fortInfo.Latitude, fortInfo.Longitude,
                                                                         session.Client.Settings.DefaultAltitude);
                    }

                    else
                    {
                        await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude),
                                                      session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax,
                                                      async() =>
                        {
                            if (session.LogicSettings.CatchWildPokemon)
                            {
                                // Catch normal map Pokemon
                                await CatchNearbyPokemonsTask.Execute(session, cancellationToken);
                                //Catch Incense Pokemon remove this for time contraints
                                //await CatchIncensePokemonsTask.Execute(session, cancellationToken);
                            }
                            return(true);
                        },
                                                      async() =>
                        {
                            await UseNearbyPokestopsTask.Execute(session, cancellationToken);
                            return(true);
                        },

                                                      cancellationToken, session);
                    }

                    if (!session.LogicSettings.LootPokestops)
                    {
                        session.MapCache.UsedPokestop(pokeStop, session);
                        continue;
                    }

                    if (!session.ForceMoveJustDone)
                    {
                        var       timesZeroXPawarded = 0;
                        var       fortTry            = 0;  //Current check
                        const int retryNumber        = 50; //How many times it needs to check to clear softban
                        const int zeroCheck          = 5;  //How many times it checks fort before it thinks it's softban
                        if (session.Runtime.BreakOutOfPathing)
                        {
                            continue;
                        }
                        do
                        {
                            cancellationToken.ThrowIfCancellationRequested();

                            var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                            if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0)
                            {
                                timesZeroXPawarded = 0;
                            }
                            if (fortSearch.ExperienceAwarded == 0)
                            {
                                timesZeroXPawarded++;

                                if (timesZeroXPawarded > zeroCheck)
                                {
                                    if ((int)fortSearch.CooldownCompleteTimestampMs != 0)
                                    {
                                        break;
                                        // Check if successfully looted, if so program can continue as this was "false alarm".
                                    }

                                    fortTry += 1;

                                    if (!ShownSoftBanMessage)
                                    {
                                        session.EventDispatcher.Send(new FortFailedEvent
                                        {
                                            Name = fortInfo.Name,
                                            Try  = fortTry,
                                            Max  = retryNumber - zeroCheck
                                        });
                                        ShownSoftBanMessage = true;
                                    }
                                    await Task.Delay(session.LogicSettings.DelaySoftbanRetry, cancellationToken);
                                }
                            }
                            else
                            {
                                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,
                                    InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull,
                                    Description   = fortInfo.Description,
                                    url           = fortInfo.ImageUrls[0]
                                });

                                if (fortSearch.PokemonDataEgg != null)
                                {
                                    session.EventDispatcher.Send(new EggFoundEvent
                                    {
                                        Distance     = fortSearch.PokemonDataEgg.EggKmWalkedTarget,
                                        PokeStopName = fortInfo.Name
                                    });
                                }
                                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);
                                }
                                session.MapCache.UsedPokestop(pokeStop, session);
                                session.EventDispatcher.Send(new InventoryNewItemsEvent
                                {
                                    Items = fortSearch.ItemsAwarded.ToItemList()
                                });
                                break; //Continue with program as loot was succesfull.
                            }
                        } while (fortTry < retryNumber - zeroCheck);
                        //Stop trying if softban is cleaned earlier or if 40 times fort looting failed.

                        ShownSoftBanMessage = false;
                        await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken);


                        //Catch Lure Pokemon

                        if (session.LogicSettings.CatchWildPokemon)
                        {
                            if (pokeStop.LureInfo != null)
                            {
                                await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken);
                            }
                            // Catch normal map Pokemon
                            if (session.LogicSettings.Teleport)
                            {
                                await CatchNearbyPokemonsTask.Execute(session, cancellationToken);
                            }
                            //Catch Incense Pokemon
                            await CatchIncensePokemonsTask.Execute(session, cancellationToken);
                        }
                        await ActionQueueTask.Execute(session, cancellationToken);

                        await MaintenanceTask.Execute(session, cancellationToken);
                    }
                    if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer)
                    {
                        await SnipePokemonTask.Execute(session, cancellationToken);
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static async Task NoTeleport(ISession session, CancellationToken cancellationToken, Random random)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var distanceFromStart = LocationUtils.CalculateDistanceInMeters(
                session.Settings.DefaultLatitude, session.Settings.DefaultLongitude,
                session.Client.CurrentLatitude, session.Client.CurrentLongitude);

            // Edge case for when the client somehow ends up outside the defined radius
            if (session.LogicSettings.MaxTravelDistanceInMeters != 0 &&
                distanceFromStart > session.LogicSettings.MaxTravelDistanceInMeters)
            {
                session.EventDispatcher.Send(new WarnEvent
                {
                    Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart)
                });
                await Task.Delay(1000, cancellationToken);

                await session.Navigation.Move(
                    new GeoCoordinate(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude),
                    session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax, null, null, cancellationToken, session);
            }

            var pokestopList = await GetPokeStops(session);

            //var stopsHit = 0; //Replaced with RuntimeSettings.stopsHit;
            //var displayStatsHit = 0;

            session.EventDispatcher.Send(new PokeStopListEvent {
                Forts = pokestopList.Select(x => x.BaseFortData).ToList()
            });

            if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited)
            {
                await session.EggWalker.InitEggWalker(cancellationToken);
            }

            if (pokestopList.Count <= 0)
            {
                if (!pokestopList.Any())
                {
                    await CheckChallengeDoneTask.Execute(session, cancellationToken);

                    await CheckChallengeTask.Execute(session, cancellationToken);
                }
                session.EventDispatcher.Send(new WarnEvent
                {
                    Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound)
                });
            }


            if (session.ForceMoveToResume != null && session.ForceMoveTo == null)
            {
                session.EventDispatcher.Send(new NoticeEvent
                {
                    Message = session.Translation.GetTranslation(TranslationString.UnDoneForceMove, session.ForceMoveToResume.Latitude, session.ForceMoveToResume.Longitude)
                });
                session.ForceMoveTo = session.ForceMoveToResume;
            }

            var bestRoute = new List <GeoCoordinate>();

            while (pokestopList.Any())
            {
                session.Runtime.BreakOutOfPathing = false;
                cancellationToken.ThrowIfCancellationRequested();

                if (session.ForceMoveTo != null)
                {
                    await ForceMoveTask.Execute(session, cancellationToken);
                }

                if (session.ForceMoveJustDone)
                {
                    session.ForceMoveJustDone = false;
                    pokestopList = await GetPokeStops(session);

                    session.Client.Player.SetInitial(session.Client.CurrentLatitude, session.Client.CurrentLongitude, session.Client.CurrentAltitude);
                    session.EventDispatcher.Send(new PokeStopListEvent {
                        Forts = pokestopList.Select(x => x.BaseFortData).ToList()
                    });
                }


                if (session.LogicSettings.UseCustomRoute && session.LogicSettings.CustomRoute != null &&
                    session.LogicSettings.CustomRoute.RoutePoints.Count > 2)
                {
                    session.EventDispatcher.Send(new NoticeEvent
                    {
                        Message = session.Translation.GetTranslation(TranslationString.CustomRouteEnabled)
                    });
                    break;
                }

                await ActionQueueTask.Execute(session, cancellationToken);

                //resort
                pokestopList =
                    pokestopList.OrderBy(
                        i =>
                        LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                session.Client.CurrentLongitude, i.Latitude, i.Longitude)).ToList();

                if (session.LogicSettings.UsePokeStopLuckyNumber)
                {
                    if (pokestopList.Count >= session.LogicSettings.PokestopSkipLuckyNumberMinUse)
                    {
                        int rng = random.Next(session.LogicSettings.PokestopSkipLuckyMin, session.LogicSettings.PokestopSkipLuckyMax);
#if DEBUG
                        Logger.Write("Skip Pokestop RNG: " + rng + " against " + session.LogicSettings.PokestopSkipLuckyNumber, LogLevel.Debug);
#endif
                        if (rng == session.LogicSettings.PokestopSkipLuckyNumber)
                        {
#if DEBUG
                            Logger.Write("Skipping Pokestop due to the rng god's will.", LogLevel.Debug);
#endif
                            if (pokestopList.Count > 0)
                            {
                                pokestopList.RemoveAt(0);
                            }
                        }
                    }
                }
                if (pokestopList.Count == 0)
                {
                    break;
                }

                var pokeStop = pokestopList[0];
                pokestopList.RemoveAt(0);

                //prolly no longer needed since MobBot Routing is dead. //Lunatiq
                //if (session.LogicSettings.RoutingService == RoutingService.GoogleDirections || session.LogicSettings.RoutingService == RoutingService.MapzenValhalla)
                //{

                bestRoute = RoutingUtils.GetBestRoute(pokeStop, pokestopList.Where(x => !session.MapCache.CheckPokestopUsed(x)), 20);
                session.EventDispatcher.Send(new PokestopsOptimalPathEvent
                {
                    Coords = bestRoute.Select(x => Tuple.Create(x.Latitude, x.Longitude)).ToList()
                });

                //}

                session.Runtime.TargetStopID = pokeStop.Id;
                var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                       session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude);
                var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                session.EventDispatcher.Send(new FortTargetEvent {
                    Id = fortInfo.FortId, Name = fortInfo.Name, Distance = distance, Latitude = fortInfo.Latitude, Longitude = fortInfo.Longitude, Description = fortInfo.Description, url = fortInfo.ImageUrls?.Count > 0 ? fortInfo.ImageUrls[0] : ""
                });

                await session.Navigation.Move(new GeoCoordinate(pokeStop.Latitude, pokeStop.Longitude),
                                              session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax,
                                              async() =>
                {
                    if (session.LogicSettings.CatchWildPokemon)
                    {
                        // Catch normal map Pokemon
                        await CatchNearbyPokemonsTask.Execute(session, cancellationToken);

                        //Catch Incense Pokemon remove this for time constraints
                        //await CatchIncensePokemonsTask.Execute(session, cancellationToken);
                    }
                    return(true);
                },
                                              async() =>
                {
                    await UseNearbyPokestopsTask.Execute(session, cancellationToken);
                    return(true);
                },
                                              cancellationToken, session, waypointsToVisit : bestRoute);

                if (!session.ForceMoveJustDone)
                {
                    var timesZeroXPawarded = 0;

                    var       fortTry     = 0;  //Current check
                    const int retryNumber = 50; //How many times it needs to check to clear softban
                    const int zeroCheck   = 5;  //How many times it checks fort before it thinks it's softban
                    if (session.Runtime.BreakOutOfPathing)
                    {
                        continue;
                    }
                    do
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        if (pokeStop.CooldownCompleteTimestampMS < DateTime.UtcNow.ToUnixTime())
                        {
                            break;                                                                      //already looted somehow
                        }
                        var fortSearch = await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                        if (fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull)
                        {
                            await RecycleItemsTask.Execute(session, cancellationToken);
                        }
                        if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0)
                        {
                            timesZeroXPawarded = 0;
                        }
                        if (fortSearch.ExperienceAwarded == 0)
                        {
                            timesZeroXPawarded++;

                            if (timesZeroXPawarded > zeroCheck)
                            {
                                if ((int)fortSearch.CooldownCompleteTimestampMs != 0)
                                {
                                    break;
                                    // Check if successfully looted, if so program can continue as this was "false alarm".
                                }

                                fortTry += 1;


                                if (session.LogicSettings.Teleport)
                                {
                                    session.EventDispatcher.Send(new FortFailedEvent
                                    {
                                        Name = fortInfo.Name,
                                        Try  = fortTry,
                                        Max  = retryNumber - zeroCheck
                                    });
                                    await Task.Delay(session.LogicSettings.DelaySoftbanRetry, cancellationToken);
                                }
                                else
                                {
                                    await DelayingUtils.Delay(session.LogicSettings.DelayBetweenPlayerActions, 400);
                                }
                            }
                        }
                        else
                        {
                            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,
                                InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull,
                                Description   = fortInfo.Description,
                                url           = fortInfo.ImageUrls?[0]
                            });
                            session.Runtime.StopsHit++;
                            session.EventDispatcher.Send(new InventoryNewItemsEvent
                            {
                                Items = fortSearch.ItemsAwarded.ToItemList()
                            });

                            if (fortSearch.PokemonDataEgg != null)
                            {
                                session.EventDispatcher.Send(new EggFoundEvent
                                {
                                    Distance     = fortSearch.PokemonDataEgg.EggKmWalkedTarget,
                                    PokeStopName = fortInfo.Name
                                });
                            }
                            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);
                            }
                            session.MapCache.UsedPokestop(pokeStop, session);
                            break; //Continue with program as loot was succesfull.
                        }
                    } while (fortTry < 1);
                    //retryNumber - zeroCheck && fortSearch.CooldownCompleteTimestampMs < DateTime.UtcNow.ToUnixTime());
                    //Stop trying if softban is cleaned earlier or if 40 times fort looting failed.


                    await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken);


                    //Catch Lure Pokemon

                    if (session.LogicSettings.CatchWildPokemon)
                    {
                        if (pokeStop.LureInfo != null)
                        {
                            await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken);
                        }
                        if (session.LogicSettings.Teleport)
                        {
                            await CatchNearbyPokemonsTask.Execute(session, cancellationToken);
                        }
                    }
                }
                if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer)
                {
                    await SnipePokemonTask.Execute(session, cancellationToken);
                }
            }
        }
        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.º 6
0
        public static async Task Execute(ISession session, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var pokestopList = await GetPokeStops(session);

            if (session.LogicSettings.UseEggIncubators && !session.EggWalker.Inited)
            {
                await session.EggWalker.InitEggWalker(cancellationToken);
            }

            if (pokestopList.Count <= 0)
            {
                if (!pokestopList.Any())
                {
                    await CheckChallengeDoneTask.Execute(session, cancellationToken);

                    await CheckChallengeTask.Execute(session, cancellationToken);
                }
                session.EventDispatcher.Send(new WarnEvent
                {
                    Message = session.Translation.GetTranslation(TranslationString.FarmPokestopsNoUsableFound)
                });
                if (session.ForceMoveJustDone)
                {
                    session.ForceMoveJustDone = false;
                }
                if (session.ForceMoveTo != null)
                {
                    await ForceMoveTask.Execute(session, cancellationToken);
                }
                await Task.Delay(60000, cancellationToken);

                await session.Navigation.Move(new GeoCoordinate(session.Client.CurrentLatitude + session.Client.Rnd.NextInRange(-0.0001, 0.0001),
                                                                session.Client.CurrentLongitude + session.Client.Rnd.NextInRange(-0.0001, 0.0001)),
                                              session.LogicSettings.WalkingSpeedMin, session.LogicSettings.WalkingSpeedMax,
                                              async() =>
                {
                    // Catch normal map Pokemon
                    await CatchNearbyPokemonsTask.Execute(session, cancellationToken);
                    //Catch Incense Pokemon
                    await CatchIncensePokemonsTask.Execute(session, cancellationToken);
                    return(true);
                },
                                              async() =>
                {
                    await UseNearbyPokestopsTask.Execute(session, cancellationToken);
                    return(true);
                }, cancellationToken, session);

                pokestopList = await GetPokeStops(session);
            }

            session.EventDispatcher.Send(new PokeStopListEvent {
                Forts = pokestopList.Select(x => x.BaseFortData)
            });


            if (session.ForceMoveToResume != null && session.ForceMoveTo == null)
            {
                session.EventDispatcher.Send(new NoticeEvent
                {
                    Message = session.Translation.GetTranslation(TranslationString.UnDoneForceMove, session.ForceMoveToResume.Latitude, session.ForceMoveToResume.Longitude)
                });
                session.ForceMoveTo = session.ForceMoveToResume;
            }

            var bestRoute = new List <GeoCoordinate>();

            session.Runtime.PokestopsToCheckGym = 13 + session.Client.Rnd.Next(15);

            while (pokestopList.Any())
            {
                if (session.ForceMoveJustDone)
                {
                    session.ForceMoveJustDone = false;
                }

                if (session.LogicSettings.UseCustomRoute && session.LogicSettings.CustomRoute != null &&
                    session.LogicSettings.CustomRoute.RoutePoints.Count > 2)
                {
                    session.EventDispatcher.Send(new NoticeEvent
                    {
                        Message = session.Translation.GetTranslation(TranslationString.CustomRouteEnabled)
                    });
                    break;
                }

                if (session.ForceMoveTo != null)
                {
                    await ForceMoveTask.Execute(session, cancellationToken);
                }

                var newPokestopList = (await GetPokeStops(session)).OrderBy(i =>
                                                                            LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                                                                    session.Client.CurrentLongitude, i.Latitude, i.Longitude)).Where(x => pokestopList.All(i => i.Id != x.Id) && LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                                                                                                                                                                                                                         session.Client.CurrentLongitude, x.Latitude, x.Longitude) < session.LogicSettings.MaxTravelDistanceInMeters).ToList();
                session.EventDispatcher.Send(new PokeStopListEvent {
                    Forts = newPokestopList.Select(x => x.BaseFortData)
                });
                pokestopList.AddRange(newPokestopList);

                var pokeStop = pokestopList.OrderBy(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                                                 session.Client.CurrentLongitude, i.Latitude, i.Longitude)).FirstOrDefault(x => !session.MapCache.CheckPokestopUsed(x));

                if (pokeStop == null)
                {
                    await Task.Delay(60000, cancellationToken);

                    continue;
                }

                //No Longer Usable, MobBot is dead - Lunatiq
                //if (session.LogicSettings.RoutingService == RoutingService.GoogleDirections || session.LogicSettings.RoutingService == RoutingService.MapzenValhalla )
                //{
                bestRoute = RoutingUtils.GetBestRoute(pokeStop, pokestopList.Where(x => !session.MapCache.CheckPokestopUsed(x)), 20);
                session.EventDispatcher.Send(new PokestopsOptimalPathEvent
                {
                    Coords = bestRoute.Select(x => Tuple.Create(x.Latitude, x.Longitude)).ToList()
                });
                //}


                var tooFarPokestops = pokestopList.Where(i => LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                                                                                                      session.Client.CurrentLongitude, i.Latitude, i.Longitude) > session.LogicSettings.MaxTravelDistanceInMeters).ToList();

                foreach (var tooFar in tooFarPokestops)
                {
                    pokestopList.Remove(tooFar);
                }

                //var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude,
                //    session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude);

                var fortInfo = await session.Client.Fort.GetFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);

                //session.EventDispatcher.Send(new FortTargetEvent {Name = fortInfo.Name, Distance = distance});

                if (session.LogicSettings.Teleport)
                {
                    await session.Client.Player.UpdatePlayerLocation(fortInfo.Latitude, fortInfo.Longitude,
                                                                     session.Client.Settings.DefaultAltitude);
                }
                else
                {
                    await MoveToPokestop(session, cancellationToken, pokeStop, bestRoute);
                }

                bestRoute.Clear();

                await ActionQueueTask.Execute(session, cancellationToken);

                if (!session.LogicSettings.LootPokestops)
                {
                    session.MapCache.UsedPokestop(pokeStop, session);
                    continue;
                }

                #region old fort logic
                //if (!session.ForceMoveJustDone)
                //{
                //    var timesZeroXPawarded = 0;
                //    var fortTry = 0; //Current check
                //    const int retryNumber = 50; //How many times it needs to check to clear softban
                //    const int zeroCheck = 5; //How many times it checks fort before it thinks it's softban
                //    //var shownSoftBanMessage = false;
                //    do
                //    {
                //        cancellationToken.ThrowIfCancellationRequested();
                //        if (session.MapCache.CheckPokestopUsed(pokeStop)) break; //already used somehow
                //        var fortSearch =
                //            await session.Client.Fort.SearchFort(pokeStop.Id, pokeStop.Latitude, pokeStop.Longitude);
                //        if (fortSearch.ExperienceAwarded > 0 && timesZeroXPawarded > 0) timesZeroXPawarded = 0;
                //        if (fortSearch.ExperienceAwarded == 0)
                //        {
                //            if (TimesZeroXPawarded == 0)
                //                await MoveToPokestop(session, cancellationToken, pokeStop, null);
                //            timesZeroXPawarded++;
                //            if ((int) fortSearch.CooldownCompleteTimestampMs != 0)
                //            {
                //                break;
                //                // Check if successfully looted, if so program can continue as this was "false alarm".
                //            }
                //            if (timesZeroXPawarded <= zeroCheck) continue;

                //            session.MapCache.UsedPokestop(pokeStop, session); //f**k that pokestop - skip it

                //            break;
                //        }
                //        else
                //        {
                //            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,
                //                InventoryFull = fortSearch.Result == FortSearchResponse.Types.Result.InventoryFull,
                //                Description = fortInfo.Description,
                //                url = fortInfo.ImageUrls.FirstOrDefault()
                //            });

                //            if (fortSearch.PokemonDataEgg != null)
                //            {
                //                session.EventDispatcher.Send(new EggFoundEvent
                //                {
                //                    Distance = fortSearch.PokemonDataEgg.EggKmWalkedTarget,
                //                    PokeStopName = fortInfo.Name
                //                });
                //            }
                //            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);
                //            }
                //            session.MapCache.UsedPokestop(pokeStop, session);
                //            session.Runtime.StopsHit++;
                //            pokeStop.CooldownCompleteTimestampMS = DateTime.UtcNow.AddMinutes(5).ToUnixTime();
                //            if (session.LogicSettings.CatchWildPokemon)
                //            {
                //                await CatchWildPokemonsTask.Execute(session, cancellationToken);
                //            }
                //            break; //Continue with program as loot was succesfull.
                //        }
                //    } while (fortTry < retryNumber - zeroCheck);

                //    //Stop trying if softban is cleaned earlier or if 40 times fort looting failed.
                //    if (session.LogicSettings.Teleport)
                //        await Task.Delay(session.LogicSettings.DelayPokestop, cancellationToken);
                //    else
                //        await Task.Delay(1000, cancellationToken);


                //    //Catch Lure Pokemon


                //    if (pokeStop.LureInfo != null && session.LogicSettings.CatchWildPokemon)
                //    {
                //        await CatchLurePokemonsTask.Execute(session, pokeStop.BaseFortData, cancellationToken);
                //    }
                //    if (session.LogicSettings.Teleport && session.LogicSettings.CatchWildPokemon)
                //        await CatchNearbyPokemonsTask.Execute(session, cancellationToken);
                //}
                #endregion

                session.Runtime.PokestopsToCheckGym--;
                if (session.LogicSettings.SnipeAtPokestops || session.LogicSettings.UseSnipeLocationServer)
                {
                    await SnipePokemonTask.Execute(session, cancellationToken);
                }
            }
        }