diff --git a/project/src/callbacks/CustomizationCallbacks.ts b/project/src/callbacks/CustomizationCallbacks.ts index de6b156b..f0bc3fad 100644 --- a/project/src/callbacks/CustomizationCallbacks.ts +++ b/project/src/callbacks/CustomizationCallbacks.ts @@ -5,6 +5,7 @@ import type { ISuit } from "@spt/models/eft/common/tables/ITrader"; import type { IBuyClothingRequestData } from "@spt/models/eft/customization/IBuyClothingRequestData"; import type { IGetSuitsResponse } from "@spt/models/eft/customization/IGetSuitsResponse"; import type { IWearClothingRequestData } from "@spt/models/eft/customization/IWearClothingRequestData"; +import type { ICustomizationSetRequest } from "@spt/models/eft/customization/iCustomizationSetRequest"; import type { IGetBodyResponseData } from "@spt/models/eft/httpResponse/IGetBodyResponseData"; import type { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse"; import { SaveServer } from "@spt/servers/SaveServer"; @@ -67,7 +68,11 @@ export class CustomizationCallbacks { } /** Handle CustomizationSet */ - public setClothing(pmcData: IPmcData, info: any, sessionID: string): IItemEventRouterResponse { + public setClothing( + pmcData: IPmcData, + info: ICustomizationSetRequest, + sessionID: string, + ): IGetBodyResponseData { return this.httpResponse.getBody(this.customizationController.setClothing(sessionID, info)); } } diff --git a/project/src/callbacks/HideoutCallbacks.ts b/project/src/callbacks/HideoutCallbacks.ts index f80d8f54..38f15f68 100644 --- a/project/src/callbacks/HideoutCallbacks.ts +++ b/project/src/callbacks/HideoutCallbacks.ts @@ -5,6 +5,7 @@ import type { IHandleQTEEventRequestData } from "@spt/models/eft/hideout/IHandle import type { IHideoutCancelProductionRequestData } from "@spt/models/eft/hideout/IHideoutCancelProductionRequestData"; import type { IHideoutCircleOfCultistProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutCircleOfCultistProductionStartRequestData"; import type { IHideoutContinuousProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutContinuousProductionStartRequestData"; +import type { IHideoutCustomizationApplyRequestData } from "@spt/models/eft/hideout/IHideoutCustomizationApplyRequestData"; import type { IHideoutDeleteProductionRequestData } from "@spt/models/eft/hideout/IHideoutDeleteProductionRequestData"; import type { IHideoutImproveAreaRequestData } from "@spt/models/eft/hideout/IHideoutImproveAreaRequestData"; import type { IHideoutPutItemInRequestData } from "@spt/models/eft/hideout/IHideoutPutItemInRequestData"; @@ -215,7 +216,7 @@ export class HideoutCallbacks implements OnUpdate { */ public hideoutCustomizationApplyCommand( pmcData: IPmcData, - request: any, + request: IHideoutCustomizationApplyRequestData, sessionId: string, ): IItemEventRouterResponse { return this.hideoutController.hideoutCustomizationApply(sessionId, pmcData, request); diff --git a/project/src/controllers/CustomizationController.ts b/project/src/controllers/CustomizationController.ts index 1b4567fe..bf4d1611 100644 --- a/project/src/controllers/CustomizationController.ts +++ b/project/src/controllers/CustomizationController.ts @@ -1,11 +1,14 @@ import { ProfileHelper } from "@spt/helpers/ProfileHelper"; import type { IPmcData } from "@spt/models/eft/common/IPmcData"; +import type { ICustomisationStorage } from "@spt/models/eft/common/tables/ICustomisationStorage"; import type { ISuit } from "@spt/models/eft/common/tables/ITrader"; import type { IBuyClothingRequestData, IPaymentItemForClothing, } from "@spt/models/eft/customization/IBuyClothingRequestData"; import type { IWearClothingRequestData } from "@spt/models/eft/customization/IWearClothingRequestData"; +import type { ICustomizationSetRequest } from "@spt/models/eft/customization/iCustomizationSetRequest"; +import type { IHideoutCustomisation } from "@spt/models/eft/hideout/IHideoutCustomisation"; import type { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse"; import type { ILogger } from "@spt/models/spt/utils/ILogger"; import { EventOutputHolder } from "@spt/routers/EventOutputHolder"; @@ -13,8 +16,6 @@ import { SaveServer } from "@spt/servers/SaveServer"; import { DatabaseService } from "@spt/services/DatabaseService"; import { LocalisationService } from "@spt/services/LocalisationService"; import { inject, injectable } from "tsyringe"; -import type { ICustomisationStorage } from "../models/eft/common/tables/ICustomisationStorage"; -import type { IHideoutCustomisation } from "../models/eft/hideout/IHideoutCustomisation"; @injectable() export class CustomizationController { @@ -249,7 +250,8 @@ export class CustomizationController { return this.databaseService.getTemplates().customisationStoage; } - public setClothing(sessionId: string, info: any): any { + /** Handle CustomizationSet event */ + public setClothing(sessionId: string, info: ICustomizationSetRequest, pmcData: IPmcData): any { throw new Error("Method not implemented."); } } diff --git a/project/src/controllers/HideoutController.ts b/project/src/controllers/HideoutController.ts index e507cee9..aef48f1c 100644 --- a/project/src/controllers/HideoutController.ts +++ b/project/src/controllers/HideoutController.ts @@ -18,6 +18,8 @@ import type { IHideoutArea, IStage } from "@spt/models/eft/hideout/IHideoutArea" import type { IHideoutCancelProductionRequestData } from "@spt/models/eft/hideout/IHideoutCancelProductionRequestData"; import type { IHideoutCircleOfCultistProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutCircleOfCultistProductionStartRequestData"; import type { IHideoutContinuousProductionStartRequestData } from "@spt/models/eft/hideout/IHideoutContinuousProductionStartRequestData"; +import type { IHideoutCustomisationGlobal } from "@spt/models/eft/hideout/IHideoutCustomisation"; +import type { IHideoutCustomizationApplyRequestData } from "@spt/models/eft/hideout/IHideoutCustomizationApplyRequestData"; import type { IHideoutDeleteProductionRequestData } from "@spt/models/eft/hideout/IHideoutDeleteProductionRequestData"; import type { IHideoutImproveAreaRequestData } from "@spt/models/eft/hideout/IHideoutImproveAreaRequestData"; import type { IHideoutProduction } from "@spt/models/eft/hideout/IHideoutProduction"; @@ -1403,8 +1405,43 @@ export class HideoutController { * @param pmcData Player profile * @param request Client request data */ - public hideoutCustomizationApply(sessionId: string, pmcData: IPmcData, request: any): IItemEventRouterResponse { - throw new Error("Method not implemented."); + public hideoutCustomizationApply( + sessionId: string, + pmcData: IPmcData, + request: IHideoutCustomizationApplyRequestData, + ): IItemEventRouterResponse { + const output = this.eventOutputHolder.getOutput(sessionId); + + const itemDetails = this.databaseService + .getHideout() + .customisation.globals.find((cust) => cust.id === request.offerId); + if (!itemDetails) { + this.logger.error(`Unable to find customisation: ${request.offerId} in db, cannot apply to hideout`); + + return output; + } + + pmcData.Hideout.Customization[this.getHideoutCustomisationType(itemDetails.type)]; + + return output; + } + + protected getHideoutCustomisationType(type: string): string { + switch (type) { + case "wall": + return "Wall"; + case "floor": + return "Floor"; + case "light": + return "Light"; + case "ceiling": + return "Ceiling"; + case "shootingRangeMark": + return "ShootingRangeMark"; + default: + this.logger.warning(`Unknown ${type}, unable to map`); + return type; + } } /** diff --git a/project/src/models/eft/customization/ICustomizationSetRequest.ts b/project/src/models/eft/customization/ICustomizationSetRequest.ts new file mode 100644 index 00000000..b9e47826 --- /dev/null +++ b/project/src/models/eft/customization/ICustomizationSetRequest.ts @@ -0,0 +1,10 @@ +export interface ICustomizationSetRequest { + Action: "CustomizationSet"; + customizations: CustomizationSetOption[]; +} + +export interface CustomizationSetOption { + id: string; + type: string; + source: string; +} diff --git a/project/src/models/eft/hideout/IHideoutCustomizationApplyRequestData.ts b/project/src/models/eft/hideout/IHideoutCustomizationApplyRequestData.ts new file mode 100644 index 00000000..98db87ab --- /dev/null +++ b/project/src/models/eft/hideout/IHideoutCustomizationApplyRequestData.ts @@ -0,0 +1,6 @@ +export interface IHideoutCustomizationApplyRequestData { + Action: "HideoutCustomizationApply"; + /** Id of the newly picked item to apply to hideout */ + offerId: string; + timestamp: number; +} diff --git a/project/src/routers/item_events/CustomizationItemEventRouter.ts b/project/src/routers/item_events/CustomizationItemEventRouter.ts index 41fccf3c..35d09faa 100644 --- a/project/src/routers/item_events/CustomizationItemEventRouter.ts +++ b/project/src/routers/item_events/CustomizationItemEventRouter.ts @@ -13,7 +13,11 @@ export class CustomizationItemEventRouter extends ItemEventRouterDefinition { } public override getHandledRoutes(): HandledRoute[] { - return [new HandledRoute("CustomizationWear", false), new HandledRoute("CustomizationBuy", false)]; + return [ + new HandledRoute("CustomizationWear", false), + new HandledRoute("CustomizationBuy", false), + new HandledRoute("CustomizationSet", false), + ]; } public override async handleItemEvent(