示例#1
0
 public void AddEncounter(EncounterOutProto encounter)
 {
     if (!ConfigurationManager.Shared.Config.Encounter.Enabled)
     {
         return;
     }
     blockingEncounterQueue.Add(encounter);
 }
示例#2
0
        private string getReplacedCustomLink(String customlink, EncounterOutProto encounter)
        {
            String link = customlink.Replace("{latitude}", Math.Round(encounter.Pokemon.Latitude, 5).ToString());

            link = link.Replace("{longitude}", Math.Round(encounter.Pokemon.Longitude, 5).ToString());
            link = link.Replace("{encounterId}", encounter.Pokemon.EncounterId.ToString());
            return(link);
        }
示例#3
0
        private void EncounterConsumer()
        {
            while (true)
            {
                List <EncounterOutProto> encounterList = new List <EncounterOutProto>();

                if (ConfigurationManager.Shared.Config.MySql.Enabled && ConfigurationManager.Shared.Config.Encounter.SaveToDatabase)
                {
                    using (var context = new MySQLContext())
                    {
                        while (blockingEncounterQueue.Count > 0)
                        {
                            EncounterOutProto encounter = blockingEncounterQueue.Take();
                            if (alreadySendEncounters.ContainsKey(encounter.Pokemon.EncounterId))
                            {
                                continue;
                            }
                            lock (lockObj)
                            {
                                alreadySendEncounters.Add(encounter.Pokemon.EncounterId, DateTime.Now);
                            }
                            encounterList.Add(encounter);
                            connectionManager.AddEncounterToDatabase(encounter, context);
                        }
                        context.SaveChanges();
                    }
                }
                else
                {
                    while (blockingEncounterQueue.Count > 0)
                    {
                        EncounterOutProto encounter = blockingEncounterQueue.Take();
                        if (alreadySendEncounters.ContainsKey(encounter.Pokemon.EncounterId))
                        {
                            continue;
                        }
                        lock (lockObj)
                        {
                            alreadySendEncounters.Add(encounter.Pokemon.EncounterId, DateTime.Now);
                        }
                        encounterList.Add(encounter);
                    }
                }
                if (encounterList.Count > 0)
                {
                    ConfigurationManager.Shared.Config.Encounter.DiscordWebhooks.ForEach(hook => SendDiscordWebhooks(hook, encounterList));
                    Thread.Sleep(3000);
                }
                Thread.Sleep(1000);
            }
        }
        public void AddEncounterToDatabase(EncounterOutProto encounterProto, MySQLContext context)
        {
            if (context.Encounters.Where(e => e.EncounterId == encounterProto.Pokemon.EncounterId).FirstOrDefault() != null)
            {
                return;
            }

            Encounter encounter = new Encounter();

            encounter.EncounterId = encounterProto.Pokemon.EncounterId;
            encounter.PokemonName = encounterProto.Pokemon.Pokemon.PokemonId;
            encounter.Form        = encounterProto.Pokemon.Pokemon.PokemonDisplay.Form;
            encounter.Stamina     = encounterProto.Pokemon.Pokemon.IndividualStamina;
            encounter.Attack      = encounterProto.Pokemon.Pokemon.IndividualAttack;
            encounter.Defense     = encounterProto.Pokemon.Pokemon.IndividualDefense;
            encounter.Latitude    = encounterProto.Pokemon.Latitude;
            encounter.Longitude   = encounterProto.Pokemon.Longitude;
            encounter.timestamp   = DateTime.UtcNow;

            context.Encounters.Add(encounter);
        }
示例#5
0
        public void AddEncounter(EncounterOutProto encounter, Payload payload)
        {
            using (var context = new RocketMapContext())
            {
                long       spawnpointId  = Convert.ToInt64(encounter.Pokemon.SpawnPointId, 16);
                Spawnpoint spawnpoint    = context.Spawnpoints.FromSqlInterpolated($"SELECT spawnpoint, spawndef, calc_endminsec FROM trs_spawn WHERE spawnpoint={spawnpointId}").FirstOrDefault();
                DateTime   disappearTime = getDespawnTime(spawnpoint, encounter.Pokemon.LastModifiedMs, encounter.Pokemon.TimeTillHiddenMs, payload.timestamp);

                String query = "INSERT INTO pokemon (encounter_id, spawnpoint_id, pokemon_id, latitude, longitude, disappear_time, " +
                               "individual_attack, individual_defense, individual_stamina, move_1, move_2, cp, cp_multiplier, " +
                               "weight, height, gender, catch_prob_1, catch_prob_2, catch_prob_3, rating_attack, rating_defense, " +
                               "weather_boosted_condition, last_modified, costume, form, seen_type) " +
                               "VALUES ({0}, {1}, {2}, {3}, {4}, \"{5}\", {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, " +
                               "{20}, {21}, \"{22}\", {23}, {24}, \"{25}\") " +
                               "ON DUPLICATE KEY UPDATE last_modified=VALUES(last_modified), disappear_time=VALUES(disappear_time), " +
                               "spawnpoint_id=VALUES(spawnpoint_id), pokemon_id=VALUES(pokemon_id), latitude=VALUES(latitude), " +
                               "longitude=VALUES(longitude), gender=VALUES(gender), costume=VALUES(costume), form=VALUES(form), " +
                               "weather_boosted_condition=VALUES(weather_boosted_condition), fort_id=NULL, cell_id=NULL, " +
                               "seen_type=IF(seen_type='encounter','encounter',VALUES(seen_type))";

                query = String.Format(query, encounter.Pokemon.EncounterId, spawnpointId, (int)encounter.Pokemon.Pokemon.PokemonId, encounter.Pokemon.Latitude, encounter.Pokemon.Longitude,
                                      ToMySQLDateTime(disappearTime), encounter.Pokemon.Pokemon.IndividualAttack, encounter.Pokemon.Pokemon.IndividualDefense, encounter.Pokemon.Pokemon.IndividualStamina,
                                      (int)encounter.Pokemon.Pokemon.Move1, (int)encounter.Pokemon.Pokemon.Move2, encounter.Pokemon.Pokemon.Cp, encounter.Pokemon.Pokemon.CpMultiplier, encounter.Pokemon.Pokemon.WeightKg,
                                      encounter.Pokemon.Pokemon.HeightM, (int)encounter.Pokemon.Pokemon.PokemonDisplay.Gender, encounter.CaptureProbability.CaptureProbability[0], encounter.CaptureProbability.CaptureProbability[1],
                                      encounter.CaptureProbability.CaptureProbability[2], "\"\"", "\"\"", (int)encounter.Pokemon.Pokemon.PokemonDisplay.WeatherBoostedCondition, UnixTimeStampToDateTime(encounter.Pokemon.LastModifiedMs).ToString("yyyy-MM-dd HH:mm:ss"),
                                      (int)encounter.Pokemon.Pokemon.PokemonDisplay.Costume, (int)encounter.Pokemon.Pokemon.PokemonDisplay.Form, SeenType.wild.ToString("g"));
                try
                {
                    context.Database.ExecuteSqlRaw(query);
                }
                catch (Exception e)
                {
                    Log.Information(e.Message);
                    Log.Information(e.StackTrace);
                    Log.Information($"Object: {JsonSerializer.Serialize(encounter)} \n Query: {query}");
                }
            }
        }
