From eb6baa5e1550be8e6ba3678745154afaffb568ca Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 01:21:02 +0100 Subject: [PATCH 1/6] fix: removing an archon shard doesn't refund it (#729) --- .../api/infestedFoundryController.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/controllers/api/infestedFoundryController.ts b/src/controllers/api/infestedFoundryController.ts index ea35fa4d..04144475 100644 --- a/src/controllers/api/infestedFoundryController.ts +++ b/src/controllers/api/infestedFoundryController.ts @@ -52,14 +52,33 @@ export const infestedFoundryController: RequestHandler = async (req, res) => { const request = getJSONfromString(String(req.body)) as IShardUninstallRequest; const inventory = await getInventory(accountId); const suit = inventory.Suits.find(suit => suit._id.toString() == request.SuitId.$oid)!; + + // refund shard + const shard = Object.entries(colorToShard).find( + ([color]) => color == suit.ArchonCrystalUpgrades![request.Slot].Color + )![1]; + const miscItemChanges = [ + { + ItemType: shard, + ItemCount: 1 + } + ]; + addMiscItems(inventory, miscItemChanges); + + // remove from suit suit.ArchonCrystalUpgrades![request.Slot] = {}; + + // remove bile const bile = inventory.InfestedFoundry!.Resources!.find( x => x.ItemType == "/Lotus/Types/Items/InfestedFoundry/HelminthBile" )!; bile.Count -= 300; + await inventory.save(); + res.json({ InventoryChanges: { + MiscItems: miscItemChanges, InfestedFoundry: inventory.toJSON().InfestedFoundry } }); -- 2.47.2 From 709c2a401bf22d9014136771fb61e245e6192fe7 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 01:21:37 +0100 Subject: [PATCH 2/6] feat: spectre loadouts (#719) --- .../api/claimCompletedRecipeController.ts | 24 +++++++++ src/controllers/api/startRecipeController.ts | 54 +++++++++++++++++++ src/models/inventoryModels/inventoryModel.ts | 21 ++++---- src/types/inventoryTypes/inventoryTypes.ts | 17 +++--- 4 files changed, 97 insertions(+), 19 deletions(-) diff --git a/src/controllers/api/claimCompletedRecipeController.ts b/src/controllers/api/claimCompletedRecipeController.ts index 5b8e048e..179327da 100644 --- a/src/controllers/api/claimCompletedRecipeController.ts +++ b/src/controllers/api/claimCompletedRecipeController.ts @@ -59,6 +59,30 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) = }); } else { logger.debug("Claiming Recipe", { recipe, pendingRecipe }); + + if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") { + const inventory = await getInventory(accountId); + inventory.PendingSpectreLoadouts ??= []; + inventory.SpectreLoadouts ??= []; + + const pendingLoadoutIndex = inventory.PendingSpectreLoadouts.findIndex( + x => x.ItemType == recipe.resultType + ); + if (pendingLoadoutIndex != -1) { + const loadoutIndex = inventory.SpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType); + if (loadoutIndex != -1) { + inventory.SpectreLoadouts.splice(loadoutIndex, 1); + } + logger.debug( + "moving spectre loadout from pending to active", + inventory.toJSON().PendingSpectreLoadouts![pendingLoadoutIndex] + ); + inventory.SpectreLoadouts.push(inventory.PendingSpectreLoadouts[pendingLoadoutIndex]); + inventory.PendingSpectreLoadouts.splice(pendingLoadoutIndex, 1); + await inventory.save(); + } + } + let InventoryChanges = {}; if (recipe.consumeOnUse) { const recipeChanges = [ diff --git a/src/controllers/api/startRecipeController.ts b/src/controllers/api/startRecipeController.ts index 83501874..4a511315 100644 --- a/src/controllers/api/startRecipeController.ts +++ b/src/controllers/api/startRecipeController.ts @@ -6,6 +6,7 @@ import { getRecipe } from "@/src/services/itemDataService"; import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService"; import { unixTimesInMs } from "@/src/constants/timeConstants"; import { Types } from "mongoose"; +import { ISpectreLoadout } from "@/src/types/inventoryTypes/inventoryTypes"; interface IStartRecipeRequest { RecipeName: string; @@ -43,6 +44,59 @@ export const startRecipeController: RequestHandler = async (req, res) => { _id: new Types.ObjectId() }); + if (recipe.secretIngredientAction == "SIA_SPECTRE_LOADOUT_COPY") { + const spectreLoadout: ISpectreLoadout = { + ItemType: recipe.resultType, + Suits: "", + LongGuns: "", + Pistols: "", + Melee: "" + }; + for ( + let secretIngredientsIndex = 0; + secretIngredientsIndex != recipe.secretIngredients!.length; + ++secretIngredientsIndex + ) { + const type = recipe.secretIngredients![secretIngredientsIndex].ItemType; + const oid = startRecipeRequest.Ids[recipe.ingredients.length + secretIngredientsIndex]; + if (oid == "ffffffffffffffffffffffff") { + // user chose to preserve the active loadout + break; + } + if (type == "/Lotus/Types/Game/PowerSuits/PlayerPowerSuit") { + const item = inventory.Suits.find(x => x._id.toString() == oid)!; + spectreLoadout.Suits = item.ItemType; + } else if (type == "/Lotus/Weapons/Tenno/Pistol/LotusPistol") { + const item = inventory.Pistols.find(x => x._id.toString() == oid)!; + spectreLoadout.Pistols = item.ItemType; + spectreLoadout.PistolsModularParts = item.ModularParts; + } else if (type == "/Lotus/Weapons/Tenno/LotusLongGun") { + const item = inventory.LongGuns.find(x => x._id.toString() == oid)!; + spectreLoadout.LongGuns = item.ItemType; + spectreLoadout.LongGunsModularParts = item.ModularParts; + } else { + console.assert(type == "/Lotus/Types/Game/LotusMeleeWeapon"); + const item = inventory.Melee.find(x => x._id.toString() == oid)!; + spectreLoadout.Melee = item.ItemType; + spectreLoadout.MeleeModularParts = item.ModularParts; + } + } + if ( + spectreLoadout.Suits != "" && + spectreLoadout.LongGuns != "" && + spectreLoadout.Pistols != "" && + spectreLoadout.Melee != "" + ) { + inventory.PendingSpectreLoadouts ??= []; + const existingIndex = inventory.PendingSpectreLoadouts.findIndex(x => x.ItemType == recipe.resultType); + if (existingIndex != -1) { + inventory.PendingSpectreLoadouts.splice(existingIndex, 1); + } + inventory.PendingSpectreLoadouts.push(spectreLoadout); + logger.debug("pending spectre loadout", spectreLoadout); + } + } + const newInventory = await inventory.save(); res.json({ diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 8202bda9..f1e3edb6 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -548,13 +548,14 @@ const fusionTreasuresSchema = new Schema().add(typeCountSchema) const spectreLoadoutsSchema = new Schema( { - LongGuns: String, - Melee: String, - Pistols: String, - PistolsFeatures: Number, - PistolsModularParts: [String], + ItemType: String, Suits: String, - ItemType: String + LongGuns: String, + LongGunsModularParts: { type: [String], default: undefined }, + Pistols: String, + PistolsModularParts: { type: [String], default: undefined }, + Melee: String, + MeleeModularParts: { type: [String], default: undefined } }, { _id: false } ); @@ -936,11 +937,9 @@ const inventorySchema = new Schema( QualifyingInvasions: [Schema.Types.Mixed], FactionScores: [Number], - //Have only Suit+Pistols+LongGuns+Melee+ItemType(BronzeSpectre,GoldSpectre,PlatinumSpectreArmy,SilverSpectreArmy) - //"/Lotus/Types/Game/SpectreArmies/BronzeSpectreArmy": "Vapor Specter Regiment", - SpectreLoadouts: [spectreLoadoutsSchema], - //If you want change Spectre Gear id - PendingSpectreLoadouts: [Schema.Types.Mixed], + // https://warframe.fandom.com/wiki/Specter_(Tenno) + PendingSpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined }, + SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined }, //New Quest Email EmailItems: [TypeXPItemSchema], diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 1f43c918..c453206d 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -203,8 +203,8 @@ export interface IInventoryResponse { SpaceMelee: IEquipmentDatabase[]; SpaceGuns: IEquipmentDatabase[]; ArchwingEnabled: boolean; - PendingSpectreLoadouts: any[]; - SpectreLoadouts: ISpectreLoadout[]; + PendingSpectreLoadouts?: ISpectreLoadout[]; + SpectreLoadouts?: ISpectreLoadout[]; SentinelWeapons: IEquipmentDatabase[]; Sentinels: IEquipmentDatabase[]; EmailItems: ITypeCount[]; @@ -871,13 +871,14 @@ export interface IShipInventory { } export interface ISpectreLoadout { - LongGuns: string; - Melee: string; - Pistols: string; - PistolsFeatures: number; - PistolsModularParts: string[]; - Suits: string; ItemType: string; + Suits: string; + LongGuns: string; + LongGunsModularParts?: string[]; + Pistols: string; + PistolsModularParts?: string[]; + Melee: string; + MeleeModularParts?: string[]; } export interface IStepSequencer { -- 2.47.2 From bda7cea90e8054469f11844fae1763aa9c2fde33 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 03:37:41 +0100 Subject: [PATCH 3/6] fix: motorcycle in backroom is broken --- src/controllers/api/setBootLocationController.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/controllers/api/setBootLocationController.ts b/src/controllers/api/setBootLocationController.ts index 599044a0..4b1b3bc5 100644 --- a/src/controllers/api/setBootLocationController.ts +++ b/src/controllers/api/setBootLocationController.ts @@ -2,11 +2,23 @@ import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { getPersonalRooms } from "@/src/services/personalRoomsService"; import { TBootLocation } from "@/src/types/shipTypes"; +import { getInventory } from "@/src/services/inventoryService"; export const setBootLocationController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const personalRooms = await getPersonalRooms(accountId); personalRooms.Ship.BootLocation = req.query.bootLocation as string as TBootLocation; await personalRooms.save(); + + if (personalRooms.Ship.BootLocation == "SHOP") { + // Temp fix so the motorcycle in the backroom doesn't appear broken. + // This code may be removed when quests are fully implemented. + const inventory = await getInventory(accountId); + if (inventory.Motorcycles.length == 0) { + inventory.Motorcycles.push({ ItemType: "/Lotus/Types/Vehicles/Motorcycle/MotorcyclePowerSuit" }); + } + await inventory.save(); + } + res.end(); }; -- 2.47.2 From e5e8bb4c4a0a3d835f57b58743e6d1c611306982 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 03:38:22 +0100 Subject: [PATCH 4/6] no need to save when nothing was changed --- src/controllers/api/setBootLocationController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/api/setBootLocationController.ts b/src/controllers/api/setBootLocationController.ts index 4b1b3bc5..1baa5daa 100644 --- a/src/controllers/api/setBootLocationController.ts +++ b/src/controllers/api/setBootLocationController.ts @@ -16,8 +16,8 @@ export const setBootLocationController: RequestHandler = async (req, res) => { const inventory = await getInventory(accountId); if (inventory.Motorcycles.length == 0) { inventory.Motorcycles.push({ ItemType: "/Lotus/Types/Vehicles/Motorcycle/MotorcyclePowerSuit" }); + await inventory.save(); } - await inventory.save(); } res.end(); -- 2.47.2 From 69c65f3ce2d1f47f2285dfef80a47a7b87fa7d04 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 04:36:40 +0100 Subject: [PATCH 5/6] fix: missing teshin hard mode vendor manifest (#737) --- src/services/serversideVendorsService.ts | 18 +- .../TeshinHardModeVendorManifest.json | 603 ++++++++++++++++++ 2 files changed, 613 insertions(+), 8 deletions(-) create mode 100644 static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json diff --git a/src/services/serversideVendorsService.ts b/src/services/serversideVendorsService.ts index 0b61caa4..3b4c3a61 100644 --- a/src/services/serversideVendorsService.ts +++ b/src/services/serversideVendorsService.ts @@ -15,16 +15,17 @@ import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json"; import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json"; import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json"; -import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json"; import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json"; +import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json"; import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json"; import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json"; -import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json"; import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json"; -import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json"; -import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json"; +import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json"; import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json"; import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json"; +import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json"; +import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json"; +import TeshinHardModeVendorManifest from "@/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json"; import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json"; interface IVendorManifest { @@ -55,16 +56,17 @@ const vendorManifests: IVendorManifest[] = [ EntratiLabsEntratiLabsCommisionsManifest, EntratiLabsEntratiLabVendorManifest, HubsIronwakeDondaVendorManifest, - HubsRailjackCrewMemberVendorManifest, HubsPerrinSequenceWeaponVendorManifest, + HubsRailjackCrewMemberVendorManifest, MaskSalesmanManifest, OstronFishmongerVendorManifest, - OstronProspectorVendorManifest, OstronPetVendorManifest, - SolarisFishmongerVendorManifest, - SolarisProspectorVendorManifest, + OstronProspectorVendorManifest, SolarisDebtTokenVendorManifest, SolarisDebtTokenVendorRepossessionsManifest, + SolarisFishmongerVendorManifest, + SolarisProspectorVendorManifest, + TeshinHardModeVendorManifest, ZarimanCommisionsManifestArchimedean ]; diff --git a/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json b/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json new file mode 100644 index 00000000..abfd1cab --- /dev/null +++ b/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json @@ -0,0 +1,603 @@ +{ + "VendorInfo":{ + "_id":{ + "$oid":"63ed01efbdaa38891767bac9" + }, + "TypeName":"/Lotus/Types/Game/VendorManifests/Hubs/TeshinHardModeVendorManifest", + "ItemManifest":[ + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/OperatorArmour/HardMode/OperatorTeshinArmsBlueprint", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9947" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/OperatorArmour/HardMode/OperatorTeshinBodyBlueprint", + "ItemPrices":[ + { + "ItemCount":25, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9948" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/OperatorArmour/HardMode/OperatorTeshinHeadBlueprint", + "ItemPrices":[ + { + "ItemCount":20, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9949" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/OperatorArmour/HardMode/OperatorTeshinLegsBlueprint", + "ItemPrices":[ + { + "ItemCount":25, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994a" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994b" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994c" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/Components/FormaStanceBlueprint", + "ItemPrices":[ + { + "ItemCount":10, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994d" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Skins/Effects/OrbsEphemera", + "ItemPrices":[ + { + "ItemCount":3, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994e" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Skins/Effects/TatsuSkullEphemera", + "ItemPrices":[ + { + "ItemCount":85, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e994f" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/Randomized/RawShotgunRandomMod", + "ItemPrices":[ + { + "ItemCount":75, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9950" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Recipes/Components/UmbraFormaBlueprint", + "ItemPrices":[ + { + "ItemCount":150, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9951" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/Kuva", + "ItemPrices":[ + { + "ItemCount":55, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":50000, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9952" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/Randomized/RawModularPistolRandomMod", + "ItemPrices":[ + { + "ItemCount":75, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9953" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/Forma", + "ItemPrices":[ + { + "ItemCount":75, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":3, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9954" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/Randomized/RawModularMeleeRandomMod", + "ItemPrices":[ + { + "ItemCount":75, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9955" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/FusionBundles/EvergreenLoginRewardFusionBundle", + "ItemPrices":[ + { + "ItemCount":150, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9956" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/Randomized/RawRifleRandomMod", + "ItemPrices":[ + { + "ItemCount":75, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9957" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Upgrades/Mods/Shotgun/WeaponRecoilReductionMod", + "ItemPrices":[ + { + "ItemCount":35, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9958" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/ShipDecos/TeshinBobbleHead", + "ItemPrices":[ + { + "ItemCount":35, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e9959" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/StoreItems/AvatarImages/ImageGaussVED", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995a" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/StoreItems/AvatarImages/ImageGrendelVED", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995b" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageProteaAction", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995c" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/ShipDecos/TeaSet", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995d" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/StoreItems/AvatarImages/AvatarImageXakuAction", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995e" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/RivenIdentifier", + "ItemPrices":[ + { + "ItemCount":20, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"2051240400000" + } + }, + "PurchaseQuantityLimit":1, + "RotatedWeekly":true, + "AllowMultipurchase":false, + "Id":{ + "$oid":"66fd60b20ba592c4c95e995f" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/BoosterPacks/RandomSyndicateProjectionPack", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":1, + "Expiry":{ + "$date":{ + "$numberLong":"1736726400000" + } + }, + "PurchaseQuantityLimit":25, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e997c" + } + }, + { + "StoreItem":"/Lotus/StoreItems/Types/Items/MiscItems/Kuva", + "ItemPrices":[ + { + "ItemCount":15, + "ItemType":"/Lotus/Types/Items/MiscItems/SteelEssence", + "ProductCategory":"MiscItems" + } + ], + "Bin":"BIN_0", + "QuantityMultiplier":10000, + "Expiry":{ + "$date":{ + "$numberLong":"1736726400000" + } + }, + "PurchaseQuantityLimit":25, + "AllowMultipurchase":true, + "Id":{ + "$oid":"66fd60b20ba592c4c95e997d" + } + } + ], + "PropertyTextHash":"0A0F20AFA748FBEE490510DBF5A33A0D", + "Expiry":{ + "$date":{ + "$numberLong":"1736726400000" + } + } + } +} \ No newline at end of file -- 2.47.2 From 05fd3c4cecf671d43938a9f5698bed072a4fc6e5 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 6 Jan 2025 05:26:37 +0100 Subject: [PATCH 6/6] chore: some notes in inventoryTypes --- src/types/inventoryTypes/inventoryTypes.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index c453206d..81d12bff 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -102,7 +102,8 @@ export type TSolarMapRegion = | "Uranus" | "Venus" | "Void" - | "SolarMapDeimosName"; + | "SolarMapDeimosName" + | "1999MapName"; //TODO: perhaps split response and database into their own files @@ -727,6 +728,8 @@ export interface IPendingRecipe { ItemType: string; CompletionDate: Date; ItemId: IOid; + TargetItemId?: string; // likely related to liches + TargetFingerprint?: string; // likely related to liches } export interface IPendingTrade { -- 2.47.2