diff --git a/README.md b/README.md index 6f29bc3..4f466c0 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,9 @@ Then run School of Dragons. - UseInventory - DeleteProfile - DeleteAccountNotification +- SetAchievementAndGetReward +- GetAchievementsByUserID +- GetPetAchievementsByUserID #### Implemented enough (probably) - GetRules (doesn't return any rules, probably doesn't need to) @@ -85,6 +88,7 @@ Then run School of Dragons. - GetCommonInventory - GetUserRoomItemPositions - SetUserRoomItemPositions +- SetUserAchievementAndGetReward (works like SetAchievementAndGetReward) #### Partially implemented - GetUserProfileByUserID (a lot is still placeholder) @@ -96,10 +100,10 @@ Then run School of Dragons. - GetUserRoomList (room categories are not implemented) - SetNextItemState (may require more work, we don't know yet) - SetUserRoom +- SetUserAchievementTask (returns a real reward but still use task placeholder) #### Currently static or stubbed - GetAllRanks (needs to be populated with what ranks the user has) -- GetPetAchievementsByUserId (always returns null) - GetAchievementTaskInfo (returns a static XML) - GetAllRewardTypeMultiplier (returns a static XML) - GetBuddyList (returns an emtpy array) @@ -109,9 +113,6 @@ Then run School of Dragons. - SaveMessage (doesn't do anything and returns false) - GetMMOServerInfoWithZone (returns an empty array) - GetActiveChallenges (returns an empty array) -- GetAchievementsByUserID (returns an achievement with the provided user ID) -- SetAchievementAndGetReward (returns 5 gems) -- SetUserAchievementTask (returns a placeholder achievement) - GetAnnouncementsByUser (returns no announcements, but that might be sufficient) - GetAverageRatingForRoom (return max rating) - GetUserActivityByUserID (returns an empty array) diff --git a/src/Controllers/Common/AchievementController.cs b/src/Controllers/Common/AchievementController.cs index 41c8683..636bd43 100644 --- a/src/Controllers/Common/AchievementController.cs +++ b/src/Controllers/Common/AchievementController.cs @@ -115,8 +115,9 @@ public class AchievementController : Controller { return Ok(new ArrayOfUserAchievementInfo { UserAchievementInfo = new UserAchievementInfo[]{ achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP), - achievementService.CreateUserAchievementInfo(viking.Id, 60000, AchievementPointTypes.PlayerFarmingXP), // TODO: placeholder until there is no leveling for farm XP - achievementService.CreateUserAchievementInfo(viking.Id, 20000, AchievementPointTypes.PlayerFishingXP), // TODO: placeholder until there is no leveling for fishing XP + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFarmingXP), + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFishingXP), + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.UDTPoints), } }); } @@ -136,45 +137,51 @@ public class AchievementController : Controller { [HttpPost] [Produces("application/xml")] [Route("AchievementWebService.asmx/SetAchievementAndGetReward")] + [Route("AchievementWebService.asmx/SetUserAchievementAndGetReward")] public IActionResult SetAchievementAndGetReward([FromForm] string apiToken, [FromForm] int achievementID) { - // TODO: This is a placeholder; returns 5 gems Viking? viking = ctx.Sessions.FirstOrDefault(x => x.ApiToken == apiToken).Viking; - return Ok(new AchievementReward[1] { - new AchievementReward { - Amount = 5, - PointTypeID = AchievementPointTypes.CashCurrency, - EntityID = Guid.Parse(viking.Id), - EntityTypeID = 1, - RewardID = 552 - } - }); + + if (viking is null) { + return Unauthorized(); + } + + var rewards = achievementService.ApplyAchievementRewardsByID(viking, achievementID); + ctx.SaveChanges(); + + return Ok(rewards); } [HttpPost] [Produces("application/xml")] [Route("V2/AchievementWebService.asmx/SetUserAchievementTask")] [DecryptRequest("achievementTaskSetRequest")] - public IActionResult SetUserAchievementTask([FromForm] string apiToken, [FromForm] int achievementID) { - // TODO: This is a placeholder - string xml = Request.Form["achievementTaskSetRequest"]; - AchievementTaskSetResponse response = new AchievementTaskSetResponse { - Success = true, - UserMessage = true, - AchievementName = "Placeholder Achievement", - Level = 1, - AchievementTaskGroupID = 1279, - LastLevelCompleted = true, - AchievementInfoID = 1279, - AchievementRewards = new AchievementReward[1] { - new AchievementReward { - Amount = 25, - PointTypeID = AchievementPointTypes.PlayerXP, - RewardID = 910, - EntityTypeID =1 + public IActionResult SetUserAchievementTask([FromForm] string apiToken) { + Viking? viking = ctx.Sessions.FirstOrDefault(x => x.ApiToken == apiToken).Viking; + + if (viking is null) { + return Unauthorized(); + } + + AchievementTaskSetRequest request = XmlUtil.DeserializeXml(Request.Form["achievementTaskSetRequest"]); + + var response = new List(); + foreach (var task in request.AchievementTaskSet) { + response.Add( + new AchievementTaskSetResponse { + Success = true, + UserMessage = true, // TODO: placeholder + AchievementName = "Placeholder Achievement", // TODO: placeholder + Level = 1, // TODO: placeholder + AchievementTaskGroupID = 1279, // TODO: placeholder + LastLevelCompleted = true, // TODO: placeholder + AchievementInfoID = 1279, // TODO: placeholder + AchievementRewards = achievementService.ApplyAchievementRewardsByTask(viking, task) } - } - }; - return Ok(new ArrayOfAchievementTaskSetResponse { AchievementTaskSetResponse = new AchievementTaskSetResponse[1] { response } }); + ); + } + ctx.SaveChanges(); + + return Ok(new ArrayOfAchievementTaskSetResponse { AchievementTaskSetResponse = response.ToArray() }); } [HttpPost] diff --git a/src/Controllers/Common/ProfileController.cs b/src/Controllers/Common/ProfileController.cs index 024f5c4..00148cd 100644 --- a/src/Controllers/Common/ProfileController.cs +++ b/src/Controllers/Common/ProfileController.cs @@ -145,8 +145,9 @@ public class ProfileController : Controller { AchievementInfo = null, // placeholder Achievements = new UserAchievementInfo[] { achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerXP), - achievementService.CreateUserAchievementInfo(viking.Id, 60000, AchievementPointTypes.PlayerFarmingXP), // TODO: placeholder until there is no leveling for farm XP - achievementService.CreateUserAchievementInfo(viking.Id, 20000, AchievementPointTypes.PlayerFishingXP), // TODO: placeholder until there is no leveling for fishing XP + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFarmingXP), + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.PlayerFishingXP), + achievementService.CreateUserAchievementInfo(viking, AchievementPointTypes.UDTPoints), } }; diff --git a/src/Resources/achievementsids.xml b/src/Resources/achievementsids.xml new file mode 100644 index 0000000..a80f052 --- /dev/null +++ b/src/Resources/achievementsids.xml @@ -0,0 +1,1536 @@ + + + + 201194 + +

