parent
							
								
									0e7c124d26
								
							
						
					
					
						commit
						5342c5a435
					
				@ -3,8 +3,7 @@ import { parseString } from "@/src/helpers/general";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
			
		||||
import { updateQuestKey, IUpdateQuestRequest } from "@/src/services/questService";
 | 
			
		||||
import { getQuestCompletionItems } from "@/src/services/itemDataService";
 | 
			
		||||
import { addItems, getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { getInventory, handleKeyRewards } from "@/src/services/inventoryService";
 | 
			
		||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
			
		||||
 | 
			
		||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
 | 
			
		||||
@ -27,13 +26,7 @@ export const updateQuestController: RequestHandler = async (req, res) => {
 | 
			
		||||
    if (updateQuestRequest.QuestKeys[0].Completed) {
 | 
			
		||||
        logger.debug(`completed quest ${updateQuestRequest.QuestKeys[0].ItemType} `);
 | 
			
		||||
        const questKeyName = updateQuestRequest.QuestKeys[0].ItemType;
 | 
			
		||||
        const questCompletionItems = getQuestCompletionItems(questKeyName);
 | 
			
		||||
        logger.debug(`quest completion items`, questCompletionItems);
 | 
			
		||||
 | 
			
		||||
        if (questCompletionItems) {
 | 
			
		||||
            const inventoryChanges = await addItems(inventory, questCompletionItems);
 | 
			
		||||
            updateQuestResponse.InventoryChanges = inventoryChanges;
 | 
			
		||||
        }
 | 
			
		||||
        updateQuestResponse.InventoryChanges = await handleKeyRewards(inventory, questKeyName);
 | 
			
		||||
        inventory.ActiveQuest = "";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@ import {
 | 
			
		||||
    IUpdateChallengeProgressRequest
 | 
			
		||||
} from "../types/requestTypes";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
import { getExalted, getKeyChainItems } from "@/src/services/itemDataService";
 | 
			
		||||
import { getExalted, getKeyChainItems, getKeyRewards } from "@/src/services/itemDataService";
 | 
			
		||||
import { IEquipmentClient, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes";
 | 
			
		||||
import {
 | 
			
		||||
    ExportArcanes,
 | 
			
		||||
@ -50,6 +50,7 @@ import { createShip } from "./shipService";
 | 
			
		||||
import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpdateService";
 | 
			
		||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
 | 
			
		||||
import { toOid } from "../helpers/inventoryHelpers";
 | 
			
		||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
			
		||||
 | 
			
		||||
export const createInventory = async (
 | 
			
		||||
    accountOwnerId: Types.ObjectId,
 | 
			
		||||
@ -464,20 +465,29 @@ export const addItem = async (
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                case "Game": {
 | 
			
		||||
                    if (typeName.substr(1).split("/")[3] == "Projections") {
 | 
			
		||||
                        // Void Relics, e.g. /Lotus/Types/Game/Projections/T2VoidProjectionGaussPrimeDBronze
 | 
			
		||||
                        const miscItemChanges = [
 | 
			
		||||
                            {
 | 
			
		||||
                                ItemType: typeName,
 | 
			
		||||
                                ItemCount: quantity
 | 
			
		||||
                            } satisfies IMiscItem
 | 
			
		||||
                        ];
 | 
			
		||||
                        addMiscItems(inventory, miscItemChanges);
 | 
			
		||||
                        return {
 | 
			
		||||
                            InventoryChanges: {
 | 
			
		||||
                                MiscItems: miscItemChanges
 | 
			
		||||
                            }
 | 
			
		||||
                        };
 | 
			
		||||
                    switch (typeName.substr(1).split("/")[3]) {
 | 
			
		||||
                        case "Projections":
 | 
			
		||||
                            // Void Relics, e.g. /Lotus/Types/Game/Projections/T2VoidProjectionGaussPrimeDBronze
 | 
			
		||||
                            const miscItemChanges = [
 | 
			
		||||
                                {
 | 
			
		||||
                                    ItemType: typeName,
 | 
			
		||||
                                    ItemCount: quantity
 | 
			
		||||
                                } satisfies IMiscItem
 | 
			
		||||
                            ];
 | 
			
		||||
                            addMiscItems(inventory, miscItemChanges);
 | 
			
		||||
                            return {
 | 
			
		||||
                                InventoryChanges: {
 | 
			
		||||
                                    MiscItems: miscItemChanges
 | 
			
		||||
                                }
 | 
			
		||||
                            };
 | 
			
		||||
                        case "CrewShip":
 | 
			
		||||
                            // Plexus - /Lotus/Types/Game/CrewShip/RailJack/DefaultHarness
 | 
			
		||||
                            const inventoryChanges = addCrewShipHarness(inventory, typeName);
 | 
			
		||||
                            return {
 | 
			
		||||
                                InventoryChanges: {
 | 
			
		||||
                                    ...inventoryChanges
 | 
			
		||||
                                }
 | 
			
		||||
                            };
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
@ -1158,3 +1168,45 @@ export const addKeyChainItems = async (
 | 
			
		||||
 | 
			
		||||
    return inventoryChanges;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const handleKeyRewards = async (
 | 
			
		||||
    inventory: TInventoryDatabaseDocument,
 | 
			
		||||
    keyType: string
 | 
			
		||||
): Promise<IInventoryChanges> => {
 | 
			
		||||
    const keyRewards = getKeyRewards(keyType);
 | 
			
		||||
    const inventoryChanges: IInventoryChanges = {};
 | 
			
		||||
    const itemsToAdd: ITypeCount[] = [];
 | 
			
		||||
    if (keyRewards) {
 | 
			
		||||
        for (const item of keyRewards) {
 | 
			
		||||
            let changes: IInventoryChanges = {};
 | 
			
		||||
 | 
			
		||||
            switch (item.rewardType) {
 | 
			
		||||
                case "RT_CREDITS":
 | 
			
		||||
                    const currencyChanges = updateCurrency(inventory, -item.amount, false);
 | 
			
		||||
                    changes = { ...currencyChanges } as IInventoryChanges;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case "RT_STORE_ITEM":
 | 
			
		||||
                    changes = (await handleStoreItemAcquisition(item.itemType, inventory, 1)).InventoryChanges;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case "RT_RECIPE":
 | 
			
		||||
                    itemsToAdd.push({ ItemType: item.itemType, ItemCount: 1 });
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case "RT_RESOURCE":
 | 
			
		||||
                    itemsToAdd.push({ ItemType: item.itemType, ItemCount: item.amount });
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            combineInventoryChanges(inventoryChanges, changes);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (itemsToAdd.length > 0) {
 | 
			
		||||
        const resourceChanges = await addItems(inventory, itemsToAdd);
 | 
			
		||||
        combineInventoryChanges(inventoryChanges, resourceChanges);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return inventoryChanges;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,5 @@
 | 
			
		||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
 | 
			
		||||
import { getIndexAfter } from "@/src/helpers/stringHelpers";
 | 
			
		||||
import { ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
import {
 | 
			
		||||
    dict_de,
 | 
			
		||||
@ -32,7 +31,6 @@ import {
 | 
			
		||||
    IRecipe,
 | 
			
		||||
    IRegion
 | 
			
		||||
} from "warframe-public-export-plus";
 | 
			
		||||
import questCompletionItems from "@/static/fixed_responses/questCompletionRewards.json";
 | 
			
		||||
 | 
			
		||||
export type WeaponTypeInternal =
 | 
			
		||||
    | "LongGuns"
 | 
			
		||||
@ -162,23 +160,6 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
 | 
			
		||||
    return keyChainStage.itemsToGiveWhenTriggered;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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 (!levelKeyData.rewards) {
 | 
			
		||||
        const error = `LevelKey ${levelKey} does not contain rewards`;
 | 
			
		||||
        logger.error(error);
 | 
			
		||||
        throw new Error(error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return levelKeyData.rewards;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getNode = (nodeName: string): IRegion => {
 | 
			
		||||
    const node = ExportRegions[nodeName];
 | 
			
		||||
    if (!node) {
 | 
			
		||||
@ -188,15 +169,19 @@ export const getNode = (nodeName: string): IRegion => {
 | 
			
		||||
    return node;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getQuestCompletionItems = (questKey: string) => {
 | 
			
		||||
    const items = (questCompletionItems as unknown as Record<string, ITypeCount[]> | undefined)?.[questKey];
 | 
			
		||||
 | 
			
		||||
    if (!items) {
 | 
			
		||||
        logger.error(
 | 
			
		||||
            `Quest ${questKey} not found in questCompletionItems, quest completion items have not been given. This is a temporary solution`
 | 
			
		||||
        );
 | 
			
		||||
export const getKeyRewards = (key: string) => {
 | 
			
		||||
    const keyData = ExportKeys[key];
 | 
			
		||||
    if (!keyData) {
 | 
			
		||||
        const error = `Key ${key} not found in ExportKeys`;
 | 
			
		||||
        logger.error(error);
 | 
			
		||||
    }
 | 
			
		||||
    return items;
 | 
			
		||||
 | 
			
		||||
    if (!keyData.rewards) {
 | 
			
		||||
        const error = `Key ${key} does not contain rewards`;
 | 
			
		||||
        logger.debug(error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return keyData.rewards;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getKeyChainMessage = ({ KeyChain, ChainStage }: IKeyChainRequest) => {
 | 
			
		||||
 | 
			
		||||
@ -17,12 +17,13 @@ import {
 | 
			
		||||
    addMods,
 | 
			
		||||
    addRecipes,
 | 
			
		||||
    combineInventoryChanges,
 | 
			
		||||
    handleKeyRewards,
 | 
			
		||||
    updateSyndicate
 | 
			
		||||
} from "@/src/services/inventoryService";
 | 
			
		||||
import { updateQuestKey } from "@/src/services/questService";
 | 
			
		||||
import { HydratedDocument } from "mongoose";
 | 
			
		||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { getLevelKeyRewards, getNode } from "@/src/services/itemDataService";
 | 
			
		||||
import { 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";
 | 
			
		||||
@ -252,20 +253,8 @@ export const addMissionRewards = async (
 | 
			
		||||
    let missionCompletionCredits = 0;
 | 
			
		||||
    //inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display
 | 
			
		||||
    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;
 | 
			
		||||
            }
 | 
			
		||||
            MissionRewards.push({
 | 
			
		||||
                StoreItem: reward.itemType,
 | 
			
		||||
                ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        const levelFixedRewards = await handleKeyRewards(inventory, levelKeyName);
 | 
			
		||||
        combineInventoryChanges(inventoryChanges, levelFixedRewards);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const reward of MissionRewards) {
 | 
			
		||||
 | 
			
		||||
@ -1,13 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain": [
 | 
			
		||||
    {
 | 
			
		||||
      "ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain",
 | 
			
		||||
      "ItemCount": 1
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "ItemType": "/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit",
 | 
			
		||||
      "ItemCount": 1
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "/Lotus/Types/Keys/InfestedMicroplanetQuest/InfestedMicroplanetQuestKeyChain": [{ "ItemType": "/Lotus/Types/Recipes/WarframeRecipes/BrokenFrameBlueprint", "ItemCount": 1 }]
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user