From c73aba7d43b8bcbd5fe6610c7023cb2f87f4ac1d Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Wed, 25 Nov 2020 11:39:16 -0500 Subject: [PATCH 1/6] Injection of patch to async load json data --- .../RogueTechPerfFix/RogueTechPerfFixes.dll | Bin 14336 -> 16384 bytes .../DataManager/AsyncJsonLoadRequest.cs | 37 +++++ .../RogueTechPerfFixes.csproj | 25 +-- Injection/Injection.csproj | 13 +- Injection/Injection/CecilManager.cs | 4 +- .../Injection/I_AmmunitionDefLoadRequest.cs | 150 ++++++++++++++++++ QuickStart/IInjector.cs | 14 ++ 7 files changed, 224 insertions(+), 19 deletions(-) create mode 100644 CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs create mode 100644 Injection/Injection/I_AmmunitionDefLoadRequest.cs create mode 100644 QuickStart/IInjector.cs diff --git a/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll b/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll index 8ed8440c04b287fdb0dd804f579813423affc94b..82613dd32d492f223615e528fe3e9719c0092083 100644 GIT binary patch literal 16384 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 diff --git a/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs b/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs new file mode 100644 index 0000000..121fa5d --- /dev/null +++ b/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs @@ -0,0 +1,37 @@ +using HBS.Logging; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RogueTechPerfFixes.DataManager +{ + public static class AsyncJsonLoadRequest + { + private static readonly ILog logger = Logger.GetLogger("DataLoader", LogLevel.Log); + + public static async Task LoadResource(string path, Action handler, bool monitor) + { + try + { + using (FileStream arg = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + StreamReader sr = new StreamReader(arg); + await sr.ReadToEndAsync(); + + // TODO: Add DataLoader.Entry refernces here, so file update monitoring can happen -or- replicate with our own + handler(sr.ToString()); + } + } + catch (Exception exception) + { + string message = $"LoadResource() - Caught exception while loading [{path}]"; + logger.LogError(message); + logger.LogException(exception); + handler(null); + } + } + } +} diff --git a/CustomComponentPerfFix/RogueTechPerfFixes.csproj b/CustomComponentPerfFix/RogueTechPerfFixes.csproj index c0bf066..aad2162 100644 --- a/CustomComponentPerfFix/RogueTechPerfFixes.csproj +++ b/CustomComponentPerfFix/RogueTechPerfFixes.csproj @@ -41,27 +41,27 @@ - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\0Harmony.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\0Harmony.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\Assembly-CSharp.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\Assembly-CSharp.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\CustomActivatableEquipment\CustomActivatableEquipment.dll + E:\steam\SteamApps\common\BATTLETECH\Mods\CustomActivatableEquipment\CustomActivatableEquipment.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\CustomAmmoCategories\CustomAmmoCategories.dll + E:\steam\SteamApps\common\BATTLETECH\Mods\CustomAmmoCategories\CustomAmmoCategories.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\CustomComponents\CustomComponents.dll + E:\steam\SteamApps\common\BATTLETECH\Mods\CustomComponents\CustomComponents.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\CustomUnits\CustomUnits.dll + E:\steam\SteamApps\common\BATTLETECH\Mods\CustomUnits\CustomUnits.dll False @@ -69,17 +69,17 @@ False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\DOTweenPro.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\DOTweenPro.dll False False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\LowVisibility\LowVisibility.dll + E:\steam\SteamApps\common\BATTLETECH\Mods_BTA_Shared_Old\LowVisibility\LowVisibility.dll False False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\Newtonsoft.Json.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\Newtonsoft.Json.dll False @@ -91,19 +91,20 @@ - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.CoreModule.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.CoreModule.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.PhysicsModule.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.PhysicsModule.dll False + diff --git a/Injection/Injection.csproj b/Injection/Injection.csproj index ef21f3f..8fca153 100644 --- a/Injection/Injection.csproj +++ b/Injection/Injection.csproj @@ -41,7 +41,7 @@ - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\Assembly-CSharp.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\Assembly-CSharp.dll False @@ -49,17 +49,17 @@ False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\DOTweenPro.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\DOTweenPro.dll False False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\ModTek\Mono.Cecil.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\MonoMod\Mono.Cecil.dll True False - G:\SteamLibrary\steamapps\common\BATTLETECH\Mods\ModTek\Mono.Cecil.Rocks.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\MonoMod\Mono.Cecil.Rocks.dll True @@ -71,11 +71,11 @@ - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.dll False - G:\SteamLibrary\steamapps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.CoreModule.dll + E:\steam\SteamApps\common\BATTLETECH\BattleTech_Data\Managed\UnityEngine.CoreModule.dll False @@ -83,6 +83,7 @@ + diff --git a/Injection/Injection/CecilManager.cs b/Injection/Injection/CecilManager.cs index 34faff9..b059ca2 100644 --- a/Injection/Injection/CecilManager.cs +++ b/Injection/Injection/CecilManager.cs @@ -112,7 +112,6 @@ static CecilManager() nameof(RTPFVersion) + Mod.Version.ToString().Replace('.', '_') , FieldAttributes.Private , _assembly.MainModule.ImportReference(typeof(string))); - TypeDefinition targetType = null; foreach (TypeDefinition type in _assembly.MainModule.Types) { @@ -162,6 +161,9 @@ public static void Init() Injectors.Add(new I_BTLight()); Injectors.Add(new I_BTLightController()); + // DataManager fixes + Injectors.Add(new I_AmmunitionDefLoadRequest()); + //Injectors.Add(new I_DOTweenAnimation()); //Injectors.Add(new I_ElementManager()); //Injectors.Add(new I_SortMoveCandidatesByInfMapNode()); diff --git a/Injection/Injection/I_AmmunitionDefLoadRequest.cs b/Injection/Injection/I_AmmunitionDefLoadRequest.cs new file mode 100644 index 0000000..b5d4925 --- /dev/null +++ b/Injection/Injection/I_AmmunitionDefLoadRequest.cs @@ -0,0 +1,150 @@ +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using RogueTechPerfFixes; +using RogueTechPerfFixes.DataManager; +using RogueTechPerfFixes.Injection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Injection.Injection +{ + class I_AmmunitionDefLoadRequest : IInjector + { + private const string _baseType = "BattleTech.Data.DataManager"; + private const string _targetType = "BattleTech.Data.DataManager/AmmunitionDefLoadRequest"; + + #region Implementation of IInjector + + public void Inject(Dictionary typeTable, ModuleDefinition module) + { + if (!Mod.Settings.Patch.Vanilla) + return; + + if (typeTable.TryGetValue(_baseType, out TypeDefinition type)) + { + //InjectField(type, module); + //InitField(type); + CecilManager.WriteLog($"Found baseType: {_baseType}"); + + foreach (TypeDefinition nestedType in type.NestedTypes) + { + if (_targetType.Equals(nestedType.FullName, StringComparison.InvariantCultureIgnoreCase)) + { + CecilManager.WriteLog($"Found target nestedType: {nestedType.FullName}"); + InjectIL(nestedType, module); + } + } + } + else + { + CecilManager.WriteError($"Can't find target type: {_targetType}"); + } + } + + #endregion + private static void InjectIL(TypeDefinition type, ModuleDefinition module) + { + const string targetMethod = "Load"; + + TypeDefinition baseType = type.BaseType.Resolve().BaseType.Resolve(); + foreach (MethodDefinition methodDef in baseType.GetMethods()) + { + CecilManager.WriteLog($" Method: {methodDef.Name}"); + } + + MethodDefinition method = + baseType.GetMethods().FirstOrDefault(m => m.Name == targetMethod); + + if (method == null) + { + CecilManager.WriteError($"Can't find method: {targetMethod}\n"); + return; + } + + ILProcessor ilProcessor = method.Body.GetILProcessor(); + + TypeReference asyncJsonLoadRequestTR = module.ImportReference(typeof(AsyncJsonLoadRequest)); + VariableDefinition asyncJsonLoadRequestVD = new VariableDefinition(asyncJsonLoadRequestTR); + method.Body.Variables.Add(asyncJsonLoadRequestVD); + + for (int i = 0; i < method.Body.Instructions.Count - 1; i++) + { + Instruction instruction = method.Body.Instructions[i]; + if (instruction.OpCode == OpCodes.Callvirt && + instruction.Operand != null && + instruction.Operand.GetType().FullName.StartsWith("HBS.Data.DataLoader::LoadResource")) + { + CecilManager.WriteLog($"Found injection point: {instruction.Operand.GetType().FullName}\n"); + method.Body.Instructions[i] = ilProcessor.Create(OpCodes.Call, method); + + // Look for preceeding methods at -7, -8 + + if (i - 7 > 0 && + method.Body.Instructions[i - 7].OpCode == OpCodes.Ldfld) + { + CecilManager.WriteLog($" WIPING LDFLD"); + method.Body.Instructions[i - 7].Operand = OpCodes.Nop; + method.Body.Instructions[i - 7].Operand = null; + } + else + CecilManager.WriteError($" NOT LDFLD - SHIT GONNA BREAK"); + + if (i - 8 > 0 && + method.Body.Instructions[i - 8].OpCode == OpCodes.Ldfld) + { + CecilManager.WriteLog($" WIPING LDFLD"); + method.Body.Instructions[i - 8].Operand = OpCodes.Nop; + method.Body.Instructions[i - 8].Operand = null; + } + else + CecilManager.WriteError($" NOT LDFLD - SHIT GONNA BREAK"); + + } + } + + + //Instruction methodStart = method.Body.Instructions[0]; + + //List newInstructions = CreateInstructions(ilProcessor, methodStart); + //newInstructions.Reverse(); + + //foreach (Instruction instruction in newInstructions) + //{ + // ilProcessor.InsertBefore(method.Body.Instructions[0], instruction); + //} + } + + //private static List CreateInstructions(ILProcessor ilProcessor, Instruction branchTarget) + //{ + // List instructions = new List() + // { + // // int remainder = _counter % _interval; + // ilProcessor.Create(OpCodes.Ldarg_0), + // ilProcessor.Create(OpCodes.Ldfld, _counter), + // ilProcessor.Create(OpCodes.Ldsfld, _interval), + // ilProcessor.Create(OpCodes.Rem_Un), + + // // _counter++; + // ilProcessor.Create(OpCodes.Ldarg_0), + // ilProcessor.Create(OpCodes.Ldarg_0), + // ilProcessor.Create(OpCodes.Ldfld, _counter), + // ilProcessor.Create(OpCodes.Ldc_I4_1), + // ilProcessor.Create(OpCodes.Add), + // ilProcessor.Create(OpCodes.Stfld, _counter), + + // // if (equal) goto branchTarget; + // ilProcessor.Create(OpCodes.Brfalse, branchTarget), + + // // return; + // ilProcessor.Create(OpCodes.Ret), + // }; + + // return instructions; + //} + + } +} diff --git a/QuickStart/IInjector.cs b/QuickStart/IInjector.cs new file mode 100644 index 0000000..699bef5 --- /dev/null +++ b/QuickStart/IInjector.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Mono.Cecil; + +namespace RogueTechPerfFixes.Injection +{ + public interface IInjector + { + void Inject(Dictionary typeTable, ModuleDefinition module); + } +} From 4c5285e18c35d88d618af08f914fe21be317ae68 Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Wed, 25 Nov 2020 14:56:34 -0500 Subject: [PATCH 2/6] - Working implementation --- .../RogueTechPerfFix/RogueTechPerfFixes.dll | Bin 16384 -> 16384 bytes .../DataManager/AsyncJsonLoadRequest.cs | 10 +- .../Injection/I_AmmunitionDefLoadRequest.cs | 102 ++++++------------ 3 files changed, 39 insertions(+), 73 deletions(-) diff --git a/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll b/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll index 82613dd32d492f223615e528fe3e9719c0092083..a7e9667990d73f320456a87582d8e97f4b740fdd 100644 GIT binary patch delta 4578 zcmZvg3vg7`8OQ(U+{fPCyL+>{Au$1j1WZB*;CH|O_kHI( zk9+pq3-P#!$Hj_AHaI z&6q=RBFoM!Nl*5hc-zaoYhY;BQGo~Kykh3e>Lc+$w}+UQZZ7CTN5q`*ODb*q zXUwIUEY>br3@5VFE!p{Ma*%p-5i3!V)}eqy6I=_4T+CUGEWJ<&;Ducn*p4BvN7JS4B9xXS>aRmZYw>Qj%h&^J!3uSxAB6lxI#0>r|i$Q zZE3rmwvSl(Z2P=sgZ7lzM|?J#LZ!^V8H&I5D_-)K#&~P7DuV$mLx17n9kEJs7m6}bZ8lKRpIVjcYy_71` zYN_{9pb}kB4uiXRhy~0>SM=vEDU3~ippt43Bx4`)XVHQJZa)>P;%=%$5mjPwdXLy7 z|53xlqsIH>68AW3jdM;KxtOW>rZ`E@C*llwo&1>WC(j!Zc-Fs|6A4`;bIAzmyvs&) z{3uS+-VwZFl;Nrnrj1SR8N)^wNAWA4VqeELYvU7Hxi&r{rf-jE&Lykk-?Ky+95-NA z$M@=TPdjO51j9L?GMo&wGX=huSuC-V`I)%lbu`Q1XTFU>4%9}EG{rPead(KcqvAL_ z%X3t#Z+wbd+$`34OT@C+Y_4^jsha}1v=_1)j?v9$cpZw#a`ZAsrD|NI{*+P&LrR@Ysa1R`2Dlx77!HXibntd1v6Nk?;9b{L zLKwJDt3&wFr#9RJ$ru+>P`#K`&Q_y=YNuAs&Q2qPYJVygc879mucu;N-C6a$?5s9I9$O)5V&Xmto`fdkm7RSP1t7_Mh^{G2C zF)ybTwyla1qs#l&bVEGedYhsqj*$PK0nls}?xUax)F#yld5{^0i7n zku(g}YNeCqBp9nrskN?BQ&Z~Gm`};YNr}$_Lq!_Srqo_%D1Xw)m2K8*8G)6rJH+=g zPec$+Dm581iVCe(qS0MVH72E=^sP19VT5{ba=D)LZ80;D!xyMhOMJ22=5_etnmlM` zVS8aRxW#&IUCsjD`k=YSzw9>0*=HU5M>=pTMs&CrF^pbN|s8%>p;wEx!=Tdl`+eL$sN<_k?i*#=H~;joDr zj0zrc%HLNPUBsbCtk9(w>y8yA)-cC_iV9q5Gu%r$GdZ}nZB@R+qF9>-ZNm>UETH)R zO3&qv-p}`_I{G4{#TTHmbIAb8$S^82hiF!5R%?#ZoS<2c*bz4aGqsqj*{r#l6qq26 zxb6AwRL`_oKg;#>2!4Gj2C>m7#u`#!v*_pV$G6D^XAq<6)NPl_QTu-l?Gf~>6SZVR zK%gTE{B?L8H^hv3Y!ltR2C~eU!@xSxMAmonOC+lXiQNw2#q#G;~P3 z&K3HYb}s$Z;*>lj>Sd?2bU8uV^wi5J?P@VaUN7g$V_f6dR6d&~OvM|aVsfOf0TbkW z?~rKJPpDBph(b|h^_DHZkG3mhh-B6xvS)2{6#dNMQjk8dSO*@M#r*Pnjx0he*$c2r+IZXR&@IL*cwWm(=eq5lZ0qyN#%tL{F8jDz3 z2*q5@xaK0Ex?HF2eVV5TQ)t>Acaj&BlK@79xBgVV?=|12`kd5GNNDt_Zr z{94XWeAsDuY=vAe_ee9YP9t^kFx6KRkIJ8HQcHcr6;BCQ&RpZDP7O|Xq;1zNxY5W z@-wt1#^&s9&B-0(wl3~bXtX|GGC+n!ey2UNrvGMe%XfQL`tOW4CB7{i;D6V%bA*V- z-%Sj>v8whX(~iW~_;X}5{;@~P1+DYZ_%qa*J~JaaK}72_BGW{4Y; z=G?^nz3$5I$>B8jQ3K?Sqf)nM{EtpX^bXkxorIIak)Kcevsba%hoMA9@7p@0`E19_ zh{O*HFIvq%fgD4yU}dDas&!89R*@*_yEhb6{k-IHaJz)p`a|DW`AznC>c3>v%5SVq i94T)vR=1un&l8E#iZQKT|L+XBvu|r;&=;bm)b}69LolQO delta 4615 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 handler, bool monitor) + public static async Task LoadResource(string path, Action handler) { try { using (FileStream arg = new FileStream(path, FileMode.Open, FileAccess.Read)) { StreamReader sr = new StreamReader(arg); - await sr.ReadToEndAsync(); + //logger.Log($"Reading file at path: {path}"); + string content = await sr.ReadToEndAsync(); - // TODO: Add DataLoader.Entry refernces here, so file update monitoring can happen -or- replicate with our own - handler(sr.ToString()); + // TODO: Add DataLoader.Entry references here, so file update monitoring can happen -or- replicate with our own + //logger.Log($"Handling file at path: {path} with content: {content}"); + handler(content); } } catch (Exception exception) diff --git a/Injection/Injection/I_AmmunitionDefLoadRequest.cs b/Injection/Injection/I_AmmunitionDefLoadRequest.cs index b5d4925..7aa4dbb 100644 --- a/Injection/Injection/I_AmmunitionDefLoadRequest.cs +++ b/Injection/Injection/I_AmmunitionDefLoadRequest.cs @@ -50,12 +50,8 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) { const string targetMethod = "Load"; + // From class -> JsonLoadRequest -> StringDataLoadRequest TypeDefinition baseType = type.BaseType.Resolve().BaseType.Resolve(); - foreach (MethodDefinition methodDef in baseType.GetMethods()) - { - CecilManager.WriteLog($" Method: {methodDef.Name}"); - } - MethodDefinition method = baseType.GetMethods().FirstOrDefault(m => m.Name == targetMethod); @@ -67,84 +63,52 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) ILProcessor ilProcessor = method.Body.GetILProcessor(); - TypeReference asyncJsonLoadRequestTR = module.ImportReference(typeof(AsyncJsonLoadRequest)); - VariableDefinition asyncJsonLoadRequestVD = new VariableDefinition(asyncJsonLoadRequestTR); - method.Body.Variables.Add(asyncJsonLoadRequestVD); + TypeReference ajlr_TR = module.ImportReference(typeof(AsyncJsonLoadRequest)); + TypeReference taskTR = module.ImportReference(typeof(Task)); + + MethodReference ajlr_lr_MR = new MethodReference("LoadResource", taskTR, ajlr_TR); + TypeReference stringTR = module.ImportReference(typeof(string)); + ajlr_lr_MR.Parameters.Add(new ParameterDefinition(stringTR)); + + TypeReference actionStringTR = module.ImportReference(typeof(Action)); + ajlr_lr_MR.Parameters.Add(new ParameterDefinition(actionStringTR)); + + //TypeReference boolTR = module.ImportReference(typeof(bool)); + //ajlr_lr_MR.Parameters.Add(new ParameterDefinition(boolTR)); + + //ajlr_lr_MR.MethodReturnType = new MethodReturnType(ajlr_lr_MR); + //ajlr_lr_MR.MethodReturnType.ReturnType = taskTR; + ajlr_lr_MR.ReturnType = taskTR; + + MethodReference ajlr_lr_Imported_MR = module.ImportReference(ajlr_lr_MR); for (int i = 0; i < method.Body.Instructions.Count - 1; i++) { Instruction instruction = method.Body.Instructions[i]; if (instruction.OpCode == OpCodes.Callvirt && - instruction.Operand != null && - instruction.Operand.GetType().FullName.StartsWith("HBS.Data.DataLoader::LoadResource")) + instruction.Operand is MethodDefinition methodDef) { - CecilManager.WriteLog($"Found injection point: {instruction.Operand.GetType().FullName}\n"); - method.Body.Instructions[i] = ilProcessor.Create(OpCodes.Call, method); - - // Look for preceeding methods at -7, -8 + //CecilManager.WriteLog($"Found methodDef: {methodDef.FullName}"); - if (i - 7 > 0 && - method.Body.Instructions[i - 7].OpCode == OpCodes.Ldfld) + if (methodDef.FullName.StartsWith("System.Void HBS.Data.DataLoader::LoadResource")) { - CecilManager.WriteLog($" WIPING LDFLD"); - method.Body.Instructions[i - 7].Operand = OpCodes.Nop; - method.Body.Instructions[i - 7].Operand = null; - } - else - CecilManager.WriteError($" NOT LDFLD - SHIT GONNA BREAK"); + CecilManager.WriteLog($"Found injection point: {methodDef.FullName}\n"); + method.Body.Instructions[i] = ilProcessor.Create(OpCodes.Call, ajlr_lr_Imported_MR); - if (i - 8 > 0 && - method.Body.Instructions[i - 8].OpCode == OpCodes.Ldfld) - { - CecilManager.WriteLog($" WIPING LDFLD"); - method.Body.Instructions[i - 8].Operand = OpCodes.Nop; - method.Body.Instructions[i - 8].Operand = null; - } - else - CecilManager.WriteError($" NOT LDFLD - SHIT GONNA BREAK"); + // Look for preceeding methods at -7, -8 + //method.Body.Instructions[i - 8].OpCode = OpCodes.Nop; + //method.Body.Instructions[i - 8].Operand = null; + + //method.Body.Instructions[i - 7].OpCode = OpCodes.Nop; + //method.Body.Instructions[i - 7].Operand = null; + //method.Body.Instructions[i - 6].OpCode = OpCodes.Nop; + //method.Body.Instructions[i - 6].Operand = null; + } } } - - //Instruction methodStart = method.Body.Instructions[0]; - - //List newInstructions = CreateInstructions(ilProcessor, methodStart); - //newInstructions.Reverse(); - - //foreach (Instruction instruction in newInstructions) - //{ - // ilProcessor.InsertBefore(method.Body.Instructions[0], instruction); - //} } - //private static List CreateInstructions(ILProcessor ilProcessor, Instruction branchTarget) - //{ - // List instructions = new List() - // { - // // int remainder = _counter % _interval; - // ilProcessor.Create(OpCodes.Ldarg_0), - // ilProcessor.Create(OpCodes.Ldfld, _counter), - // ilProcessor.Create(OpCodes.Ldsfld, _interval), - // ilProcessor.Create(OpCodes.Rem_Un), - - // // _counter++; - // ilProcessor.Create(OpCodes.Ldarg_0), - // ilProcessor.Create(OpCodes.Ldarg_0), - // ilProcessor.Create(OpCodes.Ldfld, _counter), - // ilProcessor.Create(OpCodes.Ldc_I4_1), - // ilProcessor.Create(OpCodes.Add), - // ilProcessor.Create(OpCodes.Stfld, _counter), - - // // if (equal) goto branchTarget; - // ilProcessor.Create(OpCodes.Brfalse, branchTarget), - - // // return; - // ilProcessor.Create(OpCodes.Ret), - // }; - - // return instructions; - //} - } } From 40bb6d6d0fb7a22a36d8036b2f903a8bfba76a85 Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Fri, 27 Nov 2020 10:03:33 -0500 Subject: [PATCH 3/6] Fixed bad decompile from dnSpy; forgot to pop task from stack --- .../RogueTechPerfFix/RogueTechPerfFixes.dll | Bin 16384 -> 16384 bytes .../Injection/I_AmmunitionDefLoadRequest.cs | 30 ++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll b/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll index a7e9667990d73f320456a87582d8e97f4b740fdd..84dadd9707140b0552998211f58e0f9254512a6b 100644 GIT binary patch delta 38 ucmZo@U~Fh$oY286D0*;XH>;t*gz`y3?_SMwoSP-~vDNsQ$>s%y348z|ln=WA delta 38 ucmZo@U~Fh$oY29%aofI)-K>TJjB0ZGit>^iCjQztjnluOX7d8W1U>*M77uR# diff --git a/Injection/Injection/I_AmmunitionDefLoadRequest.cs b/Injection/Injection/I_AmmunitionDefLoadRequest.cs index 7aa4dbb..06d9aeb 100644 --- a/Injection/Injection/I_AmmunitionDefLoadRequest.cs +++ b/Injection/Injection/I_AmmunitionDefLoadRequest.cs @@ -82,6 +82,7 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) MethodReference ajlr_lr_Imported_MR = module.ImportReference(ajlr_lr_MR); + int targetIdx = -1; for (int i = 0; i < method.Body.Instructions.Count - 1; i++) { Instruction instruction = method.Body.Instructions[i]; @@ -93,19 +94,28 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) if (methodDef.FullName.StartsWith("System.Void HBS.Data.DataLoader::LoadResource")) { CecilManager.WriteLog($"Found injection point: {methodDef.FullName}\n"); - method.Body.Instructions[i] = ilProcessor.Create(OpCodes.Call, ajlr_lr_Imported_MR); + targetIdx = i; + } + } + } + if (targetIdx != -1) + { + // Replace callvirt for dataManager.dataLoader.LoadResource with call to AsyncJsonLoadRequest + method.Body.Instructions[targetIdx] = ilProcessor.Create(OpCodes.Call, ajlr_lr_Imported_MR); - // Look for preceeding methods at -7, -8 - //method.Body.Instructions[i - 8].OpCode = OpCodes.Nop; - //method.Body.Instructions[i - 8].Operand = null; + // Elminate references to dataLoader (no longer used) + method.Body.Instructions[targetIdx - 9].OpCode = OpCodes.Nop; + method.Body.Instructions[targetIdx - 9].Operand = null; - //method.Body.Instructions[i - 7].OpCode = OpCodes.Nop; - //method.Body.Instructions[i - 7].Operand = null; + method.Body.Instructions[targetIdx - 8].OpCode = OpCodes.Nop; + method.Body.Instructions[targetIdx - 8].Operand = null; - //method.Body.Instructions[i - 6].OpCode = OpCodes.Nop; - //method.Body.Instructions[i - 6].Operand = null; - } - } + method.Body.Instructions[targetIdx - 7].OpCode = OpCodes.Nop; + method.Body.Instructions[targetIdx - 7].Operand = null; + + // Add a pop to remove the async Task (to eliminate dnSpy decompile err) + Instruction popInst = ilProcessor.Create(OpCodes.Pop); + ilProcessor.InsertAfter(method.Body.Instructions[targetIdx], popInst); } } From 530cfffbd130a5749f067a1b914b0c95b12eee02 Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Fri, 27 Nov 2020 11:49:53 -0500 Subject: [PATCH 4/6] - Added logger for loads (temporary, debug only) --- .../RogueTechPerfFix/RogueTechPerfFixes.dll | Bin 16384 -> 16896 bytes .../DataManager/AsyncJsonLoadRequest.cs | 20 +++- Injection/Injection.csproj | 1 + Injection/Injection/CecilManager.cs | 1 + .../Injection/I_AmmunitionDefLoadRequest.cs | 10 +- Injection/Injection/I_DataManager.cs | 98 ++++++++++++++++++ 6 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 Injection/Injection/I_DataManager.cs diff --git a/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll b/Build/Release/RogueTechPerfFix/RogueTechPerfFixes.dll index 84dadd9707140b0552998211f58e0f9254512a6b..223c02f58023528a4d13f7b48c5293a73f36de97 100644 GIT binary patch delta 5606 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 handler) { try { + + using (FileStream arg = new FileStream(path, FileMode.Open, FileAccess.Read)) { StreamReader sr = new StreamReader(arg); - //logger.Log($"Reading file at path: {path}"); + //logger.Log($"READ file at path: {path}"); + + StackTrace st = new StackTrace(); + //logger.Log($" ST: {st}"); + string content = await sr.ReadToEndAsync(); // TODO: Add DataLoader.Entry references here, so file update monitoring can happen -or- replicate with our own //logger.Log($"Handling file at path: {path} with content: {content}"); + //logger.Log($"HANDLE file at path: {path}"); handler(content); } } diff --git a/Injection/Injection.csproj b/Injection/Injection.csproj index 8fca153..f026718 100644 --- a/Injection/Injection.csproj +++ b/Injection/Injection.csproj @@ -83,6 +83,7 @@ + diff --git a/Injection/Injection/CecilManager.cs b/Injection/Injection/CecilManager.cs index b059ca2..4bce76f 100644 --- a/Injection/Injection/CecilManager.cs +++ b/Injection/Injection/CecilManager.cs @@ -163,6 +163,7 @@ public static void Init() // DataManager fixes Injectors.Add(new I_AmmunitionDefLoadRequest()); + Injectors.Add(new I_DataManager()); //Injectors.Add(new I_DOTweenAnimation()); //Injectors.Add(new I_ElementManager()); diff --git a/Injection/Injection/I_AmmunitionDefLoadRequest.cs b/Injection/Injection/I_AmmunitionDefLoadRequest.cs index 06d9aeb..13c8d38 100644 --- a/Injection/Injection/I_AmmunitionDefLoadRequest.cs +++ b/Injection/Injection/I_AmmunitionDefLoadRequest.cs @@ -26,8 +26,6 @@ public void Inject(Dictionary typeTable, ModuleDefinitio if (typeTable.TryGetValue(_baseType, out TypeDefinition type)) { - //InjectField(type, module); - //InitField(type); CecilManager.WriteLog($"Found baseType: {_baseType}"); foreach (TypeDefinition nestedType in type.NestedTypes) @@ -63,6 +61,7 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) ILProcessor ilProcessor = method.Body.GetILProcessor(); + // Add a enew reference to an importable method call for AsyncJsonLoadRequest.Load() TypeReference ajlr_TR = module.ImportReference(typeof(AsyncJsonLoadRequest)); TypeReference taskTR = module.ImportReference(typeof(Task)); @@ -72,16 +71,11 @@ private static void InjectIL(TypeDefinition type, ModuleDefinition module) TypeReference actionStringTR = module.ImportReference(typeof(Action)); ajlr_lr_MR.Parameters.Add(new ParameterDefinition(actionStringTR)); - - //TypeReference boolTR = module.ImportReference(typeof(bool)); - //ajlr_lr_MR.Parameters.Add(new ParameterDefinition(boolTR)); - - //ajlr_lr_MR.MethodReturnType = new MethodReturnType(ajlr_lr_MR); - //ajlr_lr_MR.MethodReturnType.ReturnType = taskTR; ajlr_lr_MR.ReturnType = taskTR; MethodReference ajlr_lr_Imported_MR = module.ImportReference(ajlr_lr_MR); + // Walk the instructions to find the target. Don't mutate as we go, so we can use insertAfter later. int targetIdx = -1; for (int i = 0; i < method.Body.Instructions.Count - 1; i++) { diff --git a/Injection/Injection/I_DataManager.cs b/Injection/Injection/I_DataManager.cs new file mode 100644 index 0000000..f342255 --- /dev/null +++ b/Injection/Injection/I_DataManager.cs @@ -0,0 +1,98 @@ +using BattleTech; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using RogueTechPerfFixes; +using RogueTechPerfFixes.DataManager; +using RogueTechPerfFixes.Injection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Injection.Injection +{ + class I_DataManager : IInjector + { + private const string _targetType = "BattleTech.Data.DataManager"; + + #region Implementation of IInjector + + public void Inject(Dictionary typeTable, ModuleDefinition module) + { + if (!Mod.Settings.Patch.Vanilla) + return; + + if (typeTable.TryGetValue(_targetType, out TypeDefinition type)) + { + CecilManager.WriteError($"Injecting IL for targetType: {_targetType}"); + InjectIL(type, module); + } + else + { + CecilManager.WriteError($"Can't find target type: {_targetType}"); + } + } + + #endregion + private static void InjectIL(TypeDefinition type, ModuleDefinition module) + { + // internal DataManager.FileLoadRequest CreateFileRequest(BattleTechResourceType resourceType, string identifier, PrewarmRequest prewarm, bool allowRequestStacking) + const string targetMethod = "CreateFileRequest"; + + // From class -> JsonLoadRequest -> StringDataLoadRequest + MethodDefinition method = + type.GetMethods().FirstOrDefault(m => m.Name == targetMethod); + + if (method == null) + { + CecilManager.WriteError($"Can't find method: {targetMethod}\n"); + return; + } + + ILProcessor ilProcessor = method.Body.GetILProcessor(); + Instruction methodStart = method.Body.Instructions[0]; + + List newInstructions = CreateInstructions(ilProcessor, methodStart, module); + newInstructions.Reverse(); + + foreach (Instruction instruction in newInstructions) + { + ilProcessor.InsertBefore(method.Body.Instructions[0], instruction); + } + } + + private static List CreateInstructions(ILProcessor ilProcessor, Instruction branchTarget, ModuleDefinition module) + { + // Create an importable reference to our logger + TypeReference ajlr_TR = module.ImportReference(typeof(AsyncJsonLoadRequest)); + TypeReference void_TR = module.ImportReference(typeof(void)); + + MethodReference ajlr_lr_MR = new MethodReference("LogLoadRequest", void_TR, ajlr_TR); + + TypeReference battleTechResourceType_TR = module.ImportReference(typeof(BattleTechResourceType)); + ajlr_lr_MR.Parameters.Add(new ParameterDefinition(battleTechResourceType_TR)); + + TypeReference string_TR = module.ImportReference(typeof(string)); + ajlr_lr_MR.Parameters.Add(new ParameterDefinition(string_TR)); + + TypeReference bool_TR = module.ImportReference(typeof(bool)); + ajlr_lr_MR.Parameters.Add(new ParameterDefinition(bool_TR)); + + MethodReference ajlr_lr_Imported_MR = module.ImportReference(ajlr_lr_MR); + + List instructions = new List() + { + // Add all params to stack + ilProcessor.Create(OpCodes.Ldarg, 1), + ilProcessor.Create(OpCodes.Ldarg, 2), + ilProcessor.Create(OpCodes.Ldarg, 4), + ilProcessor.Create(OpCodes.Call, ajlr_lr_Imported_MR) + }; + + return instructions; + } + + } +} From 79708eff2b3aac0216d6048fc309aeecf84ea7b5 Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Wed, 2 Dec 2020 14:29:38 -0500 Subject: [PATCH 5/6] no message --- CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs b/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs index 5cfd9a9..238744a 100644 --- a/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs +++ b/CustomComponentPerfFix/DataManager/AsyncJsonLoadRequest.cs @@ -25,8 +25,6 @@ public static async Task LoadResource(string path, Action handler) { try { - - using (FileStream arg = new FileStream(path, FileMode.Open, FileAccess.Read)) { StreamReader sr = new StreamReader(arg); From 779e6c345bb8c830b9c9b3b75be54d18302ac9e7 Mon Sep 17 00:00:00 2001 From: IceRaptor Date: Thu, 3 Dec 2020 09:38:20 -0500 Subject: [PATCH 6/6] - Disable data manager logging (for merge), rename stringdata load request (but still use AmmunitionDef as target) --- Injection/Injection.csproj | 2 +- Injection/Injection/CecilManager.cs | 5 ++--- Injection/Injection/I_DataManager.cs | 1 + ...mmunitionDefLoadRequest.cs => I_StringDataLoadRequest.cs} | 5 ++++- 4 files changed, 8 insertions(+), 5 deletions(-) rename Injection/Injection/{I_AmmunitionDefLoadRequest.cs => I_StringDataLoadRequest.cs} (93%) diff --git a/Injection/Injection.csproj b/Injection/Injection.csproj index f026718..d2f76aa 100644 --- a/Injection/Injection.csproj +++ b/Injection/Injection.csproj @@ -84,7 +84,7 @@ - + diff --git a/Injection/Injection/CecilManager.cs b/Injection/Injection/CecilManager.cs index 4bce76f..7e10240 100644 --- a/Injection/Injection/CecilManager.cs +++ b/Injection/Injection/CecilManager.cs @@ -156,14 +156,13 @@ public static void Init() try { //Injectors.Add(new I_DesiredAuraReceptionState()); - Injectors.Add(new I_CombatAuraReticle()); Injectors.Add(new I_BTLight()); Injectors.Add(new I_BTLightController()); // DataManager fixes - Injectors.Add(new I_AmmunitionDefLoadRequest()); - Injectors.Add(new I_DataManager()); + Injectors.Add(new I_StringDataLoadRequest()); + //Injectors.Add(new I_DataManager()); //Injectors.Add(new I_DOTweenAnimation()); //Injectors.Add(new I_ElementManager()); diff --git a/Injection/Injection/I_DataManager.cs b/Injection/Injection/I_DataManager.cs index f342255..246c007 100644 --- a/Injection/Injection/I_DataManager.cs +++ b/Injection/Injection/I_DataManager.cs @@ -13,6 +13,7 @@ namespace Injection.Injection { + // Injector that logs the DataManager load requests by type class I_DataManager : IInjector { private const string _targetType = "BattleTech.Data.DataManager"; diff --git a/Injection/Injection/I_AmmunitionDefLoadRequest.cs b/Injection/Injection/I_StringDataLoadRequest.cs similarity index 93% rename from Injection/Injection/I_AmmunitionDefLoadRequest.cs rename to Injection/Injection/I_StringDataLoadRequest.cs index 13c8d38..2e268b4 100644 --- a/Injection/Injection/I_AmmunitionDefLoadRequest.cs +++ b/Injection/Injection/I_StringDataLoadRequest.cs @@ -12,7 +12,10 @@ namespace Injection.Injection { - class I_AmmunitionDefLoadRequest : IInjector + // Changes DataManager.LoadResource(string path, Action handler) to support async loads of files. + // This significantly improves the load time as IO is waits together instead of blocking. + // We target AmmunitionDefLoadRequest as it's the first name that inherits from StringDataLoadRequest + class I_StringDataLoadRequest : IInjector { private const string _baseType = "BattleTech.Data.DataManager"; private const string _targetType = "BattleTech.Data.DataManager/AmmunitionDefLoadRequest";