From 5a75d88385a3f57d2190b5f0cddfc65e5e7a8fd9 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:51:18 -0700 Subject: [PATCH] feat: give skiajati and umbra mods alongside umbra, with max rank and potatoes (#2442) Not 100% sure if the response format is correct and if this is even the correct time/place to do it, but impossible to say without a log from live. Closes #1054 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2442 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- .../api/claimCompletedRecipeController.ts | 131 ++++++++++++++++-- src/services/inventoryService.ts | 13 +- src/types/purchaseTypes.ts | 4 +- 3 files changed, 130 insertions(+), 18 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index afbb95ad..d42dd22f 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,122 @@ 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", + 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", + 1, + false, + undefined, + `{"lvl":5}` + ) + ).Upgrades![0]; + const sacrificeModB = ( + 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); + + 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,