Refactored post-raid pmc inventory modification - Fixes dupe id error on raid end
This commit is contained in:
parent
922adcfb5c
commit
2c53e28e81
@ -61,7 +61,7 @@ export class InRaidHelper {
|
|||||||
isSurvived: boolean,
|
isSurvived: boolean,
|
||||||
isTransfer: boolean,
|
isTransfer: boolean,
|
||||||
): void {
|
): void {
|
||||||
// Store insurance (as removeItem() removes insurance also)
|
// Store insurance (as removeItem() removes insured items)
|
||||||
const insured = this.cloner.clone(serverProfile.InsuredItems);
|
const insured = this.cloner.clone(serverProfile.InsuredItems);
|
||||||
|
|
||||||
// Remove possible equipped items from before the raid
|
// Remove possible equipped items from before the raid
|
||||||
@ -69,46 +69,50 @@ export class InRaidHelper {
|
|||||||
this.inventoryHelper.removeItem(serverProfile, serverProfile.Inventory.questRaidItems, sessionID);
|
this.inventoryHelper.removeItem(serverProfile, serverProfile.Inventory.questRaidItems, sessionID);
|
||||||
this.inventoryHelper.removeItem(serverProfile, serverProfile.Inventory.sortingTable, sessionID);
|
this.inventoryHelper.removeItem(serverProfile, serverProfile.Inventory.sortingTable, sessionID);
|
||||||
|
|
||||||
// Handle Removing of FIR status if did not survive.
|
// Get all items that have a parent of `serverProfile.Inventory.equipment` (All items player had on them at end of raid)
|
||||||
|
const postRaidInventoryItems = this.itemHelper.findAndReturnChildrenAsItems(
|
||||||
|
postRaidProfile.Inventory.items,
|
||||||
|
postRaidProfile.Inventory.equipment,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Handle Removing of FIR status if player did not survive + not transferring
|
||||||
|
// Do after above filtering code to reduce work done
|
||||||
if (!isSurvived && !isTransfer && !this.inRaidConfig.alwaysKeepFoundInRaidonRaidEnd) {
|
if (!isSurvived && !isTransfer && !this.inRaidConfig.alwaysKeepFoundInRaidonRaidEnd) {
|
||||||
this.removeSpawnedInSessionPropertyFromItems(postRaidProfile);
|
const dbItems = this.databaseService.getItems();
|
||||||
|
|
||||||
|
const itemsToRemovePropertyFrom = postRaidProfile.Inventory.items.filter((item) => {
|
||||||
|
// Has upd object + upd.SpawnedInSession property + not a quest item
|
||||||
|
return (
|
||||||
|
item.upd?.SpawnedInSession &&
|
||||||
|
!dbItems[item._tpl]._props.QuestItem &&
|
||||||
|
!(
|
||||||
|
this.inRaidConfig.keepFiRSecureContainerOnDeath &&
|
||||||
|
this.itemHelper.itemIsInsideContainer(item, "SecuredContainer", postRaidProfile.Inventory.items)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.itemHelper.removeSpawnedInSessionPropertyFromItems(itemsToRemovePropertyFrom);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const item of postRaidInventoryItems) {
|
||||||
|
// Try to find index of item to determine if we should add or replace
|
||||||
|
const existingItemIndex = serverProfile.Inventory.items.findIndex(
|
||||||
|
(inventoryItem) => inventoryItem._id === item._id,
|
||||||
|
);
|
||||||
|
if (existingItemIndex === -1) {
|
||||||
|
// Not found, add
|
||||||
|
serverProfile.Inventory.items.push(item);
|
||||||
|
} else {
|
||||||
|
// Replace item with one from client
|
||||||
|
postRaidProfile.Inventory.items.splice(existingItemIndex, 1, item);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the new items
|
|
||||||
serverProfile.Inventory.items = [...postRaidProfile.Inventory.items, ...serverProfile.Inventory.items];
|
|
||||||
serverProfile.Inventory.fastPanel = postRaidProfile.Inventory.fastPanel; // Quick access items bar
|
serverProfile.Inventory.fastPanel = postRaidProfile.Inventory.fastPanel; // Quick access items bar
|
||||||
serverProfile.InsuredItems = insured;
|
serverProfile.InsuredItems = insured;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterate over inventory items and remove the property that defines an item as Found in Raid
|
|
||||||
* Only removes property if item had FiR when entering raid
|
|
||||||
* @param postRaidProfile profile to update items for
|
|
||||||
* @returns Updated profile with SpawnedInSession removed
|
|
||||||
*/
|
|
||||||
public removeSpawnedInSessionPropertyFromItems(postRaidProfile: IPmcData): IPmcData {
|
|
||||||
const dbItems = this.databaseService.getItems();
|
|
||||||
const itemsToRemovePropertyFrom = postRaidProfile.Inventory.items.filter((item) => {
|
|
||||||
// Has upd object + upd.SpawnedInSession property + not a quest item
|
|
||||||
return (
|
|
||||||
"upd" in item &&
|
|
||||||
"SpawnedInSession" in item.upd &&
|
|
||||||
!dbItems[item._tpl]._props.QuestItem &&
|
|
||||||
!(
|
|
||||||
this.inRaidConfig.keepFiRSecureContainerOnDeath &&
|
|
||||||
this.itemHelper.itemIsInsideContainer(item, "SecuredContainer", postRaidProfile.Inventory.items)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
for (const item of itemsToRemovePropertyFrom) {
|
|
||||||
// biome-ignore lint/performance/noDelete: <explanation>
|
|
||||||
delete item.upd.SpawnedInSession;
|
|
||||||
}
|
|
||||||
|
|
||||||
return postRaidProfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear PMC inventory of all items except those that are exempt
|
* Clear PMC inventory of all items except those that are exempt
|
||||||
* Used post-raid to remove items after death
|
* Used post-raid to remove items after death
|
||||||
|
@ -450,33 +450,43 @@ export class InventoryHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get children of item, they get deleted too
|
// Get children of item, they get deleted too
|
||||||
const itemToRemoveWithChildren = this.itemHelper.findAndReturnChildrenByItems(profile.Inventory.items, itemId);
|
const itemAndChildrenToRemove = this.itemHelper.findAndReturnChildrenAsItems(profile.Inventory.items, itemId);
|
||||||
|
if (itemAndChildrenToRemove.length === 0) {
|
||||||
|
this.logger.debug(
|
||||||
|
this.localisationService.getText("inventory-unable_to_remove_item_id_not_found", {
|
||||||
|
childId: itemId,
|
||||||
|
profileId: profile._id,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
const inventoryItems = profile.Inventory.items;
|
const inventoryItems = profile.Inventory.items;
|
||||||
const insuredItems = profile.InsuredItems;
|
const insuredItems = profile.InsuredItems;
|
||||||
|
|
||||||
// We have output object, inform client of item deletion
|
// We have output object, inform client of root item deletion, not children
|
||||||
if (output) {
|
if (output) {
|
||||||
output.profileChanges[sessionID].items.del.push({ _id: itemId });
|
output.profileChanges[sessionID].items.del.push({ _id: itemId });
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const childId of itemToRemoveWithChildren) {
|
for (const item of itemAndChildrenToRemove) {
|
||||||
// We expect that each inventory item and each insured item has unique "_id", respective "itemId".
|
// We expect that each inventory item and each insured item has unique "_id", respective "itemId".
|
||||||
// Therefore we want to use a NON-Greedy function and escape the iteration as soon as we find requested item.
|
// Therefore we want to use a NON-Greedy function and escape the iteration as soon as we find requested item.
|
||||||
const inventoryIndex = inventoryItems.findIndex((item) => item._id === childId);
|
const inventoryIndex = inventoryItems.findIndex((inventoryItem) => inventoryItem._id === item._id);
|
||||||
if (inventoryIndex !== -1) {
|
if (inventoryIndex !== -1) {
|
||||||
inventoryItems.splice(inventoryIndex, 1);
|
inventoryItems.splice(inventoryIndex, 1);
|
||||||
} else {
|
} else {
|
||||||
this.logger.warning(
|
this.logger.warning(
|
||||||
this.localisationService.getText("inventory-unable_to_remove_item_id_not_found", {
|
this.localisationService.getText("inventory-unable_to_remove_item_id_not_found", {
|
||||||
childId: childId,
|
childId: item._id,
|
||||||
profileId: profile._id,
|
profileId: profile._id,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const insuredIndex = insuredItems.findIndex((item) => item.itemId === childId);
|
const insuredItemIndex = insuredItems.findIndex((insuredItem) => insuredItem.itemId === item._id);
|
||||||
if (insuredIndex !== -1) {
|
if (insuredItemIndex !== -1) {
|
||||||
insuredItems.splice(insuredIndex, 1);
|
insuredItems.splice(insuredItemIndex, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1794,6 +1794,16 @@ export class ItemHelper {
|
|||||||
currentItem = this.getItem(tpl)[1];
|
currentItem = this.getItem(tpl)[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove FiR status from passed in items
|
||||||
|
* @param items Items to update FiR status of
|
||||||
|
*/
|
||||||
|
public removeSpawnedInSessionPropertyFromItems(items: IItem[]): void {
|
||||||
|
for (const item of items) {
|
||||||
|
delete item.upd.SpawnedInSession;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ItemHelper {
|
namespace ItemHelper {
|
||||||
|
Loading…
Reference in New Issue
Block a user