From fb582b4c2479c0ea67fe567dbf3189ca5d856be2 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Mon, 14 Aug 2023 23:35:59 +0000 Subject: [PATCH] fix error and missing xp on dragon ageup - fix error when GetAchievementsByUserID is called with dragonId instead of userID - add dragon XP when ageUp by ticket --- .../Common/AchievementController.cs | 28 +++++++++++-------- src/Controllers/Common/ContentController.cs | 9 ++++-- src/Services/AchievementService.cs | 21 ++++++++++++++ 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/Controllers/Common/AchievementController.cs b/src/Controllers/Common/AchievementController.cs index a7c3ab3..49fdd6e 100644 --- a/src/Controllers/Common/AchievementController.cs +++ b/src/Controllers/Common/AchievementController.cs @@ -73,20 +73,26 @@ public class AchievementController : Controller { // TODO: check session Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Id == userId); - - if (viking is null) { - return null; + if (viking != null) { + 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 + } + }); } - ArrayOfUserAchievementInfo arrAchievements = 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 - } - }; + Dragon? dragon = ctx.Dragons.FirstOrDefault(e => e.EntityId == userId); + if (dragon != null) { + return Ok(new ArrayOfUserAchievementInfo { + UserAchievementInfo = new UserAchievementInfo[]{ + achievementService.CreateUserAchievementInfo(dragon.EntityId, dragon.PetXP, AchievementPointTypes.DragonXP), + } + }); + } - return Ok(arrAchievements); + return null; } [HttpPost] diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index be13269..553e6cd 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -15,12 +15,14 @@ public class ContentController : Controller { private ItemService itemService; private MissionService missionService; private RoomService roomService; - public ContentController(DBContext ctx, KeyValueService keyValueService, ItemService itemService, MissionService missionService, RoomService roomService) { + private AchievementService achievementService; + public ContentController(DBContext ctx, KeyValueService keyValueService, ItemService itemService, MissionService missionService, RoomService roomService, AchievementService achievementService) { this.ctx = ctx; this.keyValueService = keyValueService; this.itemService = itemService; this.missionService = missionService; this.roomService = roomService; + this.achievementService = achievementService; } [HttpPost] @@ -916,7 +918,10 @@ public class ContentController : Controller { if (newDragonData.EntityID is not null) dragonData.EntityID = newDragonData.EntityID; if (newDragonData.Name is not null) dragonData.Name = newDragonData.Name; dragonData.PetTypeID = newDragonData.PetTypeID; - if (newDragonData.GrowthState is not null) dragonData.GrowthState = newDragonData.GrowthState; + if (newDragonData.GrowthState is not null) { + achievementService.DragonLevelUpOnAgeUp(dragon, dragonData.GrowthState, newDragonData.GrowthState); + dragonData.GrowthState = newDragonData.GrowthState; + } if (newDragonData.ImagePosition is not null) dragonData.ImagePosition = newDragonData.ImagePosition; if (newDragonData.Geometry is not null) dragonData.Geometry = newDragonData.Geometry; if (newDragonData.Texture is not null) dragonData.Texture = newDragonData.Texture; diff --git a/src/Services/AchievementService.cs b/src/Services/AchievementService.cs index a6ea48b..fb74b1f 100644 --- a/src/Services/AchievementService.cs +++ b/src/Services/AchievementService.cs @@ -10,12 +10,18 @@ namespace sodoff.Services { Dictionary ranks = 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(); } + + dragonAdultMinXP = ranks[AchievementPointTypes.DragonXP][10].Value; + dragonTitanMinXP = ranks[AchievementPointTypes.DragonXP][20].Value; } public int GetRankFromXP(int? xpPoints, AchievementPointTypes type) { @@ -37,6 +43,21 @@ namespace sodoff.Services { return CreateUserAchievementInfo(viking.Id, viking.AchievementPoints.FirstOrDefault(a => a.Type == (int)type)?.Value, type); } + public void DragonLevelUpOnAgeUp(Dragon dragon, RaisedPetGrowthState oldGrowthState, RaisedPetGrowthState newGrowthState) { + if (newGrowthState.Order > oldGrowthState.Order) { + // age up + int dragonXP = dragon.PetXP ?? 0; + if (newGrowthState.Order == 4 && dragonXP < dragonAdultMinXP) { + // to adult via ticket -> add XP + dragonXP += dragonAdultMinXP; + } else if (newGrowthState.Order == 5 && dragonXP < dragonTitanMinXP) { + // adult to titan via ticket -> add XP + dragonXP += dragonTitanMinXP - dragonAdultMinXP; + } + dragon.PetXP = dragonXP; + } + } + public void AddAchievementPoints(Viking viking, AchievementPointTypes? type, int? value) { if (type == AchievementPointTypes.DragonXP) { viking.SelectedDragon.PetXP = (viking.SelectedDragon.PetXP ?? 0) + (value ?? 0);