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