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)); } } }
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}"); } } }
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); } } } } }