6

+ 1 + 1 + 1417 + 9633 +
+
+ + 201195 + + +

5

+ 5 + 1 + 552 + 0 +
+
+ + 201196 + +

5

+ 15 + 1 + 1420 + 0 +
+
+ + 201197 + +

6

+ 1 + 1 + 1419 + 9635 +
+
+ + 201198 + +

5

+ 30 + 1 + 1610 + 0 +
+
+ + 201323 + +

2

+ 25 + 1 + 21 + 0 +
+ +

1

+ 50 + 1 + 32 + 0 +
+ +

12

+ 100 + 1 + 913 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 200 + 3 + 611 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 201323 + +

2

+ 25 + 1 + 21 + 0 +
+ +

1

+ 50 + 1 + 32 + 0 +
+ +

12

+ 100 + 1 + 913 + 0 +
+ +

8

+ 200 + 3 + 611 + 0 +
+
+ + 201387 + + +

12

+ 2000 + 1 + 983 + 0 +
+
+ + 201688 + +

6

+ 1 + 1 + 1138 + 8901 +
+
+ + 201690 + +

6

+ 1 + 1 + 1140 + 8903 +
+
+ + 201702 + +

8

+ 20 + 3 + 595 + 0 +
+
+ + 201703 + +

8

+ 48 + 3 + 1217 + 0 +
+
+ + 201704 + +

