From cef94b5c401ef22d6334d026ee18b8456afaea6e Mon Sep 17 00:00:00 2001 From: CWX Date: Fri, 12 Jul 2024 14:49:25 +0100 Subject: [PATCH] scavprofileloadpatch reworked tobe prefix instead of IL --- .../Patches/ScavMode/ScavPrefabLoadPatch.cs | 1 + .../Patches/ScavMode/ScavProfileLoadPatch.cs | 80 ++++--------------- 2 files changed, 17 insertions(+), 64 deletions(-) diff --git a/project/SPT.SinglePlayer/Patches/ScavMode/ScavPrefabLoadPatch.cs b/project/SPT.SinglePlayer/Patches/ScavMode/ScavPrefabLoadPatch.cs index 0c6d3f7..e1bb379 100644 --- a/project/SPT.SinglePlayer/Patches/ScavMode/ScavPrefabLoadPatch.cs +++ b/project/SPT.SinglePlayer/Patches/ScavMode/ScavPrefabLoadPatch.cs @@ -14,6 +14,7 @@ namespace SPT.SinglePlayer.Patches.ScavMode { protected override MethodBase GetTargetMethod() { + // Struct324 - 3.10.0 var desiredType = typeof(TarkovApplication) .GetNestedTypes(PatchConstants.PublicDeclaredFlags) .SingleCustom(x => x.GetField("timeAndWeather") != null diff --git a/project/SPT.SinglePlayer/Patches/ScavMode/ScavProfileLoadPatch.cs b/project/SPT.SinglePlayer/Patches/ScavMode/ScavProfileLoadPatch.cs index ddeeb4b..ae310ee 100644 --- a/project/SPT.SinglePlayer/Patches/ScavMode/ScavProfileLoadPatch.cs +++ b/project/SPT.SinglePlayer/Patches/ScavMode/ScavProfileLoadPatch.cs @@ -13,78 +13,30 @@ namespace SPT.SinglePlayer.Patches.ScavMode { public class ScavProfileLoadPatch : ModulePatch { + /// + /// This was changed from an IL Patch, + /// aim is just to replace loaded profile with the Scav profile when creating a game + /// + /// protected override MethodBase GetTargetMethod() { - // Struct225 - 20575 - var desiredType = typeof(TarkovApplication) - .GetNestedTypes(PatchConstants.PublicDeclaredFlags) - .SingleCustom(x => x.GetField("timeAndWeather") != null - && x.GetField("timeHasComeScreenController") != null - && x.Name.Contains("Struct")); - - var desiredMethod = desiredType.GetMethods(PatchConstants.PublicDeclaredFlags) - .FirstOrDefault(x => x.Name == "MoveNext"); - - Logger.LogDebug($"{this.GetType().Name} Type: {desiredType?.Name}"); - Logger.LogDebug($"{this.GetType().Name} Method: {desiredMethod?.Name}"); - - return desiredMethod; + return AccessTools.Method(typeof(LocalGame), nameof(LocalGame.smethod_6)); } - [PatchTranspiler] - private static IEnumerable PatchTranspile(ILGenerator generator, IEnumerable instructions) + [PatchPrefix] + public static void PatchPrefix(ref Profile profile, LocalRaidSettings raidSettings) { - var codes = new List(instructions); - - // Search for code where backend.Session.getProfile() is called. - var searchCode = new CodeInstruction(OpCodes.Callvirt, AccessTools.Method(PatchConstants.BackendProfileInterfaceType, "get_Profile")); - var searchIndex = -1; - - for (var i = 0; i < codes.Count; i++) + // check raidsettings to see if its a pmc raid + if (raidSettings.playerSide == ESideType.Pmc) { - if (codes[i].opcode == searchCode.opcode && codes[i].operand == searchCode.operand) - { - searchIndex = i; - break; - } + Logger.LogInfo("Side was PMC, returning"); + return; } - // Patch failed. - if (searchIndex == -1) - { - Logger.LogError($"Patch {MethodBase.GetCurrentMethod()} failed: Could not find reference code."); - return instructions; - } - - // Move back by 2. This is the start of this method call. - searchIndex -= 2; - - var brFalseLabel = generator.DefineLabel(); - var brLabel = generator.DefineLabel(); - var newCodes = CodeGenerator.GenerateInstructions(new List() - { - new Code(OpCodes.Ldloc_1), - new Code(OpCodes.Call, typeof(ClientApplication), "get_Session"), - new Code(OpCodes.Ldloc_1), - new Code(OpCodes.Ldfld, typeof(TarkovApplication), "_raidSettings"), - new Code(OpCodes.Callvirt, typeof(RaidSettings), "get_IsPmc"), - new Code(OpCodes.Brfalse, brFalseLabel), - new Code(OpCodes.Callvirt, PatchConstants.BackendProfileInterfaceType, "get_Profile"), - new Code(OpCodes.Br, brLabel), - new CodeWithLabel(OpCodes.Callvirt, brFalseLabel, PatchConstants.BackendProfileInterfaceType, "get_ProfileOfPet"), - new CodeWithLabel(OpCodes.Stfld, brLabel, typeof(TarkovApplication).GetNestedTypes(BindingFlags.Public).SingleCustom(IsTargetNestedType), "profile") - }); - - codes.RemoveRange(searchIndex, 4); - codes.InsertRange(searchIndex, newCodes); - - return codes.AsEnumerable(); - } - - private static bool IsTargetNestedType(System.Type nestedType) - { - return nestedType.GetMethods(PatchConstants.PublicDeclaredFlags) - .Count(x => x.GetParameters().Length == 1 && x.GetParameters()[0].ParameterType == typeof(IResult)) > 0 && nestedType.GetField("savageProfile") != null; + // if not get scav profile + // load that into the profile param + Logger.LogInfo("Side was Scav, setting profile"); + profile = PatchConstants.BackEndSession.ProfileOfPet; } } }