@@ -14,12 +14,9 @@ namespace Exiled.Events.Patches.Events.Player
1414 using Exiled . API . Features ;
1515 using Exiled . Events . Attributes ;
1616 using Exiled . Events . EventArgs . Player ;
17-
1817 using HarmonyLib ;
1918 using PlayerRoles . Ragdolls ;
20-
2119 using PlayerStatsSystem ;
22-
2320 using UnityEngine ;
2421
2522 using static HarmonyLib . AccessTools ;
@@ -39,118 +36,66 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
3936 {
4037 List < CodeInstruction > newInstructions = ListPool < CodeInstruction > . Pool . Get ( instructions ) ;
4138
42- Label ret = generator . DefineLabel ( ) ;
39+ Label continueLabel = generator . DefineLabel ( ) ;
4340
4441 LocalBuilder ev = generator . DeclareLocal ( typeof ( SpawningRagdollEventArgs ) ) ;
45- LocalBuilder newRagdoll = generator . DeclareLocal ( typeof ( Ragdoll ) ) ;
46- LocalBuilder localScale = generator . DeclareLocal ( typeof ( Vector3 ) ) ;
47- LocalBuilder evScale = generator . DeclareLocal ( typeof ( Vector3 ) ) ;
48- LocalBuilder targetScale = generator . DeclareLocal ( typeof ( Vector3 ) ) ;
49-
50- int offset = 0 ;
51- int index = newInstructions . FindIndex ( instruction => instruction . opcode == OpCodes . Ldloc_1 ) + offset ;
5242
53- // remove
54- // "basicRagdoll.NetworkInfo = new RagdollData(owner, handler, transform.localPosition, transform.localRotation);"
55- newInstructions . RemoveRange ( index , 9 ) ;
43+ int index = newInstructions . FindIndex ( instruction => instruction . Calls ( PropertySetter ( typeof ( BasicRagdoll ) , nameof ( BasicRagdoll . NetworkInfo ) ) ) ) ;
5644
57- // replace with
5845 newInstructions . InsertRange ( index , new [ ]
5946 {
60- // hub
61- new CodeInstruction ( OpCodes . Ldarg_0 ) ,
62-
63- // handler
64- new ( OpCodes . Ldarg_1 ) ,
65-
66- // ragdollRole.transform.localPosition
67- new ( OpCodes . Ldloc_2 ) ,
68- new ( OpCodes . Callvirt , PropertyGetter ( typeof ( Transform ) , nameof ( Transform . localPosition ) ) ) ,
69-
70- // ragdollRole.transform.localRotation
71- new ( OpCodes . Ldloc_2 ) ,
72- new ( OpCodes . Callvirt , PropertyGetter ( typeof ( Transform ) , nameof ( Transform . localRotation ) ) ) ,
73-
74- // new RagdollInfo(ReferenceHub, DamageHandlerBase, Vector3, Quaternion)
75- new ( OpCodes . Newobj , GetDeclaredConstructors ( typeof ( RagdollData ) ) [ 0 ] ) ,
76-
7747 // true
7848 new ( OpCodes . Ldc_I4_1 ) ,
7949
80- // SpawningRagdollEventArgs ev = new(RagdollInfo, DamageHandlerBase , bool)
50+ // SpawningRagdollEventArgs args = new(RagdollInfo, bool)
8151 new ( OpCodes . Newobj , GetDeclaredConstructors ( typeof ( SpawningRagdollEventArgs ) ) [ 0 ] ) ,
8252 new ( OpCodes . Dup ) ,
8353 new ( OpCodes . Dup ) ,
8454 new ( OpCodes . Stloc_S , ev . LocalIndex ) ,
8555
86- // Player. OnSpawningRagdoll(ev )
56+ // Player:: OnSpawningRagdoll(args )
8757 new ( OpCodes . Call , Method ( typeof ( Player ) , nameof ( Player . OnSpawningRagdoll ) ) ) ,
8858
89- // if (!ev.IsAllowed)
90- // return;
59+ // if (!args.IsAllowed)
60+ // {
61+ // Object.Destroy(gameObject);
62+ // return null;
63+ // }
9164 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( SpawningRagdollEventArgs ) , nameof ( SpawningRagdollEventArgs . IsAllowed ) ) ) ,
92- new ( OpCodes . Brfalse_S , ret ) ,
93-
94- // basicRagdoll.NetworkInfo = ev.Info
95- new ( OpCodes . Ldloc_1 ) ,
96- new ( OpCodes . Ldloc_S , ev . LocalIndex ) ,
97- new ( OpCodes . Callvirt , PropertyGetter ( typeof ( SpawningRagdollEventArgs ) , nameof ( SpawningRagdollEventArgs . Info ) ) ) ,
98- new ( OpCodes . Call , PropertySetter ( typeof ( BasicRagdoll ) , nameof ( BasicRagdoll . NetworkInfo ) ) ) ,
65+ new ( OpCodes . Brtrue_S , continueLabel ) ,
9966
100- // new Vector3()
101- new ( OpCodes . Ldloca_S , targetScale . LocalIndex ) ,
102- new ( OpCodes . Initobj , typeof ( Vector3 ) ) ,
67+ new ( OpCodes . Pop ) ,
68+ new ( OpCodes . Call , Method ( typeof ( Object ) , nameof ( Object . Destroy ) , new [ ] { typeof ( Object ) } ) ) ,
69+ new ( OpCodes . Ldnull ) ,
70+ new ( OpCodes . Ret ) ,
10371
104- // localScale = ragdoll.gameObject. transform.localScale
105- new ( OpCodes . Ldloc_1 ) ,
72+ // ragdoll transform
73+ new CodeInstruction ( OpCodes . Ldloc_1 ) . WithLabels ( continueLabel ) ,
10674 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( BasicRagdoll ) , nameof ( BasicRagdoll . gameObject ) ) ) ,
10775 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( GameObject ) , nameof ( GameObject . transform ) ) ) ,
76+
77+ // ragdoll localScale
78+ new ( OpCodes . Dup ) ,
10879 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( Transform ) , nameof ( Transform . localScale ) ) ) ,
109- new ( OpCodes . Stloc_S , localScale . LocalIndex ) ,
11080
111- // evScale = ev. Scale
81+ // SpawningRagdollEventArgs:: Scale
11282 new ( OpCodes . Ldloc_S , ev . LocalIndex ) ,
11383 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( SpawningRagdollEventArgs ) , nameof ( SpawningRagdollEventArgs . Scale ) ) ) ,
114- new ( OpCodes . Stloc_S , evScale . LocalIndex ) ,
115-
116- // targetScale.x = evScale.x * localScale.x
117- new ( OpCodes . Ldloca_S , targetScale . LocalIndex ) ,
118- new ( OpCodes . Ldloc_S , evScale . LocalIndex ) ,
119- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . x ) ) ) ,
120- new ( OpCodes . Ldloc_S , localScale . LocalIndex ) ,
121- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . x ) ) ) ,
122- new ( OpCodes . Mul ) ,
123- new ( OpCodes . Stfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . x ) ) ) ,
124-
125- // targetScale.y = evScale.y * localScale.y
126- new ( OpCodes . Ldloca_S , targetScale . LocalIndex ) ,
127- new ( OpCodes . Ldloc_S , evScale . LocalIndex ) ,
128- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . y ) ) ) ,
129- new ( OpCodes . Ldloc_S , localScale . LocalIndex ) ,
130- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . y ) ) ) ,
131- new ( OpCodes . Mul ) ,
132- new ( OpCodes . Stfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . y ) ) ) ,
133-
134- // targetScale.z = evScale.z * localScale.z
135- new ( OpCodes . Ldloca_S , targetScale . LocalIndex ) ,
136- new ( OpCodes . Ldloc_S , evScale . LocalIndex ) ,
137- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . z ) ) ) ,
138- new ( OpCodes . Ldloc_S , localScale . LocalIndex ) ,
139- new ( OpCodes . Ldfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . z ) ) ) ,
140- new ( OpCodes . Mul ) ,
141- new ( OpCodes . Stfld , Field ( typeof ( Vector3 ) , nameof ( Vector3 . z ) ) ) ,
142-
143- // ragdoll.gameObject.transform.localScale = targetScale
144- new ( OpCodes . Ldloc_1 ) ,
145- new ( OpCodes . Callvirt , PropertyGetter ( typeof ( BasicRagdoll ) , nameof ( BasicRagdoll . gameObject ) ) ) ,
146- new ( OpCodes . Callvirt , PropertyGetter ( typeof ( GameObject ) , nameof ( GameObject . transform ) ) ) ,
147- new ( OpCodes . Ldloc_S , targetScale . LocalIndex ) ,
84+
85+ // newScale = Vector3::Scale(ragdollScale, SpawningRagdollEventArgs::Scale);
86+ new ( OpCodes . Call , Method ( typeof ( Vector3 ) , nameof ( Vector3 . Scale ) , new [ ] { typeof ( Vector3 ) , typeof ( Vector3 ) } ) ) ,
87+
88+ // BasicRagdoll::gameObject::transform::localScale = targetScale
14889 new ( OpCodes . Callvirt , PropertySetter ( typeof ( Transform ) , nameof ( Transform . localScale ) ) ) ,
90+
91+ // load ragdollInfo
92+ new ( OpCodes . Ldloc_S , ev . LocalIndex ) ,
93+ new ( OpCodes . Callvirt , PropertyGetter ( typeof ( SpawningRagdollEventArgs ) , nameof ( SpawningRagdollEventArgs . Info ) ) ) ,
14994 } ) ;
15095
15196 newInstructions . InsertRange ( newInstructions . Count - 2 , new CodeInstruction [ ]
15297 {
153- // ev. Player
98+ // SpawningRagdollEventArgs:: Player
15499 new ( OpCodes . Ldloc_S , ev . LocalIndex ) ,
155100 new ( OpCodes . Callvirt , PropertyGetter ( typeof ( SpawningRagdollEventArgs ) , nameof ( SpawningRagdollEventArgs . Player ) ) ) ,
156101
@@ -171,10 +116,8 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
171116 new ( OpCodes . Call , Method ( typeof ( Player ) , nameof ( Player . OnSpawnedRagdoll ) ) ) ,
172117 } ) ;
173118
174- newInstructions [ newInstructions . Count - 1 ] . labels . Add ( ret ) ;
175-
176- for ( int z = 0 ; z < newInstructions . Count ; z ++ )
177- yield return newInstructions [ z ] ;
119+ foreach ( CodeInstruction instruction in newInstructions )
120+ yield return instruction ;
178121
179122 ListPool < CodeInstruction > . Pool . Return ( newInstructions ) ;
180123 }
0 commit comments