8

+ 48 + 3 + 1217 + 0 +
+
+ + 201705 + +

8

+ 32 + 3 + 594 + 0 +
+
+ + 201706 + +

8

+ 60 + 3 + 597 + 0 +
+
+ + 201707 + +

8

+ 16 + 3 + 1213 + 0 +
+
+ + 201713 + + +

8

+ 100 + 3 + 659 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 201714 + +

12

+ 1000 + 1 + 1216 + 0 +
+
+ + 201715 + +

12

+ 1000 + 1 + 1216 + 0 +
+
+ + 201993 + +

8

+ 30 + 3 + 597 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 202330 + +

6

+ 1 + 1 + 1367 + 9550 +
+
+ + 202331 + +

6

+ 1 + 1 + 1368 + 9551 +
+
+ + 202332 + +

6

+ 1 + 1 + 1369 + 9552 +
+
+ + 202333 + +

6

+ 1 + 1 + 1370 + 9553 +
+
+ + 202334 + +

6

+ 1 + 1 + 1371 + 9554 +
+
+ + 202335 + +

6

+ 1 + 1 + 1372 + 9555 +
+
+ + 202718 + +

6

+ 1 + 1 + 1699 + 10931 +
+
+ + 202944 + +

12

+ 500 + 1 + 7678 + 0 +
+ +

6

+ 1 + 1 + 2193 + 11921 +
+ +

8

+ 500 + 3 + 651 + 0 +
+
+ + 202945 + +

12

+ 300 + 1 + 2517 + 0 +
+ +

6

+ 1 + 1 + 2194 + 11915 +
+
+ + 202946 + +

12

+ 150 + 1 + 2518 + 0 +
+ +

6

+ 1 + 1 + 2195 + 11922 +
+ +

8

+ 200 + 3 + 611 + 0 +
+
+ + 203017 + +

21

+ 1 + 2 + 2196 + 0 +
+
+ + 203274 + +

6

+ 1 + 1 + 2251 + 12124 +
+
+ + 203529 + +

12

+ 750 + 1 + 7683 + 0 +
+ +

6

+ 1 + 1 + 2193 + 11921 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 750 + 3 + 7682 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 203530 + +

12

+ 500 + 1 + 7678 + 0 +
+ +

6

+ 1 + 1 + 2194 + 11915 +
+ +

8

+ 500 + 3 + 651 + 0 +
+
+ + 203531 + +

12

+ 150 + 1 + 2518 + 0 +
+ +

6

+ 1 + 1 + 2195 + 11922 +
+ +

8

+ 150 + 3 + 610 + 0 +
+
+ + 204499 + +

2

+ 90 + 1 + 525 + 0 +
+ +

12

+ 100 + 1 + 913 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 120 + 3 + 1279 + 0 +
+ +

8

+ 120 + 3 + 1279 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204501 + +

2

+ 110 + 1 + 526 + 0 +
+ +

12

+ 100 + 1 + 913 + 0 +
+ +

8

+ 432 + 3 + 2486 + 0 +
+
+ + 204508 + +

2

+ 130 + 1 + 527 + 0 +
+ +

12

+ 100 + 1 + 913 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 126 + 3 + 5173 + 0 +
+ +

8

+ 126 + 3 + 5173 + 0 +
+ +

8

+ 126 + 3 + 5173 + 0 +
+ +

8

+ 126 + 3 + 5173 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204525 + +

12

+ 200 + 1 + 1157 + 0 +
+ +

2

+ 147 + 1 + 2456 + 0 +
+ +

8

+ 784 + 3 + 5151 + 0 +
+
+ + 204561 + +

12

+ 300 + 1 + 2517 + 0 +
+ +

2

+ 920 + 1 + 5159 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 2880 + 3 + 5160 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204576 + +

2

+ 11 + 1 + 661 + 0 +
+ +

12

+ 10 + 1 + 919 + 0 +
+ +

8

+ 44 + 3 + 1267 + 0 +
+ +

8

+ 44 + 3 + 1267 + 0 +
+
+ + 204591 + +

12

+ 30 + 1 + 937 + 0 +
+ +

2

