From 8239e1dd0731aaa3cee370364690972dba498056 Mon Sep 17 00:00:00 2001 From: Chomp Date: Tue, 25 Feb 2025 16:54:17 +0000 Subject: [PATCH] Cleaned up `GetSizeByInventoryItemHash` --- Libraries/Core/Helpers/InventoryHelper.cs | 119 +++++++++++----------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/Libraries/Core/Helpers/InventoryHelper.cs b/Libraries/Core/Helpers/InventoryHelper.cs index 41a5786e..8c5c1444 100644 --- a/Libraries/Core/Helpers/InventoryHelper.cs +++ b/Libraries/Core/Helpers/InventoryHelper.cs @@ -24,12 +24,9 @@ public class InventoryHelper( ISptLogger _logger, HashUtil _hashUtil, HttpResponseUtil _httpResponseUtil, - FenceService _fenceService, DialogueHelper _dialogueHelper, ContainerHelper _containerHelper, DatabaseServer _databaseServer, - PaymentHelper _paymentHelper, - TraderAssortHelper _traderAssortHelper, EventOutputHolder _eventOutputHolder, ProfileHelper _profileHelper, ItemHelper _itemHelper, @@ -39,7 +36,13 @@ public class InventoryHelper( ) { // Item types to ignore inside `GetSizeByInventoryItemHash` - private readonly HashSet _itemBaseTypesToIgnore = [BaseClasses.BACKPACK, BaseClasses.SEARCHABLE_ITEM, BaseClasses.SIMPLE_CONTAINER]; + private readonly HashSet _itemBaseTypesToIgnore = [ + BaseClasses.BACKPACK, + BaseClasses.VEST, + BaseClasses.HEADWEAR, + BaseClasses.SEARCHABLE_ITEM, + BaseClasses.SIMPLE_CONTAINER, + BaseClasses.AMMO_BOX]; protected InventoryConfig _inventoryConfig = _configServer.GetConfig(); /// @@ -652,38 +655,36 @@ public class InventoryHelper( /// takes into account if item is folded /// /// Items template id - /// Items id + /// Items id /// Hashmap of inventory items /// An array representing the [width, height] of the item protected List GetSizeByInventoryItemHash(string itemTpl, string itemID, InventoryItemHash inventoryItemHash) { - var toDo = new List - { - itemID - }; - var (key, tmpItem) = _itemHelper.GetItem(itemTpl); + // Storage for root item and its children, store root item id for now + var toDo = new Queue([itemID]); // Invalid item - if (!key) + var (isValidItem, itemTemplate) = _itemHelper.GetItem(itemTpl); + if (!isValidItem) { _logger.Error(_localisationService.GetText("inventory-invalid_item_missing_from_db", itemTpl)); } // Item found but no _props property - if (key && tmpItem.Properties is null) + if (isValidItem && itemTemplate.Properties is null) { _localisationService.GetText( "inventory-item_missing_props_property", new { itemTpl, - itemName = tmpItem?.Name + itemName = itemTemplate?.Name } ); } // No item object or getItem() returned false - if (!key && tmpItem is null) + if (!isValidItem && itemTemplate is null) { // return default size of 1x1 _logger.Error(_localisationService.GetText("inventory-return_default_size", itemTpl)); @@ -692,97 +693,99 @@ public class InventoryHelper( } var rootItem = inventoryItemHash.ByItemId[itemID]; - var isFoldable = tmpItem.Properties.Foldable; - var foldedSlot = tmpItem.Properties.FoldedSlot; - var sizeUp = 0; - var sizeDown = 0; - var sizeLeft = 0; - var sizeRight = 0; + // Does root item support being folded + var rootIsFoldable = itemTemplate.Properties.Foldable.GetValueOrDefault(false); - var forcedUp = 0; - var forcedDown = 0; - var forcedLeft = 0; - var forcedRight = 0; - var outX = tmpItem.Properties.Width; - var outY = tmpItem.Properties.Height; + // The slot that can be folded on root e.g. "mod_stock" + var foldedSlot = itemTemplate.Properties.FoldedSlot; - var rootIsFolded = rootItem?.Upd?.Foldable?.Folded == true; + int sizeUp = 0, sizeDown = 0, sizeLeft = 0, sizeRight = 0; + int forcedUp = 0, forcedDown = 0, forcedLeft = 0, forcedRight = 0; + var outX = itemTemplate.Properties.Width; + var outY = itemTemplate.Properties.Height; - // The item itself is collapsible - if (isFoldable is not null && string.IsNullOrEmpty(foldedSlot) && rootIsFolded) + // Is the root item actively folded + var rootIsFolded = rootItem?.Upd?.Foldable?.Folded.GetValueOrDefault(false) ?? false; + + // Root is collapsible and has been collapsed + if (rootIsFoldable && string.IsNullOrEmpty(foldedSlot) && rootIsFolded) { - outX -= tmpItem.Properties.SizeReduceRight.Value; + // foldedSlot must be empty/null which means the root item itself is folded, not a sub child item...i think + outX -= itemTemplate.Properties.SizeReduceRight.Value; } // Calculate size contribution from child items/attachments - if (!_itemBaseTypesToIgnore.Contains(tmpItem.Parent)) + if (!_itemBaseTypesToIgnore.Contains(itemTemplate.Parent)) { while (toDo.Count > 0) { - if (inventoryItemHash.ByParentId.ContainsKey(toDo[0])) + // Lookup parent in `todo` and get all of its children, then loop over them + if (inventoryItemHash.ByParentId.TryGetValue(toDo.Peek(), out var children)) { - foreach (var item in inventoryItemHash.ByParentId[toDo[0]]) + foreach (var childItem in children) { // Filtering child items outside of mod slots, such as those inside containers, without counting their ExtraSize attribute - if (item.SlotId.IndexOf("mod_") < 0) + if (childItem.SlotId.IndexOf("mod_", StringComparison.Ordinal) < 0) { continue; } - toDo.Add(item.Id); + // Add child to queue + toDo.Enqueue(childItem.Id); // If the barrel is folded the space in the barrel is not counted - var itemResult = _itemHelper.GetItem(item.Template); - if (!itemResult.Key) + var (isValid, template) = _itemHelper.GetItem(childItem.Template); + if (!isValid) { _logger.Error( _localisationService.GetText( "inventory-get_item_size_item_not_found_by_tpl", - item.Template + childItem.Template ) ); } - var itm = itemResult.Value; - var childFoldable = itm.Properties.Foldable.GetValueOrDefault(false); - var childFolded = item.Upd?.Foldable is not null && item.Upd.Foldable.Folded == true; + var childIsFoldable = template.Properties.Foldable.GetValueOrDefault(false); + var childIsFolded = childItem.Upd?.Foldable?.Folded.GetValueOrDefault(false) ?? false; - if (isFoldable is true && foldedSlot == item.SlotId && (rootIsFolded || childFolded)) + if (rootIsFoldable && foldedSlot == childItem.SlotId && (rootIsFolded || childIsFolded)) { continue; } - if (childFoldable && rootIsFolded && childFolded) + if (childIsFoldable && rootIsFolded && childIsFolded) { continue; } // Calculating child ExtraSize - if (itm.Properties.ExtraSizeForceAdd == true) + if (template.Properties.ExtraSizeForceAdd == true) { - forcedUp += itm.Properties.ExtraSizeUp.Value; - forcedDown += itm.Properties.ExtraSizeDown.Value; - forcedLeft += itm.Properties.ExtraSizeLeft.Value; - forcedRight += itm.Properties.ExtraSizeRight.Value; + forcedUp += template.Properties.ExtraSizeUp.Value; + forcedDown += template.Properties.ExtraSizeDown.Value; + forcedLeft += template.Properties.ExtraSizeLeft.Value; + forcedRight += template.Properties.ExtraSizeRight.Value; } else { - sizeUp = sizeUp < itm.Properties.ExtraSizeUp ? itm.Properties.ExtraSizeUp.Value : sizeUp; - sizeDown = sizeDown < itm.Properties.ExtraSizeDown - ? itm.Properties.ExtraSizeDown.Value + sizeUp = sizeUp < template.Properties.ExtraSizeUp + ? template.Properties.ExtraSizeUp.Value + : sizeUp; + sizeDown = sizeDown < template.Properties.ExtraSizeDown + ? template.Properties.ExtraSizeDown.Value : sizeDown; - sizeLeft = sizeLeft < itm.Properties.ExtraSizeLeft - ? itm.Properties.ExtraSizeLeft.Value + sizeLeft = sizeLeft < template.Properties.ExtraSizeLeft + ? template.Properties.ExtraSizeLeft.Value : sizeLeft; - sizeRight = sizeRight < itm.Properties.ExtraSizeRight - ? itm.Properties.ExtraSizeRight.Value + sizeRight = sizeRight < template.Properties.ExtraSizeRight + ? template.Properties.ExtraSizeRight.Value : sizeRight; } } } - toDo.RemoveAt(0); + toDo.Dequeue(); } } @@ -912,7 +915,7 @@ public class InventoryHelper( var inventoryItemHash = new InventoryItemHash { ByItemId = new Dictionary(), - ByParentId = new Dictionary>() + ByParentId = new Dictionary>() }; foreach (var item in inventoryItems) { @@ -1365,7 +1368,7 @@ public class InventoryItemHash } [JsonPropertyName("byParentId")] - public Dictionary> ByParentId + public Dictionary> ByParentId { get; set;