public static bool AddSnipeItem(ISession session, MSniperInfo2 item, bool byPassValidation = false) { if (isBlocking) { return(false); } //this pokemon has been recorded as expires if (item.EncounterId > 0 && expiredCache.Get(item.EncounterId.ToString()) != null) { return(false); } //fake & annoy data if (Math.Abs(item.Latitude) > 90 || Math.Abs(item.Longitude) > 180 || item.Iv > 100) { return(false); } lock (locker) { Func <MSniperInfo2, bool> checkExisting = (MSniperInfo2 x) => { return((x.EncounterId > 0 && x.EncounterId == item.EncounterId) || (x.EncounterId == 0 && Math.Round(x.Latitude, 6) == Math.Round(item.Latitude, 6) && Math.Round(x.Longitude, 6) == Math.Round(item.Longitude, 6) && x.PokemonId == item.PokemonId)); }; //remove existing item that autoSnipePokemons.RemoveAll(x => checkExisting(x)); pokedexSnipePokemons.RemoveAll(x => checkExisting(x)); manualSnipePokemons.RemoveAll(x => checkExisting(x)); } if (!byPassValidation && session.LogicSettings.AutoSnipeMaxDistance > 0 && LocationUtils.CalculateDistanceInMeters(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, item.Latitude, item.Longitude) > session.LogicSettings.AutoSnipeMaxDistance * 1000) { return(false); } lock (locker) { item.AddedTime = DateTime.Now; //just keep pokemon in last 2 min autoSnipePokemons.RemoveAll(x => x.AddedTime.AddSeconds(SNIPE_SAFE_TIME) < DateTime.Now); pokedexSnipePokemons.RemoveAll(x => x.AddedTime.AddMinutes(SNIPE_SAFE_TIME) < DateTime.Now); } if (OutOffBallBlock > DateTime.Now || autoSnipePokemons.Exists(x => x.EncounterId == item.EncounterId && item.EncounterId > 0) || (item.EncounterId > 0 && session.Cache[item.EncounterId.ToString()] != null) || (session.LogicSettings.SnipeIgnoreUnknownIv && item.Iv == 0 && !byPassValidation)) { return(false); } item.Iv = Math.Round(item.Iv, 2); if (session.LogicSettings.SnipePokemonNotInPokedex) { //sometime the API return pokedex not correct, we need cahe this list, need lean everyetime peopellogi var pokedex = session.Inventory.GetPokeDexItems().Select(x => x.InventoryItemData?.PokedexEntry?.PokemonId).Where(x => x != null).ToList(); var update = pokedex.Where(x => !pokedexList.Contains(x.Value)).ToList(); pokedexList.AddRange(update.Select(x => x.Value)); //Logger.Debug($"Pokedex Entry : {pokedexList.Count()}"); if (pokedexList.Count > 0 && !pokedexList.Exists(x => x == (PokemonId)item.PokemonId) && !pokedexSnipePokemons.Exists(p => p.PokemonId == item.PokemonId) && (!session.LogicSettings.AutosnipeVerifiedOnly || (session.LogicSettings.AutosnipeVerifiedOnly && item.IsVerified()))) { session.EventDispatcher.Send(new WarnEvent() { Message = session.Translation.GetTranslation(TranslationString.SnipePokemonNotInPokedex, session.Translation.GetPokemonTranslation((PokemonId)item.PokemonId)) }); item.Priority = 0; pokedexSnipePokemons.Add(item); //Add as hight priority snipe entry return(true); } } var pokemonId = (PokemonId)item.PokemonId; SnipeFilter filter = session.LogicSettings.PokemonSnipeFilters.GetFilter <SnipeFilter>(pokemonId); lock (locker) { if (byPassValidation) { item.Priority = -1; manualSnipePokemons.Add(item); Logger.Write($"(MANUAL SNIPER) Pokemon added | {(PokemonId)item.PokemonId} [{item.Latitude},{item.Longitude}] IV {item.Iv}%"); return(true); } item.Priority = filter.Priority; if (filter.VerifiedOnly && item.EncounterId == 0) { return(false); } //check candy int candy = session.Inventory.GetCandyCount(pokemonId); if (candy < filter.AutoSnipeCandy) { autoSnipePokemons.Add(item); return(true); } if (filter.IsMatch(item.Iv, item.Move1, item.Move2, item.Level, item.EncounterId > 0)) { autoSnipePokemons.Add(item); return(true); } } return(false); }
public static bool AddSnipeItem(ISession session, MSniperInfo2 item, bool byPassValidation = false) { if (isBlocking) { return(false); } //this pokemon has been recorded as expires if (item.EncounterId > 0 && expiredCache.Get(item.EncounterId.ToString()) != null) { return(false); } //fake & annoy data if (Math.Abs(item.Latitude) > 90 || Math.Abs(item.Longitude) > 180) { return(false); } lock (locker) { Func <MSniperInfo2, bool> checkExisting = (MSniperInfo2 x) => { return((x.EncounterId > 0 && x.EncounterId == item.EncounterId) || (x.EncounterId == 0 && Math.Round(x.Latitude, 6) == Math.Round(item.Latitude, 6) && Math.Round(x.Longitude, 6) == Math.Round(item.Longitude, 6) && x.PokemonId == item.PokemonId)); }; //remove existing item that autoSnipePokemons.RemoveAll(x => checkExisting(x)); pokedexSnipePokemons.RemoveAll(x => checkExisting(x)); manualSnipePokemons.RemoveAll(x => checkExisting(x)); } if (!byPassValidation && session.LogicSettings.AutoSnipeMaxDistance > 0 && LocationUtils.CalculateDistanceInMeters(session.Settings.DefaultLatitude, session.Settings.DefaultLongitude, item.Latitude, item.Longitude) > session.LogicSettings.AutoSnipeMaxDistance * 1000) { return(false); } lock (locker) { item.AddedTime = DateTime.Now; //just keep pokemon in last 2 min autoSnipePokemons.RemoveAll(x => x.AddedTime.AddSeconds(SNIPE_SAFE_TIME) < DateTime.Now); pokedexSnipePokemons.RemoveAll(x => x.AddedTime.AddMinutes(SNIPE_SAFE_TIME) < DateTime.Now); } if (OutOffBallBlock > DateTime.Now || autoSnipePokemons.Exists(x => x.EncounterId == item.EncounterId && item.EncounterId > 0) || (item.EncounterId > 0 && session.Cache[item.EncounterId.ToString()] != null) || (session.LogicSettings.SnipeIgnoreUnknownIv && item.Iv == 0 && !byPassValidation)) { return(false); } item.Iv = Math.Round(item.Iv, 2); if (session.LogicSettings.SnipePokemonNotInPokedex) { var pokedex = session.Inventory.GetPokeDexItems(); if (!pokedex.Exists(x => x.InventoryItemData?.PokedexEntry?.PokemonId == (PokemonId)item.PokemonId) && !pokedexSnipePokemons.Exists(p => p.PokemonId == item.PokemonId) && (!session.LogicSettings.AutosnipeVerifiedOnly || (session.LogicSettings.AutosnipeVerifiedOnly && (item.EncounterId > 0 || (item.Move1 != PokemonMove.MoveUnset && item.Move2 != PokemonMove.MoveUnset))))) { session.EventDispatcher.Send(new WarnEvent() { Message = session.Translation.GetTranslation(TranslationString.SnipePokemonNotInPokedex, session.Translation.GetPokemonTranslation((PokemonId)item.PokemonId)) }); item.Priority = 0; pokedexSnipePokemons.Add(item); //Add as hight priority snipe entry return(true); } } SnipeFilter filter = new SnipeFilter() { SnipeIV = session.LogicSettings.MinIVForAutoSnipe, VerifiedOnly = session.LogicSettings.AutosnipeVerifiedOnly, AutoSnipeCandy = session.LogicSettings.DefaultAutoSnipeCandy, Level = 0 }; var pokemonId = (PokemonId)item.PokemonId; if (session.LogicSettings.PokemonSnipeFilters.ContainsKey(pokemonId)) { filter = session.LogicSettings.PokemonSnipeFilters[pokemonId]; } lock (locker) { if (byPassValidation) { item.Priority = -1; manualSnipePokemons.Add(item); Logger.Write($"(MANUAL SNIPER) Pokemon added | {(PokemonId)item.PokemonId} [{item.Latitude},{item.Longitude}] IV {item.Iv}%"); return(true); } item.Priority = filter.Priority; if (filter.VerifiedOnly && item.EncounterId == 0) { return(false); } //check candy int candy = session.Inventory.GetCandyCount(pokemonId); if (candy < filter.AutoSnipeCandy) { autoSnipePokemons.Add(item); return(true); } if (filter.IsMatch(item.Iv, item.Move1, item.Move2, item.Level, item.EncounterId > 0)) { autoSnipePokemons.Add(item); return(true); } } return(false); }