+ 46 + 1 + 5170 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 144 + 3 + 1321 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204630 + +

12

+ 300 + 1 + 2517 + 0 +
+ +

6

+ 1 + 1 + 7765 + 18354 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 4320 + 3 + 5162 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204662 + +

12

+ 300 + 1 + 2517 + 0 +
+ +

6

+ 5 + 1 + 5264 + 12826 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 1260 + 3 + 5263 + 0 +
+ +

8

+ 1260 + 3 + 5263 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 204686 + +

6

+ 1 + 1 + 5292 + 12947 +
+
+ + 204749 + +

6

+ 1 + 1 + 5354 + 13033 +
+
+ + 204805 + +

8

+ 9000 + 3 + 5385 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 205500 + +

6

+ 1 + 1 + 5748 + 15787 +
+
+ + 205932 + +

12

+ 100 + 1 + 913 + 0 +
+ +

2

+ 108 + 1 + 5149 + 0 +
+ +

6

+ 5 + 1 + 10218 + 20410 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 205998 + +

6

+ 1 + 1 + 6163 + 16777 +
+
+ + 206204 + +

2

+ 110 + 1 + 526 + 0 +
+ +

12

+ 200 + 1 + 1157 + 0 +
+ +

6

+ 5 + 1 + 10673 + 20778 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+ +

8

+ 108 + 3 + 1278 + 0 +
+
+ + 206209 + +

2

+ 360 + 1 + 531 + 0 +
+ +

12

+ 200 + 1 + 1157 + 0 +
+ +

6

+ 27 + 1 + 10677 + 20778 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 720 + 3 + 2504 + 0 +
+ +

8

+ 720 + 3 + 2504 + 0 +
+ +

8

+ 720 + 3 + 2504 + 0 +
+ +

8

+ 720 + 3 + 2504 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 206214 + +

12

+ 200 + 1 + 1157 + 0 +
+ +

2

+ 486 + 1 + 7726 + 0 +
+ +

6

+ 40 + 1 + 10681 + 20778 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 486 + 3 + 5217 + 0 +
+ +

8

+ 486 + 3 + 5217 + 0 +
+ +

8

+ 486 + 3 + 5217 + 0 +
+ +

8

+ 486 + 3 + 5217 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 206215 + +

12

+ 20 + 1 + 920 + 0 +
+ +

2

+ 32 + 1 + 2512 + 0 +
+ +

8

+ 130 + 3 + 5643 + 0 +
+ +

8

+ 130 + 3 + 5643 + 0 +
+
+ + 206220 + +

12

+ 30 + 1 + 937 + 0 +
+ +

2

+ 61 + 1 + 1866 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

12

+ 10 + 1 + 920 + 0 +
+ +

8

+ 192 + 3 + 1326 + 0 +
+ +

8

+ 192 + 3 + 1326 + 0 +
+ +

8

+ 192 + 3 + 1326 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+ +

12

+ 10 + 3 + 920 + 0 +
+
+ + 207949 + +

6

+ 1 + 1 + 10870 + 10995 +
+ +

6

+ 1 + 1 + 10871 + 11862 +
+ +

6

+ 1 + 1 + 10872 + 12437 +
+ +

6

+ 1 + 1 + 10873 + 13026 +
+ +

6

+ 1 + 1 + 10874 + 13205 +
+ +

6

+ 1 + 1 + 10875 + 13403 +
+ +

6

+ 1 + 1 + 10876 + 13625 +
+ +

6

+ 1 + 1 + 10877 + 15871 +
+ +

6

+ 1 + 1 + 10878 + 16623 +
+ +

6

+ 1 + 1 + 10879 + 19119 +
+
+ + 207950 + +

6

+ 3 + 1 + 10883 + 10996 +
+ +

6

+ 1 + 1 + 10896 + 17888 +
+ +

6

+ 1 + 1 + 10895 + 17889 +
+ +

6

+ 1 + 1 + 10894 + 17890 +
+
+ + 207951 + +

6

+ 1 + 1 + 10884 + 8967 +
+
+ + 207952 + +

6

+ 1 + 1 + 10888 + 10996 +
+ +

6

+ 2 + 1 + 10886 + 20887 +
+ +

6

+ 2 + 1 + 10887 + 20888 +
+
+ + 207953 + +

