Skip to content
This repository was archived by the owner on Jan 19, 2025. It is now read-only.

Commit c4e6422

Browse files
authored
[Resonance] Alpha 18 Fixes (#2747)
* alpha 18 fixes * change summaries to match with other ones * see cref * healing fix & change this
1 parent 77ab331 commit c4e6422

File tree

5 files changed

+110
-162
lines changed

5 files changed

+110
-162
lines changed

Exiled.Events/EventArgs/Player/SpawningRagdollEventArgs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public string Nickname
9494
/// </summary>
9595
public DamageHandler DamageHandlerBase
9696
{
97-
get => damageHandler ??= new(Player, Info.Handler);
97+
get => damageHandler ??= new DamageHandler(Player, Info.Handler);
9898
set
9999
{
100100
Info = new RagdollData(Player.ReferenceHub, value, Role, Position, Rotation, Nickname, CreationTime);

Exiled.Events/EventArgs/Scp3114/StranglingEventArgs.cs

Lines changed: 16 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,68 +8,40 @@
88
namespace Exiled.Events.EventArgs.Scp3114
99
{
1010
using Exiled.API.Features;
11+
using Exiled.API.Features.Roles;
1112
using Exiled.Events.EventArgs.Interfaces;
1213

13-
using PlayerRoles.PlayableScps.Scp3114;
14-
15-
using HumanRole = PlayerRoles.HumanRole;
16-
using Scp3114Role = API.Features.Roles.Scp3114Role;
17-
1814
/// <summary>
1915
/// Contains all information before strangling a player.
2016
/// </summary>
2117
public class StranglingEventArgs : IScp3114Event, IDeniableEvent
2218
{
23-
private readonly Scp3114Strangle strangle;
24-
private Player target = null;
25-
2619
/// <summary>
27-
/// Initializes a new instance of the <see cref="StranglingEventArgs"/> class.
20+
/// Initializes a new instance of the <see cref="StranglingEventArgs" /> class.
2821
/// </summary>
29-
/// <param name="strangle">The <see cref="Scp3114Strangle"/> instance.</param>
30-
/// <param name="player">The <see cref="API.Features.Player"/> triggering the event.</param>
31-
/// <param name="target">The <see cref="API.Features.Player"/> being targeted.</param>
32-
public StranglingEventArgs(Scp3114Strangle strangle, Player player, Scp3114Strangle.StrangleTarget target)
22+
/// <param name="player"><see cref="Player"/>.</param>
23+
/// <param name="target"><see cref="Target"/>.</param>
24+
/// <param name="isAllowed"><see cref="IsAllowed"/>.</param>
25+
public StranglingEventArgs(Player player, Player target, bool isAllowed = true)
3326
{
34-
this.strangle = strangle;
35-
Scp3114 = player.Role.As<Scp3114Role>();
3627
Player = player;
37-
Target = Player.Get(target.Target);
38-
StrangleTarget = target;
28+
Scp3114 = Player.Role.As<Scp3114Role>();
29+
Target = target;
30+
IsAllowed = isAllowed;
3931
}
4032

41-
/// <inheritdoc />
42-
public Scp3114Role Scp3114 { get; }
43-
44-
/// <inheritdoc />
45-
public Player Player
46-
{
47-
get => target;
48-
set
49-
{
50-
target = value;
51-
52-
if (!target)
53-
{
54-
StrangleTarget = default(Scp3114Strangle.StrangleTarget);
55-
return;
56-
}
33+
/// <inheritdoc/>
34+
public Player Player { get; }
5735

58-
StrangleTarget = new(target.ReferenceHub, strangle.GetStranglePosition(target.ReferenceHub.roleManager.CurrentRole as HumanRole), Player.Position);
59-
}
60-
}
36+
/// <inheritdoc/>
37+
public Scp3114Role Scp3114 { get; }
6138

6239
/// <summary>
63-
/// Gets the target player.
40+
/// Gets the <see cref="Player"/> being strangled.
6441
/// </summary>
6542
public Player Target { get; }
6643

67-
/// <summary>
68-
/// Gets the <see cref="Scp3114Strangle.StrangleTarget"/>. This value is updated when <see cref="Target"/> is changed.
69-
/// </summary>
70-
public Scp3114Strangle.StrangleTarget? StrangleTarget { get; private set; }
71-
72-
/// <inheritdoc />
73-
public bool IsAllowed { get; set; } = true;
44+
/// <inheritdoc/>
45+
public bool IsAllowed { get; set; }
7446
}
7547
}

Exiled.Events/Patches/Events/Player/Healing.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
3434
List<CodeInstruction> newInstructions = ListPool<CodeInstruction>.Pool.Get(instructions);
3535

3636
Label continueLabel = generator.DefineLabel();
37+
Label skip1 = generator.DefineLabel();
38+
Label skip2 = generator.DefineLabel();
3739

3840
LocalBuilder ev = generator.DeclareLocal(typeof(HealingEventArgs));
3941
LocalBuilder player = generator.DeclareLocal(typeof(Player));
@@ -48,49 +50,59 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
4850
new(OpCodes.Stloc_S, lastHealth.LocalIndex),
4951

5052
// player = Player.Get(this.Hub);
53+
// if (player is null) skip
5154
new(OpCodes.Ldarg_0),
5255
new(OpCodes.Callvirt, AccessTools.PropertyGetter(typeof(HealthStat), nameof(HealthStat.Hub))),
53-
new(OpCodes.Call, AccessTools.Method(typeof(Player), nameof(Player.Get), new Type[] { typeof(ReferenceHub) })),
56+
new(OpCodes.Call, AccessTools.Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
57+
new(OpCodes.Dup),
5458
new(OpCodes.Stloc_S, player.LocalIndex),
59+
new(OpCodes.Brfalse_S, skip1),
5560

56-
// HealingEventArgs ev = new(Player, amount)
61+
// HealingEventArgs args = new(player, amount)
5762
new(OpCodes.Ldloc_S, player.LocalIndex),
5863
new(OpCodes.Ldarg_1),
5964
new(OpCodes.Newobj, AccessTools.GetDeclaredConstructors(typeof(HealingEventArgs))[0]),
6065
new(OpCodes.Dup),
6166
new(OpCodes.Dup),
6267
new(OpCodes.Stloc_S, ev.LocalIndex),
6368

64-
// OnHealing(ev)
69+
// Player::OnHealing(args)
6570
new(OpCodes.Call, AccessTools.Method(typeof(Handlers.Player), nameof(Handlers.Player.OnHealing))),
6671

67-
// if (!ev.IsAllowed)
68-
// return
72+
// if (!args.IsAllowed) return
6973
new(OpCodes.Callvirt, AccessTools.PropertyGetter(typeof(HealingEventArgs), nameof(HealingEventArgs.IsAllowed))),
7074
new(OpCodes.Brtrue_S, continueLabel),
7175
new(OpCodes.Pop),
7276
new(OpCodes.Pop),
7377
new(OpCodes.Ret),
7478

75-
// healAmount = ev.Amount
79+
// healAmount = args.Amount
7680
new CodeInstruction(OpCodes.Ldloc_S, ev.LocalIndex).WithLabels(continueLabel),
7781
new(OpCodes.Callvirt, AccessTools.PropertyGetter(typeof(HealingEventArgs), nameof(HealingEventArgs.Amount))),
7882
new(OpCodes.Starg_S, 1),
83+
84+
new CodeInstruction(OpCodes.Nop).WithLabels(skip1),
7985
});
8086

87+
newInstructions[newInstructions.Count - 1].labels.Add(skip2);
88+
8189
newInstructions.InsertRange(newInstructions.Count - 1, new[]
8290
{
83-
// HealedEventArgs ev = new(Player, lastAmount)
91+
// if (player is null) skip
92+
new(OpCodes.Ldloc_S, player.LocalIndex),
93+
new(OpCodes.Brfalse_S, skip2),
94+
95+
// HealedEventArgs args = new(player, lastAmount)
8496
new(OpCodes.Ldloc_S, player.LocalIndex),
8597
new(OpCodes.Ldloc_S, lastHealth.LocalIndex),
8698
new(OpCodes.Newobj, AccessTools.GetDeclaredConstructors(typeof(HealedEventArgs))[0]),
8799

88-
// OnHealed(ev)
100+
// Player::OnHealed(args)
89101
new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(Handlers.Player), nameof(Handlers.Player.OnHealed))),
90102
});
91103

92-
for (int z = 0; z < newInstructions.Count; z++)
93-
yield return newInstructions[z];
104+
foreach (CodeInstruction instruction in newInstructions)
105+
yield return instruction;
94106

95107
ListPool<CodeInstruction>.Pool.Return(newInstructions);
96108
}

Exiled.Events/Patches/Events/Player/SpawningRagdoll.cs

Lines changed: 32 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)