forked from OpenWF/SpaceNinjaServer
		
	feat: handle railjack armaments, crew, & customizations in saveLoadout (#1706)
Closes #467 Reviewed-on: OpenWF/SpaceNinjaServer#1706 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									196182f9a8
								
							
						
					
					
						commit
						3baf6ad015
					
				@ -39,10 +39,9 @@ import {
 | 
				
			|||||||
    ILoreFragmentScan,
 | 
					    ILoreFragmentScan,
 | 
				
			||||||
    IEvolutionProgress,
 | 
					    IEvolutionProgress,
 | 
				
			||||||
    IEndlessXpProgress,
 | 
					    IEndlessXpProgress,
 | 
				
			||||||
    ICrewShipPortGuns,
 | 
					 | 
				
			||||||
    ICrewShipCustomization,
 | 
					    ICrewShipCustomization,
 | 
				
			||||||
    ICrewShipWeapon,
 | 
					    ICrewShipWeapon,
 | 
				
			||||||
    ICrewShipPilotWeapon,
 | 
					    ICrewShipWeaponEmplacements,
 | 
				
			||||||
    IShipExterior,
 | 
					    IShipExterior,
 | 
				
			||||||
    IHelminthFoodRecord,
 | 
					    IHelminthFoodRecord,
 | 
				
			||||||
    ICrewShipMembersDatabase,
 | 
					    ICrewShipMembersDatabase,
 | 
				
			||||||
@ -772,25 +771,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 }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
@ -814,7 +811,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 }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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 {
 | 
				
			||||||
 | 
				
			|||||||
@ -538,12 +538,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 {
 | 
				
			||||||
@ -568,17 +568,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 {
 | 
				
			||||||
 | 
				
			|||||||
@ -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">;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user