feat: obtaining quest rewards #962
@ -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,7 +465,8 @@ export const addItem = async (
|
||||
}
|
||||
}
|
||||
case "Game": {
|
||||
if (typeName.substr(1).split("/")[3] == "Projections") {
|
||||
switch (typeName.substr(1).split("/")[3]) {
|
||||
case "Projections":
|
||||
// Void Relics, e.g. /Lotus/Types/Game/Projections/T2VoidProjectionGaussPrimeDBronze
|
||||
const miscItemChanges = [
|
||||
{
|
||||
@ -478,6 +480,14 @@ export const addItem = async (
|
||||
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