eft-lootvalueex/Plugin/Patches/Screens/InventoryScreenPatch.cs
Yui a86213d3a6
feat: async inventory processing
TODO: Do !!NOT!! process containers twice!
2024-11-06 17:45:58 -03:00

55 lines
2.4 KiB
C#

using System.Diagnostics;
using System.Reflection;
using EFT;
using EFT.HealthSystem;
using EFT.UI;
using LootValueEX.Extensions;
using SPT.Reflection.Patching;
namespace LootValueEX.Patches.Screens
{
internal class InventoryScreenPatch : ModulePatch
{
protected override MethodBase GetTargetMethod() => typeof(InventoryScreen).GetMethods().SingleOrDefault(method => method.Name == "Show" && method.GetParameters()[0].ParameterType == typeof(IHealthController));
[PatchPostfix]
private static void PatchPostfix(ref Profile ___profile_0, ref LootItemClass ___lootItemClass)
{
Profile profile = ___profile_0;
TaskCompletionSource<bool> tcsInventory = new();
CancellationTokenSource ctsInventory = new CancellationTokenSource(5000);
Task<bool> taskInventory = tcsInventory.Task;
Task.Factory.StartNew(async () =>
{
Stopwatch sw = Stopwatch.StartNew();
foreach(EFT.InventoryLogic.Item item in profile.Inventory.GetPlayerItems(EFT.InventoryLogic.EPlayerItems.Equipment))
{
Plugin.Log.LogDebug($"Equip Process: {item.LocalizedName()} ({item.TemplateId}): {await item.GetCustomHashAsync()}");
}
sw.Stop();
Plugin.Log.LogDebug($"Equipment processing finished in {sw.ElapsedMilliseconds}ms");
tcsInventory.SetResult(true);
}, ctsInventory.Token);
if(___lootItemClass != null)
{
LootItemClass lootItemClass = ___lootItemClass;
TaskCompletionSource<bool> tcsLoot = new();
CancellationTokenSource ctsLoot = new CancellationTokenSource(5000);
Task<bool> taskLoot = tcsLoot.Task;
Task.Factory.StartNew(async () =>
{
Stopwatch sw = Stopwatch.StartNew();
foreach (EFT.InventoryLogic.Item item in lootItemClass.GetAllItems())
{
Plugin.Log.LogDebug($"LootItemClass process: {item.LocalizedName()} ({item.TemplateId}): {await item.GetCustomHashAsync()}");
}
Plugin.Log.LogDebug($"LootItemClass processing finished in {sw.ElapsedMilliseconds}ms");
tcsLoot.SetResult(true);
}, ctsLoot.Token);
}
}
}
}