feat: give skiajati and umbra mods alongside umbra, with max rank and potatoes #2442

Merged
Sainan merged 3 commits from sacrifice into main 2025-07-08 20:51:18 -07:00
3 changed files with 77 additions and 18 deletions
Showing only changes of commit e4aa501210 - Show all commits

View File

@ -14,7 +14,9 @@ import {
addRecipes, addRecipes,
occupySlot, occupySlot,
combineInventoryChanges, combineInventoryChanges,
addKubrowPetPrint addKubrowPetPrint,
addPowerSuit,
addEquipment
} from "@/src/services/inventoryService"; } from "@/src/services/inventoryService";
import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { IInventoryChanges } from "@/src/types/purchaseTypes";
import { InventorySlot, IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes"; 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 { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import { IRecipe } from "warframe-public-export-plus"; import { IRecipe } from "warframe-public-export-plus";
import { config } from "@/src/services/configService"; import { config } from "@/src/services/configService";
import { IEquipmentClient, Status } from "@/src/types/equipmentTypes"; import { EquipmentFeatures, IEquipmentClient, Status } from "@/src/types/equipmentTypes";
interface IClaimCompletedRecipeRequest { interface IClaimCompletedRecipeRequest {
RecipeIds: IOid[]; RecipeIds: IOid[];
@ -124,6 +126,57 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!; const pet = inventory.KubrowPets.id(pendingRecipe.KubrowPet!)!;
addKubrowPetPrint(inventory, pet, InventoryChanges); addKubrowPetPrint(inventory, pet, InventoryChanges);
} else if (recipe.secretIngredientAction != "SIA_UNBRAND") { } else if (recipe.secretIngredientAction != "SIA_UNBRAND") {
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,
"/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 = {
...InventoryChanges, ...InventoryChanges,
...(await addItem( ...(await addItem(
@ -136,6 +189,7 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
)) ))
}; };
} }
}
if ( if (
config.claimingBlueprintRefundsIngredients && config.claimingBlueprintRefundsIngredients &&
recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg recipe.secretIngredientAction != "SIA_CREATE_KUBROW" // Can't refund the egg

View File

@ -482,11 +482,14 @@ export const addItem = async (
if (quantity != 1) { if (quantity != 1) {
logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`); logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`);
} }
const upgrade =
inventory.Upgrades[
inventory.Upgrades.push({ inventory.Upgrades.push({
ItemType: typeName, ItemType: typeName,
UpgradeFingerprint: targetFingerprint UpgradeFingerprint: targetFingerprint
}); }) - 1
return {}; // there's not exactly a common "InventoryChanges" format for these ];
return { Upgrades: [upgrade.toJSON<IUpgradeClient>()] };
} }
const changes = [ const changes = [
{ {

View File

@ -8,7 +8,8 @@ import {
IRecentVendorPurchaseClient, IRecentVendorPurchaseClient,
TEquipmentKey, TEquipmentKey,
ICrewMemberClient, ICrewMemberClient,
IKubrowPetPrintClient IKubrowPetPrintClient,
IUpgradeClient
} from "@/src/types/inventoryTypes/inventoryTypes"; } from "@/src/types/inventoryTypes/inventoryTypes";
export enum PurchaseSource { export enum PurchaseSource {
@ -80,6 +81,7 @@ export type IInventoryChanges = {
RecentVendorPurchases?: IRecentVendorPurchaseClient; // < 38.5.0 RecentVendorPurchases?: IRecentVendorPurchaseClient; // < 38.5.0
CrewMembers?: ICrewMemberClient[]; CrewMembers?: ICrewMemberClient[];
KubrowPetPrints?: IKubrowPetPrintClient[]; KubrowPetPrints?: IKubrowPetPrintClient[];
Upgrades?: IUpgradeClient[]; // TOVERIFY
} & Record< } & Record<
Exclude< Exclude<
string, string,