From 45fc86d8e0cac429ac5c104d1341df23b2f4a4bb Mon Sep 17 00:00:00 2001 From: Chomp Date: Fri, 17 Jan 2025 11:58:10 +0000 Subject: [PATCH] Renamed `QuestReward` to `Reward` + `QuestRewardType` to `RewardType` --- Core/Controllers/PrestigeController.cs | 2 +- Core/Helpers/ProfileHelper.cs | 2 +- Core/Helpers/QuestRewardHelper.cs | 58 +++++++-------- Core/Models/Eft/Common/Tables/Achievement.cs | 2 +- Core/Models/Eft/Common/Tables/Prestige.cs | 2 +- Core/Models/Eft/Common/Tables/Quest.cs | 71 +++---------------- Core/Models/Eft/Common/Tables/Reward.cs | 59 +++++++++++++++ .../{QuestRewardType.cs => RewardType.cs} | 2 +- Core/Services/ProfileFixerService.cs | 6 +- Core/Utils/JsonUtil.cs | 2 +- 10 files changed, 105 insertions(+), 101 deletions(-) create mode 100644 Core/Models/Eft/Common/Tables/Reward.cs rename Core/Models/Enums/{QuestRewardType.cs => RewardType.cs} (91%) diff --git a/Core/Controllers/PrestigeController.cs b/Core/Controllers/PrestigeController.cs index 90b1b321..de714e3b 100644 --- a/Core/Controllers/PrestigeController.cs +++ b/Core/Controllers/PrestigeController.cs @@ -163,7 +163,7 @@ public class PrestigeController _saveServer.SaveProfile(sessionId); } - private void AddPrestigeRewardsToProfile(string sessionId, SptProfile newProfile, IEnumerable rewards) + private void AddPrestigeRewardsToProfile(string sessionId, SptProfile newProfile, IEnumerable rewards) { _logger.Error("NOT IMPLEMENTED AddPrestigeRewardsToProfile()"); } diff --git a/Core/Helpers/ProfileHelper.cs b/Core/Helpers/ProfileHelper.cs index 2320a639..ddb4a999 100644 --- a/Core/Helpers/ProfileHelper.cs +++ b/Core/Helpers/ProfileHelper.cs @@ -653,7 +653,7 @@ public class ProfileHelper return fullFavorites; } - public void AddHideoutCustomisationUnlock(SptProfile fullProfile, QuestReward reward, string source) + public void AddHideoutCustomisationUnlock(SptProfile fullProfile, Reward reward, string source) { if (fullProfile?.CustomisationUnlocks == null) fullProfile.CustomisationUnlocks = new(); diff --git a/Core/Helpers/QuestRewardHelper.cs b/Core/Helpers/QuestRewardHelper.cs index 07c47250..a63e2777 100644 --- a/Core/Helpers/QuestRewardHelper.cs +++ b/Core/Helpers/QuestRewardHelper.cs @@ -99,7 +99,7 @@ public class QuestRewardHelper // e.g. 'Success' or 'AvailableForFinish' var questStateAsString = state.ToString(); var gameVersion = pmcProfile.Info.GameVersion; - var questRewards = (List?)questDetails.Rewards.GetType().GetProperties().FirstOrDefault(p => + var questRewards = (List?)questDetails.Rewards.GetType().GetProperties().FirstOrDefault(p => p.Name == questStateAsString).GetValue(questDetails.Rewards); foreach (var reward in questRewards) { @@ -116,37 +116,37 @@ public class QuestRewardHelper switch (reward.Type) { - case QuestRewardType.Skill: + case RewardType.Skill: _profileHelper.AddSkillPointsToPlayer(profileData, skillType, double.Parse((string)reward.Value)); break; - case QuestRewardType.Experience: // this must occur first as the output object needs to take the modified profile exp value + case RewardType.Experience: // this must occur first as the output object needs to take the modified profile exp value _profileHelper.AddExperienceToPmc(sessionId, int.Parse(reward.Target)); break; - case QuestRewardType.TraderStanding: + case RewardType.TraderStanding: _traderHelper.AddStandingToTrader(sessionId, reward.Target, double.Parse((string)reward.Value)); break; - case QuestRewardType.TraderUnlock: + case RewardType.TraderUnlock: _traderHelper.SetTraderUnlockedState(reward.Target, true, sessionId); break; - case QuestRewardType.Item: + case RewardType.Item: // Handled by getQuestRewardItems() below break; - case QuestRewardType.AssortmentUnlock: + case RewardType.AssortmentUnlock: // Handled by getAssort(), locked assorts are stripped out by `assortHelper.stripLockedLoyaltyAssort()` before being sent to player break; - case QuestRewardType.Achievement: + case RewardType.Achievement: _profileHelper.AddAchievementToProfile(fullProfile, reward.Target); break; - case QuestRewardType.StashRows: // Add specified stash rows from quest reward - requires client restart + case RewardType.StashRows: // Add specified stash rows from quest reward - requires client restart _profileHelper.AddStashRowsBonusToProfile(sessionId, int.Parse((string)reward.Value)); break; - case QuestRewardType.ProductionScheme: + case RewardType.ProductionScheme: FindAndAddHideoutProductionIdToProfile(pmcProfile, reward, questDetails, sessionId, questResponse); break; - case QuestRewardType.Pockets: + case RewardType.Pockets: _profileHelper.ReplaceProfilePocketTpl(pmcProfile, reward.Target); break; - case QuestRewardType.CustomizationDirect: + case RewardType.CustomizationDirect: _profileHelper.AddHideoutCustomisationUnlock(fullProfile, reward, CustomisationSource.UNLOCKED_IN_GAME); break; default: @@ -169,7 +169,7 @@ public class QuestRewardHelper * @param gameVersion Version of game to check reward against * @returns True if it has requirement, false if it doesnt pass check */ - public bool QuestRewardIsForGameEdition(QuestReward reward, string gameVersion) + public bool QuestRewardIsForGameEdition(Reward reward, string gameVersion) { if (reward?.AvailableInGameEditions?.Count > 0 && !reward.AvailableInGameEditions.Any(ge => ge == gameVersion)) { @@ -246,7 +246,7 @@ public class QuestRewardHelper */ public Quest ApplyMoneyBoost(Quest quest, double bonusPercent, QuestStatusEnum questStatus) { - var rewards = (List)quest?.Rewards.GetType().GetProperties().FirstOrDefault(p => p.Name == questStatus.ToString()) + var rewards = (List)quest?.Rewards.GetType().GetProperties().FirstOrDefault(p => p.Name == questStatus.ToString()) .GetValue(quest.Rewards) ?? new(); var currencyRewards = rewards.Where(r => r.Type.ToString() == "Item" && @@ -272,7 +272,7 @@ public class QuestRewardHelper /// Quest with craft unlock reward /// Session id /// Response to send back to client - protected void FindAndAddHideoutProductionIdToProfile(PmcData pmcData, QuestReward craftUnlockReward, Quest questDetails, string sessionID, + protected void FindAndAddHideoutProductionIdToProfile(PmcData pmcData, Reward craftUnlockReward, Quest questDetails, string sessionID, ItemEventRouterResponse response) { var matchingProductions = GetRewardProductionMatch(craftUnlockReward, questDetails); @@ -299,7 +299,7 @@ public class QuestRewardHelper /// Reward item from quest with craft unlock details /// Quest with craft unlock reward /// Hideout craft - public List GetRewardProductionMatch(QuestReward craftUnlockReward, Quest questDetails) + public List GetRewardProductionMatch(Reward craftUnlockReward, Quest questDetails) { // Get hideout crafts and find those that match by areatype/required level/end product tpl - hope for just one match var craftingRecipes = _databaseService.GetHideout().Production.Recipes; @@ -330,7 +330,7 @@ public class QuestRewardHelper */ protected List GetQuestRewardItems(Quest quest, QuestStatusEnum status, string gameVersion) { - var rewards = (List)quest?.Rewards.GetType().GetProperties().FirstOrDefault(p => p.Name == status.ToString()) + var rewards = (List)quest?.Rewards.GetType().GetProperties().FirstOrDefault(p => p.Name == status.ToString()) .GetValue(quest.Rewards); if (rewards == null) @@ -351,7 +351,7 @@ public class QuestRewardHelper * @param questReward Reward item to fix * @returns Fixed rewards */ - protected List ProcessReward(QuestReward questReward) + protected List ProcessReward(Reward reward) { // item with mods to return var rewardItems = new List(); @@ -359,13 +359,13 @@ public class QuestRewardHelper var mods = new List(); // Is armor item that may need inserts / plates - if (questReward.Items.Count == 1 && _itemHelper.ArmorItemCanHoldMods(questReward.Items[0].Template)) + if (reward.Items.Count == 1 && _itemHelper.ArmorItemCanHoldMods(reward.Items[0].Template)) { // Attempt to pull default preset from globals and add child items to reward (clones questReward.items) - GenerateArmorRewardChildSlots(questReward.Items[0], questReward); + GenerateArmorRewardChildSlots(reward.Items[0], reward); } - foreach (var rewardItem in questReward.Items) + foreach (var rewardItem in reward.Items) { _itemHelper.AddUpdObjectToItem(rewardItem); @@ -373,7 +373,7 @@ public class QuestRewardHelper rewardItem.Upd.SpawnedInSession = true; // Is root item, fix stacks - if (rewardItem.Id == questReward.Type.ToString()) + if (rewardItem.Id == reward.Type.ToString()) { // Is base reward item if (rewardItem.ParentId != null && @@ -397,8 +397,8 @@ public class QuestRewardHelper else { // Is child mod - if (questReward.Items[0].Upd.SpawnedInSession ?? false) // Propigate FiR status into child items - rewardItem.Upd.SpawnedInSession = questReward.Items[0].Upd.SpawnedInSession; + if (reward.Items[0].Upd.SpawnedInSession ?? false) // Propigate FiR status into child items + rewardItem.Upd.SpawnedInSession = reward.Items[0].Upd.SpawnedInSession; mods.Add(rewardItem); } @@ -429,7 +429,7 @@ public class QuestRewardHelper * @param originalRewardRootItem Original armor reward item from QuestReward.items object * @param questReward Armor reward from quest */ - protected void GenerateArmorRewardChildSlots(Item originalRewardRootItem, QuestReward questReward) + protected void GenerateArmorRewardChildSlots(Item originalRewardRootItem, Reward reward) { // Look for a default preset from globals for armor var defaultPreset = _presetHelper.GetDefaultPreset(originalRewardRootItem.Template); @@ -439,13 +439,13 @@ public class QuestRewardHelper var presetAndMods = _itemHelper.ReplaceIDs(defaultPreset.Items); var newRootId = _itemHelper.RemapRootItemId(presetAndMods, _hashUtil.Generate()); - questReward.Items = presetAndMods; + reward.Items = presetAndMods; // Find root item and set its stack count - var rootItem = questReward.Items.FirstOrDefault(i => i.Id == newRootId); + var rootItem = reward.Items.FirstOrDefault(i => i.Id == newRootId); // Remap target id to the new presets root id - questReward.Target = rootItem.Id; + reward.Target = rootItem.Id; // Copy over stack count otherwise reward shows as missing in client _itemHelper.AddUpdObjectToItem(rootItem); @@ -459,6 +459,6 @@ public class QuestRewardHelper var itemDbData = _itemHelper.GetItem(originalRewardRootItem.Template).Value; // Hydrate reward with only 'required' mods - necessary for things like helmets otherwise you end up with nvgs/visors etc - questReward.Items = _itemHelper.AddChildSlotItems(questReward.Items, itemDbData, null, true); + reward.Items = _itemHelper.AddChildSlotItems(reward.Items, itemDbData, null, true); } } diff --git a/Core/Models/Eft/Common/Tables/Achievement.cs b/Core/Models/Eft/Common/Tables/Achievement.cs index 4cf81a8c..bbb42b05 100644 --- a/Core/Models/Eft/Common/Tables/Achievement.cs +++ b/Core/Models/Eft/Common/Tables/Achievement.cs @@ -14,7 +14,7 @@ public class Achievement public string? AssetPath { get; set; } [JsonPropertyName("rewards")] - public List? Rewards { get; set; } + public List? Rewards { get; set; } [JsonPropertyName("conditions")] public AchievementQuestConditionTypes? Conditions { get; set; } diff --git a/Core/Models/Eft/Common/Tables/Prestige.cs b/Core/Models/Eft/Common/Tables/Prestige.cs index 06b8d5e0..666e8197 100644 --- a/Core/Models/Eft/Common/Tables/Prestige.cs +++ b/Core/Models/Eft/Common/Tables/Prestige.cs @@ -17,7 +17,7 @@ public class PrestigeElement public List? Conditions { get; set; } [JsonPropertyName("rewards")] - public List? Rewards { get; set; } + public List? Rewards { get; set; } [JsonPropertyName("transferConfigs")] public TransferConfigs? TransferConfigs { get; set; } diff --git a/Core/Models/Eft/Common/Tables/Quest.cs b/Core/Models/Eft/Common/Tables/Quest.cs index 8b5b12fd..66e6000f 100644 --- a/Core/Models/Eft/Common/Tables/Quest.cs +++ b/Core/Models/Eft/Common/Tables/Quest.cs @@ -46,7 +46,7 @@ public class Quest public string? Image { get; set; } [JsonPropertyName("type")] - public string? Type { get; set; } + public string? RewardType { get; set; } [JsonPropertyName("isKey")] public bool? IsKey { get; set; } @@ -474,78 +474,23 @@ public class VisibilityCondition public class QuestRewards { [JsonPropertyName("AvailableForStart")] - public List? AvailableForStart { get; set; } + public List? AvailableForStart { get; set; } [JsonPropertyName("AvailableForFinish")] - public List? AvailableForFinish { get; set; } + public List? AvailableForFinish { get; set; } [JsonPropertyName("Started")] - public List? Started { get; set; } + public List? Started { get; set; } [JsonPropertyName("Success")] - public List? Success { get; set; } + public List? Success { get; set; } [JsonPropertyName("Fail")] - public List? Fail { get; set; } + public List? Fail { get; set; } [JsonPropertyName("FailRestartable")] - public List? FailRestartable { get; set; } + public List? FailRestartable { get; set; } [JsonPropertyName("Expired")] - public List? Expired { get; set; } -} - -public class QuestReward -{ - [JsonPropertyName("value")] - public object? Value { get; set; } // TODO: Can be either string or number - - [JsonPropertyName("id")] - public string? Id { get; set; } - - [JsonPropertyName("type")] - public QuestRewardType? Type { get; set; } // QuestRewardType - - [JsonPropertyName("index")] - public int? Index { get; set; } - - [JsonPropertyName("target")] - public string? Target { get; set; } - - [JsonPropertyName("items")] - public List? Items { get; set; } - - [JsonPropertyName("loyaltyLevel")] - public int? LoyaltyLevel { get; set; } - - /** Hideout area id */ - [JsonPropertyName("traderId")] - public object? TraderId { get; set; } // TODO: string | int - - [JsonPropertyName("isEncoded")] - public bool? IsEncoded { get; set; } - - [JsonPropertyName("unknown")] - public bool? Unknown { get; set; } - - [JsonPropertyName("findInRaid")] - public bool? FindInRaid { get; set; } - - [JsonPropertyName("gameMode")] - public List? GameMode { get; set; } - - /** Game editions whitelisted to get reward */ - [JsonPropertyName("availableInGameEditions")] - public List? AvailableInGameEditions { get; set; } - - /** Game editions blacklisted from getting reward */ - [JsonPropertyName("notAvailableInGameEditions")] - public List? NotAvailableInGameEditions { get; set; } - - // This is always Null atm in the achievements.json - [JsonPropertyName("illustrationConfig")] - public object? IllustrationConfig { get; set; } - - [JsonPropertyName("isHidden")] - public bool? IsHidden { get; set; } + public List? Expired { get; set; } } diff --git a/Core/Models/Eft/Common/Tables/Reward.cs b/Core/Models/Eft/Common/Tables/Reward.cs new file mode 100644 index 00000000..5b8a4836 --- /dev/null +++ b/Core/Models/Eft/Common/Tables/Reward.cs @@ -0,0 +1,59 @@ +using System.Text.Json.Serialization; +using Core.Models.Enums; + +namespace Core.Models.Eft.Common.Tables; + +public class Reward +{ + [JsonPropertyName("value")] + public object? Value { get; set; } // TODO: Can be either string or number + + [JsonPropertyName("id")] + public string? Id { get; set; } + + [JsonPropertyName("type")] + public RewardType? Type { get; set; } + + [JsonPropertyName("index")] + public int? Index { get; set; } + + [JsonPropertyName("target")] + public string? Target { get; set; } + + [JsonPropertyName("items")] + public List? Items { get; set; } + + [JsonPropertyName("loyaltyLevel")] + public int? LoyaltyLevel { get; set; } + + /** Hideout area id */ + [JsonPropertyName("traderId")] + public object? TraderId { get; set; } // TODO: string | int + + [JsonPropertyName("isEncoded")] + public bool? IsEncoded { get; set; } + + [JsonPropertyName("unknown")] + public bool? Unknown { get; set; } + + [JsonPropertyName("findInRaid")] + public bool? FindInRaid { get; set; } + + [JsonPropertyName("gameMode")] + public List? GameMode { get; set; } + + /** Game editions whitelisted to get reward */ + [JsonPropertyName("availableInGameEditions")] + public List? AvailableInGameEditions { get; set; } + + /** Game editions blacklisted from getting reward */ + [JsonPropertyName("notAvailableInGameEditions")] + public List? NotAvailableInGameEditions { get; set; } + + // This is always Null atm in the achievements.json + [JsonPropertyName("illustrationConfig")] + public object? IllustrationConfig { get; set; } + + [JsonPropertyName("isHidden")] + public bool? IsHidden { get; set; } +} diff --git a/Core/Models/Enums/QuestRewardType.cs b/Core/Models/Enums/RewardType.cs similarity index 91% rename from Core/Models/Enums/QuestRewardType.cs rename to Core/Models/Enums/RewardType.cs index f91ce754..26b8d5df 100644 --- a/Core/Models/Enums/QuestRewardType.cs +++ b/Core/Models/Enums/RewardType.cs @@ -1,6 +1,6 @@ namespace Core.Models.Enums; -public enum QuestRewardType +public enum RewardType { Skill, Experience, diff --git a/Core/Services/ProfileFixerService.cs b/Core/Services/ProfileFixerService.cs index 855ce730..355b031f 100644 --- a/Core/Services/ProfileFixerService.cs +++ b/Core/Services/ProfileFixerService.cs @@ -362,7 +362,7 @@ public class ProfileFixerService if (profileQuest.Status is QuestStatusEnum.Started or QuestStatusEnum.Success) { var productionRewards = quest.Rewards.Started?.Where( - (reward) => reward.Type == QuestRewardType.ProductionScheme); + (reward) => reward.Type == RewardType.ProductionScheme); if (productionRewards is not null) { @@ -377,7 +377,7 @@ public class ProfileFixerService if (profileQuest.Status is QuestStatusEnum.Success) { var productionRewards = quest.Rewards.Success?.Where( - (reward) => reward.Type == QuestRewardType.ProductionScheme); + (reward) => reward.Type == RewardType.ProductionScheme); if (productionRewards is not null) { @@ -396,7 +396,7 @@ public class ProfileFixerService /// Profile to check /// The quest reward to validate /// The quest the reward belongs to - protected void VerifyQuestProductionUnlock(PmcData pmcProfile, QuestReward productionUnlockReward, Quest questDetails) + protected void VerifyQuestProductionUnlock(PmcData pmcProfile, Reward productionUnlockReward, Quest questDetails) { var matchingProductions = _questRewardHelper.GetRewardProductionMatch( productionUnlockReward, diff --git a/Core/Utils/JsonUtil.cs b/Core/Utils/JsonUtil.cs index 21336c6f..4629eed9 100644 --- a/Core/Utils/JsonUtil.cs +++ b/Core/Utils/JsonUtil.cs @@ -28,7 +28,7 @@ public class JsonUtil new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), - new EftEnumConverter(), + new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter()