From e4aa50121041b7d8c2319f533de39b858d04276b Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 8 Jul 2025 12:59:22 +0200 Subject: [PATCH 1/3] feat: give skiajati and umbra mods alongside umbra, with max-rank and potatoes --- .../api/claimCompletedRecipeController.ts | 78 ++++++++++++++++--- src/services/inventoryService.ts | 13 ++-- src/types/purchaseTypes.ts | 4 +- 3 files changed, 77 insertions(+), 18 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index afbb95ad..953a539e 100644 --- a/src/controllers/api/claimCompletedRecipeController.ts +++ b/src/controllers/api/claimCompletedRecipeController.ts @@ -14,7 +14,9 @@ import { addRecipes, occupySlot, combineInventoryChanges, - addKubrowPetPrint + addKubrowPetPrint, + addPowerSuit, + addEquipment } from "@/src/services/inventoryService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { InventorySlot, IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes"; @@ -22,7 +24,7 @@ import { toOid2 } from "@/src/helpers/inventoryHelpers"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { IRecipe } from "warframe-public-export-plus"; import { config } from "@/src/services/configService"; -import { IEquipmentClient, Status } from "@/src/types/equipmentTypes"; +import { EquipmentFeatures, IEquipmentClient, Status } from "@/src/types/equipmentTypes"; interface IClaimCompletedRecipeRequest { RecipeIds: IOid[]; @@ -124,17 +126,69 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!; addKubrowPetPrint(inventory, pet, InventoryChanges); } else if (recipe.secretIngredientAction != "SIA_UNBRAND") { - InventoryChanges = { - ...InventoryChanges, - ...(await addItem( + if (recipe.resultType == "/Lotus/Powersuits/Excalibur/ExcaliburUmbra") { + // Quite the special case here... + // We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed. + // Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati + + const umbraModA = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA")) + .Upgrades![0]; + const umbraModB = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB")) + .Upgrades![0]; + const umbraModC = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC")) + .Upgrades![0]; + const sacrificeModA = ( + await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA") + ).Upgrades![0]; + const sacrificeModB = ( + await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB") + ).Upgrades![0]; + InventoryChanges.Upgrades ??= []; + InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB); + + await addPowerSuit( inventory, - recipe.resultType, - recipe.num, - false, - undefined, - pendingRecipe.TargetFingerprint - )) - }; + "/Lotus/Powersuits/Excalibur/ExcaliburUmbra", + { + Configs: [{ Upgrades: [umbraModA.ItemId.$oid, umbraModB.ItemId.$oid, umbraModC.ItemId.$oid] }], + XP: 900_000, + Features: EquipmentFeatures.DOUBLE_CAPACITY + }, + InventoryChanges + ); + inventory.XPInfo.push({ + ItemType: "/Lotus/Powersuits/Excalibur/ExcaliburUmbra", + XP: 900_000 + }); + + addEquipment( + inventory, + "Melee", + "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana", + { + Configs: [{ Upgrades: [sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }], + XP: 450_000, + Features: EquipmentFeatures.DOUBLE_CAPACITY + }, + InventoryChanges + ); + inventory.XPInfo.push({ + ItemType: "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana", + XP: 450_000 + }); + } else { + InventoryChanges = { + ...InventoryChanges, + ...(await addItem( + inventory, + recipe.resultType, + recipe.num, + false, + undefined, + pendingRecipe.TargetFingerprint + )) + }; + } } if ( config.claimingBlueprintRefundsIngredients && diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 25289621..3d6d02c9 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -482,11 +482,14 @@ export const addItem = async ( if (quantity != 1) { logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`); } - inventory.Upgrades.push({ - ItemType: typeName, - UpgradeFingerprint: targetFingerprint - }); - return {}; // there's not exactly a common "InventoryChanges" format for these + const upgrade = + inventory.Upgrades[ + inventory.Upgrades.push({ + ItemType: typeName, + UpgradeFingerprint: targetFingerprint + }) - 1 + ]; + return { Upgrades: [upgrade.toJSON()] }; } const changes = [ { diff --git a/src/types/purchaseTypes.ts b/src/types/purchaseTypes.ts index 1dcb0914..8b0db0f7 100644 --- a/src/types/purchaseTypes.ts +++ b/src/types/purchaseTypes.ts @@ -8,7 +8,8 @@ import { IRecentVendorPurchaseClient, TEquipmentKey, ICrewMemberClient, - IKubrowPetPrintClient + IKubrowPetPrintClient, + IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes"; export enum PurchaseSource { @@ -80,6 +81,7 @@ export type IInventoryChanges = { RecentVendorPurchases?: IRecentVendorPurchaseClient; // < 38.5.0 CrewMembers?: ICrewMemberClient[]; KubrowPetPrints?: IKubrowPetPrintClient[]; + Upgrades?: IUpgradeClient[]; // TOVERIFY } & Record< Exclude< string, -- 2.47.2 From 90d1b7233b7b620d524313b848f434251776dba9 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 8 Jul 2025 13:11:46 +0200 Subject: [PATCH 2/3] oops, the mods should be R5 --- .../api/claimCompletedRecipeController.ts | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index 953a539e..f1b74280 100644 --- a/src/controllers/api/claimCompletedRecipeController.ts +++ b/src/controllers/api/claimCompletedRecipeController.ts @@ -131,17 +131,55 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = // We don't just get Umbra, but also Skiajati and Umbra Mods. Both items are max rank, potatoed, and with the mods are pre-installed. // Source: https://wiki.warframe.com/w/The_Sacrifice, https://wiki.warframe.com/w/Excalibur/Umbra, https://wiki.warframe.com/w/Skiajati - const umbraModA = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA")) - .Upgrades![0]; - const umbraModB = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB")) - .Upgrades![0]; - const umbraModC = (await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC")) - .Upgrades![0]; + const umbraModA = ( + await addItem( + inventory, + "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModA", + 1, + false, + undefined, + `{"lvl":5}` + ) + ).Upgrades![0]; + const umbraModB = ( + await addItem( + inventory, + "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModB", + 1, + false, + undefined, + `{"lvl":5}` + ) + ).Upgrades![0]; + const umbraModC = ( + await addItem( + inventory, + "/Lotus/Upgrades/Mods/Sets/Umbra/WarframeUmbraModC", + 1, + false, + undefined, + `{"lvl":5}` + ) + ).Upgrades![0]; const sacrificeModA = ( - await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA") + await addItem( + inventory, + "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModA", + 1, + false, + undefined, + `{"lvl":5}` + ) ).Upgrades![0]; const sacrificeModB = ( - await addItem(inventory, "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB") + await addItem( + inventory, + "/Lotus/Upgrades/Mods/Sets/Sacrifice/MeleeSacrificeModB", + 1, + false, + undefined, + `{"lvl":5}` + ) ).Upgrades![0]; InventoryChanges.Upgrades ??= []; InventoryChanges.Upgrades.push(umbraModA, umbraModB, umbraModC, sacrificeModA, sacrificeModB); -- 2.47.2 From 48f87b42c22336a00d2b8c8e5666db974f974439 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 8 Jul 2025 13:16:32 +0200 Subject: [PATCH 3/3] put the mods into the pre-polarized slots --- .../api/claimCompletedRecipeController.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index f1b74280..d42dd22f 100644 --- a/src/controllers/api/claimCompletedRecipeController.ts +++ b/src/controllers/api/claimCompletedRecipeController.ts @@ -188,7 +188,20 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = inventory, "/Lotus/Powersuits/Excalibur/ExcaliburUmbra", { - Configs: [{ Upgrades: [umbraModA.ItemId.$oid, umbraModB.ItemId.$oid, umbraModC.ItemId.$oid] }], + Configs: [ + { + Upgrades: [ + "", + "", + "", + "", + "", + umbraModA.ItemId.$oid, + umbraModB.ItemId.$oid, + umbraModC.ItemId.$oid + ] + } + ], XP: 900_000, Features: EquipmentFeatures.DOUBLE_CAPACITY }, @@ -204,7 +217,9 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = "Melee", "/Lotus/Weapons/Tenno/Melee/Swords/UmbraKatana/UmbraKatana", { - Configs: [{ Upgrades: [sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] }], + Configs: [ + { Upgrades: ["", "", "", "", "", "", sacrificeModA.ItemId.$oid, sacrificeModB.ItemId.$oid] } + ], XP: 450_000, Features: EquipmentFeatures.DOUBLE_CAPACITY }, -- 2.47.2