2024-06-12 19:32:27 +01:00
|
|
|
import { IPmcData } from "@spt/models/eft/common/IPmcData";
|
2024-09-24 12:47:29 +01:00
|
|
|
import { IItem } from "@spt/models/eft/common/tables/IItem";
|
2024-06-12 19:32:27 +01:00
|
|
|
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";
|
2024-07-23 11:12:53 -04:00
|
|
|
import { inject, injectable } from "tsyringe";
|
2024-06-12 19:32:27 +01:00
|
|
|
|
|
|
|
@injectable()
|
2024-07-23 11:12:53 -04:00
|
|
|
export class MapMarkerService {
|
|
|
|
constructor(@inject("PrimaryLogger") protected logger: ILogger) {}
|
2024-06-12 19:32:27 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Add note to a map item in player inventory
|
|
|
|
* @param pmcData Player profile
|
|
|
|
* @param request Add marker request
|
|
|
|
* @returns Item
|
|
|
|
*/
|
2024-09-24 12:47:29 +01:00
|
|
|
public createMarkerOnMap(pmcData: IPmcData, request: IInventoryCreateMarkerRequestData): IItem {
|
2024-06-12 19:32:27 +01:00
|
|
|
// 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
|
|
|
|
*/
|
2024-09-24 12:47:29 +01:00
|
|
|
public deleteMarkerFromMap(pmcData: IPmcData, request: IInventoryDeleteMarkerRequestData): IItem {
|
2024-06-12 19:32:27 +01:00
|
|
|
// Get map from inventory
|
|
|
|
const mapItem = pmcData.Inventory.items.find((item) => item._id === request.item);
|
|
|
|
|
|
|
|
// remove marker
|
2024-07-23 11:12:53 -04:00
|
|
|
const markers = mapItem.upd.Map.Markers.filter((marker) => {
|
2024-06-12 19:32:27 +01:00
|
|
|
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
|
|
|
|
*/
|
2024-09-24 12:47:29 +01:00
|
|
|
public editMarkerOnMap(pmcData: IPmcData, request: IInventoryEditMarkerRequestData): IItem {
|
2024-06-12 19:32:27 +01:00
|
|
|
// 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
|
|
|
|
*/
|
2024-07-23 11:12:53 -04:00
|
|
|
protected sanitiseMapMarkerText(mapNoteText: string): string {
|
2024-06-12 19:32:27 +01:00
|
|
|
return mapNoteText.replace(/[^\p{L}\d ]/gu, "");
|
|
|
|
}
|
|
|
|
}
|