From 82fe598056bfb025a7ed5f4e04e2561c80abba0f Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 2 Nov 2025 23:26:31 -0800 Subject: [PATCH] chore: override vor's prize level key rewards for pre-U40 clients (#2975) Closes #2974 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2975 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- .../custom/manageQuestsController.ts | 18 +- src/services/inventoryService.ts | 5 +- src/services/itemDataService.ts | 13 +- src/services/missionInventoryUpdateService.ts | 2 +- src/services/questService.ts | 15 +- .../vorsPrizePreU40Rewards.json | 165 ++++++++++++++++++ 6 files changed, 200 insertions(+), 18 deletions(-) create mode 100644 static/fixed_responses/vorsPrizePreU40Rewards.json diff --git a/src/controllers/custom/manageQuestsController.ts b/src/controllers/custom/manageQuestsController.ts index 5fc3a964..11622d68 100644 --- a/src/controllers/custom/manageQuestsController.ts +++ b/src/controllers/custom/manageQuestsController.ts @@ -37,7 +37,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => { switch (operation) { case "completeAll": { for (const questKey of inventory.QuestKeys) { - await completeQuest(inventory, questKey.ItemType); + await completeQuest(inventory, questKey.ItemType, undefined); } break; } @@ -72,7 +72,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => { break; } - await completeQuest(inventory, questItemType); + await completeQuest(inventory, questItemType, undefined); } break; } @@ -137,7 +137,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => { if (currentStage + 1 == questManifest.chainStages?.length) { logger.debug(`Trying to complete last stage with nextStage, calling completeQuest instead`); - await completeQuest(inventory, questKey.ItemType, true); + await completeQuest(inventory, questKey.ItemType, undefined, true); } else { if (run > 0) { questKey.Progress[currentStage + 1].c = run; @@ -151,10 +151,14 @@ export const manageQuestsController: RequestHandler = async (req, res) => { }); if (currentStage > 0) { - await giveKeyChainMissionReward(inventory, { - KeyChain: questKey.ItemType, - ChainStage: currentStage - }); + await giveKeyChainMissionReward( + inventory, + { + KeyChain: questKey.ItemType, + ChainStage: currentStage + }, + undefined + ); } } } diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 66668b68..976658d5 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -116,8 +116,8 @@ export const createInventory = async ( if (config.skipTutorial) { inventory.PlayedParkourTutorial = true; await addStartingGear(inventory); - await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain"); - await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain"); + await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain", undefined); + await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain", undefined); const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"]; @@ -1569,6 +1569,7 @@ const addCrewShip = async ( const questChanges = await completeQuest( inventory, "/Lotus/Types/Keys/RailJackBuildQuest/RailjackBuildQuestKeyChain", + undefined, false ); if (questChanges) { diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index 3fead3d3..0181bf82 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -40,6 +40,8 @@ import { } from "warframe-public-export-plus"; import type { IMessage } from "../models/inboxModel.ts"; import { logger } from "../utils/logger.ts"; +import { version_compare } from "../helpers/inventoryHelpers.ts"; +import vorsPrizePreU40Rewards from "../../static/fixed_responses/vorsPrizePreU40Rewards.json" with { type: "json" }; export type WeaponTypeInternal = | "LongGuns" @@ -227,12 +229,13 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st }; export const getLevelKeyRewards = ( - levelKey: string + levelKey: string, + buildLabel: string | undefined ): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[] } => { const key = ExportKeys[levelKey] as IKey | undefined; const levelKeyRewards = key?.missionReward; - const levelKeyRewards2 = key?.rewards; + let levelKeyRewards2 = key?.rewards; if (!levelKeyRewards && !levelKeyRewards2) { logger.warn( @@ -240,6 +243,12 @@ export const getLevelKeyRewards = ( ); } + if (buildLabel && version_compare(buildLabel, "2025.10.14.16.10") < 0) { + if (levelKey in vorsPrizePreU40Rewards) { + levelKeyRewards2 = vorsPrizePreU40Rewards[levelKey as keyof typeof vorsPrizePreU40Rewards] as TReward[]; + } + } + return { levelKeyRewards, levelKeyRewards2 diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 89463af7..aafaec0a 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1219,7 +1219,7 @@ export const addMissionRewards = async ( } if (levelKeyName) { - const fixedLevelRewards = getLevelKeyRewards(levelKeyName); + const fixedLevelRewards = getLevelKeyRewards(levelKeyName, account.BuildLabel); //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`); if (fixedLevelRewards.levelKeyRewards) { missionCompletionCredits += addFixedLevelRewards( diff --git a/src/services/questService.ts b/src/services/questService.ts index eb150eb6..10eff9c6 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -149,6 +149,7 @@ export const addQuestKey = ( export const completeQuest = async ( inventory: TInventoryDatabaseDocument, questKey: string, + buildLabel: string | undefined, sendMessages: boolean = false ): Promise => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -197,8 +198,8 @@ export const completeQuest = async ( if (stage.c <= run) { stage.c = run; await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i }, sendMessages); - await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i }); - await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i }); + await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel); + await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel); } } @@ -400,7 +401,8 @@ export const giveKeyChainMessage = async ( export const giveKeyChainMissionReward = async ( inventory: TInventoryDatabaseDocument, - keyChainInfo: IKeyChainRequest + keyChainInfo: IKeyChainRequest, + buildLabel: string | undefined ): Promise => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages; @@ -409,7 +411,7 @@ export const giveKeyChainMissionReward = async ( const missionName = chainStages[keyChainInfo.ChainStage].key; const questKey = inventory.QuestKeys.find(q => q.ItemType === keyChainInfo.KeyChain); if (missionName && questKey) { - const fixedLevelRewards = getLevelKeyRewards(missionName); + const fixedLevelRewards = getLevelKeyRewards(missionName, buildLabel); const run = questKey.Progress?.[0]?.c ?? 0; if (fixedLevelRewards.levelKeyRewards) { const missionRewards: { StoreItem: string; ItemCount: number }[] = []; @@ -463,7 +465,8 @@ export const giveKeyChainStageTriggered = async ( export const installShipFeatures = async ( inventory: TInventoryDatabaseDocument, - keyChainInfo: IKeyChainRequest + keyChainInfo: IKeyChainRequest, + buildLabel: string | undefined ): Promise => { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages; @@ -478,7 +481,7 @@ export const installShipFeatures = async ( } } if (prevStage.key) { - const fixedLevelRewards = getLevelKeyRewards(prevStage.key); + const fixedLevelRewards = getLevelKeyRewards(prevStage.key, buildLabel); if (fixedLevelRewards.levelKeyRewards?.items) { for (const item of fixedLevelRewards.levelKeyRewards.items) { if (item.startsWith("/Lotus/StoreItems/Types/Items/ShipFeatureItems/")) { diff --git a/static/fixed_responses/vorsPrizePreU40Rewards.json b/static/fixed_responses/vorsPrizePreU40Rewards.json new file mode 100644 index 00000000..7f667ca8 --- /dev/null +++ b/static/fixed_responses/vorsPrizePreU40Rewards.json @@ -0,0 +1,165 @@ +{ + "/Lotus/Types/Keys/VorsPrize/MissionOne": [ + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/SocialMenuFeatureItem" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponMeleeDamageMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponDamageAmountMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponDamageAmountMod" + }, + { + "rewardType": "RT_CREDITS", + "amount": 2500 + } + ], + "/Lotus/Types/Keys/VorsPrize/MissionTwo": [ + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/ModsFeatureItem" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarHealthMaxMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarShieldMaxMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityRangeMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityStrengthMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityDurationMod" + }, + { + "rewardType": "RT_CREDITS", + "amount": 2500 + } + ], + "/Lotus/Types/Keys/VorsPrize/MissionThree": { + "name": "/Lotus/Language/G1Quests/VorsPrize3", + "parentName": "/Lotus/Types/Keys/TestKeyA", + "codexSecret": true, + "rewards": [ + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/FoundryFeatureItem" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponFireRateMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageCorpus" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageGrineer" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponFireDamageMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponElectricityDamageMod" + }, + { + "rewardType": "RT_CREDITS", + "amount": 2500 + } + ] + }, + "/Lotus/Types/Keys/VorsPrize/MissionFour": [ + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPickupBonusMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPowerMaxMod" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarEnemyRadarMod" + }, + { + "rewardType": "RT_CREDITS", + "amount": 2500 + } + ], + "/Lotus/Types/Keys/VorsPrize/MissionFive": [ + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_STORE_ITEM", + "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle" + }, + { + "rewardType": "RT_CREDITS", + "amount": 5000 + } + ] +}