diff --git a/src/controllers/api/modularWeaponCraftingController.ts b/src/controllers/api/modularWeaponCraftingController.ts index 2b116a8d..126d370b 100644 --- a/src/controllers/api/modularWeaponCraftingController.ts +++ b/src/controllers/api/modularWeaponCraftingController.ts @@ -8,11 +8,17 @@ import { addMiscItems, applyDefaultUpgrades, occupySlot, - productCategoryToInventoryBin + productCategoryToInventoryBin, + combineInventoryChanges, + addSpecialItem } from "@/src/services/inventoryService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { getDefaultUpgrades } from "@/src/services/itemDataService"; import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper"; +import { IEquipmentDatabase } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { getRandomInt } from "@/src/services/rngService"; +import { ExportSentinels } from "warframe-public-export-plus"; +import { Status } from "@/src/types/inventoryTypes/inventoryTypes"; interface IModularCraftRequest { WeaponType: string; @@ -29,11 +35,66 @@ export const modularWeaponCraftingController: RequestHandler = async (req, res) const inventory = await getInventory(accountId); const defaultUpgrades = getDefaultUpgrades(data.Parts); - const configs = applyDefaultUpgrades(inventory, defaultUpgrades); - const inventoryChanges: IInventoryChanges = { - ...addEquipment(inventory, category, data.WeaponType, data.Parts, {}, { Configs: configs }), - ...occupySlot(inventory, productCategoryToInventoryBin(category)!, false) + const defaultOverwrites: Partial = { + Configs: applyDefaultUpgrades(inventory, defaultUpgrades) }; + const inventoryChanges: IInventoryChanges = {}; + if (category == "KubrowPets") { + const traits = + data.WeaponType.indexOf("Catbrow") != -1 + ? { + BaseColor: "/Lotus/Types/Game/InfestedKavatPet/Colors/InfestedKavatColorRareBase", + SecondaryColor: "/Lotus/Types/Game/InfestedKavatPet/Colors/InfestedKavatColorRareSecondary", + TertiaryColor: "/Lotus/Types/Game/InfestedKavatPet/Colors/InfestedKavatColorRareTertiary", + AccentColor: "/Lotus/Types/Game/InfestedKavatPet/Colors/InfestedKavatColorRareAccent", + EyeColor: "/Lotus/Types/Game/InfestedKavatPet/Colors/InfestedKavatColorRareEyes", + FurPattern: "/Lotus/Types/Game/InfestedKavatPet/Patterns/InfestedCritterPatternDefault", + Personality: data.WeaponType, + BodyType: "/Lotus/Types/Game/CatbrowPet/BodyTypes/InfestedCatbrowPetRegularBodyType", + Head: { + "/Lotus/Types/Friendly/Pets/CreaturePets/ArmoredInfestedCatbrowPetPowerSuit": + "/Lotus/Types/Game/InfestedKavatPet/Heads/InfestedCritterHeadC", + "/Lotus/Types/Friendly/Pets/CreaturePets/HornedInfestedCatbrowPetPowerSuit": + "/Lotus/Types/Game/InfestedKavatPet/Heads/InfestedCritterHeadB", + "/Lotus/Types/Friendly/Pets/CreaturePets/VulpineInfestedCatbrowPetPowerSuit": + "/Lotus/Types/Game/InfestedKavatPet/Heads/InfestedCritterHeadA" + }[data.WeaponType] + } + : { + BaseColor: "/Lotus/Types/Game/InfestedPredatorPet/Colors/InfestedPredatorColorRareBase", + SecondaryColor: "/Lotus/Types/Game/InfestedPredatorPet/Colors/InfestedPredatorColorRareSecondary", + TertiaryColor: "/Lotus/Types/Game/InfestedPredatorPet/Colors/InfestedPredatorColorRareTertiary", + AccentColor: "/Lotus/Types/Game/InfestedPredatorPet/Colors/InfestedPredatorColorRareAccent", + EyeColor: "/Lotus/Types/Game/InfestedPredatorPet/Colors/InfestedPredatorColorRareEyes", + FurPattern: "/Lotus/Types/Game/InfestedPredatorPet/Patterns/InfestedPredatorPatternDefault", + Personality: data.WeaponType, + BodyType: "/Lotus/Types/Game/KubrowPet/BodyTypes/InfestedKubrowPetBodyType", + Head: { + "/Lotus/Types/Friendly/Pets/CreaturePets/MedjayPredatorKubrowPetPowerSuit": + "/Lotus/Types/Game/InfestedPredatorPet/Heads/InfestedPredatorHeadA", + "/Lotus/Types/Friendly/Pets/CreaturePets/PharaohPredatorKubrowPetPowerSuit": + "/Lotus/Types/Game/InfestedPredatorPet/Heads/InfestedPredatorHeadB", + "/Lotus/Types/Friendly/Pets/CreaturePets/VizierPredatorKubrowPetPowerSuit": + "/Lotus/Types/Game/InfestedPredatorPet/Heads/InfestedPredatorHeadC" + }[data.WeaponType] + }; + defaultOverwrites.Details = { + HasCollar: true, + IsMale: !!getRandomInt(0, 1), + Size: 0.7 + Math.random() * 0.3, + DominantTraits: traits, + RecessiveTraits: traits + }; + + // Only save mutagen & antigen in the Modularparts. + defaultOverwrites.ModularParts = [data.Parts[1], data.Parts[2]]; + + for (const specialItem of ExportSentinels[data.WeaponType].exalted!) { + addSpecialItem(inventory, specialItem, inventoryChanges); + } + } + addEquipment(inventory, category, data.WeaponType, data.Parts, inventoryChanges, defaultOverwrites); + combineInventoryChanges(inventoryChanges, occupySlot(inventory, productCategoryToInventoryBin(category)!, false)); if (defaultUpgrades) { inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 })); } @@ -48,7 +109,11 @@ export const modularWeaponCraftingController: RequestHandler = async (req, res) } const currencyChanges = updateCurrency( inventory, - category == "Hoverboards" || category == "MoaPets" || category == "LongGuns" || category == "Pistols" + category == "Hoverboards" || + category == "MoaPets" || + category == "LongGuns" || + category == "Pistols" || + category == "KubrowPets" ? 5000 : 4000, // Definitely correct for Melee & OperatorAmps false diff --git a/src/helpers/modularWeaponHelper.ts b/src/helpers/modularWeaponHelper.ts index 82610000..cf0e9b19 100644 --- a/src/helpers/modularWeaponHelper.ts +++ b/src/helpers/modularWeaponHelper.ts @@ -15,5 +15,11 @@ export const modularWeaponTypes: Record = { "/Lotus/Types/Friendly/Pets/MoaPets/MoaPetPowerSuit": "MoaPets", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": "MoaPets", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": "MoaPets", - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets" + "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": "MoaPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/ArmoredInfestedCatbrowPetPowerSuit": "KubrowPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/HornedInfestedCatbrowPetPowerSuit": "KubrowPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/VulpineInfestedCatbrowPetPowerSuit": "KubrowPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/MedjayPredatorKubrowPetPowerSuit": "KubrowPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/PharaohPredatorKubrowPetPowerSuit": "KubrowPets", + "/Lotus/Types/Friendly/Pets/CreaturePets/VizierPredatorKubrowPetPowerSuit": "KubrowPets" }; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 3abcfff5..cb5795be 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -815,7 +815,9 @@ detailsSchema.set("toJSON", { const db = returnedObject as IKubrowPetDetailsDatabase; const client = returnedObject as IKubrowPetDetailsClient; - client.HatchDate = toMongoDate(db.HatchDate); + if (db.HatchDate) { + client.HatchDate = toMongoDate(db.HatchDate); + } } }); diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 5d0edcfc..7af7b3ab 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -679,12 +679,12 @@ export enum KubrowPetPrintItemType { } export interface IKubrowPetDetailsDatabase { - Name: string; - IsPuppy: boolean; + Name?: string; + IsPuppy?: boolean; HasCollar: boolean; - PrintsRemaining: number; - Status: Status; - HatchDate: Date; + PrintsRemaining?: number; + Status?: Status; + HatchDate?: Date; DominantTraits: ITraits; RecessiveTraits: ITraits; IsMale: boolean;