diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 |
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); |