fix: complete junction data and crash in vors prize mission four #1001
8
package-lock.json
generated
8
package-lock.json
generated
@ -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",
|
||||
|
@ -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"
|
||||
|
@ -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 => {
|
||||
|
@ -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<IInventoryDatabase>,
|
||||
@ -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;
|
||||
|
||||
|
@ -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<IQuestKeyDatabase, "CompletionDate">[];
|
||||
@ -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/", ""));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user