Refactoring InventoryHelper

This commit is contained in:
Dev 2024-06-12 20:25:27 +01:00
parent aac2142706
commit 1caff10d35
2 changed files with 60 additions and 58 deletions

View File

@ -24,6 +24,7 @@ import { BaseClasses } from "@spt/models/enums/BaseClasses";
import { BonusType } from "@spt/models/enums/BonusType"; import { BonusType } from "@spt/models/enums/BonusType";
import { ConfigTypes } from "@spt/models/enums/ConfigTypes"; import { ConfigTypes } from "@spt/models/enums/ConfigTypes";
import { IInventoryConfig, RewardDetails } from "@spt/models/spt/config/IInventoryConfig"; import { IInventoryConfig, RewardDetails } from "@spt/models/spt/config/IInventoryConfig";
import { IOwnerInventoryItems } from "@spt/models/spt/inventory/IOwnerInventoryItems";
import { ILogger } from "@spt/models/spt/utils/ILogger"; import { ILogger } from "@spt/models/spt/utils/ILogger";
import { ConfigServer } from "@spt/servers/ConfigServer"; import { ConfigServer } from "@spt/servers/ConfigServer";
import { DatabaseServer } from "@spt/servers/DatabaseServer"; import { DatabaseServer } from "@spt/servers/DatabaseServer";
@ -33,16 +34,6 @@ import { ICloner } from "@spt/utils/cloners/ICloner";
import { HashUtil } from "@spt/utils/HashUtil"; import { HashUtil } from "@spt/utils/HashUtil";
import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil"; import { HttpResponseUtil } from "@spt/utils/HttpResponseUtil";
export interface IOwnerInventoryItems
{
/** Inventory items from source */
from: Item[]
/** Inventory items at destination */
to: Item[]
sameInventory: boolean
isMail: boolean
}
@injectable() @injectable()
export class InventoryHelper export class InventoryHelper
{ {
@ -202,14 +193,11 @@ export class InventoryHelper
item.upd.SpawnedInSession = foundInRaid; item.upd.SpawnedInSession = foundInRaid;
} }
else else
{
if (delete item.upd.SpawnedInSession)
{ {
delete item.upd.SpawnedInSession; delete item.upd.SpawnedInSession;
} }
} }
} }
}
/** /**
* Remove properties from a Upd object used by a trader/ragfair that are unnecessary to a player * Remove properties from a Upd object used by a trader/ragfair that are unnecessary to a player
@ -1134,34 +1122,35 @@ export class InventoryHelper
} }
/** /**
* Internal helper function to transfer an item from one profile to another. * Internal helper function to transfer an item + children from one profile to another.
* @param fromItems Inventory of the source (can be non-player) * @param sourceItems Inventory of the source (can be non-player)
* @param toItems Inventory of the destination * @param toItems Inventory of the destination
* @param body Move request * @param request Move request
*/ */
public moveItemToProfile(fromItems: Item[], toItems: Item[], body: IInventoryMoveRequestData): void public moveItemToProfile(sourceItems: Item[], toItems: Item[], request: IInventoryMoveRequestData): void
{ {
this.handleCartridges(fromItems, body); this.handleCartridges(sourceItems, request);
// Get all children item has, they need to move with item // Get all children item has, they need to move with item
const idsToMove = this.itemHelper.findAndReturnChildrenByItems(fromItems, body.item); const idsToMove = this.itemHelper.findAndReturnChildrenByItems(sourceItems, request.item);
for (const itemId of idsToMove) for (const itemId of idsToMove)
{ {
const itemToMove = fromItems.find((x) => x._id === itemId); const itemToMove = sourceItems.find((item) => item._id === itemId);
if (!itemToMove) if (!itemToMove)
{ {
this.logger.error(this.localisationService.getText("inventory-unable_to_find_item_to_move", itemId)); this.logger.error(this.localisationService.getText("inventory-unable_to_find_item_to_move", itemId));
} }
// Only adjust the values for parent item, not children (their values are already correctly tied to parent) // Only adjust the values for parent item, not children (their values are already correctly tied to parent)
if (itemId === body.item) if (itemId === request.item)
{ {
itemToMove.parentId = body.to.id; itemToMove.parentId = request.to.id;
itemToMove.slotId = body.to.container; itemToMove.slotId = request.to.container;
if (body.to.location) if (request.to.location)
{ {
// Update location object // Update location object
itemToMove.location = body.to.location; itemToMove.location = request.to.location;
} }
else else
{ {
@ -1174,7 +1163,7 @@ export class InventoryHelper
} }
toItems.push(itemToMove); toItems.push(itemToMove);
fromItems.splice(fromItems.indexOf(itemToMove), 1); sourceItems.splice(sourceItems.indexOf(itemToMove), 1);
} }
} }
@ -1182,7 +1171,7 @@ export class InventoryHelper
* Internal helper function to move item within the same profile_f. * Internal helper function to move item within the same profile_f.
* @param pmcData profile to edit * @param pmcData profile to edit
* @param inventoryItems * @param inventoryItems
* @param moveRequest * @param moveRequest client move request
* @returns True if move was successful * @returns True if move was successful
*/ */
public moveItemInternal( public moveItemInternal(
@ -1194,7 +1183,7 @@ export class InventoryHelper
this.handleCartridges(inventoryItems, moveRequest); this.handleCartridges(inventoryItems, moveRequest);
// Find item we want to 'move' // Find item we want to 'move'
const matchingInventoryItem = inventoryItems.find((x) => x._id === moveRequest.item); const matchingInventoryItem = inventoryItems.find((item) => item._id === moveRequest.item);
if (!matchingInventoryItem) if (!matchingInventoryItem)
{ {
const errorMesage = `Unable to move item: ${moveRequest.item}, cannot find in inventory`; const errorMesage = `Unable to move item: ${moveRequest.item}, cannot find in inventory`;
@ -1207,8 +1196,8 @@ export class InventoryHelper
`${moveRequest.Action} item: ${moveRequest.item} from slotid: ${matchingInventoryItem.slotId} to container: ${moveRequest.to.container}`, `${moveRequest.Action} item: ${moveRequest.item} from slotid: ${matchingInventoryItem.slotId} to container: ${moveRequest.to.container}`,
); );
// don't move shells from camora to cartridges (happens when loading shells into mts-255 revolver shotgun) // Don't move shells from camora to cartridges (happens when loading shells into mts-255 revolver shotgun)
if (matchingInventoryItem.slotId.includes("camora_") && moveRequest.to.container === "cartridges") if (matchingInventoryItem.slotId?.includes("camora_") && moveRequest.to.container === "cartridges")
{ {
this.logger.warning( this.logger.warning(
this.localisationService.getText("inventory-invalid_move_to_container", { this.localisationService.getText("inventory-invalid_move_to_container", {
@ -1224,14 +1213,17 @@ export class InventoryHelper
matchingInventoryItem.parentId = moveRequest.to.id; matchingInventoryItem.parentId = moveRequest.to.id;
matchingInventoryItem.slotId = moveRequest.to.container; matchingInventoryItem.slotId = moveRequest.to.container;
// Ensure fastpanel dict updates when item was moved out of fast-panel-accessible slot
this.updateFastPanelBinding(pmcData, matchingInventoryItem); this.updateFastPanelBinding(pmcData, matchingInventoryItem);
// Item has location propery, ensure its value is handled
if ("location" in moveRequest.to) if ("location" in moveRequest.to)
{ {
matchingInventoryItem.location = moveRequest.to.location; matchingInventoryItem.location = moveRequest.to.location;
} }
else else
{ {
// Moved from slot with location to one without, clean up
if (matchingInventoryItem.location) if (matchingInventoryItem.location)
{ {
delete matchingInventoryItem.location; delete matchingInventoryItem.location;
@ -1248,45 +1240,44 @@ export class InventoryHelper
*/ */
protected updateFastPanelBinding(pmcData: IPmcData, itemBeingMoved: Item): void protected updateFastPanelBinding(pmcData: IPmcData, itemBeingMoved: Item): void
{ {
// Find matching itemid in fast panel // Find matching _id in fast panel
for (const itemKey in pmcData.Inventory.fastPanel) const fastPanelSlot = Object.entries(pmcData.Inventory.fastPanel)
.find(([itemId]) => itemId === itemBeingMoved._id);
if (!fastPanelSlot)
{ {
if (pmcData.Inventory.fastPanel[itemKey] === itemBeingMoved._id) return;
{
// Get moved items parent
const itemParent = pmcData.Inventory.items.find((x) => x._id === itemBeingMoved.parentId);
// Empty out id if item is moved to a container other than pocket/rig
if (itemParent && !(itemParent.slotId?.startsWith("Pockets") || itemParent.slotId === "TacticalVest"))
{
pmcData.Inventory.fastPanel[itemKey] = "";
} }
break; // Get moved items parent (should be container item was put into)
const itemParent = pmcData.Inventory.items.find((item) => item._id === itemBeingMoved.parentId);
if (!itemParent)
{
return;
} }
// Reset fast panel value if item was moved to a container other than pocket/rig (cant be used from fastpanel)
const wasMovedToFastPanelAccessibleContainer = ["pockets", "tacticalvest"].includes(itemParent?.slotId?.toLowerCase() ?? "");
if (!wasMovedToFastPanelAccessibleContainer)
{
pmcData.Inventory.fastPanel[fastPanelSlot[0]] = "";
} }
} }
/** /**
* Internal helper function to handle cartridges in inventory if any of them exist. * Internal helper function to handle cartridges in inventory if any of them exist.
*/ */
protected handleCartridges(items: Item[], body: IInventoryMoveRequestData): void protected handleCartridges(items: Item[], request: IInventoryMoveRequestData): void
{ {
// -> Move item to different place - counts with equipping filling magazine etc // Not moving item into a cartridge slot, skip
if (body.to.container === "cartridges") if (request.to.container !== "cartridges")
{ {
let tmpCounter = 0; return;
}
for (const itemAmmo in items) // Get a count of cartridges in existing magazine
{ const cartridgeCount = items.filter((item) => item.parentId === request.to.id).length;
if (body.to.id === items[itemAmmo].parentId)
{ request.to.location = cartridgeCount;
tmpCounter++;
}
}
// wrong location for first cartridge
body.to.location = tmpCounter;
}
} }
/** /**

View File

@ -0,0 +1,11 @@
import { Item } from "@spt/models/eft/common/tables/IItem";
export interface IOwnerInventoryItems
{
/** Inventory items from source */
from: Item[]
/** Inventory items at destination */
to: Item[]
sameInventory: boolean
isMail: boolean
}