Skip to content

Commit ba6d2ce

Browse files
committed
Fix an issue where HashSetPool was never return
1 parent aaa01b9 commit ba6d2ce

File tree

1 file changed

+48
-35
lines changed

1 file changed

+48
-35
lines changed

EXILED/Exiled.Events/Patches/Events/Map/ExplodingFragGrenade.cs

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -61,54 +61,67 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
6161
{
6262
List<CodeInstruction> newInstructions = ListPool<CodeInstruction>.Pool.Get(instructions);
6363

64-
int offset = 1;
65-
int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Stloc_3) + offset;
64+
int offset = 2;
65+
int index = newInstructions.FindIndex(i => i.opcode == OpCodes.Ldloc_S && i.operand is LocalBuilder { LocalIndex: 5 }) + offset;
6666

67-
Label returnLabel = generator.DefineLabel();
67+
Log.Warn($"INDEX OF EXPLODING GRENADE: {index}");
68+
Label continueLabel = generator.DefineLabel();
6869

6970
LocalBuilder ev = generator.DeclareLocal(typeof(ExplodingGrenadeEventArgs));
7071

71-
newInstructions.InsertRange(
72-
index,
73-
new CodeInstruction[]
74-
{
75-
// attacker;
76-
new(OpCodes.Ldarg_0),
72+
newInstructions.InsertRange(index, new CodeInstruction[]
73+
{
74+
// attacker;
75+
new(OpCodes.Ldarg_0),
76+
77+
// position
78+
new(OpCodes.Ldarg_1),
7779

78-
// position
79-
new(OpCodes.Ldarg_1),
80+
// grenade
81+
new(OpCodes.Ldarg_2),
8082

81-
// grenade
82-
new(OpCodes.Ldarg_2),
83+
// Collider[]
84+
new(OpCodes.Ldloc_S, 5),
8385

84-
// Collider[]
85-
new(OpCodes.Ldloc_3),
86+
// explosionType
87+
new(OpCodes.Ldarg_3),
8688

87-
// explosionType
88-
new(OpCodes.Ldarg_3),
89+
// ExplodingGrenadeEventArgs ev = new(Footprint, position, grenade, colliders, ExplosionType);
90+
new(OpCodes.Newobj, DeclaredConstructor(typeof(ExplodingGrenadeEventArgs), new[] { typeof(Footprint), typeof(Vector3), typeof(ExplosionGrenade), typeof(Collider[]), typeof(ExplosionType) })),
91+
new(OpCodes.Dup),
92+
new(OpCodes.Dup),
93+
new(OpCodes.Stloc, ev.LocalIndex),
8994

90-
// ExplodingGrenadeEventArgs ev = new(player, position, grenade, colliders, ExplosionType);
91-
new(OpCodes.Newobj, DeclaredConstructor(typeof(ExplodingGrenadeEventArgs), new[] { typeof(Footprint), typeof(Vector3), typeof(ExplosionGrenade), typeof(Collider[]), typeof(ExplosionType) })),
92-
new(OpCodes.Dup),
93-
new(OpCodes.Dup),
94-
new(OpCodes.Stloc, ev.LocalIndex),
95+
// Map.OnExplodingGrenade(ev);
96+
new(OpCodes.Call, Method(typeof(Handlers.Map), nameof(Handlers.Map.OnExplodingGrenade))),
9597

96-
// Map.OnExplodingGrenade(ev);
97-
new(OpCodes.Call, Method(typeof(Handlers.Map), nameof(Handlers.Map.OnExplodingGrenade))),
98+
// if (!ev.IsAllowed)
99+
// return;
100+
new(OpCodes.Callvirt, PropertyGetter(typeof(ExplodingGrenadeEventArgs), nameof(ExplodingGrenadeEventArgs.IsAllowed))),
101+
new(OpCodes.Brtrue_S, continueLabel),
98102

99-
// if (!ev.IsAllowed)
100-
// return;
101-
new(OpCodes.Callvirt, PropertyGetter(typeof(ExplodingGrenadeEventArgs), nameof(ExplodingGrenadeEventArgs.IsAllowed))),
102-
new(OpCodes.Brfalse, returnLabel),
103+
// HashSetPool<uint>.Shared.Return(hashSet);
104+
new(OpCodes.Ldsfld, Field(typeof(NorthwoodLib.Pools.HashSetPool<uint>), nameof(NorthwoodLib.Pools.HashSetPool<uint>.Shared))),
105+
new(OpCodes.Ldloc_2),
106+
new(OpCodes.Callvirt, Method(typeof(NorthwoodLib.Pools.HashSetPool<uint>), nameof(NorthwoodLib.Pools.HashSetPool<uint>.Return))),
103107

104-
// colliders = TrimColliders(ev, colliders)
105-
new(OpCodes.Ldloc, ev.LocalIndex),
106-
new(OpCodes.Ldloc_3),
107-
new(OpCodes.Call, Method(typeof(ExplodingFragGrenade), nameof(TrimColliders))),
108-
new(OpCodes.Stloc_3),
109-
});
108+
// HashSetPool<uint>.Shared.Return(hashSet2);
109+
new(OpCodes.Ldsfld, Field(typeof(NorthwoodLib.Pools.HashSetPool<uint>), nameof(NorthwoodLib.Pools.HashSetPool<uint>.Shared))),
110+
new(OpCodes.Ldloc_3),
111+
new(OpCodes.Callvirt, Method(typeof(NorthwoodLib.Pools.HashSetPool<uint>), nameof(NorthwoodLib.Pools.HashSetPool<uint>.Return))),
110112

111-
newInstructions[newInstructions.Count - 1].labels.Add(returnLabel);
113+
// return;
114+
new(OpCodes.Ret),
115+
116+
// colliders = TrimColliders(ev, colliders)
117+
new CodeInstruction(OpCodes.Ldloc, ev.LocalIndex).WithLabels(continueLabel),
118+
new(OpCodes.Ldloc_S, 5),
119+
new(OpCodes.Call, Method(typeof(ExplodingFragGrenade), nameof(TrimColliders))),
120+
new(OpCodes.Stloc_S, 5),
121+
});
122+
123+
for (int z = 0; z < newInstructions.Count; z++)
124+
Log.Info($"[{z}]{newInstructions[z].opcode} : {newInstructions[z].operand} ({newInstructions[z].labels.Count})");
112125

113126
for (int z = 0; z < newInstructions.Count; z++)
114127
yield return newInstructions[z];

0 commit comments

Comments
 (0)