From 66bb9f0a8283de08257d61e8d60e5b521afbf533 Mon Sep 17 00:00:00 2001 From: Hipposgrumm Date: Wed, 11 Jun 2025 14:59:42 -0600 Subject: [PATCH 1/3] Daily Scoreboard now works correctly. --- src/Controllers/Common/ContentController.cs | 2 +- src/Model/DBContext.cs | 14 +++++ src/Model/DailyHighscore.cs | 15 +++++ src/Model/DailyHighscorePair.cs | 13 +++++ src/Model/Viking.cs | 1 + src/Services/GameDataService.cs | 62 ++++++++++++++++++++- 6 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 src/Model/DailyHighscore.cs create mode 100644 src/Model/DailyHighscorePair.cs diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 52dea2b..cb2745f 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -2150,7 +2150,7 @@ public class ContentController : Controller { [Route("ContentWebService.asmx/GetPeriodicGameDataByGame")] // used by Math Blaster and WoJS (probably from 24 hours ago to now) [VikingSession(UseLock = true)] public IActionResult GetPeriodicGameDataByGame(Viking viking, [FromForm] int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, int score, bool buddyFilter, string apiKey) { - return Ok(gameDataService.GetGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey, DateTime.Now.AddHours(-24), DateTime.Now)); + return Ok(gameDataService.GetDailyGameData(viking, gameId, isMultiplayer, difficulty, gameLevel, key, count, AscendingOrder, buddyFilter, apiKey)); } [HttpPost] diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index 1832763..ce01bc0 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -19,6 +19,8 @@ public class DBContext : DbContext { public DbSet RoomItems { get; set; } = null!; public DbSet GameData { get; set; } = null!; public DbSet GameDataPairs { get; set; } = null!; + public DbSet DailyHighscores { get; set; } = null!; + public DbSet DailyHighscorePairs { get; set; } = null!; public DbSet AchievementPoints { get; set; } = null!; public DbSet ProfileAnswers { get; set; } = null!; public DbSet MMORoles { get; set; } = null!; @@ -129,6 +131,9 @@ public class DBContext : DbContext { builder.Entity().HasMany(v => v.GameData) .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.DailyHighscores) + .WithOne(e => e.Viking); + builder.Entity().HasMany(v => v.SavedData) .WithOne(e => e.Viking); @@ -222,6 +227,15 @@ public class DBContext : DbContext { builder.Entity().HasOne(e => e.GameData) .WithMany(e => e.GameDataPairs); + builder.Entity().HasOne(e => e.Viking) + .WithMany(e => e.DailyHighscores); + + builder.Entity().HasMany(e => e.ScorePairs) + .WithOne(e => e.DailyScore); + + builder.Entity().HasOne(e => e.DailyScore) + .WithMany(e => e.ScorePairs); + // Others .. builder.Entity().HasOne(s => s.Viking) .WithMany(e => e.Images) diff --git a/src/Model/DailyHighscore.cs b/src/Model/DailyHighscore.cs new file mode 100644 index 0000000..4d89c0f --- /dev/null +++ b/src/Model/DailyHighscore.cs @@ -0,0 +1,15 @@ +using System.ComponentModel.DataAnnotations; + +namespace sodoff.Model; + +public class DailyHighscore { + [Key] + public int Id { get; set; } + public int VikingId { get; set; } + public int GameId { get; set; } + public int Difficulty { get; set; } + public int GameLevel { get; set; } + public bool IsMultiplayer { get; set; } + public virtual ICollection ScorePairs { get; set; } = null!; + public virtual Viking Viking { get; set; } = null!; +} diff --git a/src/Model/DailyHighscorePair.cs b/src/Model/DailyHighscorePair.cs new file mode 100644 index 0000000..6b312f3 --- /dev/null +++ b/src/Model/DailyHighscorePair.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace sodoff.Model; + +public class DailyHighscorePair { + [Key] + public int Id { get; set; } + public int DailyScoreId { get; set; } + public string Name { get; set; } = null!; + public int Value { get; set; } + public DateTime DatePlayed { get; set; } + public virtual DailyHighscore DailyScore { get; set; } = null!; +} diff --git a/src/Model/Viking.cs b/src/Model/Viking.cs index a787107..cd19e70 100644 --- a/src/Model/Viking.cs +++ b/src/Model/Viking.cs @@ -34,6 +34,7 @@ public class Viking { public virtual ICollection PairData { get; set; } = null!; public virtual ICollection InventoryItems { get; set; } = null!; public virtual ICollection GameData { get; set; } = null!; + public virtual ICollection DailyHighscores { get; set; } = null!; public virtual ICollection ProfileAnswers { get; set; } = null!; public virtual ICollection SavedData { get; set; } = null!; public virtual ICollection Parties { get; set; } = null!; diff --git a/src/Services/GameDataService.cs b/src/Services/GameDataService.cs index 8814586..b76216a 100644 --- a/src/Services/GameDataService.cs +++ b/src/Services/GameDataService.cs @@ -32,8 +32,21 @@ public class GameDataService { } gameData.DatePlayed = DateTime.UtcNow; - SavePairs(gameData, xmlDocumentData); + + DailyHighscore? daily = viking.DailyHighscores.FirstOrDefault(x => x.GameId == gameId && x.IsMultiplayer == isMultiplayer && x.Difficulty == difficulty && x.GameLevel == gameLevel); + if (daily == null) { + daily = new DailyHighscore { + GameId = gameId, + Difficulty = difficulty, + GameLevel = gameLevel, + IsMultiplayer = isMultiplayer, + ScorePairs = new List() + }; + viking.DailyHighscores.Add(daily); + } + SavePairs(gameData, daily, xmlDocumentData); ctx.SaveChanges(); + return true; } @@ -70,6 +83,30 @@ public class GameDataService { return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); } + + public GameDataSummary GetDailyGameData(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, bool buddyFilter, string apiKey) { + IQueryable query = ctx.DailyHighscores + .Where(x => x.GameId == gameId && x.IsMultiplayer == false && x.Difficulty == difficulty && x.GameLevel == gameLevel) + .SelectMany(e => e.ScorePairs).Where(x => x.DatePlayed == DateTime.Today && x.Name == key); + + // TODO: Buddy filter + + if (AscendingOrder) query = query.OrderBy(e => e.Value); + else query = query.OrderByDescending(e => e.Value); + + List selectedData; + if (ClientVersion.GetVersion(apiKey) <= ClientVersion.Max_OldJS) + // use DisplayName instead of Name + selectedData = query.Select(e => new GameDataResponse( + XmlUtil.DeserializeXml(e.DailyScore.Viking.AvatarSerialized).DisplayName, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + ).Take(count).ToList(); + else + selectedData = query.Select(e => new GameDataResponse( + e.DailyScore.Viking.Name, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + ).Take(count).ToList(); + + return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); + } // ByUser for JumpStart's My Scores public GameDataSummary GetGameDataByUser(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, string apiKey) { @@ -138,7 +175,7 @@ public class GameDataService { return gameData; } - private void SavePairs(Model.GameData gameData, string xmlDocumentData) { + private void SavePairs(Model.GameData gameData, DailyHighscore daily, string xmlDocumentData) { foreach (var pair in GetGameDataPairs(xmlDocumentData)) { GameDataPair? dbPair = gameData.GameDataPairs.FirstOrDefault(x => x.Name == pair.Name); if (dbPair == null) @@ -147,6 +184,27 @@ public class GameDataService { dbPair.Value = pair.Value; else if (pair.Name != "time" && dbPair.Value <= pair.Value) dbPair.Value = pair.Value; + + DailyHighscorePair? dailyPair = daily.ScorePairs.FirstOrDefault(x => x.Name == pair.Name); + if (dailyPair == null) { + daily.Difficulty = gameData.Difficulty; + daily.GameLevel = gameData.GameLevel; + dailyPair = new DailyHighscorePair { + Name = pair.Name, + Value = pair.Value, + DatePlayed = DateTime.Today + }; + daily.ScorePairs.Add(dailyPair); + } else if ( + (pair.Name == "time" && dailyPair.Value > pair.Value) || // Better Time + (pair.Name != "time" && dailyPair.Value <= pair.Value) || // Better Score + dailyPair.DatePlayed != DateTime.Today // Another Day + ) { + daily.Difficulty = gameData.Difficulty; + daily.GameLevel = gameData.GameLevel; + dailyPair.DatePlayed = DateTime.Today; + dailyPair.Value = pair.Value; + } } } From 17709423b6cd57e04b289b28bb9a3c54bf7e3427 Mon Sep 17 00:00:00 2001 From: Hipposgrumm Date: Sun, 15 Jun 2025 23:07:45 -0600 Subject: [PATCH 2/3] Heavily optimized the entire PR. --- src/Model/DBContext.cs | 14 ------- src/Model/DailyHighscore.cs | 15 ------- src/Model/DailyHighscorePair.cs | 13 ------- src/Model/GameDataPair.cs | 1 + src/Model/Viking.cs | 1 - src/Services/GameDataService.cs | 69 ++++++++++++--------------------- 6 files changed, 25 insertions(+), 88 deletions(-) delete mode 100644 src/Model/DailyHighscore.cs delete mode 100644 src/Model/DailyHighscorePair.cs diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index ce01bc0..1832763 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -19,8 +19,6 @@ public class DBContext : DbContext { public DbSet RoomItems { get; set; } = null!; public DbSet GameData { get; set; } = null!; public DbSet GameDataPairs { get; set; } = null!; - public DbSet DailyHighscores { get; set; } = null!; - public DbSet DailyHighscorePairs { get; set; } = null!; public DbSet AchievementPoints { get; set; } = null!; public DbSet ProfileAnswers { get; set; } = null!; public DbSet MMORoles { get; set; } = null!; @@ -131,9 +129,6 @@ public class DBContext : DbContext { builder.Entity().HasMany(v => v.GameData) .WithOne(e => e.Viking); - builder.Entity().HasMany(v => v.DailyHighscores) - .WithOne(e => e.Viking); - builder.Entity().HasMany(v => v.SavedData) .WithOne(e => e.Viking); @@ -227,15 +222,6 @@ public class DBContext : DbContext { builder.Entity().HasOne(e => e.GameData) .WithMany(e => e.GameDataPairs); - builder.Entity().HasOne(e => e.Viking) - .WithMany(e => e.DailyHighscores); - - builder.Entity().HasMany(e => e.ScorePairs) - .WithOne(e => e.DailyScore); - - builder.Entity().HasOne(e => e.DailyScore) - .WithMany(e => e.ScorePairs); - // Others .. builder.Entity().HasOne(s => s.Viking) .WithMany(e => e.Images) diff --git a/src/Model/DailyHighscore.cs b/src/Model/DailyHighscore.cs deleted file mode 100644 index 4d89c0f..0000000 --- a/src/Model/DailyHighscore.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace sodoff.Model; - -public class DailyHighscore { - [Key] - public int Id { get; set; } - public int VikingId { get; set; } - public int GameId { get; set; } - public int Difficulty { get; set; } - public int GameLevel { get; set; } - public bool IsMultiplayer { get; set; } - public virtual ICollection ScorePairs { get; set; } = null!; - public virtual Viking Viking { get; set; } = null!; -} diff --git a/src/Model/DailyHighscorePair.cs b/src/Model/DailyHighscorePair.cs deleted file mode 100644 index 6b312f3..0000000 --- a/src/Model/DailyHighscorePair.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace sodoff.Model; - -public class DailyHighscorePair { - [Key] - public int Id { get; set; } - public int DailyScoreId { get; set; } - public string Name { get; set; } = null!; - public int Value { get; set; } - public DateTime DatePlayed { get; set; } - public virtual DailyHighscore DailyScore { get; set; } = null!; -} diff --git a/src/Model/GameDataPair.cs b/src/Model/GameDataPair.cs index 9543936..7e029e5 100644 --- a/src/Model/GameDataPair.cs +++ b/src/Model/GameDataPair.cs @@ -7,5 +7,6 @@ public class GameDataPair { public int GameDataId { get; set; } public string Name { get; set; } = null!; public int Value { get; set; } + public int DailyValue { get; set; } public virtual GameData GameData { get; set; } = null!; } diff --git a/src/Model/Viking.cs b/src/Model/Viking.cs index cd19e70..a787107 100644 --- a/src/Model/Viking.cs +++ b/src/Model/Viking.cs @@ -34,7 +34,6 @@ public class Viking { public virtual ICollection PairData { get; set; } = null!; public virtual ICollection InventoryItems { get; set; } = null!; public virtual ICollection GameData { get; set; } = null!; - public virtual ICollection DailyHighscores { get; set; } = null!; public virtual ICollection ProfileAnswers { get; set; } = null!; public virtual ICollection SavedData { get; set; } = null!; public virtual ICollection Parties { get; set; } = null!; diff --git a/src/Services/GameDataService.cs b/src/Services/GameDataService.cs index b76216a..2faa29a 100644 --- a/src/Services/GameDataService.cs +++ b/src/Services/GameDataService.cs @@ -31,20 +31,9 @@ public class GameDataService { viking.GameData.Add(gameData); } - gameData.DatePlayed = DateTime.UtcNow; - DailyHighscore? daily = viking.DailyHighscores.FirstOrDefault(x => x.GameId == gameId && x.IsMultiplayer == isMultiplayer && x.Difficulty == difficulty && x.GameLevel == gameLevel); - if (daily == null) { - daily = new DailyHighscore { - GameId = gameId, - Difficulty = difficulty, - GameLevel = gameLevel, - IsMultiplayer = isMultiplayer, - ScorePairs = new List() - }; - viking.DailyHighscores.Add(daily); - } - SavePairs(gameData, daily, xmlDocumentData); + SavePairs(gameData, xmlDocumentData); + gameData.DatePlayed = DateTime.UtcNow; ctx.SaveChanges(); return true; @@ -85,9 +74,12 @@ public class GameDataService { } public GameDataSummary GetDailyGameData(Viking viking, int gameId, bool isMultiplayer, int difficulty, int gameLevel, string key, int count, bool AscendingOrder, bool buddyFilter, string apiKey) { - IQueryable query = ctx.DailyHighscores - .Where(x => x.GameId == gameId && x.IsMultiplayer == false && x.Difficulty == difficulty && x.GameLevel == gameLevel) - .SelectMany(e => e.ScorePairs).Where(x => x.DatePlayed == DateTime.Today && x.Name == key); + IQueryable query = ctx.GameData + .Where(x => + x.GameId == gameId && x.IsMultiplayer == false && + x.Difficulty == difficulty && x.GameLevel == gameLevel && + x.DatePlayed.Date == DateTime.UtcNow.Date + ).SelectMany(e => e.GameDataPairs).Where(x => x.Name == key); // TODO: Buddy filter @@ -98,11 +90,11 @@ public class GameDataService { if (ClientVersion.GetVersion(apiKey) <= ClientVersion.Max_OldJS) // use DisplayName instead of Name selectedData = query.Select(e => new GameDataResponse( - XmlUtil.DeserializeXml(e.DailyScore.Viking.AvatarSerialized).DisplayName, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + XmlUtil.DeserializeXml(e.GameData.Viking.AvatarSerialized).DisplayName, e.GameData.Viking.Uid, e.GameData.DatePlayed, false, false, e.DailyValue) ).Take(count).ToList(); else selectedData = query.Select(e => new GameDataResponse( - e.DailyScore.Viking.Name, e.DailyScore.Viking.Uid, e.DatePlayed, false, false, e.Value) + e.GameData.Viking.Name, e.GameData.Viking.Uid, e.GameData.DatePlayed, false, false, e.DailyValue) ).Take(count).ToList(); return GetSummaryFromResponse(viking, isMultiplayer, difficulty, gameLevel, key, selectedData); @@ -175,36 +167,23 @@ public class GameDataService { return gameData; } - private void SavePairs(Model.GameData gameData, DailyHighscore daily, string xmlDocumentData) { + private void SavePairs(Model.GameData gameData, string xmlDocumentData) { foreach (var pair in GetGameDataPairs(xmlDocumentData)) { GameDataPair? dbPair = gameData.GameDataPairs.FirstOrDefault(x => x.Name == pair.Name); - if (dbPair == null) - gameData.GameDataPairs.Add(pair); - else if (pair.Name == "time" && dbPair.Value > pair.Value) - dbPair.Value = pair.Value; - else if (pair.Name != "time" && dbPair.Value <= pair.Value) - dbPair.Value = pair.Value; - DailyHighscorePair? dailyPair = daily.ScorePairs.FirstOrDefault(x => x.Name == pair.Name); - if (dailyPair == null) { - daily.Difficulty = gameData.Difficulty; - daily.GameLevel = gameData.GameLevel; - dailyPair = new DailyHighscorePair { - Name = pair.Name, - Value = pair.Value, - DatePlayed = DateTime.Today - }; - daily.ScorePairs.Add(dailyPair); - } else if ( - (pair.Name == "time" && dailyPair.Value > pair.Value) || // Better Time - (pair.Name != "time" && dailyPair.Value <= pair.Value) || // Better Score - dailyPair.DatePlayed != DateTime.Today // Another Day - ) { - daily.Difficulty = gameData.Difficulty; - daily.GameLevel = gameData.GameLevel; - dailyPair.DatePlayed = DateTime.Today; - dailyPair.Value = pair.Value; - } + // If Name == "time" then (existing <= incoming) needs to be false (effectively (existing > incoming), as time should function). + // if Name is anything else, then second condition as normal. + bool newBest = (dbPair == null) || ((pair.Name == "time") != (dbPair.Value <= pair.Value)); + + if (dbPair == null) { + gameData.GameDataPairs.Add(pair); + dbPair = pair; + } else if (newBest) dbPair.Value = pair.Value; + + if ( + newBest || // Surpassed Score (or Unset) + gameData.DatePlayed.Date != DateTime.UtcNow.Date // Another Day + ) dbPair.DailyValue = pair.Value; } } From 00d4aa146a576e90f2c50c9d11156a55034231ad Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Sun, 22 Jun 2025 14:44:47 +0000 Subject: [PATCH 3/3] ClientVersion.GetGameID to get internal game id (without version / sub-app info) --- src/Controllers/Common/AchievementController.cs | 6 +++--- src/Controllers/Common/ContentController.cs | 9 ++++----- src/Controllers/Common/ItemStoreController.cs | 6 +++--- src/Services/AchievementStoreSingleton.cs | 12 ++---------- src/Util/ClientVersion.cs | 11 +++++++++++ 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Controllers/Common/AchievementController.cs b/src/Controllers/Common/AchievementController.cs index 5bc48dc..b7ccab7 100644 --- a/src/Controllers/Common/AchievementController.cs +++ b/src/Controllers/Common/AchievementController.cs @@ -43,10 +43,10 @@ public class AchievementController : Controller { //[Produces("application/xml")] [Route("AchievementWebService.asmx/GetAllRanks")] public IActionResult GetAllRanks([FromForm] string apiKey) { - uint gameVersion = ClientVersion.GetVersion(apiKey); - if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0) + uint gameID = ClientVersion.GetGameID(apiKey); + if (gameID == ClientVersion.WoJS) return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_wojs")); - if (gameVersion == ClientVersion.MB) + if (gameID == ClientVersion.MB) return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_mb")); return Ok(XmlUtil.ReadResourceXmlString("ranks.allranks_sod")); } diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 52dea2b..49e0f18 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -529,8 +529,7 @@ public class ContentController : Controller { raisedPetData.PetTypeID = petTypeID; raisedPetData.RaisedPetID = 0; // Initially make zero, so the db auto-fills raisedPetData.EntityID = Guid.Parse(dragonId); - uint gameVersion = ClientVersion.GetVersion(apiKey); - if (gameVersion > ClientVersion.Max_OldJS || (gameVersion & ClientVersion.WoJS) == 0) + if (ClientVersion.GetGameID(apiKey) != ClientVersion.WoJS) raisedPetData.Name = string.Concat("Dragon-", dragonId.AsSpan(0, 8)); // Start off with a random name (if game isn't WoJS) raisedPetData.IsSelected = false; // The api returns false, not sure why raisedPetData.CreateDate = new DateTime(DateTime.Now.Ticks); @@ -1428,14 +1427,14 @@ public class ContentController : Controller { } } - uint gameVersion = ClientVersion.GetVersion(apiKey); + uint gameID = ClientVersion.GetGameID(apiKey); // Send only JumpStart parties to JumpStart - if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0 + if (gameID == ClientVersion.WoJS && (party.Location == "MyNeighborhood" || party.Location == "MyVIPRoomInt")) { userParties.Add(userParty); // Send only Math Blaster parties to Math Blaster - } else if (gameVersion == ClientVersion.MB + } else if (gameID == ClientVersion.MB && party.Location == "MyPodInt") { userParties.Add(userParty); } diff --git a/src/Controllers/Common/ItemStoreController.cs b/src/Controllers/Common/ItemStoreController.cs index f7bb205..dc7e0c5 100644 --- a/src/Controllers/Common/ItemStoreController.cs +++ b/src/Controllers/Common/ItemStoreController.cs @@ -77,10 +77,10 @@ public class ItemStoreController : Controller { public IActionResult GetAnnouncements([FromForm] string apiKey, [FromForm] int worldObjectID) { // TODO: This is a placeholder, although this endpoint seems to be only used to send announcements to the user (such as the server shutdown), so this might be sufficient. - uint gameVersion = ClientVersion.GetVersion(apiKey); - if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0) { + uint gameID = ClientVersion.GetGameID(apiKey); + if (gameID == ClientVersion.WoJS) { return Ok(XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("announcements_wojs"))); - } else if (gameVersion == ClientVersion.SS && worldObjectID == 6) { + } else if (gameID == ClientVersion.SS && worldObjectID == 6) { return Ok(XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("announcements_ss"))); } diff --git a/src/Services/AchievementStoreSingleton.cs b/src/Services/AchievementStoreSingleton.cs index 17a02f1..d3a56e3 100644 --- a/src/Services/AchievementStoreSingleton.cs +++ b/src/Services/AchievementStoreSingleton.cs @@ -73,14 +73,14 @@ namespace sodoff.Services { } public ReadOnlyDictionary GetAchievementsGroupIdToTaskId(uint gameVersion) { - gameVersion = GameVersionForTasks(gameVersion); + gameVersion = ClientVersion.GetGameID(gameVersion); if (achievementsTasks.ContainsKey(gameVersion)) return achievementsTasks[gameVersion].achievementsGroupIdToTaskId; return new ReadOnlyDictionary(new Dictionary()); } public List? GetAllAchievementTaskInfo(int taskID, uint gameVersion) { - gameVersion = GameVersionForTasks(gameVersion); + gameVersion = ClientVersion.GetGameID(gameVersion); if (achievementsTasks.ContainsKey(gameVersion) && achievementsTasks[gameVersion].achievementsRewardByTask.ContainsKey(taskID)) { return achievementsTasks[gameVersion].achievementsRewardByTask[taskID]; } @@ -121,13 +121,5 @@ namespace sodoff.Services { } return dragonXP; } - - private uint GameVersionForTasks(uint gameVersion) { - // all SoD version of SoD using the same Tasks database - if ((gameVersion & ClientVersion.Min_SoD) == 0xa0000000) return ClientVersion.Min_SoD; - // all version of WoJS (including lands) using the same Tasks database - if (gameVersion <= ClientVersion.Max_OldJS && (gameVersion & ClientVersion.WoJS) != 0) return ClientVersion.WoJS; - return gameVersion; - } } } diff --git a/src/Util/ClientVersion.cs b/src/Util/ClientVersion.cs index d1f0702..1fbb25f 100644 --- a/src/Util/ClientVersion.cs +++ b/src/Util/ClientVersion.cs @@ -13,6 +13,17 @@ public class ClientVersion { public const uint WoJS_StoryLand = 0x01000400; // World of JumpStart -- Storyland public const uint WoJS_NewAvatar = 0x01010000; // World of JumpStart with new avatars (e.g. 1.21) + public static uint GetGameID(uint gameVersion) { + if (gameVersion > ClientVersion.Max_OldJS) + return gameVersion & 0xf0000000; + else + return gameVersion & 0x0f000000; + } + + public static uint GetGameID(string apiKey) { + return GetGameID(GetVersion(apiKey)); + } + public static uint GetVersion(string apiKey) { if ( apiKey == "b99f695c-7c6e-4e9b-b0f7-22034d799013" || // PC / Windows