From 07c2fbcadf3777333929fe109b8656740307aab9 Mon Sep 17 00:00:00 2001 From: Sainan Date: Sat, 12 Oct 2024 23:51:45 +0200 Subject: [PATCH] feat: implement socketing of ayatan sculptures (#542) --- package-lock.json | 8 +-- package.json | 2 +- .../api/fusionTreasuresController.ts | 50 +++++++++++++++++++ .../custom/getItemListsController.ts | 2 +- src/routes/api.ts | 2 + src/services/inventoryService.ts | 5 +- 6 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/controllers/api/fusionTreasuresController.ts diff --git a/package-lock.json b/package-lock.json index 2da10170..c7968a2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "copyfiles": "^2.4.1", "express": "^5.0.0-beta.3", "mongoose": "^8.4.5", - "warframe-public-export-plus": "^0.5.1", + "warframe-public-export-plus": "^0.5.2", "warframe-riven-info": "^0.1.1", "winston": "^3.13.0", "winston-daily-rotate-file": "^5.0.0" @@ -3778,9 +3778,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.1.tgz", - "integrity": "sha512-i9Qlh/xEqUQzLj6Dda0VB0nWkyEyWDYEnAyNTbb3IxebCLWEcizCSf3nkAae5xuKvwCvOefInOAa2YgiYwzr/A==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.2.tgz", + "integrity": "sha512-mv7abHis5ytlevnx9lSLwnqnv5/3t322/OKkR99Hrw+w7Qm+Ps6agZcTqNaIy6zrM1vsvWY1NnbxVe2+JIW6/Q==" }, "node_modules/warframe-riven-info": { "version": "0.1.1", diff --git a/package.json b/package.json index c18b4022..7dad1e88 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "copyfiles": "^2.4.1", "express": "^5.0.0-beta.3", "mongoose": "^8.4.5", - "warframe-public-export-plus": "^0.5.1", + "warframe-public-export-plus": "^0.5.2", "warframe-riven-info": "^0.1.1", "winston": "^3.13.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/src/controllers/api/fusionTreasuresController.ts b/src/controllers/api/fusionTreasuresController.ts new file mode 100644 index 00000000..e03af407 --- /dev/null +++ b/src/controllers/api/fusionTreasuresController.ts @@ -0,0 +1,50 @@ +import { RequestHandler } from "express"; +import { ExportResources } from "warframe-public-export-plus"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { addFusionTreasures, addMiscItems, getInventory } from "@/src/services/inventoryService"; +import { IFusionTreasure, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; + +interface IFusionTreasureRequest { + oldTreasureName: string; + newTreasureName: string; +} + +const parseFusionTreasure = (name: string, count: number): IFusionTreasure => { + const arr = name.split("_"); + return { + ItemType: arr[0], + Sockets: parseInt(arr[1], 16), + ItemCount: count + }; +}; + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +export const fusionTreasuresController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId); + const request = JSON.parse(req.body.toString() as string) as IFusionTreasureRequest; + + const oldTreasure = parseFusionTreasure(request.oldTreasureName, -1); + const newTreasure = parseFusionTreasure(request.newTreasureName, 1); + + // Swap treasures + addFusionTreasures(inventory, [oldTreasure]); + addFusionTreasures(inventory, [newTreasure]); + + // Remove consumed stars + const miscItemChanges: IMiscItem[] = []; + const filledSockets = newTreasure.Sockets & ~oldTreasure.Sockets; + for (let i = 0; filledSockets >> i; ++i) { + if ((filledSockets >> i) & 1) { + //console.log("Socket", i, "has been filled with", ExportResources[oldTreasure.ItemType].sockets![i]); + miscItemChanges.push({ + ItemType: ExportResources[oldTreasure.ItemType].sockets![i], + ItemCount: -1 + }); + } + } + addMiscItems(inventory, miscItemChanges); + + await inventory.save(); + res.end(); +}; diff --git a/src/controllers/custom/getItemListsController.ts b/src/controllers/custom/getItemListsController.ts index 101f4692..8e360ca9 100644 --- a/src/controllers/custom/getItemListsController.ts +++ b/src/controllers/custom/getItemListsController.ts @@ -36,7 +36,7 @@ const getItemListsController: RequestHandler = (_req, res) => { } for (const [uniqueName, item] of Object.entries(ExportResources)) { miscitems.push({ - uniqueName: "MiscItems:" + uniqueName, + uniqueName: item.productCategory + ":" + uniqueName, name: getEnglishString(item.name) }); } diff --git a/src/routes/api.ts b/src/routes/api.ts index dc90ca45..373ef119 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -11,6 +11,7 @@ import { dronesController } from "@/src/controllers/api/dronesController"; import { evolveWeaponController } from "@/src/controllers/api/evolveWeaponController"; import { findSessionsController } from "@/src/controllers/api/findSessionsController"; import { focusController } from "@/src/controllers/api/focusController"; +import { fusionTreasuresController } from "@/src/controllers/api/fusionTreasuresController"; import { genericUpdateController } from "@/src/controllers/api/genericUpdateController"; import { getAllianceController } from "@/src/controllers/api/getAllianceController"; import { getCreditsController } from "@/src/controllers/api/getCreditsController"; @@ -109,6 +110,7 @@ apiRouter.post("/createGuild.php", createGuildController); apiRouter.post("/evolveWeapon.php", evolveWeaponController); apiRouter.post("/findSessions.php", findSessionsController); apiRouter.post("/focus.php", focusController); +apiRouter.post("/fusionTreasures.php", fusionTreasuresController); apiRouter.post("/genericUpdate.php", genericUpdateController); apiRouter.post("/getAlliance.php", getAllianceController); apiRouter.post("/gildWeapon.php", gildWeaponController); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index c32a8af1..b7a1059f 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -657,10 +657,7 @@ export const addFusionTreasures = ( ) => { const { FusionTreasures } = inventory; itemsArray?.forEach(({ ItemType, ItemCount, Sockets }) => { - const itemIndex = FusionTreasures.findIndex(i => { - i.ItemType === ItemType; - i.Sockets === Sockets; - }); + const itemIndex = FusionTreasures.findIndex(i => i.ItemType == ItemType && (i.Sockets || 0) == (Sockets || 0)); if (itemIndex !== -1) { FusionTreasures[itemIndex].ItemCount += ItemCount;