Files
Tarkov-UIFixes/src/ContextMenus/OpenInteractions.cs
2024-10-02 16:18:59 -07:00

83 lines
2.5 KiB
C#

using Comfort.Common;
using EFT.UI;
using EFT.UI.DragAndDrop;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace UIFixes;
public class OpenInteractions(ItemContextAbstractClass itemContext, ItemUiContext itemUiContext) : ItemInfoInteractionsAbstractClass<OpenInteractions.Options>(itemUiContext)
{
private readonly ItemContextAbstractClass itemContext = itemContext;
public override void ExecuteInteractionInternal(Options interaction)
{
if (itemContext == null || itemContext.Item is not LootItemClass compoundItem)
{
return;
}
var taskSerializer = itemUiContext_0.gameObject.AddComponent<NestedContainerTaskSerializer>();
taskSerializer.Initialize(GetNestedContainers(itemContext), containerContext =>
{
if (containerContext != null)
{
itemUiContext_0.OpenItem(containerContext.Item as LootItemClass, containerContext, true);
}
return Task.CompletedTask;
});
}
public override bool IsActive(Options button)
{
return true;
}
public override IResult IsInteractive(Options button)
{
return SuccessfulResult.New;
}
public override bool HasIcons
{
get { return false; }
}
public enum Options
{
All
}
private IEnumerable<ItemContextAbstractClass> GetNestedContainers(ItemContextAbstractClass first)
{
var windowRoot = Singleton<PreloaderUI>.Instance;
LootItemClass parent = first.Item as LootItemClass;
yield return first;
while (true)
{
var innerContainers = parent.GetFirstLevelItems()
.Where(i => i != parent)
.Where(i => i is LootItemClass innerContainer && innerContainer.Grids.Any());
if (innerContainers.Count() != 1)
{
yield break;
}
var targetId = innerContainers.First().Id;
var targetItemView = windowRoot.GetComponentsInChildren<GridItemView>().FirstOrDefault(itemView => itemView.Item.Id == targetId);
if (targetItemView == null)
{
yield return null; // Keeps returning null until the window is open
}
parent = targetItemView.Item as LootItemClass;
yield return targetItemView.ItemContext;
}
}
}
public class NestedContainerTaskSerializer : TaskSerializer<ItemContextAbstractClass> { }