diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 5b537b157..1a8c8e5d7 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -286,6 +286,7 @@ namespace Game.Entities // TODO: migrate these in DB _staticFlags.ApplyFlag(CreatureStaticFlags2.AllowMountedCombat, GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.AllowMountedCombat)); + SetIgnoreFeignDeath(creatureInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.IgnoreFeighDeath)); SetInteractionAllowedInCombat(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.AllowInteractionWhileInCombat)); SetTreatAsRaidUnit(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.TreatAsRaidUnit)); @@ -2406,7 +2407,7 @@ namespace Game.Entities if (target.HasUnitState(UnitState.Died)) { // some creatures can detect fake death - if (CanIgnoreFeignDeath() && target.HasUnitFlag2(UnitFlags2.FeignDeath)) + if (IsIgnoringFeignDeath() && target.HasUnitFlag2(UnitFlags2.FeignDeath)) return true; else return false; @@ -3563,9 +3564,10 @@ namespace Game.Entities public void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; } public void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; } public bool HasSearchedAssistance() { return m_AlreadySearchedAssistance; } - public bool CanIgnoreFeignDeath() { return GetCreatureTemplate().FlagsExtra.HasFlag(CreatureFlagsExtra.IgnoreFeighDeath); } + public bool IsIgnoringFeignDeath() { return _staticFlags.HasFlag(CreatureStaticFlags2.IgnoreFeignDeath); } + public void SetIgnoreFeignDeath(bool ignoreFeignDeath) { _staticFlags.ApplyFlag(CreatureStaticFlags2.IgnoreFeignDeath, ignoreFeignDeath); } public bool IsIgnoringSanctuarySpellEffect() { return _staticFlags.HasFlag(CreatureStaticFlags2.IgnoreSanctuary); } - public void SetIngoreSanctuarySpellEffect(bool ignoreSanctuary) { _staticFlags.ApplyFlag(CreatureStaticFlags2.IgnoreSanctuary, ignoreSanctuary); } + public void SetIgnoreSanctuarySpellEffect(bool ignoreSanctuary) { _staticFlags.ApplyFlag(CreatureStaticFlags2.IgnoreSanctuary, ignoreSanctuary); } public override MovementGeneratorType GetDefaultMovementType() { return DefaultMovementType; } public void SetDefaultMovementType(MovementGeneratorType mgt) { DefaultMovementType = mgt; } diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index 77ce6b909..28ad7a326 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -1698,6 +1698,12 @@ namespace Game.Spells if (apply) { + var isAffectedByFeignDeath = bool (Unit attacker) => + { + Creature attackerCreature = attacker.ToCreature(); + return attackerCreature == null || !attackerCreature.IsIgnoringFeignDeath(); + }; + List targets = new(); var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(target, target, target.GetMap().GetVisibilityRange()); var searcher = new UnitListSearcher(target, targets, u_check); @@ -1708,6 +1714,9 @@ namespace Game.Spells if (!unit.HasUnitState(UnitState.Casting)) continue; + if (!isAffectedByFeignDeath(unit)) + continue; + for (var i = CurrentSpellTypes.Generic; i < CurrentSpellTypes.Max; i++) { if (unit.GetCurrentSpell(i) != null @@ -1718,8 +1727,9 @@ namespace Game.Spells } } - foreach (var pair in target.GetThreatManager().GetThreatenedByMeList()) - pair.Value.ScaleThreat(0.0f); + foreach (var (_, refe) in target.GetThreatManager().GetThreatenedByMeList()) + if (isAffectedByFeignDeath(refe.GetOwner())) + refe.ScaleThreat(0.0f); if (target.GetMap().IsDungeon()) // feign death does not remove combat in dungeons { @@ -1729,7 +1739,7 @@ namespace Game.Spells targetPlayer.SendAttackSwingCancelAttack(); } else - target.CombatStop(false, false); + target.CombatStop(false, false, isAffectedByFeignDeath); // prevent interrupt message if (GetCasterGUID() == target.GetGUID() && target.GetCurrentSpell(CurrentSpellTypes.Generic) != null)