diff --git a/package-lock.json b/package-lock.json index fdd59437..de59907c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,9 +327,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", diff --git a/src/controllers/api/focusController.ts b/src/controllers/api/focusController.ts new file mode 100644 index 00000000..f5d945fc --- /dev/null +++ b/src/controllers/api/focusController.ts @@ -0,0 +1,6 @@ +import { Handler } from "express"; + +export const focusController: Handler = (_req, _res) => { + //console.log("focusController", req.query); + _res.sendStatus(400); +}; diff --git a/src/controllers/api/genericUpdateController.ts b/src/controllers/api/genericUpdateController.ts index 63453c94..f77e366f 100644 --- a/src/controllers/api/genericUpdateController.ts +++ b/src/controllers/api/genericUpdateController.ts @@ -3,26 +3,24 @@ import { IGenericUpdate } from "@/src/types/genericUpdate"; import { RequestHandler } from "express"; // TODO: Nightwave evidence submission support is the only thing missing. -// TODO: Also, you might want to test this, because I definitely didn't. -const genericUpdateController: RequestHandler = async (request, response) => { - const accountId = request.query.accountId as string; +// TODO: this was added by someone without testing. It may not work. +// eslint-disable-next-line @typescript-eslint/no-misused-promises +const genericUpdateController: RequestHandler = async (_request, response) => { + // const accountId = request.query.accountId as string; - const [body] = String(request.body).split("\n"); + // const [body] = String(request.body).split("\n"); - let reply = {}; - try { - const update = JSON.parse(body) as IGenericUpdate; - if (typeof update !== "object") { - throw new Error("Invalid data format"); - } + // let reply = {}; + // try { + // const update = JSON.parse(body) as IGenericUpdate; + // if (typeof update !== "object") { + // throw new Error("Invalid data format"); + // } - reply = await updateGeneric(update, accountId); - } catch (err) { - console.error("Error parsing JSON data:", err); - } - - // Response support added for when Nightwave is supported below. - // response.json(reply); + // reply = await updateGeneric(update, accountId); + // } catch (err) { + // console.error("Error parsing JSON data:", err); + // } response.json({}); }; diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index 18e99d2f..b0501365 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -13,6 +13,77 @@ const getShipController: RequestHandler = async (req, res) => { res.status(500).json({ error: "error finding a corresponding ship" }); return; } + + ship.Ship.Features = [ + "/Lotus/Types/Items/ShipFeatureItems/AdvancedOrdisFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlchemyRoomFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlertsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/CeresNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ClanFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ErisNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EuropaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryConcurrentBuildFormaFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/JupiterNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierOneFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierTwoFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarsNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFusionFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsTransmuteFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/NeptuneNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PhobosNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PlutoNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItemBlueprint", + "/Lotus/Types/Items/ShipFeatureItems/RailjackCephalonShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SaturnNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SednaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SolarChartFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/UranusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VenusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem" + ]; + res.json(ship); }; diff --git a/src/controllers/api/inventoryController.ts b/src/controllers/api/inventoryController.ts index 77ae6372..c12387a9 100644 --- a/src/controllers/api/inventoryController.ts +++ b/src/controllers/api/inventoryController.ts @@ -31,7 +31,6 @@ const inventoryController: RequestHandler = async (request: Request, response: R if (config.testMission) inventoryResponse.Missions = testMissions; if (config.testQuestKey) inventoryResponse.QuestKeys = testQuestKeys; - inventoryResponse.DuviriInfo = { Seed: -123123123123123123, NumCompletions: 0 }; response.json(inventoryResponse); }; diff --git a/src/controllers/api/loginController.ts b/src/controllers/api/loginController.ts index e48e6df0..e488f080 100644 --- a/src/controllers/api/loginController.ts +++ b/src/controllers/api/loginController.ts @@ -50,7 +50,7 @@ const loginController: RequestHandler = async (request, response) => { return; } catch (error: unknown) { if (error instanceof Error) { - throw new Error("error creating account"); + throw new Error("error creating account", error); } } } diff --git a/src/controllers/api/saveLoadout.ts b/src/controllers/api/saveLoadout.ts index 5aa4ccb4..d520c8d0 100644 --- a/src/controllers/api/saveLoadout.ts +++ b/src/controllers/api/saveLoadout.ts @@ -8,14 +8,17 @@ import { parseString } from "@/src/helpers/general"; const saveLoadoutController: RequestHandler = async (req, res) => { //validate here const accountId = parseString(req.query.accountId); - const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest; - // console.log(util.inspect(body, { showHidden: false, depth: null, colors: true })); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { UpgradeVer, ...equipmentChanges } = body; - await handleInventoryItemConfigChange(equipmentChanges, accountId); + try { + const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest; + // console.log(util.inspect(body, { showHidden: false, depth: null, colors: true })); - res.status(200).end(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { UpgradeVer, ...equipmentChanges } = body; + await handleInventoryItemConfigChange(equipmentChanges, accountId); + } catch (error) { + res.status(200).end(); + } }; export { saveLoadoutController }; diff --git a/src/controllers/api/setBootLocationController.ts b/src/controllers/api/setBootLocationController.ts new file mode 100644 index 00000000..a2e745bc --- /dev/null +++ b/src/controllers/api/setBootLocationController.ts @@ -0,0 +1,6 @@ +import { Request, Response } from "express"; + +export const setBootLocationController = (req: Request, res: Response) => { + console.log("setBootLocationController", req.query); + res.end(); +}; diff --git a/src/controllers/api/viewController.ts b/src/controllers/api/viewController.ts deleted file mode 100644 index e63d3b1a..00000000 --- a/src/controllers/api/viewController.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { RequestHandler } from "express"; -import view from "@/static/fixed_responses/view.json"; - -const viewController: RequestHandler = (_req, res) => { - res.json(view); -}; - -export { viewController }; diff --git a/src/controllers/stats/viewController.ts b/src/controllers/stats/viewController.ts index 4e988ccc..e63d3b1a 100644 --- a/src/controllers/stats/viewController.ts +++ b/src/controllers/stats/viewController.ts @@ -1,7 +1,8 @@ import { RequestHandler } from "express"; +import view from "@/static/fixed_responses/view.json"; const viewController: RequestHandler = (_req, res) => { - res.json({}); + res.json(view); }; export { viewController }; diff --git a/src/helpers/inventoryHelpers.ts b/src/helpers/inventoryHelpers.ts index 45b6ff14..517fcfd4 100644 --- a/src/helpers/inventoryHelpers.ts +++ b/src/helpers/inventoryHelpers.ts @@ -1,10 +1,14 @@ +import { IOid } from "@/src/types/commonTypes"; import { IInventoryDatabase, IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes"; +import { Types } from "mongoose"; // a schema's toJSON is responsible for changing Oid and Date to their corresponding Response versions __id to "ItemId":{"$oid":"6450f720bc562ebf030222d4"}, and a Date to "date":{"$date":{"$numberLong":"unix timestamp"}) -const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => { +export const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { accountOwnerId, ...inventoryResponse } = inventoryDatabase; return inventoryResponse as unknown as IInventoryResponse; }; -export { toInventoryResponse }; +export const toOid = (objectId: Types.ObjectId) => { + return { $oid: objectId.toString() } satisfies IOid; +}; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 21aed851..deb3d10f 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -7,17 +7,23 @@ import { IBooster, IInventoryResponse, IInventoryDatabaseDocument, - ISlots + ISlots, + IGenericItem, + IMailbox, + IDuviriInfo } from "../../types/inventoryTypes/inventoryTypes"; import { IMongoDate, IOid } from "../../types/commonTypes"; -import { - IItemConfig, - ISuitDatabase, - IOperatorConfigClient, - IOperatorConfigDatabase -} from "@/src/types/inventoryTypes/SuitTypes"; +import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; -import { IAbilityOverride, IColor, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { + IAbilityOverride, + IColor, + IItemConfig, + IOperatorConfigClient, + IOperatorConfigDatabase, + IPolarity +} from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { toOid } from "@/src/helpers/inventoryHelpers"; const polaritySchema = new Schema({ Slot: Number, @@ -51,6 +57,7 @@ const operatorConfigSchema = new Schema( eyecol: colorSchema, facial: colorSchema, syancol: colorSchema, + cloth: colorSchema, Upgrades: [String], Name: String, // not sure if possible in operator ugly: Boolean // not sure if possible in operator @@ -141,10 +148,13 @@ const BoosterSchema = new Schema({ ItemType: String }); -const RawUpgrades = new Schema({ - ItemType: String, - ItemCount: Number -}); +const RawUpgrades = new Schema( + { + ItemType: String, + ItemCount: Number + }, + { id: false } +); RawUpgrades.virtual("LastAdded").get(function () { return { $oid: this._id.toString() } satisfies IOid; @@ -158,7 +168,7 @@ RawUpgrades.set("toJSON", { } }); -//TODO: validate what this is +//TODO: find out what this is const Upgrade = new Schema({ UpgradeFingerprint: String, ItemType: String @@ -208,14 +218,18 @@ suitSchema.set("toJSON", { const slotsBinSchema = new Schema( { - Slots: Number + Slots: Number, + Extra: Number }, { _id: false } ); -const FlavourItemSchema = new Schema({ - ItemType: String -}); +const FlavourItemSchema = new Schema( + { + ItemType: String + }, + { _id: false } +); FlavourItemSchema.set("toJSON", { transform(_document, returnedObject) { @@ -224,7 +238,70 @@ FlavourItemSchema.set("toJSON", { } }); +const GenericItemSchema = new Schema( + { + ItemType: String, + Configs: [ItemConfigSchema], + UpgradeVer: Number //this is probably just __v + }, + { id: false } +); + +GenericItemSchema.virtual("ItemId").get(function () { + return { $oid: this._id.toString() } satisfies IOid; +}); + +GenericItemSchema.set("toJSON", { + virtuals: true, + transform(_document, returnedObject) { + delete returnedObject._id; + delete returnedObject.__v; + } +}); + +// "Mailbox": { "LastInboxId": { "$oid": "123456780000000000000000" } } +const MailboxSchema = new Schema( + { + LastInboxId: { + type: Schema.Types.ObjectId, + set: (v: IMailbox["LastInboxId"]) => v.$oid.toString() + } + }, + { id: false, _id: false } +); + +MailboxSchema.set("toJSON", { + transform(_document, returnedObject) { + delete returnedObject.__v; + //TODO: there is a lot of any here + returnedObject.LastInboxId = toOid(returnedObject.LastInboxId as Types.ObjectId); + } +}); + +const DuviriInfoSchema = new Schema( + { + Seed: Number, + NumCompletions: Number + }, + { + _id: false, + id: false + } +); + +DuviriInfoSchema.set("toJSON", { + transform(_document, returnedObject) { + delete returnedObject.__v; + } +}); + const inventorySchema = new Schema({ + Horses: [GenericItemSchema], + DrifterMelee: [GenericItemSchema], + DrifterGuns: [GenericItemSchema], + DuviriInfo: DuviriInfoSchema, + Mailbox: MailboxSchema, + KahlLoadOuts: [Schema.Types.Mixed], accountOwnerId: Schema.Types.ObjectId, SubscribedToEmails: Number, Created: Schema.Types.Mixed, @@ -236,11 +313,15 @@ const inventorySchema = new Schema({ SuitBin: slotsBinSchema, WeaponBin: slotsBinSchema, SentinelBin: slotsBinSchema, - SpaceSuitBin: Schema.Types.Mixed, - SpaceWeaponBin: Schema.Types.Mixed, - PvpBonusLoadoutBin: Schema.Types.Mixed, - PveBonusLoadoutBin: Schema.Types.Mixed, - RandomModBin: Schema.Types.Mixed, + SpaceSuitBin: slotsBinSchema, + SpaceWeaponBin: slotsBinSchema, + PvpBonusLoadoutBin: slotsBinSchema, + PveBonusLoadoutBin: slotsBinSchema, + RandomModBin: slotsBinSchema, + OperatorAmpBin: slotsBinSchema, + CrewShipSalvageBin: slotsBinSchema, + MechBin: slotsBinSchema, + CrewMemberBin: slotsBinSchema, TradesRemaining: Number, DailyAffiliation: Number, DailyAffiliationPvp: Number, @@ -260,7 +341,7 @@ const inventorySchema = new Schema({ Ships: [Schema.Types.Mixed], QuestKeys: [Schema.Types.Mixed], FlavourItems: [FlavourItemSchema], - Scoops: [Schema.Types.Mixed], + Scoops: [GenericItemSchema], TrainingRetriesLeft: Number, LoadOutPresets: { type: Schema.Types.ObjectId, ref: "Loadout" }, CurrentLoadOutIds: [Schema.Types.Mixed], @@ -294,14 +375,14 @@ const inventorySchema = new Schema({ Affiliations: [Schema.Types.Mixed], QualifyingInvasions: [Schema.Types.Mixed], FactionScores: [Number], - SpaceSuits: [Schema.Types.Mixed], - SpaceMelee: [Schema.Types.Mixed], + SpaceSuits: [GenericItemSchema], + SpaceMelee: [GenericItemSchema], SpaceGuns: [Schema.Types.Mixed], ArchwingEnabled: Boolean, PendingSpectreLoadouts: [Schema.Types.Mixed], SpectreLoadouts: [Schema.Types.Mixed], - SentinelWeapons: [Schema.Types.Mixed], - Sentinels: [Schema.Types.Mixed], + Sentinels: [WeaponSchema], + SentinelWeapons: [WeaponSchema], EmailItems: [Schema.Types.Mixed], CompletedSyndicates: [String], FocusXP: Schema.Types.Mixed, @@ -314,7 +395,6 @@ const inventorySchema = new Schema({ ActiveAvatarImageType: String, KubrowPets: [Schema.Types.Mixed], ShipDecorations: [Schema.Types.Mixed], - OperatorAmpBin: Schema.Types.Mixed, DailyAffiliationCetus: Number, DailyAffiliationQuills: Number, DiscoveredMarkers: [Schema.Types.Mixed], @@ -346,13 +426,12 @@ const inventorySchema = new Schema({ MoaPets: [Schema.Types.Mixed], EquippedInstrument: String, InvasionChainProgress: [Schema.Types.Mixed], - DataKnives: [Schema.Types.Mixed], + DataKnives: [GenericItemSchema], NemesisHistory: [Schema.Types.Mixed], LastNemesisAllySpawnTime: Schema.Types.Mixed, Settings: Schema.Types.Mixed, PersonalTechProjects: [Schema.Types.Mixed], CrewShips: [Schema.Types.Mixed], - CrewShipSalvageBin: Schema.Types.Mixed, PlayerSkills: Schema.Types.Mixed, CrewShipAmmo: [Schema.Types.Mixed], CrewShipSalvagedWeaponSkins: [Schema.Types.Mixed], @@ -362,13 +441,11 @@ const inventorySchema = new Schema({ TradeBannedUntil: Schema.Types.Mixed, PlayedParkourTutorial: Boolean, SubscribedToEmailsPersonalized: Number, - MechBin: Schema.Types.Mixed, DailyAffiliationEntrati: Number, DailyAffiliationNecraloid: Number, - MechSuits: [Schema.Types.Mixed], + MechSuits: [suitSchema], InfestedFoundry: Schema.Types.Mixed, BlessingCooldown: Schema.Types.Mixed, - CrewMemberBin: Schema.Types.Mixed, CrewShipHarnesses: [Schema.Types.Mixed], CrewShipRawSalvage: [Schema.Types.Mixed], CrewMembers: [Schema.Types.Mixed], @@ -393,10 +470,7 @@ const inventorySchema = new Schema({ HasResetAccount: Boolean, PendingCoupon: Schema.Types.Mixed, Harvestable: Boolean, - DeathSquadable: Boolean, - Horses: [Schema.Types.Mixed], - DrifterMelee: [Schema.Types.Mixed], - KahlLoadOuts: [Schema.Types.Mixed] + DeathSquadable: Boolean }); inventorySchema.set("toJSON", { @@ -425,6 +499,12 @@ type InventoryDocumentProps = { Boosters: Types.DocumentArray; OperatorLoadOuts: Types.DocumentArray; AdultOperatorLoadOuts: Types.DocumentArray; + MechSuits: Types.DocumentArray; + Scoops: Types.DocumentArray; + DataKnives: Types.DocumentArray; + DrifterMelee: Types.DocumentArray; + Sentinels: Types.DocumentArray; + Horses: Types.DocumentArray; }; type InventoryModelType = Model; diff --git a/src/routes/api.ts b/src/routes/api.ts index de269c34..66f55d0f 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -26,13 +26,14 @@ import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestCo import { surveysController } from "@/src/controllers/api/surveysController"; import { updateChallengeProgressController } from "@/src/controllers/api/updateChallengeProgressController"; import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController"; -import { viewController } from "@/src/controllers/api/viewController"; import { joinSessionController } from "@/src/controllers/api/joinSessionController"; import { saveLoadoutController } from "@/src/controllers/api/saveLoadout"; import { trainingResultController } from "@/src/controllers/api/trainingResultController"; import { artifactsController } from "../controllers/api/artifactsController"; import express from "express"; +import { setBootLocationController } from "@/src/controllers/api/setBootLocationController"; +import { focusController } from "@/src/controllers/api/focusController"; const apiRouter = express.Router(); @@ -46,7 +47,6 @@ apiRouter.get("/loginRewards.php", loginRewardsController); apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController); apiRouter.get("/inbox.php", inboxController); apiRouter.get("/getShip.php", getShipController); -apiRouter.get("/view.php", viewController); apiRouter.get("/drones.php", dronesController); apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController); apiRouter.get("/getNewRewardSeed.php", getNewRewardSeedController); @@ -58,8 +58,10 @@ apiRouter.get("/hub", hubController); apiRouter.get("/modularWeaponSale.php", modularWeaponSaleController); apiRouter.get("/deleteSession.php", deleteSessionController); apiRouter.get("/logout.php", logoutController); +apiRouter.get("/setBootLocation.php", setBootLocationController); // post +apiRouter.post("/focus.php", focusController); apiRouter.post("/artifacts.php", artifactsController); apiRouter.post("/findSessions.php", findSessionsController); // eslint-disable-next-line @typescript-eslint/no-misused-promises diff --git a/src/routes/stats.ts b/src/routes/stats.ts index a0df739f..59290675 100644 --- a/src/routes/stats.ts +++ b/src/routes/stats.ts @@ -1,4 +1,4 @@ -import { viewController } from "../controllers/api/viewController"; +import { viewController } from "../controllers/stats/viewController"; import { uploadController } from "@/src/controllers/stats/uploadController"; import express from "express"; diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 534dbfa8..93d62603 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -17,7 +17,7 @@ import { import { IGenericUpdate } from "../types/genericUpdate"; import { IArtifactsRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes"; -const createInventory = async (accountOwnerId: Types.ObjectId, loadOutPresetId: Types.ObjectId) => { +export const createInventory = async (accountOwnerId: Types.ObjectId, loadOutPresetId: Types.ObjectId) => { try { const inventory = new Inventory({ ...new_inventory, @@ -53,13 +53,28 @@ export const getInventory = async (accountOwnerId: string) => { return inventory; }; -const addPowerSuit = async (powersuitName: string, accountId: string): Promise => { +//TODO: genericMethod for all the add methods, they share a lot of logic +export const addSentinel = async (sentinelName: string, accountId: string) => { + const inventory = await getInventory(accountId); + const sentinelIndex = inventory.Sentinels.push({ ItemType: sentinelName, Configs: [], XP: 0 }); + const changedInventory = await inventory.save(); + return changedInventory.Sentinels[sentinelIndex - 1].toJSON(); +}; + +export const addPowerSuit = async (powersuitName: string, accountId: string): Promise => { const inventory = await getInventory(accountId); const suitIndex = inventory.Suits.push({ ItemType: powersuitName, Configs: [], UpgradeVer: 101, XP: 0 }); const changedInventory = await inventory.save(); return changedInventory.Suits[suitIndex - 1].toJSON(); }; +export const addMechSuit = async (mechsuitName: string, accountId: string) => { + const inventory = await getInventory(accountId); + const suitIndex = inventory.MechSuits.push({ ItemType: mechsuitName, Configs: [], UpgradeVer: 101, XP: 0 }); + const changedInventory = await inventory.save(); + return changedInventory.MechSuits[suitIndex - 1].toJSON(); +}; + export const updateSlots = async (slotType: SlotType, accountId: string, slots: number) => { const inventory = await getInventory(accountId); @@ -70,6 +85,9 @@ export const updateSlots = async (slotType: SlotType, accountId: string, slots: case SlotType.WEAPON: inventory.WeaponBin.Slots += slots; break; + case SlotType.MECHSUIT: + inventory.MechBin.Slots += slots; + break; default: throw new Error("invalid slot type"); } @@ -343,5 +361,3 @@ export const upgradeMod = async (artifactsData: IArtifactsRequest, accountId: st throw error; } }; - -export { createInventory, addPowerSuit }; diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index 8b88cd86..b6d80c21 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -1,6 +1,14 @@ import { getWeaponType } from "@/src/helpers/purchaseHelpers"; import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers"; -import { addBooster, addCustomization, addPowerSuit, addWeapon, updateSlots } from "@/src/services/inventoryService"; +import { + addBooster, + addCustomization, + addMechSuit, + addPowerSuit, + addSentinel, + addWeapon, + updateSlots +} from "@/src/services/inventoryService"; import { IPurchaseRequest, SlotType } from "@/src/types/purchaseTypes"; export const getStoreItemCategory = (storeItem: string) => { @@ -72,8 +80,25 @@ const handleWeaponsPurchase = async (weaponName: string, accountId: string) => { }; const handlePowersuitPurchase = async (powersuitName: string, accountId: string) => { + if (powersuitName.includes("EntratiMech")) { + const mechSuit = await addMechSuit(powersuitName, accountId); + await updateSlots(SlotType.MECHSUIT, accountId, -1); + console.log("mech suit", mechSuit); + + return { + InventoryChanges: { + MechBin: { + count: 1, + platinum: 0, + Slots: -1 + }, + MechSuits: [mechSuit] + } + }; + } + const suit = await addPowerSuit(powersuitName, accountId); - await updateSlots(SlotType.WEAPON, accountId, -1); + await updateSlots(SlotType.SUIT, accountId, -1); return { InventoryChanges: { @@ -95,13 +120,24 @@ const handleTypesPurchase = async (typesName: string, accountId: string) => { return await handleSuitCustomizationsPurchase(typesName, accountId); // case "Recipes": // break; - // case "Sentinels": - // break; + case "Sentinels": + return await handleSentinelPurchase(typesName, accountId); default: throw new Error(`unknown Types category: ${typeCategory} not implemented or new`); } }; +const handleSentinelPurchase = async (sentinelName: string, accountId: string) => { + const sentinel = await addSentinel(sentinelName, accountId); + + return { + InventoryChanges: { + SentinelBin: { count: 1, platinum: 0, Slots: -1 }, + Sentinels: [sentinel] + } + }; +}; + const handleSuitCustomizationsPurchase = async (customizationName: string, accountId: string) => { const customization = await addCustomization(customizationName, accountId); diff --git a/src/services/saveLoadoutService.ts b/src/services/saveLoadoutService.ts index d47254e9..8d690e62 100644 --- a/src/services/saveLoadoutService.ts +++ b/src/services/saveLoadoutService.ts @@ -15,13 +15,20 @@ export const isEmptyObject = (obj: unknown): boolean => { //setup default items on account creation or like originally in giveStartingItems.php -//export const updateLoadout = (loadout: ISaveLoadoutRequest, accountId: string) => {}; +//TODO: avoid multiple saves for less db calls +//TODO: change update functions to only add and not save + +/* loadouts has loadoutconfigs +operatorloadouts has itemconfig, but no multiple config ids +itemconfig has multiple config ids +*/ -//support multiple loadouts and multiple items and multiple configs per item export const handleInventoryItemConfigChange = async ( equipmentChanges: ISaveLoadoutRequestNoUpgradeVer, accountId: string ) => { + const inventory = await getInventory(accountId); + for (const [_equipmentName, _equipment] of Object.entries(equipmentChanges)) { const equipment = _equipment as ISaveLoadoutRequestNoUpgradeVer[keyof ISaveLoadoutRequestNoUpgradeVer]; const equipmentName = _equipmentName as keyof ISaveLoadoutRequestNoUpgradeVer; @@ -34,12 +41,10 @@ export const handleInventoryItemConfigChange = async ( switch (equipmentName) { case "OperatorLoadOuts": case "AdultOperatorLoadOuts": { - console.log("loadout received", equipmentName); - const inventory = await getInventory(accountId); const operatorConfig = equipment as IOperatorConfigEntry; const operatorLoadout = inventory[equipmentName]; - + console.log("loadout received", equipmentName, operatorConfig); // all non-empty entries are one loadout slot for (const [loadoutId, loadoutConfig] of Object.entries(operatorConfig)) { // console.log("loadoutId", loadoutId, "loadoutconfig", loadoutConfig); @@ -123,20 +128,25 @@ export const handleInventoryItemConfigChange = async ( case "LongGuns": case "Pistols": case "Suits": - case "Melee": { + case "Melee": + case "Scoops": + case "DataKnives": + case "DrifterMelee": + case "Sentinels": + case "Horses": { console.log("? ???? ?", equipmentName, equipment); - const itemEntry = equipment as IItemEntry; + const itemEntries = equipment as IItemEntry; const inventory = await getInventory(accountId); - for (const [itemId, itemConfig] of Object.entries(itemEntry)) { - const inventoryItem = inventory[equipmentName].find(item => item._id.toString() === itemId); + for (const [itemId, itemConfigEntries] of Object.entries(itemEntries)) { + const inventoryItem = inventory[equipmentName].find(item => item._id?.toString() === itemId); if (!inventoryItem) { throw new Error(`inventory item ${equipmentName} not found with id ${itemId}`); } //config ids are 0,1,2 can there be a 3? - for (const [configId, config] of Object.entries(itemConfig)) { + for (const [configId, config] of Object.entries(itemConfigEntries)) { inventoryItem.Configs[parseInt(configId)] = config; } } @@ -145,35 +155,40 @@ export const handleInventoryItemConfigChange = async ( } case "CurrentLoadOutIds": { //TODO: remove duplicate getInventory after finding out when currentloadOutId is sent - const loadoutIds = equipment as IOid[]; + const loadoutIds = equipment as IOid[]; // TODO: Check for more than just an array of oids, I think i remember one instance const inventory = await getInventory(accountId); inventory.CurrentLoadOutIds = loadoutIds; await inventory.save(); break; } + case "EquippedGear": { + inventory.EquippedGear = equipment as string[]; + break; + } default: { - console.log("category not implemented", equipmentName); + console.log("category not implemented", equipmentName, equipment); } } //case "OperatorAmps": - // case "Sentinels": + // case "SentinelWeapons": // case "KubrowPets": // case "SpaceSuits": // case "SpaceGuns": // case "SpaceMelee": - // case "Scoops": + // case "SpecialItems": // case "MoaPets": // case "Hoverboards": - // case "DataKnives": + // case "MechSuits": // case "CrewShipHarnesses": - // case "Horses": - // case "DrifterMelee": + + // // case "CrewShips": //case "KahlLoadOuts": not sure yet how to handle kahl: it is not sent in inventory } + await inventory.save(); }; diff --git a/src/types/inventoryTypes/SuitTypes.ts b/src/types/inventoryTypes/SuitTypes.ts index fb63283a..f075587c 100644 --- a/src/types/inventoryTypes/SuitTypes.ts +++ b/src/types/inventoryTypes/SuitTypes.ts @@ -1,6 +1,7 @@ import { IOid } from "@/src/types/commonTypes"; -import { IAbilityOverride, IColor, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { Types } from "mongoose"; +import { IItemConfig } from "./commonInventoryTypes"; export interface ISuitClient extends ISuitDatabase { ItemId: IOid; @@ -19,43 +20,5 @@ export interface ISuitDatabase { FocusLens?: string; UnlockLevel?: number; _id: Types.ObjectId; -} - -interface IItemConfigBase { - Skins: string[]; - pricol?: IColor; - attcol?: IColor; - sigcol?: IColor; - eyecol?: IColor; - facial?: IColor; - syancol?: IColor; - cloth?: IColor; - Upgrades?: string[]; - Name?: string; - ugly?: boolean; -} - -export interface IItemConfig extends IItemConfigBase { - Songs?: ISong[]; - AbilityOverride?: IAbilityOverride; - PvpUpgrades?: string[]; - ugly?: boolean; -} - -export interface ISong { - m?: string; - b?: string; - p?: string; - s: string; -} - -//TODO: Consider renaming it to loadout instead of config -export interface IOperatorConfigDatabase extends IItemConfigBase { - _id: Types.ObjectId; - AbilityOverride?: IAbilityOverride; // not present in adultOperator - OperatorAmp?: IOid; // not present in adultOperator -} - -export interface IOperatorConfigClient extends Omit { - ItemId: IOid; + ItemId?: IOid; // only in response } diff --git a/src/types/inventoryTypes/commonInventoryTypes.ts b/src/types/inventoryTypes/commonInventoryTypes.ts index 0664407f..b86cb719 100644 --- a/src/types/inventoryTypes/commonInventoryTypes.ts +++ b/src/types/inventoryTypes/commonInventoryTypes.ts @@ -1,3 +1,6 @@ +import { IOid } from "@/src/types/commonTypes"; +import { Types } from "mongoose"; + export interface IPolarity { Slot: number; Value: FocusSchool; @@ -41,3 +44,44 @@ export interface Isigcol { t1: number; en: number; } + +interface IItemConfigBase { + Skins: string[]; + pricol?: IColor; + attcol?: IColor; + sigcol?: IColor; + eyecol?: IColor; + facial?: IColor; + syancol?: IColor; + cloth?: IColor; + Upgrades?: string[]; + Name?: string; + ugly?: boolean; +} + +//TODO: Proper names for the different config types, this should be something like +//IItemConfigPlayable +export interface IItemConfig extends IItemConfigBase { + Songs?: ISong[]; + AbilityOverride?: IAbilityOverride; + PvpUpgrades?: string[]; + ugly?: boolean; +} + +export interface ISong { + m?: string; + b?: string; + p?: string; + s: string; +} + +//TODO: Consider renaming it to loadout instead of config +export interface IOperatorConfigDatabase extends IItemConfigBase { + _id: Types.ObjectId; + AbilityOverride?: IAbilityOverride; // not present in adultOperator + OperatorAmp?: IOid; // not present in adultOperator +} + +export interface IOperatorConfigClient extends Omit { + ItemId: IOid; +} diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index db0383f8..2674599a 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -1,17 +1,24 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Document, Types } from "mongoose"; import { IOid, IMongoDate } from "../commonTypes"; -import { IAbilityOverride, IColor, FocusSchool, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; -import { IOperatorConfigClient, ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; +import { + IAbilityOverride, + IColor, + FocusSchool, + IPolarity, + IItemConfig, + IOperatorConfigClient +} from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; import { IOperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; -import { IItemConfig } from "@/src/types/saveLoadoutTypes"; //Document extends will be deleted soon. TODO: delete and migrate uses to ... export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {} -export interface IInventoryDatabase extends Omit { +export interface IInventoryDatabase extends Omit { accountOwnerId: Types.ObjectId; TrainingDate: Date; // TrainingDate changed from IMongoDate to Date LoadOutPresets: Types.ObjectId; // LoadOutPresets changed from ILoadOutPresets to Types.ObjectId for population + Mailbox: Types.ObjectId; // Mailbox changed from IMailbox to Types.ObjectId } export interface IInventoryResponseDocument extends IInventoryResponse, Document {} @@ -22,13 +29,25 @@ export interface IGenericItem { Configs: IItemConfig[]; UpgradeVer: number; ItemId: IOid; + Features?: number; //space suit has this +} + +export interface IDuviriInfo { + Seed: number; + NumCompletions: number; +} + +export interface IMailbox { + LastInboxId: IOid; } export interface IInventoryResponse { - KahlLoadOuts: IGenericItem[]; - DrifterMelee: IGenericItem[]; Horses: IGenericItem[]; - DuviriInfo: { Seed: number; NumCompletions: number }; // TODO: add to schema + DrifterMelee: IGenericItem[]; + DrifterGuns: IGenericItem[]; + DuviriInfo: IDuviriInfo; + Mailbox: IMailbox; + KahlLoadOuts: IGenericItem[]; SubscribedToEmails: number; Created: IMongoDate; RewardSeed: number; @@ -41,9 +60,13 @@ export interface IInventoryResponse { SentinelBin: ISlots; SpaceSuitBin: ISlots; SpaceWeaponBin: ISlots; - PvpBonusLoadoutBin: ICrewMemberBinClass; + PvpBonusLoadoutBin: ISlots; PveBonusLoadoutBin: ISlots; RandomModBin: ISlots; + MechBin: ISlots; + CrewMemberBin: ISlots; + OperatorAmpBin: ISlots; + CrewShipSalvageBin: ISlots; TradesRemaining: number; DailyAffiliation: number; DailyAffiliationPvp: number; @@ -63,7 +86,7 @@ export interface IInventoryResponse { Ships: IShip[]; QuestKeys: IQuestKey[]; FlavourItems: IFlavourItem[]; - Scoops: IScoop[]; + Scoops: IGenericItem[]; TrainingRetriesLeft: number; LoadOutPresets: ILoadOutPresets; CurrentLoadOutIds: Array; @@ -97,14 +120,14 @@ export interface IInventoryResponse { Affiliations: IAffiliation[]; QualifyingInvasions: any[]; FactionScores: number[]; - SpaceSuits: ISpace[]; - SpaceMelee: ISpace[]; + SpaceSuits: IGenericItem[]; + SpaceMelee: IGenericItem[]; SpaceGuns: ISpaceGun[]; ArchwingEnabled: boolean; PendingSpectreLoadouts: any[]; SpectreLoadouts: ISpectreLoadout[]; - SentinelWeapons: ISentinelWeapon[]; - Sentinels: ISentinel[]; + SentinelWeapons: IWeaponDatabase[]; + Sentinels: IWeaponDatabase[]; EmailItems: IEmailItem[]; CompletedSyndicates: string[]; FocusXP: IFocusXP; @@ -117,7 +140,6 @@ export interface IInventoryResponse { ActiveAvatarImageType: string; KubrowPets: IKubrowPet[]; ShipDecorations: IConsumable[]; - OperatorAmpBin: ISlots; DailyAffiliationCetus: number; DailyAffiliationQuills: number; DiscoveredMarkers: IDiscoveredMarker[]; @@ -149,13 +171,12 @@ export interface IInventoryResponse { MoaPets: IMoaPet[]; EquippedInstrument: string; InvasionChainProgress: IInvasionChainProgress[]; - DataKnives: IDataKnife[]; + DataKnives: IGenericItem[]; NemesisHistory: INemesisHistory[]; LastNemesisAllySpawnTime: IMongoDate; Settings: ISettings; PersonalTechProjects: IPersonalTechProject[]; CrewShips: ICrewShip[]; - CrewShipSalvageBin: ISlots; PlayerSkills: IPlayerSkills; CrewShipAmmo: IConsumable[]; CrewShipSalvagedWeaponSkins: ICrewShipSalvagedWeaponSkin[]; @@ -165,13 +186,11 @@ export interface IInventoryResponse { TradeBannedUntil: IMongoDate; PlayedParkourTutorial: boolean; SubscribedToEmailsPersonalized: number; - MechBin: ICrewMemberBinClass; DailyAffiliationEntrati: number; DailyAffiliationNecraloid: number; - MechSuits: IMechSuit[]; + MechSuits: ISuitDatabase[]; InfestedFoundry: IInfestedFoundry; BlessingCooldown: IMongoDate; - CrewMemberBin: ICrewMemberBinClass; CrewShipHarnesses: ICrewShipHarness[]; CrewShipRawSalvage: IConsumable[]; CrewMembers: ICrewMember[]; @@ -275,10 +294,6 @@ export interface IConsumable { ItemType: string; } -export interface ICrewMemberBinClass { - Slots: number; -} - export interface ICrewMember { ItemType: string; NemesisFingerprint: number; @@ -418,22 +433,6 @@ export interface IPortGuns { PRIMARY_A: IL; } -export interface IDataKnife { - ItemType: string; - XP: number; - Configs: IDataKnifeConfig[]; - UpgradeVer: number; - ItemId: IOid; -} - -export interface IDataKnifeConfig { - Upgrades?: string[]; - pricol?: IColor; - Skins: string[]; - attcol?: IColor; - sigcol?: IColor; -} - export interface IDiscoveredMarker { tag: string; discoveryState: number[]; @@ -733,17 +732,6 @@ export interface ILotusCustomization { Persona: string; } -export interface IMechSuit { - ItemType: string; - Configs: IDataKnifeConfig[]; - Features: number; - UpgradeVer: number; - XP: number; - Polarity: IPolarity[]; - Polarized: number; - ItemId: IOid; -} - export interface IMission { Completes: number; Tier?: number; @@ -932,6 +920,7 @@ export interface IQuestKey { Progress?: IProgress[]; unlock?: boolean; Completed?: boolean; + CustomData?: string; ItemType: string; CompletionDate?: IMongoDate; } @@ -949,17 +938,6 @@ export interface IRawUpgrade { LastAdded?: IOid; } -export interface IScoop { - ItemType: string; - Configs: IScoopConfig[]; - UpgradeVer: number; - ItemId: IOid; -} - -export interface IScoopConfig { - pricol?: IColor; -} - export interface ISeasonChallengeHistory { challenge: string; id: string; @@ -969,40 +947,6 @@ export interface ISentientSpawnChanceBoosters { numOceanMissionsCompleted: number; } -export interface ISentinelWeapon { - ItemType: string; - Configs: ISentinelWeaponConfig[]; - UpgradeVer?: number; - XP?: number; - ItemId: IOid; - Features?: number; - Polarity?: IPolarity[]; - Polarized?: number; -} - -export interface ISentinelWeaponConfig { - Skins?: FluffySkin[]; - Upgrades?: string[]; -} - -export enum FluffySkin { - Empty = "", - LotusUpgradesSkinsHolsterCustomizationsGlaiveInPlace = "/Lotus/Upgrades/Skins/HolsterCustomizations/GlaiveInPlace", - LotusUpgradesSkinsHolsterCustomizationsPistolHipsR = "/Lotus/Upgrades/Skins/HolsterCustomizations/PistolHipsR", - LotusUpgradesSkinsHolsterCustomizationsRifleUpperBack = "/Lotus/Upgrades/Skins/HolsterCustomizations/RifleUpperBack" -} - -export interface ISentinel { - ItemType: string; - Configs: IKubrowPetConfig[]; - UpgradeVer: number; - XP: number; - Features?: number; - Polarity?: IPolarity[]; - Polarized?: number; - ItemId: IOid; -} - export interface ISettings { FriendInvRestriction: string; GiftMode: string; @@ -1038,15 +982,6 @@ export interface ISpaceGunConfig { Upgrades?: string[]; } -export interface ISpace { - ItemType: string; - Configs: IKubrowPetConfig[]; - XP: number; - UpgradeVer: number; - ItemId: IOid; - Features?: number; -} - export interface ISpecialItem { ItemType: string; Configs: ISpecialItemConfig[]; diff --git a/src/types/inventoryTypes/weaponTypes.ts b/src/types/inventoryTypes/weaponTypes.ts index 0d92ef6d..7cc390f3 100644 --- a/src/types/inventoryTypes/weaponTypes.ts +++ b/src/types/inventoryTypes/weaponTypes.ts @@ -1,5 +1,5 @@ import { IOid } from "@/src/types/commonTypes"; -import { IItemConfig } from "@/src/types/inventoryTypes/SuitTypes"; +import { IItemConfig } from "./commonInventoryTypes"; import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { Types } from "mongoose"; diff --git a/src/types/purchaseTypes.ts b/src/types/purchaseTypes.ts index ca98dc95..ce1e6270 100644 --- a/src/types/purchaseTypes.ts +++ b/src/types/purchaseTypes.ts @@ -40,5 +40,6 @@ export type IBinChanges = { export enum SlotType { SUIT = "SuitBin", - WEAPON = "WeaponBin" + WEAPON = "WeaponBin", + MECHSUIT = "MechBin" } diff --git a/src/types/saveLoadoutTypes.ts b/src/types/saveLoadoutTypes.ts index 5e630be5..61020029 100644 --- a/src/types/saveLoadoutTypes.ts +++ b/src/types/saveLoadoutTypes.ts @@ -1,5 +1,5 @@ import { IOid } from "@/src/types/commonTypes"; -import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/SuitTypes"; +import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { Types } from "mongoose"; export interface ISaveLoadoutRequest { @@ -31,6 +31,7 @@ export interface ISaveLoadoutRequest { CrewShips: IItemEntry; CurrentLoadOutIds: IOid[]; ValidNewLoadoutId: string; + EquippedGear: string[]; } export interface ISaveLoadoutRequestNoUpgradeVer extends Omit {} @@ -89,4 +90,3 @@ export interface IEquipmentSelection { mod: number; cus: number; } -export { IItemConfig }; diff --git a/static/fixed_responses/postTutorialInventory.json b/static/fixed_responses/postTutorialInventory.json index 31d9a61f..9bcab784 100644 --- a/static/fixed_responses/postTutorialInventory.json +++ b/static/fixed_responses/postTutorialInventory.json @@ -5,7 +5,7 @@ "RewardSeed": -5604904486637265640, "CrewMemberBin": { "Slots": 3 }, "CrewShipSalvageBin": { "Slots": 8 }, - "DrifterMelee": [{ "ItemType": "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords", "ItemId": { "$oid": "647bd268c547fe5b2909e715" } }], + "DrifterMelee": [{ "ItemType": "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords", "ItemId": { "$oid": "647bd27cf856530b4f3bf343" } }], "FusionPoints": 0, "MechBin": { "Slots": 4 }, "OperatorAmpBin": { "Slots": 8 }, @@ -84,7 +84,24 @@ "CrewShipWeaponSkins": [], "DrifterGuns": [], "Drones": [], - "Horses": [], + "Horses": [ + { + "ItemType": "/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit", + "Configs": [ + { + "Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"] + }, + { + "Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"] + }, + { + "Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"] + } + ], + "UpgradeVer": 101, + "ItemId": { "$oid": "647bd27cf856530b4f3bf343" } + } + ], "Hoverboards": [], "KubrowPets": [], "KubrowPetEggs": [], diff --git a/static/fixed_responses/testQuestKeys.json b/static/fixed_responses/testQuestKeys.json index df32ed3d..1a822001 100644 --- a/static/fixed_responses/testQuestKeys.json +++ b/static/fixed_responses/testQuestKeys.json @@ -7,5 +7,35 @@ }, { "ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/WarWithinQuest/WarWithinQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/SacrificeQuest/SacrificeQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/NewWarIntroQuest/NewWarIntroKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/NewWarQuest/NewWarQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/ApostasyQuest/ApostasyKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/WarWithinQuest/WarWithinQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/OrokinMoonQuest/OrokinMoonQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/ZarimanQuest/ZarimanQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain" + }, + { + "ItemType": "/Lotus/Types/Keys/ArchwingQuest/ArchwingQuestKeyChain" } ]