separate Achievement ID for different games

needed for MaM Fish Trap
This commit is contained in:
Robert Paciorek 2025-08-20 09:49:18 +00:00
parent 693a73a71e
commit 80a1c24dd7
7 changed files with 186 additions and 16 deletions

View File

@ -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<Guid[]>(petIDs);
var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID, petGuids);
var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID, ClientVersion.GetGameID(apiKey), petGuids);
ctx.SaveChanges();
return Ok(rewards);

View File

@ -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>(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]

View File

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAchievementsIdInfo>
<!-- fish trap rewards (probability of each 10%), do not correspond to the original ones, max 3 reward's item per achievements due to client limitation -->
<AchievementsIdInfo>
<AID>201388</AID>
<AR>
<p>6</p>
<a>3</a>
<t>1</t>
<r>8</r>
<ii>11766</ii><!-- Perch -->
</AR>
<AR>
<p>6</p>
<a>2</a>
<t>1</t>
<r>8</r>
<ii>11162</ii><!-- Brown Trout -->
</AR>
<AR>
<p>6</p>
<a>1</a>
<t>1</t>
<r>8</r>
<ii>11767</ii><!-- Salmon -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201389</AID>
<AR>
<p>6</p>
<a>4</a>
<t>1</t>
<r>8</r>
<ii>11766</ii><!-- Perch -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201390</AID>
<AR>
<p>6</p>
<a>2</a>
<t>1</t>
<r>8</r>
<ii>11766</ii><!-- Perch -->
</AR>
<AR>
<p>6</p>
<a>1</a>
<t>1</t>
<r>8</r>
<ii>11162</ii><!-- Brown Trout -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201391</AID>
<AR>
<p>6</p>
<a>3</a>
<t>1</t>
<r>8</r>
<ii>11768</ii><!-- Eel -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201392</AID>
<AR>
<p>6</p>
<a>1</a>
<t>1</t>
<r>8</r>
<ii>11768</ii><!-- Eel -->
</AR>
<AR>
<p>6</p>
<a>3</a>
<t>1</t>
<r>8</r>
<ii>11767</ii><!-- Salmon -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201393</AID>
<AR>
<p>6</p>
<a>5</a>
<t>1</t>
<r>8</r>
<ii>11766</ii><!-- Perch -->
</AR>
<AR>
<p>6</p>
<a>1</a>
<t>1</t>
<r>8</r>
<ii>11768</ii><!-- Eel -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201394</AID>
<AR>
<p>6</p>
<a>1</a>
<t>1</t>
<r>8</r>
<ii>11766</ii><!-- Perch -->
</AR>
<AR>
<p>6</p>
<a>2</a>
<t>1</t>
<r>8</r>
<ii>11162</ii><!-- Brown Trout -->
</AR>
<AR>
<p>6</p>
<a>2</a>
<t>1</t>
<r>8</r>
<ii>11767</ii><!-- Salmon -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201395</AID>
<AR>
<p>6</p>
<a>5</a>
<t>1</t>
<r>8</r>
<ii>11162</ii><!-- Brown Trout -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201396</AID>
<AR>
<p>6</p>
<a>5</a>
<t>1</t>
<r>8</r>
<ii>11767</ii><!-- Salmon -->
</AR>
</AchievementsIdInfo>
<AchievementsIdInfo>
<AID>201397</AID>
<AR>
<p>6</p>
<a>3</a>
<t>1</t>
<r>8</r>
<ii>11162</ii><!-- Brown Trout -->
</AR>
<AR>
<p>6</p>
<a>2</a>
<t>1</t>
<r>8</r>
<ii>11767</ii><!-- Salmon -->
</AR>
</AchievementsIdInfo>
</ArrayOfAchievementsIdInfo>

View File

@ -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 {

View File

@ -29,7 +29,7 @@ namespace sodoff.Services {
}
Dictionary<AchievementPointTypes, UserRank[]> ranks = new();
Dictionary<int, AchievementReward[]> achievementsRewardByID = new();
Dictionary<uint, Dictionary<int, AchievementReward[]>> achievementsRewardByID = new();
Dictionary<int, List<AchievementTaskInfo>> achievementsRewardByTask = new();
Dictionary<uint, AchievementTasks> 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<AchievementsIdInfo[]>(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<AchievementsIdInfo[]>(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;
}
}

View File

@ -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

View File

@ -68,6 +68,9 @@
<EmbeddedResource Include="Resources\achievements\achievementid_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementid_mam.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="Resources\achievements\achievementtaskinfo_sod.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>