Server/project/src/services/MapMarkerService.ts

97 lines
3.1 KiB
TypeScript
Raw Normal View History

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, "");
}
}