@@ -10,19 +10,12 @@ public class MaterialColorUpdaterPatch
10
10
{
11
11
internal static readonly Dictionary < MaterialColorUpdater , Props > temperatureColorProps = [ ] ;
12
12
13
- [ HarmonyPostfix ]
14
- [ HarmonyPatch ( MethodType . Constructor , typeof ( Transform ) , typeof ( int ) , typeof ( Part ) ) ]
15
- private static void MaterialColorUpdater_Ctor_Postfix ( MaterialColorUpdater __instance )
16
- {
17
- temperatureColorProps [ __instance ] = new Props ( int . MinValue + 1 ) ;
18
- }
19
-
20
13
[ HarmonyPostfix ]
21
14
[ HarmonyPatch ( "CreateRendererList" ) ]
22
15
private static void MaterialColorUpdater_CreateRendererList_Postfix (
23
16
MaterialColorUpdater __instance )
24
17
{
25
- var props = temperatureColorProps [ __instance ] ;
18
+ var props = temperatureColorProps [ __instance ] = new Props ( int . MinValue + 1 ) ;
26
19
foreach ( var renderer in __instance . renderers ) {
27
20
MaterialPropertyManager . Instance ? . Set ( renderer , props ) ;
28
21
}
@@ -46,6 +39,7 @@ private static IEnumerable<CodeInstruction> Update_Transpiler(
46
39
foreach ( var insn in insns ) {
47
40
yield return insn ;
48
41
42
+ // this.mpb.SetColor(this.propertyID, this.setColor);
49
43
// IL_0022: ldarg.0 // this
50
44
// IL_0023: ldfld class UnityEngine.MaterialPropertyBlock MaterialColorUpdater::mpb
51
45
// IL_0028: ldarg.0 // this
@@ -54,14 +48,17 @@ private static IEnumerable<CodeInstruction> Update_Transpiler(
54
48
// IL_002f: ldfld valuetype UnityEngine.Color MaterialColorUpdater::setColor
55
49
// IL_0034: callvirt instance void UnityEngine.MaterialPropertyBlock::SetColor(int32, valuetype UnityEngine.Color)
56
50
if ( insn . Calls ( MPB_SetColor ) ) break ;
51
+ // Remaining code applies MPB to renderers.
57
52
}
58
53
59
- CodeInstruction [ ] replace = [
54
+ // MaterialColorUpdaterPatch.Update_SetProperty(this);
55
+ // return;
56
+ CodeInstruction [ ] updateProp = [
60
57
new ( OpCodes . Ldarg_0 ) , // this
61
58
CodeInstruction . Call ( ( ) => Update_SetProperty ( default ) ) ,
62
59
new ( OpCodes . Ret )
63
60
] ;
64
- foreach ( var insn in replace ) yield return insn ;
61
+ foreach ( var insn in updateProp ) yield return insn ;
65
62
}
66
63
67
64
private static void DisposeIfExists ( MaterialColorUpdater mcu )
@@ -84,6 +81,39 @@ private static void Part_OnDestroy_Postfix(Part __instance)
84
81
DisposeIfExists ( __instance . temperatureRenderer ) ;
85
82
}
86
83
84
+ [ HarmonyTranspiler ]
85
+ [ HarmonyPatch ( typeof ( ModuleJettison ) , nameof ( ModuleJettison . Jettison ) ) ]
86
+ private static IEnumerable < CodeInstruction > ModuleJettison_Jettison_Transpiler (
87
+ IEnumerable < CodeInstruction > insns )
88
+ {
89
+ var ModuleJettison_jettisonTemperatureRenderer = AccessTools . Field (
90
+ typeof ( ModuleJettison ) , nameof ( ModuleJettison . jettisonTemperatureRenderer ) ) ;
91
+
92
+ // this.jettisonTemperatureRenderer = null;
93
+ // IL_0327: ldarg.0 // this
94
+ // IL_0328: ldnull
95
+ // IL_0329: stfld class MaterialColorUpdater ModuleJettison::jettisonTemperatureRenderer
96
+ CodeMatch [ ] matchSetTempRendererNull = [
97
+ new ( OpCodes . Ldarg_0 ) ,
98
+ new ( OpCodes . Ldnull ) ,
99
+ new ( OpCodes . Stfld , ModuleJettison_jettisonTemperatureRenderer )
100
+ ] ;
101
+
102
+ var matcher = new CodeMatcher ( insns ) ;
103
+
104
+ matcher
105
+ . MatchStartForward ( matchSetTempRendererNull )
106
+ . ThrowIfNotMatch ( "failed to find set temp renderer null" )
107
+ . Insert (
108
+ // MaterialColorUpdaterPatch.DisposeIfExists(this.jettisonTemperatureRenderer);
109
+ new CodeInstruction ( OpCodes . Ldarg_0 ) , // this
110
+ new CodeInstruction ( OpCodes . Ldfld , ModuleJettison_jettisonTemperatureRenderer ) ,
111
+ CodeInstruction . Call ( ( ) => DisposeIfExists ( default ) )
112
+ ) ;
113
+
114
+ return matcher . InstructionEnumeration ( ) ;
115
+ }
116
+
87
117
// FIXME: write a transpiler for ModuleJettison.Jettison.
88
118
89
119
[ HarmonyPostfix ]
0 commit comments