diff --git a/EXILED/Exiled.API/Extensions/RoleExtensions.cs b/EXILED/Exiled.API/Extensions/RoleExtensions.cs
index e86805f009..407e26565c 100644
--- a/EXILED/Exiled.API/Extensions/RoleExtensions.cs
+++ b/EXILED/Exiled.API/Extensions/RoleExtensions.cs
@@ -13,6 +13,7 @@ namespace Exiled.API.Extensions
using Enums;
using Exiled.API.Features.Spawn;
+ using Footprinting;
using InventorySystem;
using InventorySystem.Configs;
using PlayerRoles;
@@ -27,6 +28,22 @@ namespace Exiled.API.Extensions
///
public static class RoleExtensions
{
+ ///
+ /// Compares LifeIdentifier.
+ ///
+ /// The footprint to compare.
+ /// The other footprint.
+ /// If LifeIdentifier is the same (same role).
+ public static bool CompareLife(this Footprint footprint, Footprint other) => footprint.LifeIdentifier == other.LifeIdentifier;
+
+ ///
+ /// Compares LifeIdentifier.
+ ///
+ /// The footprint to compare.
+ /// The hub to compare to.
+ /// If LifeIdentifier is the same (same role).
+ public static bool CompareLife(this Footprint footprint, ReferenceHub other) => footprint.LifeIdentifier == other.roleManager.CurrentRole.UniqueLifeIdentifier;
+
///
/// Gets a role's .
///
diff --git a/EXILED/Exiled.API/Features/Roles/Role.cs b/EXILED/Exiled.API/Features/Roles/Role.cs
index 0b636e95f8..ef6d8dceab 100644
--- a/EXILED/Exiled.API/Features/Roles/Role.cs
+++ b/EXILED/Exiled.API/Features/Roles/Role.cs
@@ -114,6 +114,11 @@ protected Role(PlayerRoleBase baseRole)
///
public bool IsValid => Owner != null && Owner.IsConnected && Base == Owner.RoleManager.CurrentRole;
+ ///
+ /// Gets the life identifier for the role.
+ ///
+ public int LifeIdentifier => Base.UniqueLifeIdentifier;
+
///
/// Gets a random spawn position of this role.
///
diff --git a/EXILED/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs b/EXILED/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs
index 29cabcadbf..bfb61c181d 100644
--- a/EXILED/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs
+++ b/EXILED/Exiled.Events/Patches/Events/Map/ExplodingFlashGrenade.cs
@@ -12,6 +12,7 @@ namespace Exiled.Events.Patches.Events.Map
using API.Features;
using API.Features.Pools;
+ using Exiled.API.Extensions;
using Exiled.Events.EventArgs.Map;
using Exiled.Events.Patches.Generic;
using Footprinting;
@@ -63,14 +64,13 @@ private static IEnumerable Transpiler(IEnumerable targetToAffect = ListPool.Pool.Get();
- foreach (ReferenceHub referenceHub in ReferenceHub.AllHubs)
+ foreach (Player player in Player.List)
{
- Player player = Player.Get(referenceHub);
- if ((instance.transform.position - referenceHub.transform.position).sqrMagnitude >= distance)
+ if ((instance.transform.position - player.Position).sqrMagnitude >= distance)
continue;
- if (!ExiledEvents.Instance.Config.CanFlashbangsAffectThrower && instance.PreviousOwner.LifeIdentifier != new Footprint(referenceHub).LifeIdentifier)
+ if (!ExiledEvents.Instance.Config.CanFlashbangsAffectThrower && instance.PreviousOwner.CompareLife(player.ReferenceHub))
continue;
- if (!IndividualFriendlyFire.CheckFriendlyFirePlayer(instance.PreviousOwner, player.ReferenceHub) && instance.PreviousOwner.LifeIdentifier != new Footprint(referenceHub).LifeIdentifier)
+ if (!IndividualFriendlyFire.CheckFriendlyFirePlayer(instance.PreviousOwner, player.ReferenceHub) && !instance.PreviousOwner.CompareLife(player.ReferenceHub))
continue;
if (Physics.Linecast(instance.transform.position, player.CameraTransform.position, instance._blindingMask))
continue;
diff --git a/EXILED/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs b/EXILED/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs
index d95b88a878..d8ae229346 100644
--- a/EXILED/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs
+++ b/EXILED/Exiled.Events/Patches/Generic/IndividualFriendlyFire.cs
@@ -7,6 +7,8 @@
namespace Exiled.Events.Patches.Generic
{
+ using Exiled.API.Extensions;
+
#pragma warning disable SA1402
using System;
using System.Collections.Generic;
@@ -96,8 +98,7 @@ public static bool CheckFriendlyFirePlayerRules(Footprint attackerFootprint, Ref
return true;
// Only check friendlyFire if the FootPrint hasn't changed (Fix for Grenade not dealing damage because it's from a dead player)
- // TODO rework FriendlyFireRule to make it compatible with Footprint
- if (!attackerFootprint.Equals(new Footprint(attackerFootprint.Hub)))
+ if (!attackerFootprint.CompareLife(new Footprint(attackerFootprint.Hub)))
return false;
// Check if attackerFootprint.Hub or victimHub is null and log debug information