chore: override vor's prize level key rewards for pre-U40 clients (#2975)
Some checks failed
Build Docker image / docker (push) Waiting to run
Build / build (push) Has been cancelled

Closes #2974

Reviewed-on: #2975
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
Sainan 2025-11-02 23:26:31 -08:00 committed by Sainan
parent bc271216ac
commit 82fe598056
6 changed files with 200 additions and 18 deletions

View File

@ -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
);
}
}
}

View File

@ -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) {

View File

@ -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

View File

@ -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(

View File

@ -149,6 +149,7 @@ export const addQuestKey = (
export const completeQuest = async (
inventory: TInventoryDatabaseDocument,
questKey: string,
buildLabel: string | undefined,
sendMessages: boolean = false
): Promise<void | IQuestKeyClient> => {
// 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<void> => {
// 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<void> => {
// 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/")) {

View File

@ -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
}
]
}