From ffc3aef55122abdc75c4fe1ec6311bceef752aec Mon Sep 17 00:00:00 2001 From: kubishechka Date: Tue, 12 Sep 2023 22:25:01 +0200 Subject: [PATCH] Make patches version agnostic (DrakiaXYZ's approach) --- .../CactusPie.FastSearch.csproj | 4 +- src/CactusPie.FastSearch/FastSearchPlugin.cs | 2 +- .../SearchInitialDelayPatch.cs | 40 ++++++++++++++----- src/CactusPie.FastSearch/SearchTimePatch.cs | 24 +++++++---- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/CactusPie.FastSearch/CactusPie.FastSearch.csproj b/src/CactusPie.FastSearch/CactusPie.FastSearch.csproj index 99e926e..459a7e4 100644 --- a/src/CactusPie.FastSearch/CactusPie.FastSearch.csproj +++ b/src/CactusPie.FastSearch/CactusPie.FastSearch.csproj @@ -1,8 +1,8 @@ - + net472 - 1.0.0 + 1.1.0 CactusPie diff --git a/src/CactusPie.FastSearch/FastSearchPlugin.cs b/src/CactusPie.FastSearch/FastSearchPlugin.cs index 8f53fa8..235452c 100644 --- a/src/CactusPie.FastSearch/FastSearchPlugin.cs +++ b/src/CactusPie.FastSearch/FastSearchPlugin.cs @@ -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 SearchTimeMultiplier { get; private set; } diff --git a/src/CactusPie.FastSearch/SearchInitialDelayPatch.cs b/src/CactusPie.FastSearch/SearchInitialDelayPatch.cs index f884083..cffe54c 100644 --- a/src/CactusPie.FastSearch/SearchInitialDelayPatch.cs +++ b/src/CactusPie.FastSearch/SearchInitialDelayPatch.cs @@ -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; } @@ -44,4 +62,4 @@ public static void PatchPrefix(Callback callback, bool isInstant, GClass2517 __i } } } -} \ No newline at end of file +} diff --git a/src/CactusPie.FastSearch/SearchTimePatch.cs b/src/CactusPie.FastSearch/SearchTimePatch.cs index 30b3020..f95017a 100644 --- a/src/CactusPie.FastSearch/SearchTimePatch.cs +++ b/src/CactusPie.FastSearch/SearchTimePatch.cs @@ -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] @@ -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)); } } -} \ No newline at end of file +}