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",
 | 
					        "copyfiles": "^2.4.1",
 | 
				
			||||||
        "express": "^5",
 | 
					        "express": "^5",
 | 
				
			||||||
        "mongoose": "^8.9.4",
 | 
					        "mongoose": "^8.9.4",
 | 
				
			||||||
        "warframe-public-export-plus": "^0.5.30",
 | 
					        "warframe-public-export-plus": "^0.5.35",
 | 
				
			||||||
        "warframe-riven-info": "^0.1.2",
 | 
					        "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
        "winston": "^3.17.0",
 | 
					        "winston": "^3.17.0",
 | 
				
			||||||
        "winston-daily-rotate-file": "^5.0.0"
 | 
					        "winston-daily-rotate-file": "^5.0.0"
 | 
				
			||||||
@ -4093,9 +4093,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-public-export-plus": {
 | 
					    "node_modules/warframe-public-export-plus": {
 | 
				
			||||||
      "version": "0.5.32",
 | 
					      "version": "0.5.35",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.32.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.35.tgz",
 | 
				
			||||||
      "integrity": "sha512-jO9i2Gzz9DWibiHlEO17D975ajs6KrTay8cS5I0GkUUe1XWVU8mML4b+IYCHzM4FWq1t6p2YPCGznQfknqvorg=="
 | 
					      "integrity": "sha512-YLQP1n5sOV+PS5hfC4Kuoapa9gsqOy5Qy/E4EYfRV/xJBruFl3tPhbdbgFn3HhL2OBrgRJ8yzT5bjIvaHKhOCw=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-riven-info": {
 | 
					    "node_modules/warframe-riven-info": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
				
			|||||||
@ -17,7 +17,7 @@
 | 
				
			|||||||
    "copyfiles": "^2.4.1",
 | 
					    "copyfiles": "^2.4.1",
 | 
				
			||||||
    "express": "^5",
 | 
					    "express": "^5",
 | 
				
			||||||
    "mongoose": "^8.9.4",
 | 
					    "mongoose": "^8.9.4",
 | 
				
			||||||
    "warframe-public-export-plus": "^0.5.30",
 | 
					    "warframe-public-export-plus": "^0.5.35",
 | 
				
			||||||
    "warframe-riven-info": "^0.1.2",
 | 
					    "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
    "winston": "^3.17.0",
 | 
					    "winston": "^3.17.0",
 | 
				
			||||||
    "winston-daily-rotate-file": "^5.0.0"
 | 
					    "winston-daily-rotate-file": "^5.0.0"
 | 
				
			||||||
 | 
				
			|||||||
@ -163,20 +163,21 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getLevelKeyRewards = (levelKey: string) => {
 | 
					export const getLevelKeyRewards = (levelKey: string) => {
 | 
				
			||||||
    const levelKeyData = ExportKeys[levelKey];
 | 
					    if (!ExportKeys[levelKey]) {
 | 
				
			||||||
    if (!levelKeyData) {
 | 
					        throw new Error(`LevelKey ${levelKey} not found`);
 | 
				
			||||||
        const error = `LevelKey ${levelKey} not found`;
 | 
					 | 
				
			||||||
        logger.error(error);
 | 
					 | 
				
			||||||
        throw new Error(error);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!levelKeyData.rewards) {
 | 
					    const levelKeyRewards = ExportKeys[levelKey]?.missionReward;
 | 
				
			||||||
        const error = `LevelKey ${levelKey} does not contain rewards`;
 | 
					    const levelKeyRewards2 = ExportKeys[levelKey]?.rewards;
 | 
				
			||||||
        logger.error(error);
 | 
					
 | 
				
			||||||
        throw new Error(error);
 | 
					    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 => {
 | 
					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 { IMissionInventoryUpdateRequest, IRewardInfo } from "../types/requestTypes";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { IRngResult, getRandomReward } from "@/src/services/rngService";
 | 
					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 { InventoryDocumentProps, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			||||||
import { getEntriesUnsafe } from "@/src/utils/ts-utils";
 | 
					import { getEntriesUnsafe } from "@/src/utils/ts-utils";
 | 
				
			||||||
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
 | 
					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 { handleStoreItemAcquisition } from "./purchaseService";
 | 
				
			||||||
 | 
					import { IMissionReward } from "../types/missionTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getRotations = (rotationCount: number): number[] => {
 | 
					const getRotations = (rotationCount: number): number[] => {
 | 
				
			||||||
    if (rotationCount === 0) return [0];
 | 
					    if (rotationCount === 0) return [0];
 | 
				
			||||||
@ -258,31 +263,38 @@ export const addMissionRewards = async (
 | 
				
			|||||||
    if (levelKeyName) {
 | 
					    if (levelKeyName) {
 | 
				
			||||||
        const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
 | 
					        const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
 | 
				
			||||||
        //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
					        //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
				
			||||||
        for (const reward of fixedLevelRewards) {
 | 
					        if (fixedLevelRewards.levelKeyRewards) {
 | 
				
			||||||
            //quest stage completion credit rewards
 | 
					            addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, MissionRewards);
 | 
				
			||||||
            if (reward.rewardType == "RT_CREDITS") {
 | 
					        }
 | 
				
			||||||
                inventory.RegularCredits += reward.amount;
 | 
					        if (fixedLevelRewards.levelKeyRewards2) {
 | 
				
			||||||
                missionCompletionCredits += reward.amount;
 | 
					            for (const reward of fixedLevelRewards.levelKeyRewards2) {
 | 
				
			||||||
                continue;
 | 
					                //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) {
 | 
					    if (missions) {
 | 
				
			||||||
        const junctionReward = (junctionRewards as IJunctionRewards)[rewardInfo.node];
 | 
					        const node = getNode(missions.Tag);
 | 
				
			||||||
        for (const item of junctionReward.items) {
 | 
					
 | 
				
			||||||
            MissionRewards.push({
 | 
					        //node based credit rewards for mission completion
 | 
				
			||||||
                StoreItem: item.ItemType,
 | 
					        if (node.missionIndex !== 28) {
 | 
				
			||||||
                ItemCount: item.ItemCount
 | 
					            const levelCreditReward = getLevelCreditRewards(missions?.Tag);
 | 
				
			||||||
            });
 | 
					            missionCompletionCredits += levelCreditReward;
 | 
				
			||||||
 | 
					            inventory.RegularCredits += levelCreditReward;
 | 
				
			||||||
 | 
					            logger.debug(`levelCreditReward ${levelCreditReward}`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (junctionReward.credits) {
 | 
					
 | 
				
			||||||
            inventory.RegularCredits += junctionReward.credits;
 | 
					        if (node.missionReward) {
 | 
				
			||||||
            missionCompletionCredits += junctionReward.credits;
 | 
					            missionCompletionCredits += addFixedLevelRewards(node.missionReward, inventory, MissionRewards);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -294,19 +306,6 @@ export const addMissionRewards = async (
 | 
				
			|||||||
        combineInventoryChanges(inventoryChanges, inventoryChange.InventoryChanges);
 | 
					        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, {
 | 
					    const credits = addCredits(inventory, {
 | 
				
			||||||
        missionCompletionCredits,
 | 
					        missionCompletionCredits,
 | 
				
			||||||
        missionDropCredits: creditDrops ?? 0,
 | 
					        missionDropCredits: creditDrops ?? 0,
 | 
				
			||||||
@ -316,7 +315,7 @@ export const addMissionRewards = async (
 | 
				
			|||||||
    return { inventoryChanges, MissionRewards, credits };
 | 
					    return { inventoryChanges, MissionRewards, credits };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//slightly inaccurate compared to official
 | 
					//creditBonus is not entirely accurate.
 | 
				
			||||||
//TODO: consider ActiveBoosters
 | 
					//TODO: consider ActiveBoosters
 | 
				
			||||||
export const addCredits = (
 | 
					export const addCredits = (
 | 
				
			||||||
    inventory: HydratedDocument<IInventoryDatabase>,
 | 
					    inventory: HydratedDocument<IInventoryDatabase>,
 | 
				
			||||||
@ -348,6 +347,40 @@ export const addCredits = (
 | 
				
			|||||||
    return { ...finalCredits, DailyMissionBonus: true };
 | 
					    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 {
 | 
					function getLevelCreditRewards(nodeName: string): number {
 | 
				
			||||||
    const minEnemyLevel = getNode(nodeName).minEnemyLevel;
 | 
					    const minEnemyLevel = getNode(nodeName).minEnemyLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,7 @@ import {
 | 
				
			|||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { HydratedDocument } from "mongoose";
 | 
					import { HydratedDocument } from "mongoose";
 | 
				
			||||||
import { ExportKeys } from "warframe-public-export-plus";
 | 
					import { ExportKeys } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { addFixedLevelRewards } from "./missionInventoryUpdateService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IUpdateQuestRequest {
 | 
					export interface IUpdateQuestRequest {
 | 
				
			||||||
    QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
 | 
					    QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
 | 
				
			||||||
@ -136,16 +137,25 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest
 | 
				
			|||||||
        const missionName = chainStages[i].key;
 | 
					        const missionName = chainStages[i].key;
 | 
				
			||||||
        if (missionName) {
 | 
					        if (missionName) {
 | 
				
			||||||
            const fixedLevelRewards = getLevelKeyRewards(missionName);
 | 
					            const fixedLevelRewards = getLevelKeyRewards(missionName);
 | 
				
			||||||
            //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
					            //logger.debug(`fixedLevelRewards`, fixedLevelRewards);
 | 
				
			||||||
            for (const reward of fixedLevelRewards) {
 | 
					            if (fixedLevelRewards.levelKeyRewards) {
 | 
				
			||||||
                if (reward.rewardType == "RT_CREDITS") {
 | 
					                const missionRewards: { StoreItem: string; ItemCount: number }[] = [];
 | 
				
			||||||
                    inventory.RegularCredits += reward.amount;
 | 
					                addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, missionRewards);
 | 
				
			||||||
                    continue;
 | 
					
 | 
				
			||||||
 | 
					                for (const reward of missionRewards) {
 | 
				
			||||||
 | 
					                    await addItem(inventory, reward.StoreItem.replace("StoreItems/", ""), reward.ItemCount);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (reward.rewardType == "RT_RESOURCE") {
 | 
					            } else if (fixedLevelRewards.levelKeyRewards2) {
 | 
				
			||||||
                    await addItem(inventory, reward.itemType.replace("StoreItems/", ""), reward.amount);
 | 
					                for (const reward of fixedLevelRewards.levelKeyRewards2) {
 | 
				
			||||||
                } else {
 | 
					                    if (reward.rewardType == "RT_CREDITS") {
 | 
				
			||||||
                    await addItem(inventory, reward.itemType.replace("StoreItems/", ""));
 | 
					                        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