Skip to content

Commit ea99309

Browse files
New event
1 parent d5e7777 commit ea99309

File tree

4 files changed

+160
-12
lines changed

4 files changed

+160
-12
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// -----------------------------------------------------------------------
2+
// <copyright file="RemovedHandcuffsEventArgs.cs" company="Exiled Team">
3+
// Copyright (c) Exiled Team. All rights reserved.
4+
// Licensed under the CC BY-SA 3.0 license.
5+
// </copyright>
6+
// -----------------------------------------------------------------------
7+
8+
namespace Exiled.Events.EventArgs.Player
9+
{
10+
using API.Enums;
11+
using API.Features;
12+
using Exiled.Events.EventArgs.Interfaces;
13+
14+
/// <summary>
15+
/// Contains all information after freeing a handcuffed player.
16+
/// </summary>
17+
public class RemovedHandcuffsEventArgs : IPlayerEvent
18+
{
19+
/// <summary>
20+
/// Initializes a new instance of the <see cref="RemovedHandcuffsEventArgs" /> class.
21+
/// </summary>
22+
/// <param name="cuffer">The cuffer player.</param>
23+
/// <param name="target">The target player to be uncuffed.</param>
24+
/// <param name="uncuffReason">The reason of removing handcuffs.</param>
25+
public RemovedHandcuffsEventArgs(Player cuffer, Player target, UncuffReason uncuffReason)
26+
{
27+
Player = cuffer;
28+
Target = target;
29+
UncuffReason = uncuffReason;
30+
}
31+
32+
/// <summary>
33+
/// Gets the target player to be cuffed.
34+
/// </summary>
35+
public Player Target { get; }
36+
37+
/// <summary>
38+
/// Gets the cuffer player.
39+
/// </summary>
40+
public Player Player { get; }
41+
42+
/// <summary>
43+
/// Gets the reason of removing handcuffs.
44+
/// </summary>
45+
public UncuffReason UncuffReason { get; }
46+
}
47+
}

EXILED/Exiled.Events/EventArgs/Player/RemovingHandcuffsEventArgs.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ public RemovingHandcuffsEventArgs(Player cuffer, Player target, UncuffReason unc
3737
public Player Target { get; }
3838

3939
/// <summary>
40-
/// Gets or sets a value indicating whether or not the player can be handcuffed.
40+
/// Gets or sets a value indicating whether or not the player can be handcuffed. Denying the event will only have an effect when <see cref="UncuffReason" /> is <see cref="UncuffReason.Player" /> until next major update.
4141
/// </summary>
42+
/// TODO: Update docs and patches
4243
public bool IsAllowed { get; set; }
4344

4445
/// <summary>

EXILED/Exiled.Events/Handlers/Player.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ public class Player
223223
/// </summary>
224224
public static Event<RemovingHandcuffsEventArgs> RemovingHandcuffs { get; set; } = new();
225225

226+
/// <summary>
227+
/// Invoked after freeing a handcuffed <see cref="API.Features.Player"/>.
228+
/// </summary>
229+
public static Event<RemovedHandcuffsEventArgs> RemovedHandcuffs { get; set; } = new();
230+
226231
/// <summary>
227232
/// Invoked before a <see cref="API.Features.Player"/> escapes.
228233
/// </summary>
@@ -704,6 +709,12 @@ public class Player
704709
/// <param name="ev">The <see cref="RemovingHandcuffsEventArgs"/> instance.</param>
705710
public static void OnRemovingHandcuffs(RemovingHandcuffsEventArgs ev) => RemovingHandcuffs.InvokeSafely(ev);
706711

712+
/// <summary>
713+
/// Called after freeing a handcuffed <see cref="API.Features.Player"/>.
714+
/// </summary>
715+
/// <param name="ev">The <see cref="RemovedHandcuffsEventArgs"/> instance.</param>
716+
public static void OnRemovedHandcuffs(RemovedHandcuffsEventArgs ev) => RemovedHandcuffs.InvokeSafely(ev);
717+
707718
/// <summary>
708719
/// Called before a <see cref="API.Features.Player"/> escapes.
709720
/// </summary>

EXILED/Exiled.Events/Patches/Events/Player/ProcessDisarmMessage.cs

Lines changed: 100 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ namespace Exiled.Events.Patches.Events.Player
2727

2828
/// <summary>
2929
/// Patches <see cref="DisarmingHandlers.ServerProcessDisarmMessage" />.
30-
/// Adds the <see cref="Handlers.Player.Handcuffing" /> and <see cref="Handlers.Player.RemovingHandcuffs" /> events.
30+
/// Adds the <see cref="Handlers.Player.Handcuffing" />, <see cref="Handlers.Player.RemovingHandcuffs" />, and <see cref="Handlers.Player.RemovedHandcuffs" /> events.
3131
/// </summary>
3232
[EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.Handcuffing))]
3333
[EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RemovingHandcuffs))]
34+
[EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RemovedHandcuffs))]
3435
[HarmonyPatch(typeof(DisarmingHandlers), nameof(DisarmingHandlers.ServerProcessDisarmMessage))]
3536
internal static class ProcessDisarmMessage
3637
{
@@ -47,6 +48,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
4748
index,
4849
new[]
4950
{
51+
// Invoking RemovingHandcuffs event
5052
// Player.Get(referenceHub)
5153
new CodeInstruction(OpCodes.Ldloc_0),
5254
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
@@ -73,6 +75,25 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
7375
// return;
7476
new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
7577
new(OpCodes.Brfalse_S, returnLabel),
78+
79+
// Invoking RemovedHandcuffs event
80+
// Player.Get(referenceHub)
81+
new(OpCodes.Ldloc_0),
82+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
83+
84+
// Player.Get(msg.PlayerToDisarm)
85+
new(OpCodes.Ldarg_1),
86+
new(OpCodes.Ldfld, Field(typeof(DisarmMessage), nameof(DisarmMessage.PlayerToDisarm))),
87+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
88+
89+
// UncuffReason.Player
90+
new(OpCodes.Ldc_I4_0),
91+
92+
// RemovedHandcuffsEventArgs ev = new(Player, Player, UncuffReason.Player)
93+
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovedHandcuffsEventArgs))[0]),
94+
95+
// Handlers.Player.OnRemovedHandcuffs(ev)
96+
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovedHandcuffs))),
7697
});
7798

