コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }