From f50763ff66216b7ae62f02cf0fc05a31bb48f17d Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sun, 20 Apr 2025 12:03:36 +0200 Subject: [PATCH] feat(webui): KubrowPets support also using `/api/modularWeaponCrafting.php` instead of `/custom/addModularEquipment` for modular equipment --- .../api/modularWeaponCraftingController.ts | 45 ++-- src/controllers/api/releasePetController.ts | 8 +- .../custom/addModularEquipmentController.ts | 98 ------- .../custom/getItemListsController.ts | 15 +- src/helpers/inventoryHelpers.ts | 142 ++++++++++ src/routes/custom.ts | 2 - src/services/inventoryService.ts | 104 ++++++- static/webui/index.html | 29 +- static/webui/script.js | 253 ++++++++++++++---- static/webui/translations/de.js | 3 + static/webui/translations/en.js | 3 + static/webui/translations/es.js | 3 + static/webui/translations/fr.js | 3 + static/webui/translations/ru.js | 3 + static/webui/translations/zh.js | 3 + 15 files changed, 538 insertions(+), 176 deletions(-) delete mode 100644 src/controllers/custom/addModularEquipmentController.ts diff --git a/src/controllers/api/modularWeaponCraftingController.ts b/src/controllers/api/modularWeaponCraftingController.ts index 8819a2a6..0d083371 100644 --- a/src/controllers/api/modularWeaponCraftingController.ts +++ b/src/controllers/api/modularWeaponCraftingController.ts @@ -23,6 +23,7 @@ import { Status } from "@/src/types/inventoryTypes/inventoryTypes"; interface IModularCraftRequest { WeaponType: string; Parts: string[]; + isWebUi?: boolean; } export const modularWeaponCraftingController: RequestHandler = async (req, res) => { @@ -139,33 +140,39 @@ export const modularWeaponCraftingController: RequestHandler = async (req, res) } defaultOverwrites.Configs = applyDefaultUpgrades(inventory, defaultUpgrades); addEquipment(inventory, category, data.WeaponType, data.Parts, inventoryChanges, defaultOverwrites); - combineInventoryChanges(inventoryChanges, occupySlot(inventory, productCategoryToInventoryBin(category)!, false)); + combineInventoryChanges( + inventoryChanges, + occupySlot(inventory, productCategoryToInventoryBin(category)!, !!data.isWebUi) + ); if (defaultUpgrades) { inventoryChanges.RawUpgrades = defaultUpgrades.map(x => ({ ItemType: x.ItemType, ItemCount: 1 })); } // Remove credits & parts const miscItemChanges = []; - for (const part of data.Parts) { - miscItemChanges.push({ - ItemType: part, - ItemCount: -1 - }); + let currencyChanges = {}; + if (!data.isWebUi) { + for (const part of data.Parts) { + miscItemChanges.push({ + ItemType: part, + ItemCount: -1 + }); + } + currencyChanges = updateCurrency( + inventory, + category == "Hoverboards" || + category == "MoaPets" || + category == "LongGuns" || + category == "Pistols" || + category == "KubrowPets" + ? 5000 + : 4000, // Definitely correct for Melee & OperatorAmps + false + ); + addMiscItems(inventory, miscItemChanges); } - const currencyChanges = updateCurrency( - inventory, - category == "Hoverboards" || - category == "MoaPets" || - category == "LongGuns" || - category == "Pistols" || - category == "KubrowPets" - ? 5000 - : 4000, // Definitely correct for Melee & OperatorAmps - false - ); - addMiscItems(inventory, miscItemChanges); - await inventory.save(); + await inventory.save(); // Tell client what we did res.json({ InventoryChanges: { diff --git a/src/controllers/api/releasePetController.ts b/src/controllers/api/releasePetController.ts index 10625778..5e1d792b 100644 --- a/src/controllers/api/releasePetController.ts +++ b/src/controllers/api/releasePetController.ts @@ -8,7 +8,11 @@ export const releasePetController: RequestHandler = async (req, res) => { const inventory = await getInventory(accountId, "RegularCredits KubrowPets"); const payload = getJSONfromString(String(req.body)); - const inventoryChanges = updateCurrency(inventory, 25000, false); + const inventoryChanges = updateCurrency( + inventory, + payload.recipeName == "/Lotus/Types/Game/KubrowPet/ReleasePetRecipe" ? 25000 : 0, + false + ); inventoryChanges.RemovedIdItems = [{ ItemId: { $oid: payload.petId } }]; inventory.KubrowPets.pull({ _id: payload.petId }); @@ -18,6 +22,6 @@ export const releasePetController: RequestHandler = async (req, res) => { }; interface IReleasePetRequest { - recipeName: "/Lotus/Types/Game/KubrowPet/ReleasePetRecipe"; + recipeName: "/Lotus/Types/Game/KubrowPet/ReleasePetRecipe" | "webui"; petId: string; } diff --git a/src/controllers/custom/addModularEquipmentController.ts b/src/controllers/custom/addModularEquipmentController.ts deleted file mode 100644 index 984acd75..00000000 --- a/src/controllers/custom/addModularEquipmentController.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { getAccountIdForRequest } from "@/src/services/loginService"; -import { - getInventory, - addEquipment, - occupySlot, - productCategoryToInventoryBin, - applyDefaultUpgrades -} from "@/src/services/inventoryService"; -import { modularWeaponTypes } from "@/src/helpers/modularWeaponHelper"; -import { getDefaultUpgrades } from "@/src/services/itemDataService"; -import { IEquipmentDatabase } from "@/src/types/inventoryTypes/commonInventoryTypes"; -import { ExportWeapons } from "warframe-public-export-plus"; -import { RequestHandler } from "express"; - -export const addModularEquipmentController: RequestHandler = async (req, res) => { - const requiredFields = new Set(); - const accountId = await getAccountIdForRequest(req); - const request = req.body as IAddModularEquipmentRequest; - const category = modularWeaponTypes[request.ItemType]; - const inventoryBin = productCategoryToInventoryBin(category)!; - requiredFields.add(category); - requiredFields.add(inventoryBin); - - request.ModularParts.forEach(part => { - if (ExportWeapons[part].gunType) { - if (category == "LongGuns") { - request.ItemType = { - GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimary", - GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryShotgun", - GT_BEAM: "/Lotus/Weapons/SolarisUnited/Primary/LotusModularPrimaryBeam" - }[ExportWeapons[part].gunType]; - } else { - request.ItemType = { - GT_RIFLE: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondary", - GT_SHOTGUN: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun", - GT_BEAM: "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam" - }[ExportWeapons[part].gunType]; - } - } else if (request.ItemType == "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetPowerSuit") { - if (part.includes("ZanukaPetPartHead")) { - request.ItemType = { - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA": - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit", - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB": - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit", - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC": - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit" - }[part]!; - } - } - }); - const defaultUpgrades = getDefaultUpgrades(request.ModularParts); - if (defaultUpgrades) { - requiredFields.add("RawUpgrades"); - } - const defaultWeaponsMap: Record = { - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetAPowerSuit": [ - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponIP" - ], - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetBPowerSuit": [ - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponIS" - ], - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetCPowerSuit": [ - "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetMeleeWeaponPS" - ] - }; - const defaultWeapons = defaultWeaponsMap[request.ItemType] as string[] | undefined; - if (defaultWeapons) { - for (const defaultWeapon of defaultWeapons) { - const category = ExportWeapons[defaultWeapon].productCategory; - requiredFields.add(category); - requiredFields.add(productCategoryToInventoryBin(category)); - } - } - - const inventory = await getInventory(accountId, Array.from(requiredFields).join(" ")); - if (defaultWeapons) { - for (const defaultWeapon of defaultWeapons) { - const category = ExportWeapons[defaultWeapon].productCategory; - addEquipment(inventory, category, defaultWeapon); - occupySlot(inventory, productCategoryToInventoryBin(category)!, true); - } - } - - const defaultOverwrites: Partial = { - Configs: applyDefaultUpgrades(inventory, defaultUpgrades) - }; - - addEquipment(inventory, category, request.ItemType, request.ModularParts, undefined, defaultOverwrites); - occupySlot(inventory, inventoryBin, true); - await inventory.save(); - res.end(); -}; - -interface IAddModularEquipmentRequest { - ItemType: string; - ModularParts: string[]; -} diff --git a/src/controllers/custom/getItemListsController.ts b/src/controllers/custom/getItemListsController.ts index 38e42bdb..214c51e7 100644 --- a/src/controllers/custom/getItemListsController.ts +++ b/src/controllers/custom/getItemListsController.ts @@ -56,6 +56,7 @@ const getItemListsController: RequestHandler = (req, response) => { res.Syndicates = []; res.OperatorAmps = []; res.QuestKeys = []; + res.KubrowPets = []; for (const [uniqueName, item] of Object.entries(ExportWarframes)) { res[item.productCategory].push({ uniqueName, @@ -64,7 +65,7 @@ const getItemListsController: RequestHandler = (req, response) => { }); } for (const [uniqueName, item] of Object.entries(ExportSentinels)) { - if (item.productCategory == "Sentinels") { + if (item.productCategory != "SpecialItems") { res[item.productCategory].push({ uniqueName, name: getString(item.name, lang) @@ -73,11 +74,13 @@ const getItemListsController: RequestHandler = (req, response) => { } for (const [uniqueName, item] of Object.entries(ExportWeapons)) { if (item.partType) { - res.ModularParts.push({ - uniqueName, - name: getString(item.name, lang), - partType: item.partType - }); + if (!uniqueName.startsWith("/Lotus/Types/Items/Deimos/")) { + res.ModularParts.push({ + uniqueName, + name: getString(item.name, lang), + partType: item.partType + }); + } if (uniqueName.split("/")[5] != "SentTrainingAmplifier") { res.miscitems.push({ uniqueName: uniqueName, diff --git a/src/helpers/inventoryHelpers.ts b/src/helpers/inventoryHelpers.ts index d7fa7b25..79466fb3 100644 --- a/src/helpers/inventoryHelpers.ts +++ b/src/helpers/inventoryHelpers.ts @@ -1,5 +1,6 @@ import { IMongoDate, IOid } from "@/src/types/commonTypes"; import { Types } from "mongoose"; +import { TRarity } from "warframe-public-export-plus"; export const toOid = (objectId: Types.ObjectId): IOid => { return { $oid: objectId.toString() } satisfies IOid; @@ -8,3 +9,144 @@ export const toOid = (objectId: Types.ObjectId): IOid => { export const toMongoDate = (date: Date): IMongoDate => { return { $date: { $numberLong: date.getTime().toString() } }; }; + +export const kubrowWeights: Record = { + COMMON: 6, + UNCOMMON: 4, + RARE: 2, + LEGENDARY: 1 +}; + +export const kubrowFurPatternsWeights: Record = { + COMMON: 6, + UNCOMMON: 5, + RARE: 2, + LEGENDARY: 1 +}; + +export const catbrowDetails = { + Colors: [ + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseA", rarity: "COMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseB", rarity: "COMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseC", rarity: "COMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseD", rarity: "COMMON" as TRarity }, + + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorSecondaryA", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorSecondaryB", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorSecondaryC", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorSecondaryD", rarity: "UNCOMMON" as TRarity }, + + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorTertiaryA", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorTertiaryB", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorTertiaryC", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorTertiaryD", rarity: "RARE" as TRarity }, + + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorAccentsA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorAccentsB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorAccentsC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorAccentsD", rarity: "LEGENDARY" as TRarity } + ], + + EyeColors: [ + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesD", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesE", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesF", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesG", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesH", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesI", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesJ", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesK", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesL", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesM", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorEyesN", rarity: "LEGENDARY" as TRarity } + ], + + FurPatterns: [{ type: "/Lotus/Types/Game/CatbrowPet/Patterns/CatbrowPetPatternA", rarity: "COMMON" as TRarity }], + + BodyTypes: [ + { type: "/Lotus/Types/Game/CatbrowPet/BodyTypes/CatbrowPetRegularBodyType", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/BodyTypes/CatbrowPetRegularBodyType", rarity: "LEGENDARY" as TRarity } + ], + + Heads: [ + { type: "/Lotus/Types/Game/CatbrowPet/Heads/CatbrowHeadA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Heads/CatbrowHeadB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Heads/CatbrowHeadC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Heads/CatbrowHeadD", rarity: "LEGENDARY" as TRarity } + ], + + Tails: [ + { type: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailD", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailE", rarity: "LEGENDARY" as TRarity } + ] +}; + +export const kubrowDetails = { + Colors: [ + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneA", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneB", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneC", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneD", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneE", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneF", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneG", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMundaneH", rarity: "UNCOMMON" as TRarity }, + + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidA", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidB", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidC", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidD", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidE", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidF", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidG", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorMidH", rarity: "RARE" as TRarity }, + + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantD", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantE", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantF", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantG", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorVibrantH", rarity: "LEGENDARY" as TRarity } + ], + + EyeColors: [ + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesA", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesB", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesC", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesD", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesE", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesF", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesG", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesH", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Colors/KubrowPetColorEyesI", rarity: "LEGENDARY" as TRarity } + ], + + FurPatterns: [ + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternB", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternA", rarity: "UNCOMMON" as TRarity }, + + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternC", rarity: "RARE" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternD", rarity: "RARE" as TRarity }, + + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternE", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/Patterns/KubrowPetPatternF", rarity: "LEGENDARY" as TRarity } + ], + + BodyTypes: [ + { type: "/Lotus/Types/Game/KubrowPet/BodyTypes/KubrowPetRegularBodyType", rarity: "UNCOMMON" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/BodyTypes/KubrowPetHeavyBodyType", rarity: "LEGENDARY" as TRarity }, + { type: "/Lotus/Types/Game/KubrowPet/BodyTypes/KubrowPetThinBodyType", rarity: "LEGENDARY" as TRarity } + ], + + Heads: [], + + Tails: [] +}; diff --git a/src/routes/custom.ts b/src/routes/custom.ts index 16359226..fbd859c1 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -15,7 +15,6 @@ import { createAccountController } from "@/src/controllers/custom/createAccountC import { createMessageController } from "@/src/controllers/custom/createMessageController"; import { addCurrencyController } from "@/src/controllers/custom/addCurrencyController"; import { addItemsController } from "@/src/controllers/custom/addItemsController"; -import { addModularEquipmentController } from "@/src/controllers/custom/addModularEquipmentController"; import { addXpController } from "@/src/controllers/custom/addXpController"; import { importController } from "@/src/controllers/custom/importController"; @@ -40,7 +39,6 @@ customRouter.post("/createAccount", createAccountController); customRouter.post("/createMessage", createMessageController); customRouter.post("/addCurrency", addCurrencyController); customRouter.post("/addItems", addItemsController); -customRouter.post("/addModularEquipment", addModularEquipmentController); customRouter.post("/addXp", addXpController); customRouter.post("/import", importController); customRouter.post("/manageQuests", manageQuestsController); diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 7537c8d6..fd6a597b 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -23,7 +23,10 @@ import { IUpgradeClient, TPartialStartingGear, ILoreFragmentScan, - ICrewMemberClient + ICrewMemberClient, + Status, + IKubrowPetDetailsDatabase, + ITraits } from "@/src/types/inventoryTypes/inventoryTypes"; import { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate"; import { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes"; @@ -58,14 +61,21 @@ import { ExportWeapons, IDefaultUpgrade, IPowersuit, + ISentinel, TStandingLimitBin } from "warframe-public-export-plus"; import { createShip } from "./shipService"; -import { toOid } from "../helpers/inventoryHelpers"; +import { + catbrowDetails, + kubrowDetails, + kubrowFurPatternsWeights, + kubrowWeights, + toOid +} from "../helpers/inventoryHelpers"; import { addQuestKey, completeQuest } from "@/src/services/questService"; import { handleBundleAcqusition } from "./purchaseService"; import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json"; -import { getRandomElement, getRandomInt, SRng } from "./rngService"; +import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from "./rngService"; import { createMessage } from "./inboxService"; import { getMaxStanding } from "@/src/helpers/syndicateStandingHelper"; @@ -714,6 +724,11 @@ export const addItem = async ( return { MiscItems: miscItemChanges }; + } else if ( + typeName.substr(1).split("/")[3] == "CatbrowPet" || + typeName.substr(1).split("/")[3] == "KubrowPet" + ) { + return addKubrowPet(inventory, typeName, undefined, premiumPurchase); } else if (typeName.startsWith("/Lotus/Types/Game/CrewShip/CrewMember/")) { if (!seed) { throw new Error(`Expected crew member to have a seed`); @@ -932,6 +947,89 @@ export const addSpaceSuit = ( return inventoryChanges; }; +export const addKubrowPet = ( + inventory: TInventoryDatabaseDocument, + kubrowPetName: string, + details: IKubrowPetDetailsDatabase | undefined, + premiumPurchase: boolean, + inventoryChanges: IInventoryChanges = {} +): IInventoryChanges => { + combineInventoryChanges(inventoryChanges, occupySlot(inventory, InventorySlot.SENTINELS, premiumPurchase)); + + const kubrowPet = ExportSentinels[kubrowPetName] as ISentinel | undefined; + const exalted = kubrowPet?.exalted ?? []; + for (const specialItem of exalted) { + addSpecialItem(inventory, specialItem, inventoryChanges); + } + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const configs: IItemConfig[] = applyDefaultUpgrades(inventory, kubrowPet?.defaultUpgrades); + + if (!details) { + let traits: ITraits; + + if (kubrowPetName == "/Lotus/Types/Game/CatbrowPet/VampireCatbrowPetPowerSuit") { + traits = { + BaseColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseVampire", + SecondaryColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorSecondaryVampire", + TertiaryColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorTertiaryVampire", + AccentColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorAccentsVampire", + EyeColor: "/Lotus/Types/Game/CatbrowPet/Colors/CatbrowPetColorBaseA", + FurPattern: "/Lotus/Types/Game/CatbrowPet/Patterns/CatbrowPetPatternVampire", + Personality: kubrowPetName, + BodyType: "/Lotus/Types/Game/CatbrowPet/BodyTypes/CatbrowPetVampireBodyType", + Head: "/Lotus/Types/Game/CatbrowPet/Heads/CatbrowHeadVampire", + Tail: "/Lotus/Types/Game/CatbrowPet/Tails/CatbrowTailVampire" + }; + } else { + const isCatbrow = [ + "/Lotus/Types/Game/CatbrowPet/MirrorCatbrowPetPowerSuit", + "/Lotus/Types/Game/CatbrowPet/CheshireCatbrowPetPowerSuit" + ].includes(kubrowPetName); + const traitsPool = isCatbrow ? catbrowDetails : kubrowDetails; + + traits = { + BaseColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type, + SecondaryColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type, + TertiaryColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type, + AccentColor: getRandomWeightedReward(traitsPool.Colors, kubrowWeights)!.type, + EyeColor: getRandomWeightedReward(traitsPool.EyeColors, kubrowWeights)!.type, + FurPattern: getRandomWeightedReward(traitsPool.FurPatterns, kubrowFurPatternsWeights)!.type, + Personality: kubrowPetName, + BodyType: getRandomWeightedReward(traitsPool.BodyTypes, kubrowWeights)!.type, + Head: isCatbrow ? getRandomWeightedReward(traitsPool.Heads, kubrowWeights)!.type : undefined, + Tail: isCatbrow ? getRandomWeightedReward(traitsPool.Tails, kubrowWeights)!.type : undefined + }; + } + + details = { + Name: "", + IsPuppy: false, + HasCollar: true, + PrintsRemaining: 2, + Status: Status.StatusStasis, + HatchDate: new Date(Math.trunc(Date.now() / 86400000) * 86400000), + IsMale: !!getRandomInt(0, 1), + Size: getRandomInt(70, 100) / 100, + DominantTraits: traits, + RecessiveTraits: traits + }; + } + + const kubrowPetIndex = + inventory.KubrowPets.push({ + ItemType: kubrowPetName, + Configs: configs, + XP: 0, + Details: details, + IsNew: true + }) - 1; + inventoryChanges.KubrowPets ??= []; + inventoryChanges.KubrowPets.push(inventory.KubrowPets[kubrowPetIndex].toJSON()); + + return inventoryChanges; +}; + export const updateSlots = ( inventory: TInventoryDatabaseDocument, slotName: SlotNames, diff --git a/static/webui/index.html b/static/webui/index.html index 3830e378..5df7ba59 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -305,7 +305,7 @@ -