6

+ 1 + 1 + 10891 + 13322 +
+ +

6

+ 1 + 1 + 10889 + 20885 +
+
+ + 207954 + +

5

+ 7500 + 1 + 10892 + 0 +
+
+ + 207955 + +

6

+ 1 + 1 + 10893 + 15873 +
+
+
diff --git a/src/Resources/achievementstasks.xml b/src/Resources/achievementstasks.xml new file mode 100644 index 0000000..73d0886 --- /dev/null +++ b/src/Resources/achievementstasks.xml @@ -0,0 +1,1032 @@ + + + + 155 + + 30 +

2

+ 1 + 30 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 50 +

1

+ 1 + 32 + 0 +
+ + 100 +

8

+ 1 + 609 + 0 +
+
+ + 157 + + 70 +

2

+ 1 + 524 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 158 + + 70 +

2

+ 1 + 524 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 159 + + 60 +

2

+ 1 + 28 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 80 +

1

+ 1 + 35 + 0 +
+ + 100 +

8

+ 1 + 609 + 0 +
+
+ + 1594 + + 100 +

12

+ 1 + 913 + 0 +
+ + 20 +

2

+ 1 + 20 + 0 +
+
+ + 161 + + 60 +

2

+ 1 + 28 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 100 +

1

+ 1 + 36 + 0 +
+ + 150 +

8

+ 1 + 610 + 0 +
+
+ + 163 + + 100 +

2

+ 1 + 23 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 165 + + 20 +

2

+ 1 + 20 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 168 + + 8 +

12

+ 1 + 930 + 0 +
+ + 30 +

2

+ 1 + 30 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 50 +

9

+ 1 + 829 + 0 +
+
+ + 170 + + 70 +

2

+ 1 + 524 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 75 +

9

+ 1 + 5936 + 0 +
+
+ + 171 + + 8 +

12

+ 1 + 930 + 0 +
+ + 50 +

2

+ 1 + 19 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 60 +

9

+ 1 + 1986 + 0 +
+
+ + 174 + + 25 +

2

+ 1 + 21 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 177 + + 100 +

2

+ 1 + 23 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 150 +

1

+ 1 + 37 + 0 +
+ + 200 +

8

+ 1 + 611 + 0 +
+
+ + 180 + + 60 +

2

+ 1 + 28 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+ + 100 +

1

+ 1 + 36 + 0 +
+ + 150 +

8

+ 1 + 610 + 0 +
+
+ + 182 + + 50 +

2

+ 1 + 19 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2102 + + + 2000 +

12

+ 1 + 5286 + 0 +
+
+ + 2103 + + 150 +

5

+ 1 + 5856 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 300 +

1

+ 1 + 168 + 0 +
+ + 300 +

8

+ 1 + 622 + 0 +
+
+ + 2104 + + 150 +

5

+ 1 + 5856 + 0 +
+
+ + 223 + + 25 +

10

+ 1 + 907 + 0 +
+ + 6 +

12

+ 1 + 926 + 0 +
+
+ + 225 + + 8 +

12

+ 1 + 930 + 0 +
+ + 40 +

10

+ 1 + 910 + 0 +
+ + 8 +

12

+ 1 + 927 + 0 +
+
+ + 2259 + + 50 +

2

+ 1 + 19 + 0 +
+ + 50 +

8

+ 1 + 659 + 0 +
+ + 50 +

1

+ 1 + 32 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2260 + + 70 +

2

+ 1 + 524 + 0 +
+ + 100 +

8

+ 1 + 609 + 0 +
+ + 100 +

1

+ 1 + 36 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2261 + + 300 +

1

+ 1 + 168 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2262 + + 10 +

12

+ 1 + 920 + 0 +
+ + 400 +

2

+ 1 + 521 + 0 +
+ + 600 +

1

+ 1 + 318 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2263 + + 10 +

12

+ 1 + 920 + 0 +
+ + 500 +

2

+ 1 + 522 + 0 +
+ + 1000 +

1

+ 1 + 518 + 0 +
+ + 1200 +

8

+ 1 + 2798 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2264 + + 100 +

1

+ 1 + 36 + 0 +
+ + 70 +

2

