From a3c1dcd1f195fbfe5ce5c721e8b28fe745a1793e Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Thu, 20 Nov 2025 23:23:37 -0800 Subject: [PATCH] fix: create NORMAL loadout with post-tutorial accounts (#3057) There are some strange client bugs resulting from logging in to an account without a loadout in post-tutorial state. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3057 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/services/inventoryService.ts | 23 ++++++++++++++++++++++- src/services/loginService.ts | 10 +++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 993ede7d..d8e01639 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -93,9 +93,11 @@ import type { import { EquipmentFeatures, Status } from "../types/equipmentTypes.ts"; import type { ITypeCount } from "../types/commonTypes.ts"; import { skinLookupTable } from "../helpers/skinLookupTable.ts"; +import type { TLoadoutDatabaseDocument } from "../models/inventoryModels/loadoutModel.ts"; export const createInventory = async ( accountOwnerId: Types.ObjectId, + loadout: TLoadoutDatabaseDocument, defaultItemReferences: { loadOutPresetId: Types.ObjectId; ship: Types.ObjectId } ): Promise => { try { @@ -115,10 +117,29 @@ export const createInventory = async ( if (config.skipTutorial) { inventory.PlayedParkourTutorial = true; - await addStartingGear(inventory); + const startingGear = await addStartingGear(inventory); await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain", undefined); await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain", undefined); + loadout.NORMAL.push({ + s: { + ItemId: new Types.ObjectId(fromOid(startingGear.Suits![0].ItemId)) + }, + l: { + ItemId: new Types.ObjectId(fromOid(startingGear.LongGuns![0].ItemId)) + }, + p: { + ItemId: new Types.ObjectId(fromOid(startingGear.Pistols![0].ItemId)) + }, + m: { + ItemId: new Types.ObjectId(fromOid(startingGear.Melee![0].ItemId)) + }, + a: { + ItemId: new Types.ObjectId(fromOid(startingGear.SpecialItems![0].ItemId)) + } + }); + await loadout.save(); + const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"]; inventory.Missions.push( diff --git a/src/services/loginService.ts b/src/services/loginService.ts index d73a2545..d6d38f04 100644 --- a/src/services/loginService.ts +++ b/src/services/loginService.ts @@ -3,7 +3,7 @@ import { createInventory } from "./inventoryService.ts"; import type { IDatabaseAccountJson, IDatabaseAccountRequiredFields } from "../types/loginTypes.ts"; import { createShip } from "./shipService.ts"; import type { Document, Types } from "mongoose"; -import { Loadout } from "../models/inventoryModels/loadoutModel.ts"; +import { Loadout, type TLoadoutDatabaseDocument } from "../models/inventoryModels/loadoutModel.ts"; import { PersonalRooms } from "../models/personalRoomsModel.ts"; import type { Request } from "express"; import { config } from "./configService.ts"; @@ -39,10 +39,10 @@ export const createAccount = async (accountData: IDatabaseAccountRequiredFields) const account = new Account(accountData); try { await account.save(); - const loadoutId = await createLoadout(account._id); + const loadout = await createLoadout(account._id); const shipId = await createShip(account._id); await createPersonalRooms(account._id, shipId); - await createInventory(account._id, { loadOutPresetId: loadoutId, ship: shipId }); + await createInventory(account._id, loadout, { loadOutPresetId: loadout._id, ship: shipId }); await createStats(account._id.toString()); return account.toJSON(); } catch (error) { @@ -53,10 +53,10 @@ export const createAccount = async (accountData: IDatabaseAccountRequiredFields) } }; -export const createLoadout = async (accountId: Types.ObjectId): Promise => { +export const createLoadout = async (accountId: Types.ObjectId): Promise => { const loadout = new Loadout({ loadoutOwnerId: accountId }); const savedLoadout = await loadout.save(); - return savedLoadout._id; + return savedLoadout; }; export const createPersonalRooms = async (accountId: Types.ObjectId, shipId: Types.ObjectId): Promise => {