Core/Auras: Feign death will no longer cause creatures immune to it to drop combat (and then reenter it because the unit feigning death is considered valid)
Port From (https://github.com/TrinityCore/TrinityCore/commit/0c32277139a173c31043706d72e1cfe8830aaade)
This commit is contained in:
@@ -286,6 +286,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
// TODO: migrate these in DB
|
// TODO: migrate these in DB
|
||||||
_staticFlags.ApplyFlag(CreatureStaticFlags2.AllowMountedCombat, GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.AllowMountedCombat));
|
_staticFlags.ApplyFlag(CreatureStaticFlags2.AllowMountedCombat, GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.AllowMountedCombat));
|
||||||
|
SetIgnoreFeignDeath(creatureInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.IgnoreFeighDeath));
|
||||||
SetInteractionAllowedInCombat(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.AllowInteractionWhileInCombat));
|
SetInteractionAllowedInCombat(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.AllowInteractionWhileInCombat));
|
||||||
SetTreatAsRaidUnit(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.TreatAsRaidUnit));
|
SetTreatAsRaidUnit(GetCreatureDifficulty().TypeFlags.HasAnyFlag(CreatureTypeFlags.TreatAsRaidUnit));
|
||||||
|
|
||||||
@@ -2406,7 +2407,7 @@ namespace Game.Entities
|
|||||||
if (target.HasUnitState(UnitState.Died))
|
if (target.HasUnitState(UnitState.Died))
|
||||||
{
|
{
|
||||||
// some creatures can detect fake death
|
// some creatures can detect fake death
|
||||||
if (CanIgnoreFeignDeath() && target.HasUnitFlag2(UnitFlags2.FeignDeath))
|
if (IsIgnoringFeignDeath() && target.HasUnitFlag2(UnitFlags2.FeignDeath))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
@@ -3563,9 +3564,10 @@ namespace Game.Entities
|
|||||||
public void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
|
public void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
|
||||||
public void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
public void SetNoSearchAssistance(bool val) { m_AlreadySearchedAssistance = val; }
|
||||||
public bool HasSearchedAssistance() { return m_AlreadySearchedAssistance; }
|
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 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 override MovementGeneratorType GetDefaultMovementType() { return DefaultMovementType; }
|
||||||
public void SetDefaultMovementType(MovementGeneratorType mgt) { DefaultMovementType = mgt; }
|
public void SetDefaultMovementType(MovementGeneratorType mgt) { DefaultMovementType = mgt; }
|
||||||
|
|||||||
@@ -1698,6 +1698,12 @@ namespace Game.Spells
|
|||||||
|
|
||||||
if (apply)
|
if (apply)
|
||||||
{
|
{
|
||||||
|
var isAffectedByFeignDeath = bool (Unit attacker) =>
|
||||||
|
{
|
||||||
|
Creature attackerCreature = attacker.ToCreature();
|
||||||
|
return attackerCreature == null || !attackerCreature.IsIgnoringFeignDeath();
|
||||||
|
};
|
||||||
|
|
||||||
List<Unit> targets = new();
|
List<Unit> targets = new();
|
||||||
var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(target, target, target.GetMap().GetVisibilityRange());
|
var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(target, target, target.GetMap().GetVisibilityRange());
|
||||||
var searcher = new UnitListSearcher(target, targets, u_check);
|
var searcher = new UnitListSearcher(target, targets, u_check);
|
||||||
@@ -1708,6 +1714,9 @@ namespace Game.Spells
|
|||||||
if (!unit.HasUnitState(UnitState.Casting))
|
if (!unit.HasUnitState(UnitState.Casting))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!isAffectedByFeignDeath(unit))
|
||||||
|
continue;
|
||||||
|
|
||||||
for (var i = CurrentSpellTypes.Generic; i < CurrentSpellTypes.Max; i++)
|
for (var i = CurrentSpellTypes.Generic; i < CurrentSpellTypes.Max; i++)
|
||||||
{
|
{
|
||||||
if (unit.GetCurrentSpell(i) != null
|
if (unit.GetCurrentSpell(i) != null
|
||||||
@@ -1718,8 +1727,9 @@ namespace Game.Spells
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var pair in target.GetThreatManager().GetThreatenedByMeList())
|
foreach (var (_, refe) in target.GetThreatManager().GetThreatenedByMeList())
|
||||||
pair.Value.ScaleThreat(0.0f);
|
if (isAffectedByFeignDeath(refe.GetOwner()))
|
||||||
|
refe.ScaleThreat(0.0f);
|
||||||
|
|
||||||
if (target.GetMap().IsDungeon()) // feign death does not remove combat in dungeons
|
if (target.GetMap().IsDungeon()) // feign death does not remove combat in dungeons
|
||||||
{
|
{
|
||||||
@@ -1729,7 +1739,7 @@ namespace Game.Spells
|
|||||||
targetPlayer.SendAttackSwingCancelAttack();
|
targetPlayer.SendAttackSwingCancelAttack();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
target.CombatStop(false, false);
|
target.CombatStop(false, false, isAffectedByFeignDeath);
|
||||||
|
|
||||||
// prevent interrupt message
|
// prevent interrupt message
|
||||||
if (GetCasterGUID() == target.GetGUID() && target.GetCurrentSpell(CurrentSpellTypes.Generic) != null)
|
if (GetCasterGUID() == target.GetGUID() && target.GetCurrentSpell(CurrentSpellTypes.Generic) != null)
|
||||||
|
|||||||
Reference in New Issue
Block a user