7899
offset = -3;
@@ -83,6 +104,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
83104
index,
84105
new[]
85106
{
107+
// Invoking Handcuffing event
86108
// Player.Get(referenceHub)
87109
new CodeInstruction(OpCodes.Ldloc_0).MoveLabelsFrom(newInstructions[index]),
88110
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
@@ -119,9 +141,10 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
119141

120142
/// <summary>
121143
/// Patches <see cref="DisarmedPlayers.ValidateEntry(DisarmedPlayers.DisarmedEntry)" />.
122-
/// Invokes <see cref="Handlers.Player.RemovingHandcuffs" /> event.
144+
/// Invokes <see cref="Handlers.Player.RemovingHandcuffs" /> and <see cref="Handlers.Player.RemovedHandcuffs" /> event.
123145
/// </summary>
124146
[EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RemovingHandcuffs))]
147+
[EventPatch(typeof(Handlers.Player), nameof(Handlers.Player.RemovedHandcuffs))]
125148
[HarmonyPatch(typeof(DisarmedPlayers), nameof(DisarmedPlayers.ValidateEntry))]
126149
internal static class Uncuff
127150
{
@@ -138,6 +161,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
138161
index,
139162
new[]
140163
{
164+
// Invoking RemovingHandcuffs event
141165
// Player.Get(Cuffer)
142166
new CodeInstruction(OpCodes.Ldloc_1),
143167
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
@@ -154,15 +178,36 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
154178

155179
// RemovingHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.CufferDied, true)
156180
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovingHandcuffsEventArgs))[0]),
157-
new(OpCodes.Dup),
181+
182+
// TODO: Uncomment this part in next major update to prevent breaking changes
183+
// new(OpCodes.Dup),
158184

159185
// Handlers.Player.OnRemovingHandcuffs(ev)
160186
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovingHandcuffs))),
161187

188+
// TODO: Uncomment this part in next major update to prevent breaking changes
162189
// if (!ev.IsAllowed)
163190
// return true;
164-
new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
165-
new(OpCodes.Brfalse_S, returnLabel),
191+
// new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
192+
// new(OpCodes.Brfalse_S, returnLabel),
193+
194+
// Invoking RemovedHandcuffs event
195+
// Player.Get(Cuffer)
196+
new CodeInstruction(OpCodes.Ldloc_1),
197+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
198+
199+
// Player.Get(Target)
200+
new(OpCodes.Ldloc_0),
201+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
202+
203+
// UncuffReason.CufferDied
204+
new(OpCodes.Ldc_I4_2),
205+
206+
// RemovedHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.CufferDied)
207+
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovedHandcuffsEventArgs))[0]),
208+
209+
// Handlers.Player.OnRemovedHandcuffs(ev)
210+
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovedHandcuffs))),
166211
});
167212

