Skip to content

Commit 1c2792a

Browse files
authored
feat: Add ragdoll to died event (#507)
* Add ragdoll to died event * oops * oops 2x :)
1 parent b3564e1 commit 1c2792a

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ namespace Exiled.Events.EventArgs.Player
1313
using Interfaces;
1414

1515
using PlayerRoles;
16+
using PlayerRoles.Ragdolls;
1617

1718
using CustomAttackerHandler = API.Features.DamageHandlers.AttackerDamageHandler;
1819
using DamageHandlerBase = PlayerStatsSystem.DamageHandlerBase;
1920

2021
/// <summary>
2122
/// Contains all information after a player dies.
2223
/// </summary>
23-
public class DiedEventArgs : IPlayerEvent, IAttackerEvent
24+
public class DiedEventArgs : IPlayerEvent, IAttackerEvent, IRagdollEvent
2425
{
2526
/// <summary>
2627
/// Initializes a new instance of the <see cref="DiedEventArgs" /> class.
@@ -32,12 +33,16 @@ public class DiedEventArgs : IPlayerEvent, IAttackerEvent
3233
/// <param name="damageHandler">
3334
/// <inheritdoc cref="DamageHandler" />
3435
/// </param>
35-
public DiedEventArgs(Player target, RoleTypeId targetOldRole, DamageHandlerBase damageHandler)
36+
/// <param name="ragdoll">
37+
/// <inheritdoc cref="Ragdoll" />
38+
/// </param>
39+
public DiedEventArgs(Player target, RoleTypeId targetOldRole, DamageHandlerBase damageHandler, BasicRagdoll ragdoll)
3640
{
3741
DamageHandler = new CustomDamageHandler(target, damageHandler);
3842
Attacker = DamageHandler.BaseIs(out CustomAttackerHandler attackerDamageHandler) ? attackerDamageHandler.Attacker : null;
3943
Player = target;
4044
TargetOldRole = targetOldRole;
45+
Ragdoll = Ragdoll.Get(ragdoll);
4146
}
4247

4348
/// <summary>
@@ -59,5 +64,10 @@ public DiedEventArgs(Player target, RoleTypeId targetOldRole, DamageHandlerBase
5964
/// Gets the attacker.
6065
/// </summary>
6166
public Player Attacker { get; }
67+
68+
/// <summary>
69+
/// Gets ragdoll of the dead player.
70+
/// </summary>
71+
public Ragdoll Ragdoll { get; }
6272
}
6373
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace Exiled.Events.Patches.Events.Player
1919
using HarmonyLib;
2020

2121
using PlayerRoles;
22+
using PlayerRoles.Ragdolls;
2223

2324
using PlayerStatsSystem;
2425

@@ -41,6 +42,7 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
4142

4243
LocalBuilder player = generator.DeclareLocal(typeof(Player));
4344
LocalBuilder oldRole = generator.DeclareLocal(typeof(RoleTypeId));
45+
LocalBuilder ragdoll = generator.DeclareLocal(typeof(BasicRagdoll));
4446

4547
newInstructions.InsertRange(
4648
0,
@@ -77,6 +79,10 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
7779
new(OpCodes.Stloc, oldRole.LocalIndex),
7880
});
7981

82+
int index = newInstructions.FindIndex(x => x.opcode == OpCodes.Pop);
83+
84+
newInstructions[index] = new CodeInstruction(OpCodes.Stloc, ragdoll.LocalIndex);
85+
8086
newInstructions.InsertRange(
8187
newInstructions.Count - 1,
8288
new CodeInstruction[]
@@ -90,6 +96,9 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
9096
// handler
9197
new(OpCodes.Ldarg_1),
9298

99+
// ragdoll
100+
new(OpCodes.Ldloc_S, ragdoll.LocalIndex),
101+
93102
// DiedEventArgs evDied = new(Player, RoleTypeId, DamageHandlerBase)
94103
new(OpCodes.Newobj, GetDeclaredConstructors(typeof(DiedEventArgs))[0]),
95104

@@ -105,4 +114,4 @@ private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstructi
105114
ListPool<CodeInstruction>.Pool.Return(newInstructions);
106115
}
107116
}
108-
}
117+
}

0 commit comments

Comments
 (0)