Esempio n. 1
0
        private DateTime getDespawnTime(Spawnpoint spawnpoint, long lastModifiedMs, long tillDespawnMs, long timestamp)
        {
            var now = UnixTimeStampToDateTime(timestamp);

            if (spawnpoint != null && spawnpoint.calc_endminsec != null && spawnpoint.calc_endminsec.Length != 0)
            {
                var split           = spawnpoint.calc_endminsec.Split(":");
                var despawnDateTime = new DateTime(now.Year, now.Month, now.Day, now.Hour, int.Parse(split[0]), int.Parse(split[1]));
                if (despawnDateTime < now)
                {
                    despawnDateTime = despawnDateTime.AddHours(1);
                }
                return(despawnDateTime);
            }
            else
            {
                if (30 < tillDespawnMs && tillDespawnMs <= 90000)
                {
                    return(now.AddMilliseconds(tillDespawnMs));
                }
                else
                {
                    return(now.AddMinutes(10));
                }
            }
        }
Esempio n. 2
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}");
                }
            }
        }
Esempio n. 3
0
        public void AddSpawnpoints(GetMapObjectsOutProto mapProto)
        {
            if (mapProto.MapCell == null || mapProto.MapCell.Count == 0)
            {
                return;
            }
            var cells = mapProto.MapCell;

            using (var context = new RocketMapContext())
            {
                String spawnpointsQuery = "INSERT INTO trs_spawn(spawnpoint, latitude, longitude, earliest_unseen, " +
                                          "last_scanned, spawndef, calc_endminsec, eventid) " +
                                          "VALUES (@spawnpoint, @latitude, @longitude, @earliestUnseen, @LastScanned, @spawnDef, @calcEndminsec, " +
                                          "(select id from trs_event where now() between event_start and " +
                                          "event_end order by event_start desc limit 1)) " +
                                          "ON DUPLICATE KEY UPDATE " +
                                          "last_scanned=VALUES(last_scanned), " +
                                          "earliest_unseen=LEAST(earliest_unseen, VALUES(earliest_unseen)), " +
                                          "spawndef=if(((select id from trs_event where now() between event_start and event_end order " +
                                          "by event_start desc limit 1)=1 and eventid=1) or (select id from trs_event where now() between " +
                                          "event_start and event_end order by event_start desc limit 1)<>1 and eventid<>1, VALUES(spawndef), " +
                                          "spawndef), " +
                                          "calc_endminsec=VALUES(calc_endminsec)";

                String spawnpointsUnseenQuery = "INSERT INTO trs_spawn (spawnpoint, latitude, longitude, earliest_unseen, last_non_scanned, spawndef, " +
                                                "eventid) VALUES (@spawnpoint, @latitude, @longitude, @earliestUnseen, @LastNonScanned, @spawnDef, " +
                                                "(select id from trs_event where now() between event_start and " +
                                                "event_end order by event_start desc limit 1)) " +
                                                "ON DUPLICATE KEY UPDATE " +
                                                "spawndef=if(((select id from trs_event where now() between event_start and event_end order " +
                                                "by event_start desc limit 1)=1 and eventid=1) or (select id from trs_event where now() between " +
                                                "event_start and event_end order by event_start desc limit 1)<>1 and eventid<>1, VALUES(spawndef), " +
                                                "spawndef), " +
                                                "last_non_scanned=VALUES(last_non_scanned)";
                var spawnIds = cells.SelectMany(cell => cell.WildPokemon).Select(poke => Convert.ToInt64(poke.SpawnPointId, 16));

                var spawnIdsString      = String.Join(", ", spawnIds).Trim(',');
                var getSpawnpointsQuery = $"SELECT spawnpoint, spawndef, calc_endminsec FROM trs_spawn WHERE spawnpoint in ({spawnIdsString})";
                var dbSpawnpoints       = context.Spawnpoints.FromSqlRaw(getSpawnpointsQuery);

                foreach (var cell in cells)
                {
                    foreach (var wild in cell.WildPokemon)
                    {
                        var currentSpawnpointId = Convert.ToInt64(wild.SpawnPointId, 16);
                        var id = new MySqlParameter("spawnpoint", currentSpawnpointId);

                        var cellLatLng = new S2CellId((ulong)Convert.ToInt64(wild.SpawnPointId + "00000", 16)).ToLatLng();
                        var latitude   = new MySqlParameter("latitude", cellLatLng.LatDegrees);
                        var longitude  = new MySqlParameter("longitude", cellLatLng.LngDegrees);

                        var despawnTime = wild.TimeTillHiddenMs;
                        var minPos      = getCurrentSpawnDefPosition();

                        Spawnpoint     currentDbSpawnpoint = dbSpawnpoints.FirstOrDefault(s => s.spawnpoint == currentSpawnpointId);
                        int            oldSpawnDef         = currentDbSpawnpoint != null ? currentDbSpawnpoint.spawndef : int.MinValue;
                        MySqlParameter newSpawnDef;
                        if (oldSpawnDef != int.MinValue)
                        {
                            newSpawnDef = new MySqlParameter("spawnDef", getSpawnDefWithMinPos(oldSpawnDef, minPos));
                        }
                        else
                        {
                            newSpawnDef = new MySqlParameter("spawnDef", getSpawnDefWithMinPos(240, minPos));
                        }
                        if (0 <= despawnTime && despawnTime <= 90000)
                        {
                            var earliestUnseen = new MySqlParameter("earliestUnseen", despawnTime);
                            var lastScanned    = new MySqlParameter("LastScanned", ToMySQLDateTime(DateTime.UtcNow));
                            var calcEndTime    = new MySqlParameter("calcEndminsec", DateTime.UtcNow.AddMilliseconds(despawnTime).ToString("mm:ss"));

                            context.Database.ExecuteSqlRaw(spawnpointsQuery, id, latitude, longitude, earliestUnseen, lastScanned, newSpawnDef, calcEndTime);
                        }
                        else
                        {
                            var earliestUnseen = new MySqlParameter("earliestUnseen", 99999999);
                            var lastScanned    = new MySqlParameter("LastNonScanned", DateTime.UtcNow);

                            context.Database.ExecuteSqlRaw(spawnpointsUnseenQuery, id, latitude, longitude, earliestUnseen, lastScanned, newSpawnDef);
                        }
                    }
                }
            }
        }