From 9d79aa70eb1c8893e946f86da45a08ec59ca9acc Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 12 Jun 2024 19:32:27 +0100 Subject: [PATCH] Moved map marker logic out of `InventoryController` and into its own `MapMarkerService` --- .../src/controllers/InventoryController.ts | 42 ++------ project/src/di/Container.ts | 2 + project/src/services/MapMarkerService.ts | 96 +++++++++++++++++++ 3 files changed, 105 insertions(+), 35 deletions(-) create mode 100644 project/src/services/MapMarkerService.ts diff --git a/project/src/controllers/InventoryController.ts b/project/src/controllers/InventoryController.ts index b3afa448..f6946ee7 100644 --- a/project/src/controllers/InventoryController.ts +++ b/project/src/controllers/InventoryController.ts @@ -41,6 +41,7 @@ import { EventOutputHolder } from "@spt/routers/EventOutputHolder"; import { DatabaseService } from "@spt/services/DatabaseService"; import { FenceService } from "@spt/services/FenceService"; import { LocalisationService } from "@spt/services/LocalisationService"; +import { MapMarkerService } from "@spt/services/MapMarkerService"; import { PlayerService } from "@spt/services/PlayerService"; import { RagfairOfferService } from "@spt/services/RagfairOfferService"; import { ICloner } from "@spt/utils/cloners/ICloner"; @@ -63,6 +64,7 @@ export class InventoryController @inject("QuestHelper") protected questHelper: QuestHelper, @inject("HideoutHelper") protected hideoutHelper: HideoutHelper, @inject("RagfairOfferService") protected ragfairOfferService: RagfairOfferService, + @inject("MapMarkerService") protected mapMarkerService: MapMarkerService, @inject("ProfileHelper") protected profileHelper: ProfileHelper, @inject("PaymentHelper") protected paymentHelper: PaymentHelper, @inject("TraderHelper") protected traderHelper: TraderHelper, @@ -817,16 +819,10 @@ export class InventoryController output: IItemEventRouterResponse, ): void { - // Get map from inventory - const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); + const adjustedMapItem = this.mapMarkerService.createMarkerOnMap(pmcData, request); - // add marker - mapItem.upd.Map = mapItem.upd.Map || { Markers: [] }; - request.mapMarker.Note = this.sanitiseMapMarkerText(request.mapMarker.Note); - mapItem.upd.Map.Markers.push(request.mapMarker); - - // sync with client - output.profileChanges[sessionID].items.change.push(mapItem); + // Sync with client + output.profileChanges[sessionID].items.change.push(adjustedMapItem); } /** @@ -843,15 +839,7 @@ export class InventoryController output: IItemEventRouterResponse, ): void { - // Get map from inventory - const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); - - // remove marker - const markers = mapItem.upd.Map.Markers.filter((marker) => - { - return marker.X !== request.X && marker.Y !== request.Y; - }); - mapItem.upd.Map.Markers = markers; + const mapItem = this.mapMarkerService.deleteMarkerFromMap(pmcData, request); // sync with client output.profileChanges[sessionID].items.change.push(mapItem); @@ -871,28 +859,12 @@ export class InventoryController output: IItemEventRouterResponse, ): void { - // Get map from inventory - const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); - - // edit marker - const indexOfExistingNote = mapItem.upd.Map.Markers.findIndex((m) => m.X === request.X && m.Y === request.Y); - request.mapMarker.Note = this.sanitiseMapMarkerText(request.mapMarker.Note); - mapItem.upd.Map.Markers[indexOfExistingNote] = request.mapMarker; + const mapItem = this.mapMarkerService.editMarkerOnMap(pmcData, request); // sync with client output.profileChanges[sessionID].items.change.push(mapItem); } - /** - * Strip out characters from note string that are not: letter/numbers/unicode/spaces - * @param mapNoteText Marker text to sanitise - * @returns Sanitised map marker text - */ - protected sanitiseMapMarkerText(mapNoteText: string): string - { - return mapNoteText.replace(/[^\p{L}\d ]/gu, ""); - } - /** * Handle OpenRandomLootContainer event * Handle event fired when a container is unpacked (currently only the halloween pumpkin) diff --git a/project/src/di/Container.ts b/project/src/di/Container.ts index b112173e..7cf48ebb 100644 --- a/project/src/di/Container.ts +++ b/project/src/di/Container.ts @@ -214,6 +214,7 @@ import { ItemFilterService } from "@spt/services/ItemFilterService"; import { LocaleService } from "@spt/services/LocaleService"; import { LocalisationService } from "@spt/services/LocalisationService"; import { MailSendService } from "@spt/services/MailSendService"; +import { MapMarkerService } from "@spt/services/MapMarkerService"; import { MatchBotDetailsCacheService } from "@spt/services/MatchBotDetailsCacheService"; import { MatchLocationService } from "@spt/services/MatchLocationService"; import { CustomItemService } from "@spt/services/mod/CustomItemService"; @@ -789,6 +790,7 @@ export class Container depContainer.register("GiftService", GiftService); depContainer.register("MailSendService", MailSendService); depContainer.register("RaidTimeAdjustmentService", RaidTimeAdjustmentService); + depContainer.register("MapMarkerService", MapMarkerService); depContainer.register("ProfileActivityService", ProfileActivityService, { lifecycle: Lifecycle.Singleton, diff --git a/project/src/services/MapMarkerService.ts b/project/src/services/MapMarkerService.ts new file mode 100644 index 00000000..42b491e0 --- /dev/null +++ b/project/src/services/MapMarkerService.ts @@ -0,0 +1,96 @@ +import { inject, injectable } from "tsyringe"; +import { IPmcData } from "@spt/models/eft/common/IPmcData"; +import { Item } from "@spt/models/eft/common/tables/IItem"; +import { IInventoryCreateMarkerRequestData } from "@spt/models/eft/inventory/IInventoryCreateMarkerRequestData"; +import { IInventoryDeleteMarkerRequestData } from "@spt/models/eft/inventory/IInventoryDeleteMarkerRequestData"; +import { IInventoryEditMarkerRequestData } from "@spt/models/eft/inventory/IInventoryEditMarkerRequestData"; +import { ILogger } from "@spt/models/spt/utils/ILogger"; + +@injectable() +export class MapMarkerService +{ + constructor( + @inject("PrimaryLogger") protected logger: ILogger, + ) + {} + + /** + * Add note to a map item in player inventory + * @param pmcData Player profile + * @param request Add marker request + * @returns Item + */ + public createMarkerOnMap( + pmcData: IPmcData, + request: IInventoryCreateMarkerRequestData, + ): Item + { + // Get map from inventory + const mapItem = pmcData.Inventory.items.find((i) => i._id === request.item); + + // add marker to map item + mapItem.upd.Map = mapItem.upd.Map || { Markers: [] }; + + // Update request note with text, then add to maps upd + request.mapMarker.Note = this.sanitiseMapMarkerText(request.mapMarker.Note); + mapItem.upd.Map.Markers.push(request.mapMarker); + + return mapItem; + } + + /** + * Delete a map marker + * @param pmcData Player profile + * @param request Delete marker request + * @returns Item + */ + public deleteMarkerFromMap( + pmcData: IPmcData, + request: IInventoryDeleteMarkerRequestData, + ): Item + { + // Get map from inventory + const mapItem = pmcData.Inventory.items.find((item) => item._id === request.item); + + // remove marker + const markers = mapItem.upd.Map.Markers.filter((marker) => + { + return marker.X !== request.X && marker.Y !== request.Y; + }); + mapItem.upd.Map.Markers = markers; + + return mapItem; + } + + /** + * Edit an existing map marker + * @param pmcData Player profile + * @param request Edit marker request + * @returns Item + */ + public editMarkerOnMap( + pmcData: IPmcData, + request: IInventoryEditMarkerRequestData, + ): Item + { + // Get map from inventory + const mapItem = pmcData.Inventory.items.find((item) => item._id === request.item); + + // edit marker + const indexOfExistingNote = mapItem.upd.Map.Markers.findIndex((m) => m.X === request.X && m.Y === request.Y); + request.mapMarker.Note = this.sanitiseMapMarkerText(request.mapMarker.Note); + mapItem.upd.Map.Markers[indexOfExistingNote] = request.mapMarker; + + return mapItem; + } + + /** + * Strip out characters from note string that are not: letter/numbers/unicode/spaces + * @param mapNoteText Marker text to sanitise + * @returns Sanitised map marker text + */ + protected sanitiseMapMarkerText(mapNoteText: string): string + { + return mapNoteText.replace(/[^\p{L}\d ]/gu, ""); + } +}