stable mission rewards

- implement SetAchievementByEntityIDs endpoint
- add stable achivments to achievementsids.xml (generated from TimedMissionDO.xml)
- remove AddAchievementPointsAndGetReward, AddAchievementPoints now return AchievementReward
- add ApplyPayout to proxy
This commit is contained in:
Robert Paciorek 2023-09-03 22:04:18 +00:00 committed by Spirtix
parent 45a105af2e
commit 82d31853ea
7 changed files with 8456 additions and 863 deletions

View File

@ -82,6 +82,7 @@ Then run School of Dragons.
- RerollUserItem - RerollUserItem
- FuseItems - FuseItems
- AddBattleItems - AddBattleItems
- SetAchievementByEntityIDs
#### Implemented enough (probably) #### Implemented enough (probably)
- GetRules (doesn't return any rules, probably doesn't need to) - GetRules (doesn't return any rules, probably doesn't need to)
@ -107,6 +108,7 @@ Then run School of Dragons.
- ProcessRewardedItems (need add cash reward) - ProcessRewardedItems (need add cash reward)
- SellItems (need add cash reward) - SellItems (need add cash reward)
- ApplyRewards - ApplyRewards
- ApplyPayout
#### Currently static or stubbed #### Currently static or stubbed
- GetAllRanks (needs to be populated with what ranks the user has) - GetAllRanks (needs to be populated with what ranks the user has)
@ -123,4 +125,3 @@ Then run School of Dragons.
- GetAverageRatingForRoom (return max rating) - GetAverageRatingForRoom (return max rating)
- GetUserActivityByUserID (returns an empty array) - GetUserActivityByUserID (returns an empty array)
- GetUserGameCurrency (return 65536 gems and 65536 coins) - GetUserGameCurrency (return 65536 gems and 65536 coins)
- SetAchievementByEntityIDs (returns a static achievement)

View File

@ -79,6 +79,7 @@ methods = [
'DeleteAccountNotification', 'DeleteAccountNotification',
'SetUserAchievementAndGetReward', 'SetUserAchievementAndGetReward',
'ProcessRewardedItems', 'ProcessRewardedItems',
'ApplyPayout',
] ]
def routable(path): def routable(path):

View File

@ -167,10 +167,10 @@ public class AchievementController : Controller {
public IActionResult ApplyPayout(Viking viking, string ModuleName, int points) { public IActionResult ApplyPayout(Viking viking, string ModuleName, int points) {
// TODO: use args (ModuleName and points) to calculate reward // TODO: use args (ModuleName and points) to calculate reward
return Ok(new AchievementReward[]{ return Ok(new AchievementReward[]{
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.PlayerXP, 10), achievementService.AddAchievementPoints(viking, AchievementPointTypes.PlayerXP, 10),
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.GameCurrency, 5), achievementService.AddAchievementPoints(viking, AchievementPointTypes.GameCurrency, 5),
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.DragonXP, 6), achievementService.AddAchievementPoints(viking, AchievementPointTypes.DragonXP, 6),
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.UDTPoints, 6), achievementService.AddAchievementPoints(viking, AchievementPointTypes.UDTPoints, 6),
}); });
} }
@ -178,16 +178,11 @@ public class AchievementController : Controller {
[Produces("application/xml")] [Produces("application/xml")]
[Route("AchievementWebService.asmx/SetAchievementByEntityIDs")] [Route("AchievementWebService.asmx/SetAchievementByEntityIDs")]
[VikingSession] [VikingSession]
public IActionResult SetAchievementByEntityIDs(Viking viking, [FromForm] int achievementID) { public IActionResult SetAchievementByEntityIDs(Viking viking, [FromForm] int achievementID, [FromForm] string petIDs) {
// TODO: This is a placeholder Guid[] petGuids = XmlUtil.DeserializeXml<Guid[]>(petIDs);
return Ok(new AchievementReward[1] {
new AchievementReward { return Ok(
Amount = 25, achievementService.ApplyAchievementRewardsByID(viking, achievementID, petGuids)
PointTypeID = AchievementPointTypes.PlayerXP, );
EntityID = Guid.Parse(viking.Id),
EntityTypeID = 1,
RewardID = 552
}
});
} }
} }

View File

@ -1103,8 +1103,6 @@ public class ContentController : Controller {
achievementRewards.Add(new AchievementReward{ achievementRewards.Add(new AchievementReward{
EntityID = petInfo.EntityID, EntityID = petInfo.EntityID,
PointTypeID = AchievementPointTypes.DragonXP, PointTypeID = AchievementPointTypes.DragonXP,
EntityTypeID = 3, // dragon ?
RewardID = 1265, // TODO: placeholder
Amount = dragonXp Amount = dragonXp
}); });
} }
@ -1112,10 +1110,10 @@ public class ContentController : Controller {
// player XP and gems // player XP and gems
achievementRewards.Add( achievementRewards.Add(
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.PlayerXP, 60 * rewardMultipler) achievementService.AddAchievementPoints(viking, AchievementPointTypes.PlayerXP, 60 * rewardMultipler)
); );
achievementRewards.Add( achievementRewards.Add(
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.CashCurrency, 2 * rewardMultipler) achievementService.AddAchievementPoints(viking, AchievementPointTypes.CashCurrency, 2 * rewardMultipler)
); );
} }

File diff suppressed because it is too large Load Diff

View File