+ 1 + 524 + 0 +
+ + 200 +

8

+ 1 + 609 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2265 + + 200 +

5

+ 1 + 1569 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2267 + + + 20 +

1

+ 1 + 2 + 0 +
+ + 50 +

2

+ 1 + 19 + 0 +
+ + 30 +

8

+ 1 + 597 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2268 + + + 30 +

1

+ 1 + 31 + 0 +
+ + 50 +

2

+ 1 + 19 + 0 +
+ + 80 +

8

+ 1 + 657 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2275 + + 60 +

1

+ 1 + 33 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2278 + + 800 +

2

+ 1 + 535 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2281 + + 60 +

1

+ 1 + 33 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 50 +

8

+ 1 + 659 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2282 + + 60 +

1

+ 1 + 33 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 50 +

8

+ 1 + 659 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2283 + + 60 +

1

+ 1 + 33 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 50 +

8

+ 1 + 659 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 2284 + + 60 +

1

+ 1 + 33 + 0 +
+ + 100 +

2

+ 1 + 23 + 0 +
+ + 50 +

8

+ 1 + 659 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 265 + + 8 +

12

+ 1 + 930 + 0 +
+ + 50 +

10

+ 1 + 912 + 0 +
+ + 10 +

12

+ 1 + 919 + 0 +
+
+ + 60 + + 5 +

2

+ 1 + 7 + 0 +
+ + 30 +

12

+ 1 + 937 + 0 +
+
+ + 627 + + 50 +

12

+ 1 + 913 + 0 +
+
+ + 628 + + 100 +

12

+ 1 + 1157 + 0 +
+
+ + 677 + + 40 +

12

+ 1 + 982 + 0 +
+
+ + 678 + + 40 +

12

+ 1 + 982 + 0 +
+
+ + 765 + + 10 +

12

+ 1 + 920 + 0 +
+ + 1 +

6

+ 1 + 1470 + 9941 +
+ + + 100 +

2

+ 1 + 23 + 0 +
+ + 150 +

1

+ 1 + 37 + 0 +
+
+ + 810 + + 8 +

12

+ 1 + 930 + 0 +
+ + 1 +

6

+ 1 + 1151 + 8914 +
+ + 60 +

10

+ 1 + 1846 + 0 +
+ + 10 +

12

