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,7 +263,11 @@ export const addMissionRewards = async (
 | 
			
		||||
    if (levelKeyName) {
 | 
			
		||||
        const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
 | 
			
		||||
        //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
			
		||||
        for (const reward of fixedLevelRewards) {
 | 
			
		||||
        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;
 | 
			
		||||
@ -271,18 +280,21 @@ export const addMissionRewards = async (
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    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 (junctionReward.credits) {
 | 
			
		||||
            inventory.RegularCredits += junctionReward.credits;
 | 
			
		||||
            missionCompletionCredits += junctionReward.credits;
 | 
			
		||||
 | 
			
		||||
    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 (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,8 +137,16 @@ 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) {
 | 
			
		||||
            //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);
 | 
			
		||||
                }
 | 
			
		||||
            } else if (fixedLevelRewards.levelKeyRewards2) {
 | 
			
		||||
                for (const reward of fixedLevelRewards.levelKeyRewards2) {
 | 
			
		||||
                    if (reward.rewardType == "RT_CREDITS") {
 | 
			
		||||
                        inventory.RegularCredits += reward.amount;
 | 
			
		||||
                        continue;
 | 
			
		||||
@ -150,6 +159,7 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    inventory.ActiveQuest = "";
 | 
			
		||||
    //TODO: handle quest completion items
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user