diff --git a/Source/Game/Entities/Player/Player.Map.cs b/Source/Game/Entities/Player/Player.Map.cs index 450404175..f66540c04 100644 --- a/Source/Game/Entities/Player/Player.Map.cs +++ b/Source/Game/Entities/Player/Player.Map.cs @@ -110,9 +110,14 @@ namespace Game.Entities m_areaUpdateId = newArea; AreaTableRecord area = CliDB.AreaTableStorage.LookupByKey(newArea); + bool oldFFAPvPArea = pvpInfo.IsInFFAPvPArea; pvpInfo.IsInFFAPvPArea = area != null && area.Flags[0].HasAnyFlag(AreaFlags.Arena); UpdatePvPState(true); + // check if we were in ffa arena and we left + if (oldFFAPvPArea && !pvpInfo.IsInFFAPvPArea) + ValidateAttackersAndOwnTarget(); + PhasingHandler.OnAreaChange(this); UpdateAreaDependentAuras(newArea); diff --git a/Source/Game/Entities/Unit/Unit.Combat.cs b/Source/Game/Entities/Unit/Unit.Combat.cs index 6aaa60181..829586355 100644 --- a/Source/Game/Entities/Unit/Unit.Combat.cs +++ b/Source/Game/Entities/Unit/Unit.Combat.cs @@ -225,6 +225,24 @@ namespace Game.Entities } } + public void ValidateAttackersAndOwnTarget() + { + // iterate attackers + List toRemove = new List(); + foreach (Unit attacker in getAttackers()) + if (!attacker.IsValidAttackTarget(this)) + toRemove.Add(attacker); + + foreach (Unit attacker in toRemove) + attacker.AttackStop(); + + // remove our own victim + Unit victim = GetVictim(); + if (victim != null) + if (!IsValidAttackTarget(victim)) + AttackStop(); + } + public void CombatStop(bool includingCast = false) { if (includingCast && IsNonMeleeSpellCast(false))