feat: handle railjack armaments, crew, & customizations in saveLoadout
All checks were successful
Build / build (push) Successful in 41s
Build / build (pull_request) Successful in 1m24s

This commit is contained in:
Sainan 2025-04-17 22:47:25 +02:00
parent 41d976d362
commit 90940b01e2
5 changed files with 72 additions and 37 deletions

View File

@ -39,10 +39,9 @@ import {
ILoreFragmentScan, ILoreFragmentScan,
IEvolutionProgress, IEvolutionProgress,
IEndlessXpProgress, IEndlessXpProgress,
ICrewShipPortGuns,
ICrewShipCustomization, ICrewShipCustomization,
ICrewShipWeapon, ICrewShipWeapon,
ICrewShipPilotWeapon, ICrewShipWeaponEmplacements,
IShipExterior, IShipExterior,
IHelminthFoodRecord, IHelminthFoodRecord,
ICrewShipMembersDatabase, ICrewShipMembersDatabase,
@ -719,25 +718,23 @@ const endlessXpProgressSchema = new Schema<IEndlessXpProgress>(
{ _id: false } { _id: false }
); );
const crewShipPilotWeaponSchema = new Schema<ICrewShipPilotWeapon>( const crewShipWeaponEmplacementsSchema = new Schema<ICrewShipWeaponEmplacements>(
{ {
PRIMARY_A: EquipmentSelectionSchema, PRIMARY_A: EquipmentSelectionSchema,
SECONDARY_A: EquipmentSelectionSchema PRIMARY_B: EquipmentSelectionSchema,
}, SECONDARY_A: EquipmentSelectionSchema,
{ _id: false } SECONDARY_B: EquipmentSelectionSchema
);
const crewShipPortGunsSchema = new Schema<ICrewShipPortGuns>(
{
PRIMARY_A: EquipmentSelectionSchema
}, },
{ _id: false } { _id: false }
); );
const crewShipWeaponSchema = new Schema<ICrewShipWeapon>( const crewShipWeaponSchema = new Schema<ICrewShipWeapon>(
{ {
PILOT: crewShipPilotWeaponSchema, PILOT: crewShipWeaponEmplacementsSchema,
PORT_GUNS: crewShipPortGunsSchema PORT_GUNS: crewShipWeaponEmplacementsSchema,
STARBOARD_GUNS: crewShipWeaponEmplacementsSchema,
ARTILLERY: crewShipWeaponEmplacementsSchema,
SCANNER: crewShipWeaponEmplacementsSchema
}, },
{ _id: false } { _id: false }
); );
@ -761,7 +758,7 @@ const crewShipCustomizationSchema = new Schema<ICrewShipCustomization>(
const crewShipMemberSchema = new Schema<ICrewShipMemberDatabase>( const crewShipMemberSchema = new Schema<ICrewShipMemberDatabase>(
{ {
ItemId: { type: Schema.Types.ObjectId, required: false }, ItemId: { type: Schema.Types.ObjectId, required: false },
NemesisFingerprint: { type: Number, required: false } NemesisFingerprint: { type: BigInt, required: false }
}, },
{ _id: false } { _id: false }
); );

View File

@ -104,18 +104,18 @@ const replaceSlots = (db: ISlots, client: ISlots): void => {
db.Slots = client.Slots; db.Slots = client.Slots;
}; };
const convertCrewShipMember = (client: ICrewShipMemberClient): ICrewShipMemberDatabase => { export const importCrewMemberId = (crewMemberId: ICrewShipMemberClient): ICrewShipMemberDatabase => {
return { if (crewMemberId.ItemId) {
...client, return { ItemId: new Types.ObjectId(crewMemberId.ItemId.$oid) };
ItemId: client.ItemId ? new Types.ObjectId(client.ItemId.$oid) : undefined }
}; return { NemesisFingerprint: BigInt(crewMemberId.NemesisFingerprint ?? 0) };
}; };
const convertCrewShipMembers = (client: ICrewShipMembersClient): ICrewShipMembersDatabase => { const convertCrewShipMembers = (client: ICrewShipMembersClient): ICrewShipMembersDatabase => {
return { return {
SLOT_A: client.SLOT_A ? convertCrewShipMember(client.SLOT_A) : undefined, SLOT_A: client.SLOT_A ? importCrewMemberId(client.SLOT_A) : undefined,
SLOT_B: client.SLOT_B ? convertCrewShipMember(client.SLOT_B) : undefined, SLOT_B: client.SLOT_B ? importCrewMemberId(client.SLOT_B) : undefined,
SLOT_C: client.SLOT_C ? convertCrewShipMember(client.SLOT_C) : undefined SLOT_C: client.SLOT_C ? importCrewMemberId(client.SLOT_C) : undefined
}; };
}; };

View File

