aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp18
-rw-r--r--src/server/game/Entities/Unit/Unit.h2
3 files changed, 25 insertions, 0 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 4c21143aefc..3bede968fea 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7000,9 +7000,14 @@ void Player::UpdateArea(uint32 newArea)
m_areaUpdateId = newArea;
AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
+ bool oldFFAPvPArea = pvpInfo.IsInFFAPvPArea;
pvpInfo.IsInFFAPvPArea = area && (area->Flags[0] & AREA_FLAG_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/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e0ce67c75f6..53fa6416c32 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5720,6 +5720,24 @@ bool Unit::AttackStop()
return true;
}
+void Unit::ValidateAttackersAndOwnTarget()
+{
+ // iterate attackers
+ UnitVector toRemove;
+ AttackerSet const& attackers = getAttackers();
+ for (Unit* attacker : attackers)
+ if (!attacker->IsValidAttackTarget(this))
+ toRemove.push_back(attacker);
+
+ for (Unit* attacker : toRemove)
+ attacker->AttackStop();
+
+ // remove our own victim
+ if (Unit* victim = GetVictim())
+ if (!IsValidAttackTarget(victim))
+ AttackStop();
+}
+
void Unit::CombatStop(bool includingCast)
{
if (includingCast && IsNonMeleeSpellCast(false))
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 50013a0797d..d955bce211e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -928,6 +928,7 @@ class TC_GAME_API Unit : public WorldObject
public:
typedef std::set<Unit*> AttackerSet;
typedef std::set<Unit*> ControlList;
+ typedef std::vector<Unit*> UnitVector;
typedef std::multimap<uint32, Aura*> AuraMap;
typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> AuraMapBounds;
@@ -1010,6 +1011,7 @@ class TC_GAME_API Unit : public WorldObject
return m_attacking;
}
+ void ValidateAttackersAndOwnTarget();
void CombatStop(bool includingCast = false);
void CombatStopWithPets(bool includingCast = false);
void StopAttackFaction(uint32 faction_id);