Add priority sorting
This commit is contained in:
parent
4a564a60c9
commit
850b5caff1
@ -1,6 +1,8 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using Aki.Reflection.Patching;
|
using Aki.Reflection.Patching;
|
||||||
using Comfort.Common;
|
using Comfort.Common;
|
||||||
using EFT;
|
using EFT;
|
||||||
@ -10,6 +12,8 @@ namespace CactusPie.ContainerQuickLoot
|
|||||||
{
|
{
|
||||||
public class QuickTransferPatch : ModulePatch
|
public class QuickTransferPatch : ModulePatch
|
||||||
{
|
{
|
||||||
|
private static readonly Regex LootTagRegex = new Regex("@loot[0-9]*", RegexOptions.Compiled, TimeSpan.FromMilliseconds(100));
|
||||||
|
|
||||||
protected override MethodBase GetTargetMethod()
|
protected override MethodBase GetTargetMethod()
|
||||||
{
|
{
|
||||||
MethodInfo method = typeof(GClass2585).GetMethod("QuickFindAppropriatePlace", BindingFlags.Public | BindingFlags.Static);
|
MethodInfo method = typeof(GClass2585).GetMethod("QuickFindAppropriatePlace", BindingFlags.Public | BindingFlags.Static);
|
||||||
@ -34,6 +38,7 @@ namespace CactusPie.ContainerQuickLoot
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If is loose loot pick up
|
// If is loose loot pick up
|
||||||
else if (order == GClass2585.EMoveItemOrder.PickUp && controller.OwnerType == EOwnerType.Profile)
|
else if (order == GClass2585.EMoveItemOrder.PickUp && controller.OwnerType == EOwnerType.Profile)
|
||||||
{
|
{
|
||||||
@ -69,21 +74,14 @@ namespace CactusPie.ContainerQuickLoot
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ContainerCollection containerCollection = null;
|
ContainerCollection targetContainerCollection = FindTargetContainerCollection(item, inventory);
|
||||||
|
|
||||||
Item targetContainer = inventory.Equipment.GetAllItems().FirstOrDefault(x =>
|
if (targetContainerCollection == null)
|
||||||
x.IsContainer &&
|
|
||||||
x.TryGetItemComponent(out TagComponent tagComponent) &&
|
|
||||||
tagComponent.Name.Contains("@loot") &&
|
|
||||||
(containerCollection = x as ContainerCollection) != null &&
|
|
||||||
containerCollection.Containers.Any(y => y.CanAccept(item)));
|
|
||||||
|
|
||||||
if (targetContainer == null || containerCollection == null)
|
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (IContainer collectionContainer in containerCollection.Containers)
|
foreach (IContainer collectionContainer in targetContainerCollection.Containers)
|
||||||
{
|
{
|
||||||
if (!(collectionContainer is GClass2318 container))
|
if (!(collectionContainer is GClass2318 container))
|
||||||
{
|
{
|
||||||
@ -140,6 +138,63 @@ namespace CactusPie.ContainerQuickLoot
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ContainerCollection FindTargetContainerCollection(Item item, Inventory inventory)
|
||||||
|
{
|
||||||
|
ContainerCollection targetContainerCollection = null;
|
||||||
|
int? lowestFoundPriority = null;
|
||||||
|
|
||||||
|
foreach (Item inventoryItem in inventory.Equipment.GetAllItems())
|
||||||
|
{
|
||||||
|
// It has to be a container collection - an item that we can transfer the loot into
|
||||||
|
if (!inventoryItem.IsContainer)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The container has to have a tag - later we will check it's the @loot tag
|
||||||
|
if (!inventoryItem.TryGetItemComponent(out TagComponent tagComponent))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We check if there is a @loot tag
|
||||||
|
Match regexMatch = LootTagRegex.Match(tagComponent.Name);
|
||||||
|
|
||||||
|
if (!regexMatch.Success)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We check if any of the containers in the collection can hold our item
|
||||||
|
var containerCollection = inventoryItem as ContainerCollection;
|
||||||
|
|
||||||
|
if (containerCollection == null || !containerCollection.Containers.Any(container => container.CanAccept(item)))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We extract the suffix - if not suffix provided, we assume 0
|
||||||
|
// Length of @loot - we only want the number suffix
|
||||||
|
const int lootTagLength = 5;
|
||||||
|
|
||||||
|
string priorityString = regexMatch.Value.Substring(lootTagLength);
|
||||||
|
int priority = priorityString.Length == 0 ? 0 : int.Parse(priorityString);
|
||||||
|
|
||||||
|
if (lowestFoundPriority == null || priority < lowestFoundPriority.Value)
|
||||||
|
{
|
||||||
|
lowestFoundPriority = priority;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
targetContainerCollection = containerCollection;
|
||||||
|
}
|
||||||
|
|
||||||
|
return targetContainerCollection;
|
||||||
|
}
|
||||||
|
|
||||||
private static Player GetLocalPlayerFromWorld(GameWorld gameWorld)
|
private static Player GetLocalPlayerFromWorld(GameWorld gameWorld)
|
||||||
{
|
{
|
||||||
if (gameWorld == null || gameWorld.MainPlayer == null)
|
if (gameWorld == null || gameWorld.MainPlayer == null)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user