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
- FuseItems
- AddBattleItems
- SetAchievementByEntityIDs
#### Implemented enough (probably)
- 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)
- SellItems (need add cash reward)
- ApplyRewards
- ApplyPayout
#### Currently static or stubbed
- GetAllRanks (needs to be populated with what ranks the user has)
@ -123,4 +125,3 @@ Then run School of Dragons.
- GetAverageRatingForRoom (return max rating)
- GetUserActivityByUserID (returns an empty array)
- GetUserGameCurrency (return 65536 gems and 65536 coins)
- SetAchievementByEntityIDs (returns a static achievement)

View File

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

View File

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

View File

@ -1103,8 +1103,6 @@ public class ContentController : Controller {
achievementRewards.Add(new AchievementReward{
EntityID = petInfo.EntityID,
PointTypeID = AchievementPointTypes.DragonXP,
EntityTypeID = 3, // dragon ?
RewardID = 1265, // TODO: placeholder
Amount = dragonXp
});
}
@ -1112,10 +1110,10 @@ public class ContentController : Controller {
// player XP and gems
achievementRewards.Add(
achievementService.AddAchievementPointsAndGetReward(viking, AchievementPointTypes.PlayerXP, 60 * rewardMultipler)
achievementService.AddAchievementPoints(viking, AchievementPointTypes.PlayerXP, 60 * rewardMultipler)
);
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")]
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) {
viking.SelectedDragon.PetXP = (viking.SelectedDragon.PetXP ?? 0) + (value ?? 0);
return AddDragonAchievementPoints(viking.SelectedDragon, value);
} else if (type != null) {
AchievementPoints xpPoints = viking.AchievementPoints.FirstOrDefault(a => a.Type == (int)type);
if (xpPoints is null) {
@ -71,48 +82,59 @@ namespace sodoff.Services {
viking.AchievementPoints.Add(xpPoints);
}
xpPoints.Value += value ?? 0;
}
}
public AchievementReward AddAchievementPointsAndGetReward(Viking viking, AchievementPointTypes type, int value) {
AddAchievementPoints(viking, type, value);
return new AchievementReward{
EntityID = Guid.Parse(viking.Id),
PointTypeID = type,
EntityTypeID = 1, // player ?
RewardID = 1265, // TODO: placeholder
Amount = value
};
}
return null;
}
public void ApplyAchievementReward(Viking viking, AchievementReward reward) {
public AchievementReward? ApplyAchievementReward(Viking viking, AchievementReward reward) {
if (reward.PointTypeID == AchievementPointTypes.ItemReward) {
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
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)
return null;
List<AchievementReward> grantedRewards = new List<AchievementReward>();
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)
} */
if (dragonsIDs != null && reward.PointTypeID == AchievementPointTypes.DragonXP) {
double amountDouble = (reward.Amount ?? 0)/dragonsIDs.Length;
int amount = (int)Math.Ceiling(amountDouble);
foreach (Guid dragonID in dragonsIDs) {
Dragon dragon = viking.Dragons.FirstOrDefault(e => e.EntityId == dragonID.ToString());
grantedRewards.Add(
AddDragonAchievementPoints(dragon, amount)
);
}
} else {
grantedRewards.Add(
ApplyAchievementReward(viking, reward)
);
}
// 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) {
// TODO: check trophies, etc criteria and id need apply and add to results extra reward here
return grantedRewards.ToArray();
}
public AchievementReward[] ApplyAchievementRewardsByID(Viking viking, int achievementID, Guid[]? dragonsIDs = null) {
var rewards = achievementStore.GetAchievementRewardsById(achievementID);
if (rewards != null) {
return ApplyAchievementRewards(viking, rewards);
return ApplyAchievementRewards(viking, rewards, dragonsIDs);
} else {
return new AchievementReward[0];
}