58 lines
1.7 KiB
C#
58 lines
1.7 KiB
C#
using Microsoft.Xna.Framework;
|
|
using System.Linq;
|
|
|
|
namespace Barotrauma;
|
|
|
|
partial class InventoryHighlightAction : EventAction
|
|
{
|
|
private static readonly Color highlightColor = Color.Orange;
|
|
|
|
partial void UpdateProjSpecific()
|
|
{
|
|
foreach (var target in ParentEvent.GetTargets(TargetTag))
|
|
{
|
|
SetHighlight(target);
|
|
}
|
|
}
|
|
|
|
private void SetHighlight(Entity entity)
|
|
{
|
|
if (entity is Item item)
|
|
{
|
|
int i = 0;
|
|
foreach (var itemContainer in item.GetComponents<Items.Components.ItemContainer>())
|
|
{
|
|
if (ItemContainerIndex == -1 || i == ItemContainerIndex)
|
|
{
|
|
SetHighlight(itemContainer.Inventory);
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
else if (entity is Character c)
|
|
{
|
|
SetHighlight(c.Inventory);
|
|
}
|
|
}
|
|
|
|
private void SetHighlight(Inventory inventory)
|
|
{
|
|
if (inventory?.visualSlots == null) { return; }
|
|
for (int i = 0; i < inventory.visualSlots.Length; i++)
|
|
{
|
|
if (inventory.visualSlots[i].HighlightTimer > 0) { continue; }
|
|
Item item = inventory.GetItemAt(i);
|
|
if (IsSuitableItem(item) ||
|
|
(Recursive && item?.OwnInventory != null && item.OwnInventory.FindAllItems(it => IsSuitableItem(it), recursive: true).Any()))
|
|
{
|
|
inventory.visualSlots[i].ShowBorderHighlight(highlightColor, 0.5f, 0.5f, 0.1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool IsSuitableItem(Item item)
|
|
{
|
|
return (ItemIdentifier.IsEmpty && item == null) ||
|
|
(item != null && (item.Prefab.Identifier == ItemIdentifier || item.HasTag(ItemIdentifier)));
|
|
}
|
|
} |