示例#6
0
        public async Task AddEncounter(EncounterOutProto encounter, string username)
        {
            var pokemonId = (uint)encounter.Pokemon.Pokemon.PokemonId;
            var cp        = (ushort?)encounter.Pokemon.Pokemon.Cp;
            var move1     = (uint?)encounter.Pokemon.Pokemon.Move1;
            var move2     = (uint?)encounter.Pokemon.Pokemon.Move2;
            var size      = (double?)encounter.Pokemon.Pokemon.HeightM;
            var weight    = (double?)encounter.Pokemon.Pokemon.WeightKg;
            var atkIV     = (ushort?)encounter.Pokemon.Pokemon.IndividualAttack;
            var defIV     = (ushort?)encounter.Pokemon.Pokemon.IndividualDefense;
            var staIV     = (ushort?)encounter.Pokemon.Pokemon.IndividualStamina;
            var costume   = (ushort)encounter.Pokemon.Pokemon.PokemonDisplay.Costume;
            var form      = (ushort?)encounter.Pokemon.Pokemon.PokemonDisplay.Form;
            var gender    = (ushort)encounter.Pokemon.Pokemon.PokemonDisplay.Gender;

            if (PokemonId != pokemonId ||
                CP != cp ||
                Move1 != move1 ||
                Move2 != move2 ||
                Size != size ||
                Weight != weight ||
                AttackIV != atkIV ||
                DefenseIV != defIV ||
                StaminaIV != staIV ||
                Costume != costume ||
                Form != form ||
                Gender != gender)
            {
                HasChanges    = true;
                _hasIvChanges = true;
            }

            PokemonId = pokemonId;
            CP        = cp;
            Move1     = move1;
            Move2     = move2;
            Size      = size;
            Weight    = weight;
            AttackIV  = atkIV;
            DefenseIV = defIV;
            StaminaIV = staIV;
            Costume   = costume;
            Form      = form;
            Gender    = gender;
            IsShiny   = encounter.Pokemon.Pokemon.PokemonDisplay.Shiny;
            Username  = username;

            if (_hasIvChanges)
            {
                var    cpMultiplier = encounter.Pokemon.Pokemon.CpMultiplier;
                ushort level;
                if (cpMultiplier < 0.734)
                {
                    level = (ushort)Math.Round(
                        (58.35178527 * cpMultiplier * cpMultiplier) -
                        (2.838007664 * cpMultiplier) + 0.8539209906
                        );
                }
                else
                {
                    level = (ushort)Math.Round((171.0112688 * cpMultiplier) - 95.20425243);
                }
                Level   = level;
                IsDitto = IsDittoDisguised(pokemonId, level, Weather, AttackIV ?? 0, DefenseIV ?? 0, StaminaIV ?? 0);
                if (IsDitto)
                {
                    ConsoleExt.WriteInfo($"[Pokemon] Pokemon {Id} Ditto found, disguised as {PokemonId}");
                    SetDittoAttributes(PokemonId);
                }

                if (AttackIV != null)
                {
                    await SetPvpRankings().ConfigureAwait(false);
                }

                SpawnId = Convert.ToUInt64(encounter.Pokemon.SpawnPointId, 16);
                var timestampMs = DateTime.UtcNow.ToTotalSeconds();
                await HandleSpawnpoint(encounter.Pokemon.TimeTillHiddenMs, timestampMs).ConfigureAwait(false);

                Updated = DateTime.UtcNow.ToTotalSeconds();
                Changed = Updated;
                if (FirstSeenTimestamp == 0)
                {
                    FirstSeenTimestamp = Updated;
                }
            }
            await Task.CompletedTask.ConfigureAwait(false);
        }