@ -13,6 +13,8 @@ import { Types } from "mongoose";
import { isEmptyObject } from "@/src/helpers/general"; import { isEmptyObject } from "@/src/helpers/general";
import { logger } from "@/src/utils/logger"; import { logger } from "@/src/utils/logger";
import { equipmentKeys, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes"; import { equipmentKeys, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
import { IItemConfig } from "../types/inventoryTypes/commonInventoryTypes";
import { importCrewMemberId } from "./importService";
//TODO: setup default items on account creation or like originally in giveStartingItems.php //TODO: setup default items on account creation or like originally in giveStartingItems.php
@ -174,8 +176,8 @@ export const handleInventoryItemConfigChange = async (
} }
for (const [configId, config] of Object.entries(itemConfigEntries)) { for (const [configId, config] of Object.entries(itemConfigEntries)) {
if (typeof config !== "boolean") { if (/^[0-9]+$/.test(configId)) {
inventoryItem.Configs[parseInt(configId)] = config; inventoryItem.Configs[parseInt(configId)] = config as IItemConfig;
} }
} }
if ("Favorite" in itemConfigEntries) { if ("Favorite" in itemConfigEntries) {
@ -184,6 +186,26 @@ export const handleInventoryItemConfigChange = async (
if ("IsNew" in itemConfigEntries) { if ("IsNew" in itemConfigEntries) {
inventoryItem.IsNew = itemConfigEntries.IsNew; inventoryItem.IsNew = itemConfigEntries.IsNew;
} }
if ("ItemName" in itemConfigEntries) {
inventoryItem.ItemName = itemConfigEntries.ItemName;
}
if ("RailjackImage" in itemConfigEntries) {
inventoryItem.RailjackImage = itemConfigEntries.RailjackImage;
}
if ("Customization" in itemConfigEntries) {
inventoryItem.Customization = itemConfigEntries.Customization;
}
if ("Weapon" in itemConfigEntries) {
inventoryItem.Weapon = itemConfigEntries.Weapon;
}
if (itemConfigEntries.CrewMembers) {
inventoryItem.CrewMembers = {
SLOT_A: importCrewMemberId(itemConfigEntries.CrewMembers.SLOT_A ?? {}),
SLOT_B: importCrewMemberId(itemConfigEntries.CrewMembers.SLOT_B ?? {}),
SLOT_C: importCrewMemberId(itemConfigEntries.CrewMembers.SLOT_C ?? {})
};
}
} }
break; break;
} else { } else {

View File

@ -532,12 +532,12 @@ export interface ICrewShipMembersDatabase {
export interface ICrewShipMemberClient { export interface ICrewShipMemberClient {
ItemId?: IOid; ItemId?: IOid;
NemesisFingerprint?: number; NemesisFingerprint?: number | bigint;
} }
export interface ICrewShipMemberDatabase { export interface ICrewShipMemberDatabase {
ItemId?: Types.ObjectId; ItemId?: Types.ObjectId;
NemesisFingerprint?: number; NemesisFingerprint?: bigint;
} }
export interface ICrewShipCustomization { export interface ICrewShipCustomization {
@ -562,17 +562,18 @@ export type IMiscItem = ITypeCount;
// inventory.CrewShips[0].Weapon // inventory.CrewShips[0].Weapon
export interface ICrewShipWeapon { export interface ICrewShipWeapon {
PILOT: ICrewShipPilotWeapon; PILOT?: ICrewShipWeaponEmplacements;
PORT_GUNS: ICrewShipPortGuns; PORT_GUNS?: ICrewShipWeaponEmplacements;
STARBOARD_GUNS?: ICrewShipWeaponEmplacements;
ARTILLERY?: ICrewShipWeaponEmplacements;
SCANNER?: ICrewShipWeaponEmplacements;
} }
export interface ICrewShipPilotWeapon { export interface ICrewShipWeaponEmplacements {
PRIMARY_A: IEquipmentSelection; PRIMARY_A?: IEquipmentSelection;
SECONDARY_A: IEquipmentSelection; PRIMARY_B?: IEquipmentSelection;
} SECONDARY_A?: IEquipmentSelection;
SECONDARY_B?: IEquipmentSelection;
export interface ICrewShipPortGuns {
PRIMARY_A: IEquipmentSelection;
} }
export interface IDiscoveredMarker { export interface IDiscoveredMarker {

View File

@ -1,7 +1,13 @@
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";
import { ILoadoutConfigClient } from "./inventoryTypes/inventoryTypes"; import {
ICrewShipCustomization,
ICrewShipMembersClient,
ICrewShipWeapon,
IFlavourItem,
ILoadoutConfigClient
} from "./inventoryTypes/inventoryTypes";
export interface ISaveLoadoutRequest { export interface ISaveLoadoutRequest {
LoadOuts: ILoadoutClient; LoadOuts: ILoadoutClient;
@ -51,7 +57,16 @@ export interface IItemEntry {
export type IConfigEntry = { export type IConfigEntry = {
[configId in "0" | "1" | "2" | "3" | "4" | "5"]: IItemConfig; [configId in "0" | "1" | "2" | "3" | "4" | "5"]: IItemConfig;
} & { Favorite?: boolean; IsNew?: boolean }; } & {
Favorite?: boolean;
IsNew?: boolean;
// Railjack
ItemName?: string;
RailjackImage?: IFlavourItem;
Customization?: ICrewShipCustomization;
Weapon?: ICrewShipWeapon;
CrewMembers?: ICrewShipMembersClient;
};
export type ILoadoutClient = Omit<ILoadoutDatabase, "_id" | "loadoutOwnerId">; export type ILoadoutClient = Omit<ILoadoutDatabase, "_id" | "loadoutOwnerId">;