+ 1 + 919 + 0 +
+
+
diff --git a/src/Schema/AchievementPointTypes.cs b/src/Schema/AchievementPointTypes.cs index d1e6c28..8fdf2ee 100644 --- a/src/Schema/AchievementPointTypes.cs +++ b/src/Schema/AchievementPointTypes.cs @@ -32,4 +32,7 @@ public enum AchievementPointTypes { [XmlEnum("13")] Unknown13 = 13, + + [XmlEnum("21")] + Unknown21 = 21, } diff --git a/src/Schema/AchievementTask.cs b/src/Schema/AchievementTask.cs new file mode 100644 index 0000000..7a191e3 --- /dev/null +++ b/src/Schema/AchievementTask.cs @@ -0,0 +1,26 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema; + +[XmlRoot(ElementName = "ATS", Namespace = "")] +[Serializable] +public class AchievementTask +{ + [XmlElement(ElementName = "oid")] + public string OwnerID; + + [XmlElement(ElementName = "tid")] + public int TaskID; + + [XmlElement(ElementName = "aiid")] + public int AchievementInfoID; + + [XmlElement(ElementName = "rid")] + public string RelatedID; + + [XmlElement(ElementName = "pts")] + public int Points; + + [XmlElement(ElementName = "etid")] + public int EntityTypeID; +} diff --git a/src/Schema/AchievementTaskSetRequest.cs b/src/Schema/AchievementTaskSetRequest.cs new file mode 100644 index 0000000..baaaf53 --- /dev/null +++ b/src/Schema/AchievementTaskSetRequest.cs @@ -0,0 +1,11 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema; + +[XmlRoot(ElementName = "ATSRQ", Namespace = "")] +[Serializable] +public class AchievementTaskSetRequest +{ + [XmlElement(ElementName = "as")] + public AchievementTask[] AchievementTaskSet { get; set; } +} diff --git a/src/Schema/AchievementsIdInfo.cs b/src/Schema/AchievementsIdInfo.cs new file mode 100644 index 0000000..0ee5de1 --- /dev/null +++ b/src/Schema/AchievementsIdInfo.cs @@ -0,0 +1,14 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema; + +[XmlRoot(ElementName = "AchievementsIdInfo", Namespace = "")] +[Serializable] +public class AchievementsIdInfo +{ + [XmlElement(ElementName = "AID")] + public int AchievementID; + + [XmlElement(ElementName = "AR")] + public AchievementReward[] AchievementReward; +} diff --git a/src/Schema/AchievementsTaskInfo.cs b/src/Schema/AchievementsTaskInfo.cs new file mode 100644 index 0000000..cd5d02a --- /dev/null +++ b/src/Schema/AchievementsTaskInfo.cs @@ -0,0 +1,14 @@ +using System.Xml.Serialization; + +namespace sodoff.Schema; + +[XmlRoot(ElementName = "AchievementsTaskInfo", Namespace = "")] +[Serializable] +public class AchievementsTaskInfo +{ + [XmlElement(ElementName = "TID")] + public int TaskID; + + [XmlElement(ElementName = "AR")] + public AchievementReward[] AchievementReward; +} diff --git a/src/Services/AchievementService.cs b/src/Services/AchievementService.cs index 9590af5..a8198af 100644 --- a/src/Services/AchievementService.cs +++ b/src/Services/AchievementService.cs @@ -9,17 +9,28 @@ namespace sodoff.Services { public class AchievementService { Dictionary ranks = new(); + Dictionary achivmentsRewardByID = new(); + Dictionary achivmentsRewardByTask = new(); int dragonAdultMinXP; int dragonTitanMinXP; public AchievementService() { ArrayOfUserRank allranks = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("allranks")); - foreach (var pointType in Enum.GetValues()) { ranks[pointType] = allranks.UserRank.Where(r => r.PointTypeID == pointType).ToArray(); } + AchievementsIdInfo[] allAchievementsIdInfo = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("achievementsids")); + foreach (var achievementsIdInfo in allAchievementsIdInfo) { + achivmentsRewardByID[achievementsIdInfo.AchievementID] = achievementsIdInfo.AchievementReward; + } + + AchievementsTaskInfo[] allAchievementsTaskInfo = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("achievementstasks")); + foreach (var achievementsTaskInfo in allAchievementsTaskInfo) { + achivmentsRewardByTask[achievementsTaskInfo.TaskID] = achievementsTaskInfo.AchievementReward; + } + dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value; dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value; } @@ -88,5 +99,56 @@ namespace sodoff.Services { xpPoints.Value += value ?? 0; } } + + public void ApplyAchievementReward(Viking viking, AchievementReward reward) { + if (reward.PointTypeID == AchievementPointTypes.ItemReward) { + // TODO: This is not a pretty solution. Use inventory service in the future + InventoryItem? ii = viking.Inventory.InventoryItems.FirstOrDefault(x => x.ItemId == reward.ItemID); + if (ii is null) { + ii = new InventoryItem { + ItemId = reward.ItemID, + Quantity = 0 + }; + viking.Inventory.InventoryItems.Add(ii); + } + ii.Quantity += (int)reward.Amount!; + } else { // currencies, all types of player XP and dragon XP + AddAchievementPoints(viking, reward.PointTypeID, reward.Amount); + } + } + + public AchievementReward[] ApplyAchievementRewards(Viking viking, AchievementReward[] rewards) { + foreach (var reward in rewards) { + ApplyAchievementReward(viking, reward); + /* TODO we don't need this? + if (reward.PointTypeID == AchievementPointTypes.DragonXP) { + reward.EntityID = Guid.Parse(viking.SelectedDragon.EntityId) + } else { + reward.EntityID = Guid.Parse(viking.Id) + } */ + } + // TODO: check trophies, etc criteria and id need apply and add to results extra reward here + return rewards; + } + + public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID) { + if (achivmentsRewardByID.ContainsKey(achievementID)) { + var rewards = achivmentsRewardByID[achievementID]; + return ApplyAchievementRewards(viking, rewards); + } else { + Console.WriteLine(string.Format("Unknown rewards for achievementID={0}", achievementID)); + return new AchievementReward[0]; + } + } + + public AchievementReward[] ApplyAchievementRewardsByTask(Viking viking, AchievementTask task) { + if (achivmentsRewardByTask.ContainsKey(task.TaskID)) { + var rewards = achivmentsRewardByTask[task.TaskID]; + return ApplyAchievementRewards(viking, rewards); + } else { + Console.WriteLine(string.Format("Unknown rewards for taskID={0}", task.TaskID)); + return new AchievementReward[0]; + } + } } } diff --git a/src/Services/MissionService.cs b/src/Services/MissionService.cs index f04f5f8..67ef893 100644 --- a/src/Services/MissionService.cs +++ b/src/Services/MissionService.cs @@ -38,11 +38,6 @@ public class MissionService { if (completed) { Mission mission = GetMissionWithProgress(missionId, userId); if (MissionCompleted(mission)) { - // Get mission rewards - result.Add(new MissionCompletedResult { - MissionID = missionId, - Rewards = mission.Rewards.ToArray() - }); // Update mission from active to completed Viking viking = ctx.Vikings.FirstOrDefault(x => x.Id == userId)!; MissionState? missionState = viking.MissionStates.FirstOrDefault(x => x.MissionId == missionId); @@ -50,23 +45,14 @@ public class MissionService { missionState.MissionStatus = MissionStatus.Completed; missionState.UserAccepted = null; } - foreach (var reward in mission.Rewards) { - if (reward.PointTypeID == AchievementPointTypes.ItemReward) { - // TODO: This is not a pretty solution. Use inventory service in the future - InventoryItem? ii = viking.Inventory.InventoryItems.FirstOrDefault(x => x.ItemId == reward.ItemID); - if (ii is null) { - ii = new InventoryItem { - ItemId = reward.ItemID, - Quantity = 0 - }; - viking.Inventory.InventoryItems.Add(ii); - } - ii.Quantity += (int)reward.Amount!; - } else { // currencies, all types of player XP and dragon XP - achievementService.AddAchievementPoints(viking, reward.PointTypeID, reward.Amount); - } - } + var rewards = achievementService.ApplyAchievementRewards(viking, mission.Rewards.ToArray()); ctx.SaveChanges(); + + // Get mission rewards + result.Add(new MissionCompletedResult { + MissionID = missionId, + Rewards = rewards + }); } } return result; diff --git a/src/Services/RoomService.cs b/src/Services/RoomService.cs index d4f6480..f80d8c8 100644 --- a/src/Services/RoomService.cs +++ b/src/Services/RoomService.cs @@ -9,11 +9,14 @@ namespace sodoff.Services; public class RoomService { private readonly DBContext ctx; - private ItemService itemService; - public RoomService(DBContext ctx, ItemService itemService) { + private ItemService itemService; + private AchievementService achievementService; + + public RoomService(DBContext ctx, ItemService itemService, AchievementService achievementService) { this.ctx = ctx; this.itemService = itemService; + this.achievementService = achievementService; } public void CreateRoom(Viking viking, string roomId) { @@ -131,21 +134,7 @@ public class RoomService { } if (rewards != null) { - response.Rewards = rewards; - foreach (var reward in rewards) { - if (reward.PointTypeID == AchievementPointTypes.ItemReward) { - // TODO: This is not a pretty solution. Use inventory service in the future - InventoryItem? ii = item.Room.Viking.Inventory.InventoryItems.FirstOrDefault(x => x.ItemId == reward.ItemID); - if (ii is null) { - ii = new InventoryItem { - ItemId = reward.ItemID, - Quantity = 0 - }; - item.Room.Viking.Inventory.InventoryItems.Add(ii); - } - ii.Quantity += (int)reward.Amount!; - } - } + response.Rewards = achievementService.ApplyAchievementRewards(item.Room.Viking, rewards); } DateTime stateChange = new DateTime(DateTime.Now.Ticks); diff --git a/src/sodoff.csproj b/src/sodoff.csproj index 0dcc75f..3d46ca7 100644 --- a/src/sodoff.csproj +++ b/src/sodoff.csproj @@ -20,6 +20,8 @@ + + @@ -35,6 +37,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + @@ -52,6 +60,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest