|
11 | 11 | [Modification(ModType.PostMerge, "Reset Sections aware array when reset world size", ModPriority.Early)] |
12 | 12 | [MonoMod.MonoModIgnore] |
13 | 13 | void PatchSectionsAwareFields(ModFwModder modder) { |
| 14 | + new SectionMod(modder).Run(); |
| 15 | +} |
14 | 16 |
|
15 | | - ModuleDefinition module = modder.Module; |
16 | | - |
17 | | - MethodDefinition resetAndResize = module |
18 | | - .GetType("UnifiedServerProcess.SectionsHelper") |
19 | | - .GetMethod("ResetAndResize"); |
20 | 17 |
|
21 | | - MethodDefinition setWorldSize = module |
22 | | - .GetType("Terraria.WorldGen") |
23 | | - .GetMethod("mfwh_setWorldSize"); |
| 18 | +[MonoMod.MonoModIgnore] |
| 19 | +class SectionMod |
| 20 | +{ |
| 21 | + readonly ModFwModder modder; |
| 22 | + readonly MethodDefinition resetAndResize; |
| 23 | + readonly MethodDefinition setWorldSize; |
| 24 | + readonly Instruction ret; |
| 25 | + public SectionMod(ModFwModder modder) { |
| 26 | + this.modder = modder; |
| 27 | + var module = modder.Module; |
| 28 | + resetAndResize = module |
| 29 | + .GetType("UnifiedServerProcess.SectionsHelper") |
| 30 | + .GetMethod("ResetAndResize"); |
| 31 | + setWorldSize = module |
| 32 | + .GetType("Terraria.WorldGen") |
| 33 | + .GetMethod("mfwh_setWorldSize"); |
| 34 | + ret = setWorldSize.Body.Instructions.Single(i => i.OpCode.Code is Code.Ret); |
| 35 | + } |
24 | 36 |
|
25 | | - Instruction ret = setWorldSize.Body.Instructions.Single(i => i.OpCode.Code is Code.Ret); |
| 37 | + public void Run() { |
26 | 38 |
|
27 | | - MethodDefinition activeSections_Reset = module |
28 | | - .GetType("Terraria.DataStructures.ActiveSections") |
29 | | - .GetMethod("Reset"); |
30 | | - Process(activeSections_Reset, "LastActiveTime"); |
31 | | - setWorldSize.Body.GetILProcessor() |
32 | | - .InsertBefore(ret, Instruction.Create(OpCodes.Call, MonoModCommon.Structure.CreateMethodReference(activeSections_Reset, activeSections_Reset))); |
| 39 | + ModuleDefinition module = modder.Module; |
33 | 40 |
|
34 | | - MethodDefinition leashedEntityClear = module |
35 | | - .GetType("Terraria.GameContent.LeashedEntity") |
36 | | - .GetMethod("Clear"); |
37 | | - Process(leashedEntityClear, "BySection"); |
| 41 | + MethodDefinition activeSections_Reset = module |
| 42 | + .GetType("Terraria.DataStructures.ActiveSections") |
| 43 | + .GetMethod("Reset"); |
| 44 | + Process(activeSections_Reset, "LastActiveTime"); |
| 45 | + setWorldSize.Body.GetILProcessor() |
| 46 | + .InsertBefore(ret, Instruction.Create(OpCodes.Call, MonoModCommon.Structure.CreateMethodReference(activeSections_Reset, activeSections_Reset))); |
38 | 47 |
|
| 48 | + MethodDefinition leashedEntityClear = module |
| 49 | + .GetType("Terraria.GameContent.LeashedEntity") |
| 50 | + .GetMethod("Clear"); |
| 51 | + Process(leashedEntityClear, "BySection"); |
| 52 | + } |
39 | 53 |
|
40 | 54 | void Process(MethodDefinition method, string fieldName) { |
41 | 55 | foreach (Instruction? inst in method.Body.Instructions) { |
|
0 commit comments