From 045d93345882c31739e4b35a8de5cac745bddded Mon Sep 17 00:00:00 2001 From: OrdisPrime <134585663+OrdisPrime@users.noreply.github.com> Date: Mon, 24 Feb 2025 08:50:07 -0800 Subject: [PATCH] fix: complete junction data and crash in vors prize mission four (#1001) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1001 Co-authored-by: OrdisPrime <134585663+OrdisPrime@users.noreply.github.com> Co-committed-by: OrdisPrime <134585663+OrdisPrime@users.noreply.github.com> --- package-lock.json | 8 +- package.json | 2 +- src/services/itemDataService.ts | 21 ++-- src/services/missionInventoryUpdateService.ts | 107 ++++++++++++------ src/services/questService.ts | 28 +++-- 5 files changed, 105 insertions(+), 61 deletions(-) diff --git a/package-lock.json b/package-lock.json index a43d45a2e..a46ffbde6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.30", + "warframe-public-export-plus": "^0.5.35", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" @@ -4093,9 +4093,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.32.tgz", - "integrity": "sha512-jO9i2Gzz9DWibiHlEO17D975ajs6KrTay8cS5I0GkUUe1XWVU8mML4b+IYCHzM4FWq1t6p2YPCGznQfknqvorg==" + "version": "0.5.35", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.35.tgz", + "integrity": "sha512-YLQP1n5sOV+PS5hfC4Kuoapa9gsqOy5Qy/E4EYfRV/xJBruFl3tPhbdbgFn3HhL2OBrgRJ8yzT5bjIvaHKhOCw==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index d26bee377..64eb538f6 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.30", + "warframe-public-export-plus": "^0.5.35", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index d68ef666d..c18f3021f 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -163,20 +163,21 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st }; export const getLevelKeyRewards = (levelKey: string) => { - const levelKeyData = ExportKeys[levelKey]; - if (!levelKeyData) { - const error = `LevelKey ${levelKey} not found`; - logger.error(error); - throw new Error(error); + if (!ExportKeys[levelKey]) { + throw new Error(`LevelKey ${levelKey} not found`); } - if (!levelKeyData.rewards) { - const error = `LevelKey ${levelKey} does not contain rewards`; - logger.error(error); - throw new Error(error); + const levelKeyRewards = ExportKeys[levelKey]?.missionReward; + const levelKeyRewards2 = ExportKeys[levelKey]?.rewards; + + if (!levelKeyRewards && !levelKeyRewards2) { + throw new Error(`LevelKey ${levelKey} does not contain either rewards1 or rewards2`); } - return levelKeyData.rewards; + return { + levelKeyRewards, + levelKeyRewards2 + }; }; export const getNode = (nodeName: string): IRegion => { diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 5d7ecf16a..2fd250300 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1,4 +1,10 @@ -import { ExportFusionBundles, ExportRegions, ExportRewards, IReward } from "warframe-public-export-plus"; +import { + ExportFusionBundles, + ExportRegions, + ExportRewards, + IMissionReward as IMissionRewardExternal, + IReward +} from "warframe-public-export-plus"; import { IMissionInventoryUpdateRequest, IRewardInfo } from "../types/requestTypes"; import { logger } from "@/src/utils/logger"; import { IRngResult, getRandomReward } from "@/src/services/rngService"; @@ -25,9 +31,8 @@ import { getLevelKeyRewards, getNode } from "@/src/services/itemDataService"; import { InventoryDocumentProps, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { getEntriesUnsafe } from "@/src/utils/ts-utils"; import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; -import junctionRewards from "@/static/fixed_responses/junctionRewards.json"; -import { IJunctionRewards } from "@/src/types/commonTypes"; import { handleStoreItemAcquisition } from "./purchaseService"; +import { IMissionReward } from "../types/missionTypes"; const getRotations = (rotationCount: number): number[] => { if (rotationCount === 0) return [0]; @@ -258,31 +263,38 @@ export const addMissionRewards = async ( if (levelKeyName) { const fixedLevelRewards = getLevelKeyRewards(levelKeyName); //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`); - for (const reward of fixedLevelRewards) { - //quest stage completion credit rewards - if (reward.rewardType == "RT_CREDITS") { - inventory.RegularCredits += reward.amount; - missionCompletionCredits += reward.amount; - continue; + if (fixedLevelRewards.levelKeyRewards) { + addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, MissionRewards); + } + if (fixedLevelRewards.levelKeyRewards2) { + for (const reward of fixedLevelRewards.levelKeyRewards2) { + //quest stage completion credit rewards + if (reward.rewardType == "RT_CREDITS") { + inventory.RegularCredits += reward.amount; + missionCompletionCredits += reward.amount; + continue; + } + MissionRewards.push({ + StoreItem: reward.itemType, + ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1 + }); } - MissionRewards.push({ - StoreItem: reward.itemType, - ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1 - }); } } - if (rewardInfo.node in junctionRewards) { - const junctionReward = (junctionRewards as IJunctionRewards)[rewardInfo.node]; - for (const item of junctionReward.items) { - MissionRewards.push({ - StoreItem: item.ItemType, - ItemCount: item.ItemCount - }); + if (missions) { + const node = getNode(missions.Tag); + + //node based credit rewards for mission completion + if (node.missionIndex !== 28) { + const levelCreditReward = getLevelCreditRewards(missions?.Tag); + missionCompletionCredits += levelCreditReward; + inventory.RegularCredits += levelCreditReward; + logger.debug(`levelCreditReward ${levelCreditReward}`); } - if (junctionReward.credits) { - inventory.RegularCredits += junctionReward.credits; - missionCompletionCredits += junctionReward.credits; + + if (node.missionReward) { + missionCompletionCredits += addFixedLevelRewards(node.missionReward, inventory, MissionRewards); } } @@ -294,19 +306,6 @@ export const addMissionRewards = async ( combineInventoryChanges(inventoryChanges, inventoryChange.InventoryChanges); } - //node based credit rewards for mission completion - if (missions) { - const node = getNode(missions.Tag); - - if (node.missionIndex !== 28) { - const levelCreditReward = getLevelCreditRewards(missions?.Tag); - missionCompletionCredits += levelCreditReward; - inventory.RegularCredits += levelCreditReward; - logger.debug(`levelCreditReward ${levelCreditReward}`); - } - } - - //creditBonus is not correct for mirage mission 3 const credits = addCredits(inventory, { missionCompletionCredits, missionDropCredits: creditDrops ?? 0, @@ -316,7 +315,7 @@ export const addMissionRewards = async ( return { inventoryChanges, MissionRewards, credits }; }; -//slightly inaccurate compared to official +//creditBonus is not entirely accurate. //TODO: consider ActiveBoosters export const addCredits = ( inventory: HydratedDocument, @@ -348,6 +347,40 @@ export const addCredits = ( return { ...finalCredits, DailyMissionBonus: true }; }; +export const addFixedLevelRewards = ( + rewards: IMissionRewardExternal, + inventory: TInventoryDatabaseDocument, + MissionRewards: IMissionReward[] +) => { + let missionBonusCredits = 0; + if (rewards.credits) { + missionBonusCredits += rewards.credits; + inventory.RegularCredits += rewards.credits; + } + if (rewards.items) { + for (const item of rewards.items) { + MissionRewards.push({ + StoreItem: `/Lotus/StoreItems${item.substring("Lotus/".length)}`, + ItemCount: 1 + }); + } + } + if (rewards.countedItems) { + for (const item of rewards.countedItems) { + MissionRewards.push({ + StoreItem: `/Lotus/StoreItems${item.ItemType.substring("Lotus/".length)}`, + ItemCount: item.ItemCount + }); + } + } + if (rewards.countedStoreItems) { + for (const item of rewards.countedStoreItems) { + MissionRewards.push(item); + } + } + return missionBonusCredits; +}; + function getLevelCreditRewards(nodeName: string): number { const minEnemyLevel = getNode(nodeName).minEnemyLevel; diff --git a/src/services/questService.ts b/src/services/questService.ts index e9899721d..f7b502d5c 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -14,6 +14,7 @@ import { import { logger } from "@/src/utils/logger"; import { HydratedDocument } from "mongoose"; import { ExportKeys } from "warframe-public-export-plus"; +import { addFixedLevelRewards } from "./missionInventoryUpdateService"; export interface IUpdateQuestRequest { QuestKeys: Omit[]; @@ -136,16 +137,25 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest const missionName = chainStages[i].key; if (missionName) { const fixedLevelRewards = getLevelKeyRewards(missionName); - //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`); - for (const reward of fixedLevelRewards) { - if (reward.rewardType == "RT_CREDITS") { - inventory.RegularCredits += reward.amount; - continue; + //logger.debug(`fixedLevelRewards`, fixedLevelRewards); + if (fixedLevelRewards.levelKeyRewards) { + const missionRewards: { StoreItem: string; ItemCount: number }[] = []; + addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, missionRewards); + + for (const reward of missionRewards) { + await addItem(inventory, reward.StoreItem.replace("StoreItems/", ""), reward.ItemCount); } - if (reward.rewardType == "RT_RESOURCE") { - await addItem(inventory, reward.itemType.replace("StoreItems/", ""), reward.amount); - } else { - await addItem(inventory, reward.itemType.replace("StoreItems/", "")); + } else if (fixedLevelRewards.levelKeyRewards2) { + for (const reward of fixedLevelRewards.levelKeyRewards2) { + if (reward.rewardType == "RT_CREDITS") { + inventory.RegularCredits += reward.amount; + continue; + } + if (reward.rewardType == "RT_RESOURCE") { + await addItem(inventory, reward.itemType.replace("StoreItems/", ""), reward.amount); + } else { + await addItem(inventory, reward.itemType.replace("StoreItems/", "")); + } } } }