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 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); |
