fix quest system
This commit is contained in:
parent
a4ec3833bf
commit
1148ef8de4
17
src/controllers/api/giveKeyChainTriggeredItemsController.ts
Normal file
17
src/controllers/api/giveKeyChainTriggeredItemsController.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { RequestHandler } from "express";
|
||||||
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { giveKeyChainTriggeredItems } from "@/src/services/questService";
|
||||||
|
import { IGiveKeyChainTriggeredItemsRequest } from "@/src/types/questTypes";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
const giveKeyChainTriggeredItemsController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const payload = getJSONfromString(req.body as string) as IGiveKeyChainTriggeredItemsRequest;
|
||||||
|
if (payload) {
|
||||||
|
const result = await giveKeyChainTriggeredItems(accountId, payload);
|
||||||
|
if (result) res.json(result);
|
||||||
|
} else res.json({});
|
||||||
|
};
|
||||||
|
|
||||||
|
export { giveKeyChainTriggeredItemsController };
|
@ -0,0 +1,28 @@
|
|||||||
|
import { RequestHandler } from "express";
|
||||||
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { giveKeyChainTriggeredMessage } from "@/src/services/questService";
|
||||||
|
|
||||||
|
export interface IGiveKeyChainTriggeredMessageGroup {
|
||||||
|
experiment: string;
|
||||||
|
experimentGroup: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IGiveKeyChainTriggeredMessageRequest {
|
||||||
|
KeyChain: string;
|
||||||
|
ChainStage: number;
|
||||||
|
Groups: IGiveKeyChainTriggeredMessageGroup[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
const giveKeyChainTriggeredMessageController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const payload = getJSONfromString(req.body as string) as IGiveKeyChainTriggeredMessageRequest;
|
||||||
|
|
||||||
|
const result = giveKeyChainTriggeredMessage(accountId, payload.KeyChain, payload.ChainStage);
|
||||||
|
|
||||||
|
if (result) res.json(result);
|
||||||
|
else res.status(200).end();
|
||||||
|
};
|
||||||
|
|
||||||
|
export { giveKeyChainTriggeredMessageController };
|
@ -1,7 +1,13 @@
|
|||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { setActiveQuest } from "@/src/services/questService";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
|
|
||||||
const setActiveQuestController: RequestHandler = (_req, res) => {
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
res.sendStatus(200);
|
const setActiveQuestController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const quest = req.query.quest as string;
|
||||||
|
const result = await setActiveQuest(accountId, quest);
|
||||||
|
res.json(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
export { setActiveQuestController };
|
export { setActiveQuestController };
|
||||||
|
16
src/controllers/api/updateQuestController.ts
Normal file
16
src/controllers/api/updateQuestController.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { RequestHandler } from "express";
|
||||||
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { IUpdateQuestRequest } from "@/src/types/questTypes";
|
||||||
|
import { updateQuest } from "@/src/services/questService";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
const updateQuestController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const payload = getJSONfromString(req.body as string) as IUpdateQuestRequest;
|
||||||
|
const result = await updateQuest(accountId, payload);
|
||||||
|
res.json(result);
|
||||||
|
};
|
||||||
|
|
||||||
|
export { updateQuestController };
|
||||||
|
|
@ -19,18 +19,18 @@ import {
|
|||||||
equipmentKeys,
|
equipmentKeys,
|
||||||
IFusionTreasure
|
IFusionTreasure
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
import { IGenericUpdate } from "../types/genericUpdate";
|
import { IGenericUpdate } from "@/src/types/genericUpdate";
|
||||||
import {
|
import {
|
||||||
IArtifactsRequest,
|
IArtifactsRequest,
|
||||||
IMissionInventoryUpdateRequest,
|
IMissionInventoryUpdateRequest,
|
||||||
IThemeUpdateRequest,
|
IThemeUpdateRequest,
|
||||||
IUpdateChallengeProgressRequest
|
IUpdateChallengeProgressRequest
|
||||||
} from "../types/requestTypes";
|
} from "@/src/types/requestTypes";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { getWeaponType, getExalted } from "@/src/services/itemDataService";
|
import { getWeaponType, getExalted } from "@/src/services/itemDataService";
|
||||||
import { getRandomWeightedReward } from "@/src/services/rngService";
|
import { getRandomWeightedReward } from "@/src/services/rngService";
|
||||||
import { ISyndicateSacrifice, ISyndicateSacrificeResponse } from "../types/syndicateTypes";
|
import { ISyndicateSacrifice, ISyndicateSacrificeResponse } from "@/src/types/syndicateTypes";
|
||||||
import { IEquipmentClient } from "../types/inventoryTypes/commonInventoryTypes";
|
import { IEquipmentClient, IEquipmentDatabase } from "@/src/types/inventoryTypes/commonInventoryTypes";
|
||||||
import {
|
import {
|
||||||
ExportBoosterPacks,
|
ExportBoosterPacks,
|
||||||
ExportCustoms,
|
ExportCustoms,
|
||||||
@ -870,3 +870,10 @@ export const upgradeMod = async (artifactsData: IArtifactsRequest, accountId: st
|
|||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const addHerse = async (ItemType: string, accountId: string): Promise<IEquipmentDatabase> => {
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
const herseIndex = inventory.Horses.push({ ItemType: ItemType, Configs: [], UpgradeVer: 101 });
|
||||||
|
const changedInventory = await inventory.save();
|
||||||
|
return changedInventory.Horses[herseIndex - 1].toJSON();
|
||||||
|
};
|
||||||
|
193
src/services/questService.ts
Normal file
193
src/services/questService.ts
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
import { ExportKeys, ExportRecipes, ExportResources, IKey } from "warframe-public-export-plus";
|
||||||
|
import { addHerse, addItem, getInventory } from "./inventoryService";
|
||||||
|
import { logger } from "@/src/utils/logger";
|
||||||
|
import {
|
||||||
|
IGiveKeyChainTriggeredItemsRequest,
|
||||||
|
IGiveKeyChainTriggeredItemsResponse,
|
||||||
|
ISetActiveQuestResponse,
|
||||||
|
IUpdateQuestRequest,
|
||||||
|
IUpdateQuestResponse
|
||||||
|
} from "@/src/types/questTypes";
|
||||||
|
import { IInventoryDatabaseDocument, IQuestKeyDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
|
import { toOid } from "@/src/helpers/inventoryHelpers";
|
||||||
|
|
||||||
|
const getQuest = (quest: string): IKey | undefined => {
|
||||||
|
for (const [k, v] of Object.entries(ExportKeys)) {
|
||||||
|
if (k == quest) {
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setActiveQuest = async (accountId: string, quest: string): Promise<ISetActiveQuestResponse> => {
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
const questKey = inventory.QuestKeys.find(q => q.ItemType == quest);
|
||||||
|
if (questKey == null) inventory.QuestKeys.push({ ItemType: quest });
|
||||||
|
inventory.ActiveQuest = quest;
|
||||||
|
await inventory.save();
|
||||||
|
|
||||||
|
const questData = getQuest(quest);
|
||||||
|
if (questData) {
|
||||||
|
console.log(questData);
|
||||||
|
}
|
||||||
|
const result: ISetActiveQuestResponse = {
|
||||||
|
inventoryChanges: {
|
||||||
|
QuestKey: [],
|
||||||
|
Herses: [],
|
||||||
|
PremiumCreditsFree: 0,
|
||||||
|
PremiumCredits: 0,
|
||||||
|
RegularCredits: 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
switch (quest) {
|
||||||
|
case "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain":
|
||||||
|
// eslint-disable-next-line no-case-declarations
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
// eslint-disable-next-line no-case-declarations
|
||||||
|
const questKey = inventory.QuestKeys.find(q => q.ItemType == quest);
|
||||||
|
if (questKey == null) inventory.QuestKeys.push({ ItemType: quest });
|
||||||
|
inventory.ActiveQuest = quest;
|
||||||
|
await inventory.save();
|
||||||
|
// eslint-disable-next-line no-case-declarations
|
||||||
|
const herse = await addHerse("/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit", accountId);
|
||||||
|
result.inventoryChanges.QuestKey.push({ ItemType: quest });
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||||
|
result.inventoryChanges.Herses.push({ ItemType: herse.ItemType, ItemId: toOid(herse._id) });
|
||||||
|
result.inventoryChanges.PremiumCreditsFree = 50;
|
||||||
|
result.inventoryChanges.PremiumCredits = 50;
|
||||||
|
result.inventoryChanges.RegularCredits = 3000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
result.inventoryChanges.QuestKey.push({ ItemType: quest });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateQuestKeys = async (
|
||||||
|
inventory: IInventoryDatabaseDocument,
|
||||||
|
questKeys: IQuestKeyDatabase[]
|
||||||
|
): Promise<void> => {
|
||||||
|
logger.debug("quest: " + questKeys[0].ItemType);
|
||||||
|
|
||||||
|
const questKeyIndex = inventory.QuestKeys.findIndex(questKey => questKey.ItemType === questKeys[0].ItemType);
|
||||||
|
|
||||||
|
inventory.QuestKeys[questKeyIndex] = questKeys[0];
|
||||||
|
|
||||||
|
if (questKeys[0].Completed) {
|
||||||
|
inventory.QuestKeys[questKeyIndex].CompletionDate = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
await inventory.save();
|
||||||
|
};
|
||||||
|
|
||||||
|
export const updateQuest = async (
|
||||||
|
accountId: string,
|
||||||
|
updateQuest: IUpdateQuestRequest
|
||||||
|
): Promise<IUpdateQuestResponse> => {
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
|
||||||
|
await updateQuestKeys(inventory, updateQuest.QuestKeys);
|
||||||
|
|
||||||
|
const result: IUpdateQuestResponse = {
|
||||||
|
MissionRewards: []
|
||||||
|
};
|
||||||
|
|
||||||
|
if (updateQuest.QuestKeys[0].Completed) {
|
||||||
|
const quest = ExportKeys[updateQuest.QuestKeys[0].ItemType];
|
||||||
|
if (quest.rewards != null) {
|
||||||
|
for (const reward of quest.rewards) {
|
||||||
|
switch (reward.rewardType) {
|
||||||
|
case "RT_STORE_ITEM":
|
||||||
|
await addItem(accountId, reward.itemType.replace("/Lotus/StoreItems/", "/Lotus/"), 1);
|
||||||
|
break;
|
||||||
|
case "RT_RECIPE":
|
||||||
|
await addItem(accountId, reward.itemType, 1);
|
||||||
|
break;
|
||||||
|
case "RT_CREDITS":
|
||||||
|
inventory.RegularCredits += reward.amount;
|
||||||
|
await inventory.save();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// push MissionRewards
|
||||||
|
// result.MissionRewards.push({});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const giveKeyChainTriggeredItems = async (
|
||||||
|
accountId: string,
|
||||||
|
payload: IGiveKeyChainTriggeredItemsRequest
|
||||||
|
): Promise<IGiveKeyChainTriggeredItemsResponse> => {
|
||||||
|
logger.debug("keyChain: " + payload.KeyChain + " chainStage: " + payload.ChainStage);
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
|
||||||
|
const quest = ExportKeys[payload.KeyChain];
|
||||||
|
|
||||||
|
const result: IGiveKeyChainTriggeredItemsResponse = {};
|
||||||
|
|
||||||
|
if (quest.chainStages) {
|
||||||
|
const stage = quest.chainStages[payload.ChainStage];
|
||||||
|
|
||||||
|
if (stage.key && stage.key in ExportKeys) {
|
||||||
|
const stageQuest = ExportKeys[stage.key];
|
||||||
|
if (stageQuest.rewards) {
|
||||||
|
for (const item of stageQuest.rewards) {
|
||||||
|
switch (item.rewardType) {
|
||||||
|
case "RT_STORE_ITEM":
|
||||||
|
await addItem(accountId, item.itemType.replace("/Lotus/StoreItems/", "/Lotus/"), 1);
|
||||||
|
break;
|
||||||
|
case "RT_CREDITS":
|
||||||
|
inventory.RegularCredits += item.amount;
|
||||||
|
await inventory.save();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stage.itemsToGiveWhenTriggered.length > 0) {
|
||||||
|
let itemType = stage.itemsToGiveWhenTriggered[0];
|
||||||
|
if (itemType.indexOf("") > 0) {
|
||||||
|
itemType = itemType.replace("/Lotus/StoreItems/", "/Lotus/");
|
||||||
|
}
|
||||||
|
await addItem(accountId, itemType, 1);
|
||||||
|
|
||||||
|
if (itemType in ExportRecipes) {
|
||||||
|
result.Recipes = [
|
||||||
|
{
|
||||||
|
ItemType: itemType,
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemType in ExportResources) {
|
||||||
|
result.WishlistChanges = [itemType];
|
||||||
|
result.MiscItems = [
|
||||||
|
{
|
||||||
|
ItemType: itemType,
|
||||||
|
ItemCount: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// more
|
||||||
|
} else {
|
||||||
|
result.MissionRewards = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const giveKeyChainTriggeredMessage = (accountId: string, keyChain: string, chainStage: number): null => {
|
||||||
|
logger.debug("accountId:" + accountId + "keyChain: " + keyChain + " chainStage: " + chainStage);
|
||||||
|
// TODO:message
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
@ -290,6 +290,7 @@ export interface IInventoryResponse {
|
|||||||
PendingCoupon: IPendingCoupon;
|
PendingCoupon: IPendingCoupon;
|
||||||
Harvestable: boolean;
|
Harvestable: boolean;
|
||||||
DeathSquadable: boolean;
|
DeathSquadable: boolean;
|
||||||
|
ActiveQuest: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAffiliation {
|
export interface IAffiliation {
|
||||||
|
45
src/types/questTypes.ts
Normal file
45
src/types/questTypes.ts
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import { IOid } from "./commonTypes";
|
||||||
|
import { IQuestKeyDatabase } from "./inventoryTypes/inventoryTypes";
|
||||||
|
|
||||||
|
export interface ISetActiveQuestKey {
|
||||||
|
ItemType: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISetActiveQuestHerse extends ISetActiveQuestKey {
|
||||||
|
ItemId: IOid;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISetActiveQuestResponse {
|
||||||
|
inventoryChanges: {
|
||||||
|
QuestKey: ISetActiveQuestKey[];
|
||||||
|
Herses: ISetActiveQuestHerse[];
|
||||||
|
PremiumCreditsFree: number;
|
||||||
|
PremiumCredits: number;
|
||||||
|
RegularCredits: number;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IUpdateQuestRequest {
|
||||||
|
QuestKeys: IQuestKeyDatabase[];
|
||||||
|
PS: string;
|
||||||
|
questCompletion: boolean;
|
||||||
|
PlayerShipEvents: [];
|
||||||
|
crossPlaySetting: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IUpdateQuestResponse {
|
||||||
|
CustomData?: string;
|
||||||
|
MissionRewards: [];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IGiveKeyChainTriggeredItemsRequest {
|
||||||
|
KeyChain: string;
|
||||||
|
ChainStage: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IGiveKeyChainTriggeredItemsResponse {
|
||||||
|
WishlistChanges?: [string];
|
||||||
|
MiscItems?: [{ ItemType: string; ItemCount: number }];
|
||||||
|
Recipes?: [{ ItemType: string; ItemCount: number }];
|
||||||
|
MissionRewards?: [];
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user