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 dc94521c1bb..5fb275a6969 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -7060,9 +7060,14 @@ void Player::UpdateArea(uint32 newArea)
m_areaUpdateId = newArea;
AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
+ bool oldFFAPvPArea = pvpInfo.IsInFFAPvPArea;
pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
UpdatePvPState(true);
+ // check if we were in ffa arena and we left
+ if (oldFFAPvPArea && !pvpInfo.IsInFFAPvPArea)
+ ValidateAttackersAndOwnTarget();
+
UpdateAreaDependentAuras(newArea);
// previously this was in UpdateZone (but after UpdateArea) so nothing will break
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index f9e8f85cc86..7ddc586a4f3 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -5874,6 +5874,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 12b2be85e03..646595d2808 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1264,6 +1264,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;
@@ -1340,6 +1341,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);