168213
offset = 5;
@@ -173,6 +218,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
173218
index,
174219
new[]
175220
{
221+
// Invoking RemovingHandcuffs event
176222
// Player.Get(Cuffer)
177223
new CodeInstruction(OpCodes.Ldloc_1),
178224
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
@@ -189,15 +235,36 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
189235

190236
// RemovingHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.CufferDied, true)
191237
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovingHandcuffsEventArgs))[0]),
192-
new(OpCodes.Dup),
238+
239+
// TODO: Uncomment this part in next major update to prevent breaking changes
240+
// new(OpCodes.Dup),
193241

194242
// Handlers.Player.OnRemovingHandcuffs(ev)
195243
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovingHandcuffs))),
196244

245+
// TODO: Uncomment this part in next major update to prevent breaking changes
197246
// if (!ev.IsAllowed)
198247
// return true;
199-
new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
200-
new(OpCodes.Brfalse_S, returnLabel),
248+
// new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
249+
// new(OpCodes.Brfalse_S, returnLabel),
250+
251+
// Invoking RemovedHandcuffs event
252+
// Player.Get(Cuffer)
253+
new CodeInstruction(OpCodes.Ldloc_1),
254+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
255+
256+
// Player.Get(Target)
257+
new(OpCodes.Ldloc_0),
258+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
259+
260+
// UncuffReason.CufferDied
261+
new(OpCodes.Ldc_I4_2),
262+
263+
// RemovedHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.CufferDied)
264+
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovedHandcuffsEventArgs))[0]),
265+
266+
// Handlers.Player.OnRemovedHandcuffs(ev)
267+
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovedHandcuffs))),
201268
});
202269

203270
offset = 3;
@@ -208,6 +275,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
208275
index,
209276
new[]
210277
{
278+
// Invoking RemovingHandcuffs event
211279
// Player.Get(Cuffer)
212280
new CodeInstruction(OpCodes.Ldloc_1),
213281
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
@@ -224,15 +292,36 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
224292

225293
// RemovingHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.OutOfRange, true)
226294
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovingHandcuffsEventArgs))[0]),
227-
new(OpCodes.Dup),
295+
296+
// TODO: Uncomment this part in next major update to prevent breaking changes
297+
// new(OpCodes.Dup),
228298

229299
// Handlers.Player.OnRemovingHandcuffs(ev)
230300
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovingHandcuffs))),
231301

302+
// TODO: Uncomment this part in next major update to prevent breaking changes
232303
// if (!ev.IsAllowed)
233304
// return true;
234-
new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
235-
new(OpCodes.Brfalse_S, returnLabel),
305+
// new(OpCodes.Callvirt, PropertyGetter(typeof(RemovingHandcuffsEventArgs), nameof(RemovingHandcuffsEventArgs.IsAllowed))),
306+
// new(OpCodes.Brfalse_S, returnLabel),
307+
308+
// Invoking RemovedHandcuffs event
309+
// Player.Get(Cuffer)
310+
new CodeInstruction(OpCodes.Ldloc_1),
311+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
312+
313+
// Player.Get(Target)
314+
new(OpCodes.Ldloc_0),
315+
new(OpCodes.Call, Method(typeof(Player), nameof(Player.Get), new[] { typeof(ReferenceHub) })),
316+
317+
// UncuffReason.CufferDied
318+
new(OpCodes.Ldc_I4_2),
319+
320+
// RemovedHandcuffsEventArgs ev = new(Cuffer, Target, UncuffReason.OutOfRange)
321+
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(RemovedHandcuffsEventArgs))[0]),
322+
323+
// Handlers.Player.OnRemovedHandcuffs(ev)
324+
new(OpCodes.Call, Method(typeof(Handlers.Player), nameof(Handlers.Player.OnRemovedHandcuffs))),
236325
});
237326

238327
newInstructions[newInstructions.Count - 2].labels.Add(returnLabel);

0 commit comments

Comments
 (0)