From 80a1c24dd70def1a7a9c0cd25168ecc018abc4a2 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Wed, 20 Aug 2025 09:49:18 +0000 Subject: [PATCH] separate Achievement ID for different games needed for MaM Fish Trap --- .../Common/AchievementController.cs | 8 +- src/Controllers/Common/ContentController.cs | 4 +- .../achievements/achievementid_mam.xml | 160 ++++++++++++++++++ src/Services/AchievementService.cs | 4 +- src/Services/AchievementStoreSingleton.cs | 19 ++- src/Services/RoomService.cs | 4 +- src/sodoff.csproj | 3 + 7 files changed, 186 insertions(+), 16 deletions(-) create mode 100644 src/Resources/achievements/achievementid_mam.xml diff --git a/src/Controllers/Common/AchievementController.cs b/src/Controllers/Common/AchievementController.cs index b7ccab7..1b340d9 100644 --- a/src/Controllers/Common/AchievementController.cs +++ b/src/Controllers/Common/AchievementController.cs @@ -168,8 +168,8 @@ public class AchievementController : Controller { [Route("AchievementWebService.asmx/SetAchievementAndGetReward")] [Route("AchievementWebService.asmx/SetUserAchievementAndGetReward")] [VikingSession(UseLock=true)] - public IActionResult SetAchievementAndGetReward(Viking viking, [FromForm] int achievementID) { - var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID); + public IActionResult SetAchievementAndGetReward(Viking viking, [FromForm] int achievementID, [FromForm] string apiKey) { + var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID, ClientVersion.GetGameID(apiKey)); ctx.SaveChanges(); return Ok(rewards); @@ -247,10 +247,10 @@ public class AchievementController : Controller { [Produces("application/xml")] [Route("AchievementWebService.asmx/SetAchievementByEntityIDs")] [VikingSession(UseLock=true)] - public IActionResult SetAchievementByEntityIDs(Viking viking, [FromForm] int achievementID, [FromForm] string petIDs) { + public IActionResult SetAchievementByEntityIDs(Viking viking, [FromForm] int achievementID, [FromForm] string petIDs, [FromForm] string apiKey) { Guid[] petGuids = XmlUtil.DeserializeXml(petIDs); - var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID, petGuids); + var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID, ClientVersion.GetGameID(apiKey), petGuids); ctx.SaveChanges(); return Ok(rewards); diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 8935881..0c669bd 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -1594,7 +1594,7 @@ public class ContentController : Controller { [Produces("application/xml")] [Route("ContentWebService.asmx/SetNextItemState")] [VikingSession] - public IActionResult SetNextItemState(Viking viking, [FromForm] string setNextItemStateRequest) { + public IActionResult SetNextItemState(Viking viking, [FromForm] string setNextItemStateRequest, [FromForm] string apiKey) { SetNextItemStateRequest request = XmlUtil.DeserializeXml(setNextItemStateRequest); RoomItem? item = ctx.RoomItems.FirstOrDefault(x => x.Id == request.UserItemPositionID); if (item is null) @@ -1604,7 +1604,7 @@ public class ContentController : Controller { return Unauthorized("Can't set state not owned item"); // NOTE: The game sets OverrideStateCriteria only if a speedup is used - return Ok(roomService.NextItemState(item, request.OverrideStateCriteria)); + return Ok(roomService.NextItemState(item, request.OverrideStateCriteria, ClientVersion.GetGameID(apiKey))); } [HttpPost] diff --git a/src/Resources/achievements/achievementid_mam.xml b/src/Resources/achievements/achievementid_mam.xml new file mode 100644 index 0000000..adc9c7f --- /dev/null +++ b/src/Resources/achievements/achievementid_mam.xml @@ -0,0 +1,160 @@ + + + + + 201388 + +

6

+ 3 + 1 + 8 + 11766 +
+ +

6

+ 2 + 1 + 8 + 11162 +
+ +

6

+ 1 + 1 + 8 + 11767 +
+
+ + 201389 + +

6

+ 4 + 1 + 8 + 11766 +
+
+ + 201390 + +

6

+ 2 + 1 + 8 + 11766 +
+ +

6

+ 1 + 1 + 8 + 11162 +
+
+ + 201391 + +

6

+ 3 + 1 + 8 + 11768 +
+
+ + 201392 + +

6

+ 1 + 1 + 8 + 11768 +
+ +

6

+ 3 + 1 + 8 + 11767 +
+
+ + 201393 + +

6

+ 5 + 1 + 8 + 11766 +
+ +

6

+ 1 + 1 + 8 + 11768 +
+
+ + 201394 + +

6

+ 1 + 1 + 8 + 11766 +
+ +

6

+ 2 + 1 + 8 + 11162 +
+ +

6

+ 2 + 1 + 8 + 11767 +
+
+ + 201395 + +

6

+ 5 + 1 + 8 + 11162 +
+
+ + 201396 + +

6

+ 5 + 1 + 8 + 11767 +
+
+ + 201397 + +

6

+ 3 + 1 + 8 + 11162 +
+ +

6

+ 2 + 1 + 8 + 11767 +
+
+
diff --git a/src/Services/AchievementService.cs b/src/Services/AchievementService.cs index 219887f..d31f31f 100644 --- a/src/Services/AchievementService.cs +++ b/src/Services/AchievementService.cs @@ -145,8 +145,8 @@ namespace sodoff.Services { return grantedRewards.ToArray(); } - public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID, Guid[]? dragonsIDs = null) { - var rewards = achievementStore.GetAchievementRewardsById(achievementID); + public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID, uint gameVersion, Guid[]? dragonsIDs = null) { + var rewards = achievementStore.GetAchievementRewardsById(achievementID, gameVersion); if (rewards != null) { return ApplyAchievementRewards(viking, rewards, dragonsIDs); } else { diff --git a/src/Services/AchievementStoreSingleton.cs b/src/Services/AchievementStoreSingleton.cs index d3a56e3..7864ebb 100644 --- a/src/Services/AchievementStoreSingleton.cs +++ b/src/Services/AchievementStoreSingleton.cs @@ -29,7 +29,7 @@ namespace sodoff.Services { } Dictionary ranks = new(); - Dictionary achievementsRewardByID = new(); + Dictionary> achievementsRewardByID = new(); Dictionary> achievementsRewardByTask = new(); Dictionary achievementsTasks = new(); @@ -42,9 +42,16 @@ namespace sodoff.Services { ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray(); } + achievementsRewardByID[ClientVersion.Min_SoD] = new(); AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("achievements.achievementid_sod")); foreach (var achievementsIdInfo in allAchievementsIdInfo) { - achievementsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward; + achievementsRewardByID[ClientVersion.Min_SoD][achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward; + } + + achievementsRewardByID[ClientVersion.MaM] = new(); + allAchievementsIdInfo = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("achievements.achievementid_mam")); + foreach (var achievementsIdInfo in allAchievementsIdInfo) { + achievementsRewardByID[ClientVersion.MaM][achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward; } achievementsTasks[ClientVersion.Min_SoD] = new AchievementTasks("achievements.achievementtaskinfo_sod"); @@ -64,10 +71,10 @@ namespace sodoff.Services { return ranks[type].Count(r => r.Value <= xpPoints); } - public AchievementReward[]? GetAchievementRewardsById(int achievementID) { - if (achievementsRewardByID.ContainsKey(achievementID)) { - return achievementsRewardByID[achievementID]; - } else { + public AchievementReward[]? GetAchievementRewardsById(int achievementID, uint gameVersion) { + try { + return achievementsRewardByID[gameVersion][achievementID]; + } catch(System.Collections.Generic.KeyNotFoundException) { return null; } } diff --git a/src/Services/RoomService.cs b/src/Services/RoomService.cs index ab6d505..315bc5f 100644 --- a/src/Services/RoomService.cs +++ b/src/Services/RoomService.cs @@ -127,7 +127,7 @@ public class RoomService { return new UserItemPositionList { UserItemPosition = itemPosition.ToArray() }; } - public SetNextItemStateResult NextItemState(RoomItem item, bool speedup) { + public SetNextItemStateResult NextItemState(RoomItem item, bool speedup, uint gameVersion) { SetNextItemStateResult response = new SetNextItemStateResult { Success = true, ErrorCode = ItemStateChangeError.Success @@ -153,7 +153,7 @@ public class RoomService { response.Rewards = achievementService.ApplyAchievementRewards(item.Room.Viking, rewards); } if (achievementID != null) { - var newrewards = achievementService.ApplyAchievementRewardsByID(item.Room.Viking, (int)achievementID); + var newrewards = achievementService.ApplyAchievementRewardsByID(item.Room.Viking, (int)achievementID, gameVersion); if (response.Rewards is null) response.Rewards = newrewards; else diff --git a/src/sodoff.csproj b/src/sodoff.csproj index 4e30ed9..19d9505 100644 --- a/src/sodoff.csproj +++ b/src/sodoff.csproj @@ -68,6 +68,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest