private static async Task ActionsWhenTravelToSnipeTarget(ISession session, CancellationToken cancellationToken, SnipePokemonInfo pokemon, bool allowCatchPokemon, bool allowSpinPokeStop) { var distance = LocationUtils.CalculateDistanceInMeters( pokemon.Latitude, pokemon.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude ); if (allowCatchPokemon && distance > 50.0) { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken, sessionAllowTransfer : false); } if (allowSpinPokeStop) { //looking for neaby pokestop. spin it await UseNearbyPokestopsTask.SpinPokestopNearBy(session, cancellationToken, null); } if (session.LogicSettings.ActivateMSniper) { await MSniperServiceTask.Execute(session, cancellationToken); } }
private static SnipePokemonInfo ParseLine(string line) { var match = Regex.Match(line, @"(?<id>\d+)\|(?<lat>\-?\d+[\,|\.]\d+)\|(?<lon>\-?\d+[\,|\.]\d+)\|(?<expires>\d+)\|(?<verified>[1|0])\|\|"); if (match.Success) { var pokemonId = Convert.ToInt32(match.Groups["id"].Value); var sniperInfo = new SnipePokemonInfo() { Id = pokemonId, Source = "PokeZZ" }; var lat = Convert.ToDouble(match.Groups["lat"].Value); var lon = Convert.ToDouble(match.Groups["lon"].Value); sniperInfo.Latitude = Math.Round(lat, 7); sniperInfo.Longitude = Math.Round(lon, 7); var expires = Convert.ToInt64(match.Groups["expires"].Value); if (expires != default(long)) { sniperInfo.ExpiredTime = UnixTimeStampToDateTime(expires); } return(sniperInfo); } return(null); }
static void CalculateDistanceAndEstTime(SnipePokemonInfo p) { double speed = p.Setting.AllowSpeedUp ? p.Setting.MaxSpeedUpSpeed : _setting.WalkingSpeedInKilometerPerHour; var speedInMetersPerSecond = speed / 3.6; p.Distance = CalculateDistanceInMeters(_session.Client.CurrentLatitude, _session.Client.CurrentLongitude, p.Latitude, p.Longitude); p.EstimatedTime = p.Distance / speedInMetersPerSecond + p.Setting.DelayTimeAtDestination / 1000 + 15; //margin 30 second }
public static void UpdateCatchPokemon(double latitude, double longitude, PokemonId id) { bool exist = false; foreach (var p in rarePokemons) { if (LocationUtils.CalculateDistanceInMeters(latitude, longitude, p.Value.Latitude, p.Value.Longitude) < 30.0 && p.Value.PokemonId == id && !p.Value.IsVisited) { p.Value.IsVisited = true; exist = true; _session.EventDispatcher.Send(new HumanWalkSnipeEvent() { UniqueId = p.Value.UniqueId, Type = HumanWalkSnipeEventTypes.EncounterSnipePokemon, PokemonId = id, Latitude = latitude, Longitude = longitude, Pokemons = ApplyFilter(rarePokemons.ToList()), }); } } ; //in some case, we caught the pokemon before data refresh, we need add a fake pokemon to list to avoid it add back and waste time if (!exist && pokemonToBeCaughtLocallyIds.ContainsKey(id)) { var pokemonInfo = new SnipePokemonInfo() { Latitude = latitude, Longitude = longitude, Id = (int)id, IsFake = true, IsVisited = true, ExpiredTime = DateTime.Now.AddMinutes(14), //not being used. just fake to make code valid Setting = new HumanWalkSnipeFilter(1, 1, 100, false, false, false, 0), }; rarePokemons[pokemonInfo.GetHashCode()] = pokemonInfo; } }
private static SnipePokemonInfo ParseLine(string line) { var match = Regex.Match(line, @"(?<id>\d+)\|(?<lat>\-?\d+[\,|\.]\d+)\|(?<lon>\-?\d+[\,|\.]\d+)\|(?<expires>\d+)\|(?<verified>[1|0])\|\|"); if (match.Success) { var pokemonId = Convert.ToInt32(match.Groups["id"].Value); var sniperInfo = new SnipePokemonInfo() { Id = pokemonId, Source = "PokeZZ" }; //sniperInfo.Id = pokemonId; var lat = Convert.ToDouble(match.Groups["lat"].Value); var lon = Convert.ToDouble(match.Groups["lon"].Value); sniperInfo.Latitude = Math.Round(lat, 7); sniperInfo.Longitude = Math.Round(lon, 7); var expires = Convert.ToInt64(match.Groups["expires"].Value); if (expires != default(long)) { //var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); //var untilTime = epoch.AddSeconds(expires).ToLocalTime(); //if (untilTime < DateTime.Now) //{ // return null; //} //sniperInfo.ExpirationTimestamp = DateTime.Now.AddMinutes(15) < untilTime ? // DateTime.Now.AddMinutes(15) : untilTime; sniperInfo.ExpiredTime = UnixTimeStampToDateTime(expires); } return(sniperInfo); } return(null); }
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 = CheckPokeballsToSnipe(_setting.HumanWalkingSnipeCatchEmAllMinBalls, session, cancellationToken); 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); 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, LocationUtils.getElevation(session.ElevationService, pokemon.Latitude, pokemon.Longitude)); await session.Navigation.Move( snipeTarget, async() => { cancellationToken.ThrowIfCancellationRequested(); await ActionsWhenTravelToSnipeTarget(session, cancellationToken, pokemon, catchPokemon, spinPokestop); }, session, cancellationToken, pokemon.Setting.AllowSpeedUp?pokemon.Setting.MaxSpeedUpSpeed : 0 ); 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); await CatchNearbyPokemonsTask .Execute(session, cancellationToken, pokemon.PokemonId, pokemon.Setting.AllowTransferWhileWalking); await Task.Delay(1000, cancellationToken); if (!pokemon.IsVisited) { await CatchLurePokemonsTask.Execute(session, cancellationToken); } lock (threadLocker) { pokemon.IsVisited = true; pokemon.IsCatching = false; } if (session.LogicSettings.TransferDuplicatePokemon) { await TransferDuplicatePokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.TransferWeakPokemon) { await TransferWeakPokemonTask.Execute(session, cancellationToken); } if (session.LogicSettings.EvolveAllPokemonAboveIv || session.LogicSettings.EvolveAllPokemonWithEnoughCandy || session.LogicSettings.UseLuckyEggsWhileEvolving || session.LogicSettings.KeepPokemonsThatCanEvolve) { await EvolvePokemonTask.Execute(session, cancellationToken); } } } while (pokemon != null && _setting.HumanWalkingSnipeTryCatchEmAll); if (caughtAnyPokemonInThisWalk && (!_setting.HumanWalkingSnipeAlwaysWalkBack || _setting.UseGpxPathing)) { if (session.LogicSettings.UseGpxPathing) { await WalkingBackGPXPath(session, cancellationToken, originalPokestop, fortInfo); } else { await UpdateFarmingPokestop(session, cancellationToken); } } }
public static async Task Execute(ISession session, CancellationToken cancellationToken, Func <double, double, Task> actionWhenWalking = null, Func <Task> afterCatchFunc = null) { 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); if (!checkBall && !prioritySnipeFlag) { return; } } bool caughtAnyPokemonInThisWalk = false; SnipePokemonInfo pokemon = null; do { prioritySnipeFlag = false; pokemon = GetNextSnipeablePokemon(session.Client.CurrentLatitude, session.Client.CurrentLongitude, !caughtAnyPokemonInThisWalk); if (pokemon != null) { caughtAnyPokemonInThisWalk = true; CalculateDistanceAndEstTime(pokemon); var remainTimes = (pokemon.ExpiredTime - DateTime.Now).TotalSeconds * 0.95; //just use 90% times var catchPokemonTimeEST = (pokemon.Distance / 100) * 10; //assume that 100m we catch 1 pokemon and it took 10 second for each. 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; 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), SpinPokeStop = pokemon.Setting.SpinPokestopWhileWalking, WalkSpeedApplied = pokemon.Setting.AllowSpeedUp ? pokemon.Setting.MaxSpeedUpSpeed : _session.LogicSettings.WalkingSpeedInKilometerPerHour, Type = HumanWalkSnipeEventTypes.StartWalking, Rarity = PokemonGradeHelper.GetPokemonGrade(pokemon.PokemonId).ToString() }); await session.Navigation.Move(new GeoCoordinate(pokemon.Latitude, pokemon.Longitude, LocationUtils.getElevation(session, pokemon.Latitude, pokemon.Longitude)), async() => { var distance = LocationUtils.CalculateDistanceInMeters(pokemon.Latitude, pokemon.Longitude, session.Client.CurrentLatitude, session.Client.CurrentLongitude); if (catchPokemon && distance > 100.0) { // Catch normal map Pokemon await CatchNearbyPokemonsTask.Execute(session, cancellationToken, sessionAllowTransfer: false); } if (actionWhenWalking != null && spinPokestop) { await actionWhenWalking(session.Client.CurrentLatitude, session.Client.CurrentLongitude); } return(true); }, session, cancellationToken, pokemon.Setting.AllowSpeedUp?pokemon.Setting.MaxSpeedUpSpeed : 0); session.EventDispatcher.Send(new HumanWalkSnipeEvent() { Latitude = pokemon.Latitude, Longitude = pokemon.Longitude, PauseDuration = pokemon.Setting.DelayTimeAtDestination / 1000, Type = HumanWalkSnipeEventTypes.DestinationReached, UniqueId = pokemon.UniqueId }); //await CatchNearbyPokemonsTask.Execute(session, cancellationToken, pokemon.PokemonId,false); //await CatchIncensePokemonsTask.Execute(session, cancellationToken); await Task.Delay(pokemon.Setting.DelayTimeAtDestination); // if (!pokemon.IsVisited) { await CatchNearbyPokemonsTask.Execute(session, cancellationToken, pokemon.PokemonId, false); await CatchIncensePokemonsTask.Execute(session, cancellationToken); } pokemon.IsVisited = true; pokemon.IsCatching = false; } }while (pokemon != null && _setting.HumanWalkingSnipeTryCatchEmAll); if (caughtAnyPokemonInThisWalk && (!_setting.HumanWalkingSnipeAlwaysWalkBack || _setting.UseGpxPathing)) { await afterCatchFunc?.Invoke(); } }