@ -44,4 +44,8 @@ public class AchievementReward
[XmlElement(ElementName = "cid")] [XmlElement(ElementName = "cid")]
public int CommonInventoryID; public int CommonInventoryID;
public AchievementReward Clone() {
return (AchievementReward) this.MemberwiseClone();
}
} }

View File

@ -58,9 +58,20 @@ namespace sodoff.Services {
} }
} }
public void AddAchievementPoints(Viking viking, AchievementPointTypes? type, int? value) { public AchievementReward? AddDragonAchievementPoints(Dragon dragon, int? value) {
dragon.PetXP = (dragon.PetXP ?? 0) + (value ?? 0);
return new AchievementReward{
// NOTE: RewardID and EntityTypeID are not used by client
EntityID = Guid.Parse(dragon.EntityId),
PointTypeID = AchievementPointTypes.DragonXP,
Amount = value ?? 0
};
}
public AchievementReward? AddAchievementPoints(Viking viking, AchievementPointTypes? type, int? value) {
if (type == AchievementPointTypes.DragonXP && viking.SelectedDragon != null) { if (type == AchievementPointTypes.DragonXP && viking.SelectedDragon != null) {
viking.SelectedDragon.PetXP = (viking.SelectedDragon.PetXP ?? 0) + (value ?? 0); return AddDragonAchievementPoints(viking.SelectedDragon, value);
} else if (type != null) { } else if (type != null) {
AchievementPoints xpPoints = viking.AchievementPoints.FirstOrDefault(a => a.Type == (int)type); AchievementPoints xpPoints = viking.AchievementPoints.FirstOrDefault(a => a.Type == (int)type);
if (xpPoints is null) { if (xpPoints is null) {
@ -71,48 +82,59 @@ namespace sodoff.Services {
viking.AchievementPoints.Add(xpPoints); viking.AchievementPoints.Add(xpPoints);
} }
xpPoints.Value += value ?? 0; xpPoints.Value += value ?? 0;
return new AchievementReward{
EntityID = Guid.Parse(viking.Id),
PointTypeID = type,
Amount = value
};
} }
return null;
} }
public AchievementReward AddAchievementPointsAndGetReward(Viking viking, AchievementPointTypes type, int value) { public AchievementReward? ApplyAchievementReward(Viking viking, AchievementReward reward) {
AddAchievementPoints(viking, type, value);
return new AchievementReward{
EntityID = Guid.Parse(viking.Id),
PointTypeID = type,
EntityTypeID = 1, // player ?
RewardID = 1265, // TODO: placeholder
Amount = value
};
}
public void ApplyAchievementReward(Viking viking, AchievementReward reward) {
if (reward.PointTypeID == AchievementPointTypes.ItemReward) { if (reward.PointTypeID == AchievementPointTypes.ItemReward) {
inventoryService.AddItemToInventory(viking, reward.ItemID, (int)reward.Amount!); inventoryService.AddItemToInventory(viking, reward.ItemID, (int)reward.Amount!);
AchievementReward grantedReward = reward.Clone();
grantedReward.EntityID = Guid.Parse(viking.Id);
return grantedReward;
} else { // currencies, all types of player XP and dragon XP } else { // currencies, all types of player XP and dragon XP
AddAchievementPoints(viking, reward.PointTypeID, reward.Amount); return AddAchievementPoints(viking, reward.PointTypeID, reward.Amount);
} }
} }
public AchievementReward[] ApplyAchievementRewards(Viking viking, AchievementReward[] rewards) { public AchievementReward[] ApplyAchievementRewards(Viking viking, AchievementReward[] rewards, Guid[]? dragonsIDs = null) {
if (rewards is null) if (rewards is null)
return null; return null;
List<AchievementReward> grantedRewards = new List<AchievementReward>();
foreach (var reward in rewards) { foreach (var reward in rewards) {
ApplyAchievementReward(viking, reward); if (dragonsIDs != null && reward.PointTypeID == AchievementPointTypes.DragonXP) {
/* TODO we don't need this? double amountDouble = (reward.Amount ?? 0)/dragonsIDs.Length;
if (reward.PointTypeID == AchievementPointTypes.DragonXP) { int amount = (int)Math.Ceiling(amountDouble);
reward.EntityID = Guid.Parse(viking.SelectedDragon.EntityId) foreach (Guid dragonID in dragonsIDs) {
Dragon dragon = viking.Dragons.FirstOrDefault(e => e.EntityId == dragonID.ToString());
grantedRewards.Add(
AddDragonAchievementPoints(dragon, amount)
);
}
} else { } else {
reward.EntityID = Guid.Parse(viking.Id) grantedRewards.Add(
} */ ApplyAchievementReward(viking, reward)
);
}
} }
// TODO: check trophies, etc criteria and id need apply and add to results extra reward here // TODO: check trophies, etc criteria and id need apply and add to results extra reward here
return rewards;
return grantedRewards.ToArray();
} }
public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID) { public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID, Guid[]? dragonsIDs = null) {
var rewards = achievementStore.GetAchievementRewardsById(achievementID); var rewards = achievementStore.GetAchievementRewardsById(achievementID);
if (rewards != null) { if (rewards != null) {
return ApplyAchievementRewards(viking, rewards); return ApplyAchievementRewards(viking, rewards, dragonsIDs);
} else { } else {
return new AchievementReward[0]; return new AchievementReward[0];
} }