Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/CactusPie.FastSearch/CactusPie.FastSearch.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<Version>1.0.0</Version>
<Version>1.1.0</Version>
<Authors>CactusPie</Authors>
</PropertyGroup>

Expand Down
2 changes: 1 addition & 1 deletion src/CactusPie.FastSearch/FastSearchPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace CactusPie.FastSearch
{
[BepInPlugin("com.cactuspie.fastsearch", "CactusPie.FastSearch", "1.0.0")]
[BepInPlugin("com.cactuspie.fastsearch", "CactusPie.FastSearch", "1.1.0")]
public class FastSearchPlugin : BaseUnityPlugin
{
internal static ConfigEntry<float> SearchTimeMultiplier { get; private set; }
Expand Down
40 changes: 29 additions & 11 deletions src/CactusPie.FastSearch/SearchInitialDelayPatch.cs
Original file line number Diff line number Diff line change
@@ -1,35 +1,53 @@
using System;
using System.Reflection;
using Aki.Reflection.Patching;
using Aki.Reflection.Utils;
using Comfort.Common;
using EFT.InventoryLogic;
using System.Linq;
using HarmonyLib;

namespace CactusPie.FastSearch
{
public class SearchInitialDelayPatch : ModulePatch
{
private static readonly FieldInfo InventoryControllerField = typeof(GClass2517).GetField("gclass2417_0", BindingFlags.Instance | BindingFlags.NonPublic);
private static readonly FieldInfo SearchableItemField = typeof(GClass2517).GetField("gclass2338_0", BindingFlags.Instance | BindingFlags.NonPublic);

private static Type _searchOperationClass;
private static FieldInfo _inventoryControllerField;
private static FieldInfo _searchableItemField;
private static FieldInfo _terminatedField;

protected override MethodBase GetTargetMethod()
{
MethodInfo method = typeof(GClass2517).GetMethod("method_0", BindingFlags.NonPublic | BindingFlags.Instance);

return method;
_searchOperationClass = PatchConstants.EftTypes.Single(x => x.GetMethod("GetNextDiscoveryTime", BindingFlags.Static | BindingFlags.Public) != null);
_terminatedField = _searchOperationClass.GetField("Terminated", BindingFlags.Instance | BindingFlags.Public);
var searchOperationFields = _searchOperationClass.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
_inventoryControllerField = searchOperationFields.Single(x => x.FieldType == typeof(InventoryControllerClass));
_searchableItemField = searchOperationFields.Single(x => x.FieldType == typeof(SearchableItemClass));

return AccessTools.GetDeclaredMethods(_searchOperationClass).FirstOrDefault(IsTargetMethod);
}

private static bool IsTargetMethod(MethodInfo mi)
{
var parameters = mi.GetParameters();
return parameters.Length >= 2
&& parameters[0].Name == "callback"
&& parameters[1].Name == "isInstant"
&& mi.ReturnType == typeof(System.Collections.IEnumerator);
}

[PatchPrefix]
public static void PatchPrefix(Callback callback, bool isInstant, GClass2517 __instance)
public static void PatchPrefix(Callback callback, bool isInstant, object __instance)
{
if (FastSearchPlugin.SearchInitialDelayEnabled.Value)
{
return;
}

var inventoryController = (InventoryControllerClass)InventoryControllerField.GetValue(__instance);
var searchableItem = (SearchableItemClass)SearchableItemField.GetValue(__instance);
var inventoryController = (InventoryControllerClass)_inventoryControllerField.GetValue(__instance);
var searchableItem = (SearchableItemClass)_searchableItemField.GetValue(__instance);

if (__instance.Terminated)
if ((bool)_terminatedField.GetValue(__instance))
{
return;
}
Expand All @@ -44,4 +62,4 @@ public static void PatchPrefix(Callback callback, bool isInstant, GClass2517 __i
}
}
}
}
}
24 changes: 17 additions & 7 deletions src/CactusPie.FastSearch/SearchTimePatch.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
using System;
using System.Reflection;
using Aki.Reflection.Patching;
using TarkovDateTime = GClass1252;
using Aki.Reflection.Utils;
using HarmonyLib;
using System.Linq;

namespace CactusPie.FastSearch
{
public class SearchTimePatch : ModulePatch
{
private static Type _searchOperationClass;
private static PropertyInfo _tarkovDateTimeNow;

protected override MethodBase GetTargetMethod()
{
MethodInfo method = typeof(GClass2517).GetMethod("GetNextDiscoveryTime", BindingFlags.Static | BindingFlags.Public);
return method;
Type tarkovDateTime = PatchConstants.EftTypes.Single(
x => x.GetProperty("MoscowNow", BindingFlags.Static | BindingFlags.Public) != null && x.GetProperty("Now", BindingFlags.Static | BindingFlags.Public) != null
);
_tarkovDateTimeNow = AccessTools.Property(tarkovDateTime, "Now");

_searchOperationClass = PatchConstants.EftTypes.Single(x => x.GetMethod("GetNextDiscoveryTime", BindingFlags.Static | BindingFlags.Public) != null);
return _searchOperationClass.GetMethod("GetNextDiscoveryTime", BindingFlags.Static | BindingFlags.Public);
}

[PatchPostfix]
Expand All @@ -23,13 +33,13 @@ public static void PatchPostFix(float speed, bool instant, ref DateTime __result

float searchTimeMultiplier = FastSearchPlugin.SearchTimeMultiplier.Value;

DateTime now = (DateTime)_tarkovDateTimeNow.GetValue(null);
if (searchTimeMultiplier == 0)
{
__result = TarkovDateTime.Now;
__result = now;
return;
}

__result = TarkovDateTime.Now.AddTicks((long)((__result - TarkovDateTime.Now).Ticks * searchTimeMultiplier));
__result = now.AddTicks((long)((__result - now).Ticks * searchTimeMultiplier));
}
}
}
}