private static async Task WalkingToPokeStop(ISession session, CancellationToken cancellationToken, FortData pokeStop, FortDetailsResponse fortInfo) { var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, pokeStop.Latitude, pokeStop.Longitude); // we only move to the PokeStop, and send the associated FortTargetEvent, when not using GPX // also, GPX pathing uses its own EggWalker and calls the CatchPokemon tasks internally. if (!session.LogicSettings.UseGpxPathing) { var eggWalker = new EggWalker(1000, session); cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); // Always set the fort info in base walk strategy. var pokeStopDestination = new FortLocation(pokeStop.Latitude, pokeStop.Longitude, await LocationUtils.GetElevation(session.ElevationService, pokeStop.Latitude, pokeStop.Longitude).ConfigureAwait(false), pokeStop, fortInfo); await session.Navigation.Move(pokeStopDestination, async() => { await OnWalkingToPokeStopOrGym(session, pokeStop, cancellationToken).ConfigureAwait(false); }, session, cancellationToken).ConfigureAwait(false); // we have moved this distance, so apply it immediately to the egg walker. await eggWalker.ApplyDistance(distance, cancellationToken).ConfigureAwait(false); } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); var distanceFromStart = LocationUtils.CalculateDistanceInMeters( session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); await LocationUtils.UpdatePlayerLocationWithAltitude(session, new GeoCoordinate(session.Client.CurrentLatitude, session.Client.CurrentLongitude, session.Client.CurrentAltitude), session.Client.CurrentSpeed).ConfigureAwait(false); // Edge case for when the client somehow ends up outside the defined radius if (session.LogicSettings.MaxTravelDistanceInMeters != 0 && checkForMoveBackToDefault && distanceFromStart > session.LogicSettings.MaxTravelDistanceInMeters) { checkForMoveBackToDefault = false; Logger.Write( session.Translation.GetTranslation(TranslationString.FarmPokestopsOutsideRadius, distanceFromStart), LogLevel.Warning); var eggWalker = new EggWalker(1000, session); var defaultLocation = new MapLocation(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, await LocationUtils.GetElevation(session.ElevationService, session.Settings.DefaultLatitude, session.Settings.DefaultLongitude).ConfigureAwait(false) ); await session.Navigation.Move(defaultLocation, async() => { await MSniperServiceTask.Execute(session, cancellationToken).ConfigureAwait(false); }, session, cancellationToken).ConfigureAwait(false); // we have moved this distance, so apply it immediately to the egg walker. await eggWalker.ApplyDistance(distanceFromStart, cancellationToken).ConfigureAwait(false); } checkForMoveBackToDefault = false; await CatchNearbyPokemonsTask.Execute(session, cancellationToken).ConfigureAwait(false); // initialize the variables in UseNearbyPokestopsTask here, as this is a fresh start. UseNearbyPokestopsTask.Initialize(); await UseNearbyPokestopsTask.Execute(session, cancellationToken).ConfigureAwait(false); }
private static async Task WalkingBackGPXPath(ISession session, CancellationToken cancellationToken, FortData originalPokestop, FortDetailsResponse fortInfo) { var destination = new FortLocation( originalPokestop.Latitude, originalPokestop.Longitude, await LocationUtils.GetElevation( session.ElevationService, originalPokestop.Latitude, originalPokestop.Longitude ).ConfigureAwait(false), originalPokestop, fortInfo ); await session.Navigation.Move(destination, async() => { await MSniperServiceTask.Execute(session, cancellationToken).ConfigureAwait(false); await CatchNearbyPokemonsTask.Execute(session, cancellationToken).ConfigureAwait(false); await UseNearbyPokestopsTask.SpinPokestopNearBy(session, cancellationToken).ConfigureAwait(false); }, session, cancellationToken).ConfigureAwait(false); }
public static async Task Execute(ISession session, CancellationToken cancellationToken, FortData originalPokestop, FortDetailsResponse fortInfo) { StartAsyncPollingTask(session, cancellationToken); pokestopCount++; pokestopCount = pokestopCount % 3; if (pokestopCount > 0 && !prioritySnipeFlag) { return; } InitSession(session); if (!_setting.CatchPokemon && !prioritySnipeFlag) { return; } cancellationToken.ThrowIfCancellationRequested(); if (_setting.HumanWalkingSnipeTryCatchEmAll) { var checkBall = await CheckPokeballsToSnipe(_setting.HumanWalkingSnipeCatchEmAllMinBalls, session, cancellationToken).ConfigureAwait(false); if (!checkBall && !prioritySnipeFlag) { return; } } bool caughtAnyPokemonInThisWalk = false; SnipePokemonInfo pokemon = null; do { cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); prioritySnipeFlag = false; pokemon = await GetNextSnipeablePokemon(session.Client.CurrentLatitude, session.Client.CurrentLongitude, !caughtAnyPokemonInThisWalk).ConfigureAwait(false); if (pokemon != null) { caughtAnyPokemonInThisWalk = true; CalculateDistanceAndEstTime(pokemon); var remainTimes = (pokemon.ExpiredTime - DateTime.Now).TotalSeconds * 0.95; //just use 90% times //assume that 100m we catch 1 pokemon and it took 10 second for each. var catchPokemonTimeEST = (pokemon.Distance / 100) * 10; string strPokemon = session.Translation.GetPokemonTranslation(pokemon.PokemonId); var spinPokestopEST = (pokemon.Distance / 100) * 5; bool catchPokemon = (pokemon.EstimatedTime + catchPokemonTimeEST) < remainTimes && pokemon.Setting.CatchPokemonWhileWalking; bool spinPokestop = pokemon.Setting.SpinPokestopWhileWalking && (pokemon.EstimatedTime + catchPokemonTimeEST + spinPokestopEST) < remainTimes; lock (threadLocker) { pokemon.IsCatching = true; } session.EventDispatcher.Send(new HumanWalkSnipeEvent() { PokemonId = pokemon.PokemonId, Latitude = pokemon.Latitude, Longitude = pokemon.Longitude, Distance = pokemon.Distance, Expires = (pokemon.ExpiredTime - DateTime.Now).TotalSeconds, Estimate = (int)pokemon.EstimatedTime, Setting = pokemon.Setting, CatchPokemon = catchPokemon, Pokemons = ApplyFilter(rarePokemons.ToList()), SpinPokeStop = pokemon.Setting.SpinPokestopWhileWalking, WalkSpeedApplied = pokemon.Setting.AllowSpeedUp ? pokemon.Setting.MaxSpeedUpSpeed : _session.LogicSettings.WalkingSpeedInKilometerPerHour, Type = HumanWalkSnipeEventTypes.StartWalking, Rarity = PokemonGradeHelper.GetPokemonGrade(pokemon.PokemonId).ToString() }); var snipeTarget = new SnipeLocation(pokemon.Latitude, pokemon.Longitude, await LocationUtils.GetElevation(session.ElevationService, pokemon.Latitude, pokemon.Longitude).ConfigureAwait(false)); await session.Navigation.Move( snipeTarget, async() => { cancellationToken.ThrowIfCancellationRequested(); await ActionsWhenTravelToSnipeTarget(session, cancellationToken, pokemon, catchPokemon, spinPokestop).ConfigureAwait(false); }, session, cancellationToken, pokemon.Setting.AllowSpeedUp?pokemon.Setting.MaxSpeedUpSpeed : 0 ).ConfigureAwait(false); session.EventDispatcher.Send(new HumanWalkSnipeEvent() { Latitude = pokemon.Latitude, Longitude = pokemon.Longitude, PauseDuration = pokemon.Setting.DelayTimeAtDestination / 1000, Type = HumanWalkSnipeEventTypes.DestinationReached, UniqueId = pokemon.UniqueId }); //await Task.Delay(pokemon.Setting.DelayTimeAtDestination, cancellationToken).ConfigureAwait(false); await CatchNearbyPokemonsTask .Execute(session, cancellationToken, pokemon.PokemonId, pokemon.Setting.AllowTransferWhileWalking).ConfigureAwait(false); await Task.Delay(1000, cancellationToken).ConfigureAwait(false); if (!pokemon.IsVisited) { await CatchLurePokemonsTask.Execute(session, cancellationToken).ConfigureAwait(false); } lock (threadLocker) { pokemon.IsVisited = true; pokemon.IsCatching = false; } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } if (EvolvePokemonTask.IsActivated(session)) { await EvolvePokemonTask.Execute(session, cancellationToken).ConfigureAwait(false); } } } while (pokemon != null && _setting.HumanWalkingSnipeTryCatchEmAll); if (caughtAnyPokemonInThisWalk && (!_setting.HumanWalkingSnipeAlwaysWalkBack || _setting.UseGpxPathing)) { if (session.LogicSettings.UseGpxPathing) { await WalkingBackGPXPath(session, cancellationToken, originalPokestop, fortInfo).ConfigureAwait(false); } else { await UpdateFarmingPokestop(session, cancellationToken).ConfigureAwait(false); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken) { var tracks = GetGpxTracks(session); var eggWalker = new EggWalker(1000, session); if (!_resumeTrack.HasValue || !_resumeTrackSeg.HasValue || !_resumeTrackPt.HasValue) { _resumeTrack = session.LogicSettings.ResumeTrack; _resumeTrackSeg = session.LogicSettings.ResumeTrackSeg; _resumeTrackPt = session.LogicSettings.ResumeTrackPt; // initialize the variables in UseNearbyPokestopsTask here, as this is a fresh start. UseNearbyPokestopsTask.Initialize(); } for (var curTrk = _resumeTrack.Value; curTrk < tracks.Count; curTrk++) { _resumeTrack = curTrk; cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); var track = tracks.ElementAt(curTrk); var trackSegments = track.Segments; for (var curTrkSeg = _resumeTrackSeg.Value; curTrkSeg < trackSegments.Count; curTrkSeg++) { _resumeTrackSeg = curTrkSeg; cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); var trackPoints = trackSegments.ElementAt(curTrkSeg).TrackPoints; for (var curTrkPt = _resumeTrackPt.Value; curTrkPt < trackPoints.Count; curTrkPt++) { _resumeTrackPt = curTrkPt; cancellationToken.ThrowIfCancellationRequested(); TinyIoC.TinyIoCContainer.Current.Resolve <MultiAccountManager>().ThrowIfSwitchAccountRequested(); var nextPoint = trackPoints.ElementAt(curTrkPt); var distance = LocationUtils.CalculateDistanceInMeters(session.Client.CurrentLatitude, session.Client.CurrentLongitude, Convert.ToDouble(nextPoint.Lat, CultureInfo.InvariantCulture), Convert.ToDouble(nextPoint.Lon, CultureInfo.InvariantCulture)); if (distance > 5000) { session.EventDispatcher.Send(new ErrorEvent { Message = session.Translation.GetTranslation(TranslationString.DesiredDestTooFar, nextPoint.Lat, nextPoint.Lon, session.Client.CurrentLatitude, session.Client.CurrentLongitude) }); break; } var lat = Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lat, CultureInfo.InvariantCulture); var lng = Convert.ToDouble(trackPoints.ElementAt(curTrkPt).Lon, CultureInfo.InvariantCulture); IGeoLocation destination = new GPXPointLocation(lat, lng, await LocationUtils.GetElevation(session.ElevationService, lat, lng).ConfigureAwait(false)); await session.Navigation.Move(destination, async() => { await MSniperServiceTask.Execute(session, cancellationToken).ConfigureAwait(false); await CatchNearbyPokemonsTask.Execute(session, cancellationToken).ConfigureAwait(false); //Catch Incense Pokemon await CatchIncensePokemonsTask.Execute(session, cancellationToken).ConfigureAwait(false); await UseNearbyPokestopsTask.Execute(session, cancellationToken).ConfigureAwait(false); }, session, cancellationToken).ConfigureAwait(false); await eggWalker.ApplyDistance(distance, cancellationToken).ConfigureAwait(false); // Return to FarmState/StateMachine if we have reached both user defined limits if ((UseNearbyPokestopsTask._pokestopLimitReached || UseNearbyPokestopsTask._pokestopTimerReached) && session.Stats.CatchThresholdExceeds(session)) { return; } } //end trkpts _resumeTrackPt = 0; } //end trksegs _resumeTrackSeg = 0; } //end tracks _resumeTrack = 0; }