diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index ecd007be..8d298d5d 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -83,7 +83,8 @@ import { INemesisClient, IInfNode, IDiscoveredMarker, - IWeeklyMission + IWeeklyMission, + ILockedWeaponGroupDatabase } from "../../types/inventoryTypes/inventoryTypes"; import { IOid } from "../../types/commonTypes"; import { @@ -1147,6 +1148,17 @@ const alignmentSchema = new Schema( { _id: false } ); +const lockedWeaponGroupSchema = new Schema( + { + s: Schema.Types.ObjectId, + p: Schema.Types.ObjectId, + l: Schema.Types.ObjectId, + m: Schema.Types.ObjectId, + sn: Schema.Types.ObjectId + }, + { _id: false } +); + const inventorySchema = new Schema( { accountOwnerId: Schema.Types.ObjectId, @@ -1488,7 +1500,9 @@ const inventorySchema = new Schema( EchoesHexConquestActiveFrameVariants: { type: [String], default: undefined }, EchoesHexConquestActiveStickers: { type: [String], default: undefined }, - BrandedSuits: { type: [Schema.Types.ObjectId], default: undefined } + // G3 + Zanuka + BrandedSuits: { type: [Schema.Types.ObjectId], default: undefined }, + LockedWeaponGroup: { type: lockedWeaponGroupSchema, default: undefined } }, { timestamps: { createdAt: "Created", updatedAt: false } } ); @@ -1523,6 +1537,15 @@ inventorySchema.set("toJSON", { if (inventoryDatabase.BrandedSuits) { inventoryResponse.BrandedSuits = inventoryDatabase.BrandedSuits.map(toOid); } + if (inventoryDatabase.LockedWeaponGroup) { + inventoryResponse.LockedWeaponGroup = { + s: toOid(inventoryDatabase.LockedWeaponGroup.s), + l: inventoryDatabase.LockedWeaponGroup.l ? toOid(inventoryDatabase.LockedWeaponGroup.l) : undefined, + p: inventoryDatabase.LockedWeaponGroup.p ? toOid(inventoryDatabase.LockedWeaponGroup.p) : undefined, + m: inventoryDatabase.LockedWeaponGroup.m ? toOid(inventoryDatabase.LockedWeaponGroup.m) : undefined, + sn: inventoryDatabase.LockedWeaponGroup.sn ? toOid(inventoryDatabase.LockedWeaponGroup.sn) : undefined + }; + } } }); diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index f4fe1164..8fbfd41e 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -47,6 +47,7 @@ import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPe import conservationAnimals from "@/static/fixed_responses/conservationAnimals.json"; import { getInfNodes } from "@/src/helpers/nemesisHelpers"; import { Loadout } from "../models/inventoryModels/loadoutModel"; +import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes"; const getRotations = (rotationCount: number): number[] => { if (rotationCount === 0) return [0]; @@ -95,7 +96,8 @@ export const addMissionInventoryUpdates = async ( inventoryUpdates.MissionFailed && inventoryUpdates.MissionStatus == "GS_FAILURE" && inventoryUpdates.EndOfMatchUpload && - inventoryUpdates.ObjectiveReached + inventoryUpdates.ObjectiveReached && + !inventoryUpdates.LockedWeaponGroup ) { const loadout = (await Loadout.findById(inventory.LoadOutPresets, "NORMAL"))!; const config = loadout.NORMAL.id(inventory.CurrentLoadOutIds[0].$oid)!; @@ -397,6 +399,35 @@ export const addMissionInventoryUpdates = async ( } break; } + case "LockedWeaponGroup": { + inventory.LockedWeaponGroup = { + s: new Types.ObjectId(value.s.$oid), + l: value.l ? new Types.ObjectId(value.l.$oid) : undefined, + p: value.p ? new Types.ObjectId(value.p.$oid) : undefined, + m: value.m ? new Types.ObjectId(value.m.$oid) : undefined, + sn: value.sn ? new Types.ObjectId(value.sn.$oid) : undefined + }; + break; + } + case "UnlockWeapons": { + inventory.LockedWeaponGroup = undefined; + break; + } + case "CurrentLoadOutIds": { + const loadout = await Loadout.findOne({ loadoutOwnerId: inventory.accountOwnerId }); + if (loadout) { + for (const [loadoutId, loadoutConfig] of Object.entries(value.LoadOuts.NORMAL)) { + const { ItemId, ...loadoutConfigItemIdRemoved } = loadoutConfig; + const loadoutConfigDatabase: ILoadoutConfigDatabase = { + _id: new Types.ObjectId(ItemId.$oid), + ...loadoutConfigItemIdRemoved + }; + loadout.NORMAL.id(loadoutId)!.overwrite(loadoutConfigDatabase); + } + await loadout.save(); + } + break; + } default: // Equipment XP updates if (equipmentKeys.includes(key as TEquipmentKey)) { diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index b4d60f20..4eee21b6 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -45,6 +45,7 @@ export interface IInventoryDatabase | "Nemesis" | "EntratiVaultCountResetDate" | "BrandedSuits" + | "LockedWeaponGroup" | TEquipmentKey >, InventoryDatabaseEquipment { @@ -75,6 +76,7 @@ export interface IInventoryDatabase Nemesis?: INemesisDatabase; EntratiVaultCountResetDate?: Date; BrandedSuits?: Types.ObjectId[]; + LockedWeaponGroup?: ILockedWeaponGroupDatabase; } export interface IQuestKeyDatabase { @@ -349,6 +351,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu EchoesHexConquestActiveFrameVariants?: string[]; EchoesHexConquestActiveStickers?: string[]; BrandedSuits?: IOid[]; + LockedWeaponGroup?: ILockedWeaponGroupClient; } export interface IAffiliation { @@ -1149,3 +1152,19 @@ export interface ISongChallenge { Song: string; Difficulties: number[]; } + +export interface ILockedWeaponGroupClient { + s: IOid; + p?: IOid; + l?: IOid; + m?: IOid; + sn?: IOid; +} + +export interface ILockedWeaponGroupDatabase { + s: Types.ObjectId; + p?: Types.ObjectId; + l?: Types.ObjectId; + m?: Types.ObjectId; + sn?: Types.ObjectId; +} diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index 25158f20..299760df 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -17,7 +17,9 @@ import { ILoreFragmentScan, IUpgradeClient, ICollectibleEntry, - IDiscoveredMarker + IDiscoveredMarker, + ILockedWeaponGroupClient, + ILoadOutPresets } from "./inventoryTypes/inventoryTypes"; export interface IAffiliationChange { @@ -108,6 +110,12 @@ export type IMissionInventoryUpdateRequest = { Count: number; }[]; DiscoveredMarkers?: IDiscoveredMarker[]; + LockedWeaponGroup?: ILockedWeaponGroupClient; // sent when captured by zanuka + UnlockWeapons?: boolean; // sent when recovered weapons from zanuka capture + IncHarvester?: boolean; // sent when recovered weapons from zanuka capture + CurrentLoadOutIds?: { + LoadOuts: ILoadOutPresets; // sent when recovered weapons from zanuka capture + }; } & { [K in TEquipmentKey]?: IEquipmentClient[]; };