diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 24 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f0bd0ba2fc..79859ab388 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -16393,9 +16393,21 @@ void Unit::SetContestedPvP(Player* attackedPlayer) { Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); - if (!player || (attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->opponent == attackedPlayer)))) + if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->opponent == attackedPlayer))) || player->InBattleground())) return; + // check if there any guards that should care about the contested flag on player + std::list<Unit*> targets; + Acore::NearestVisibleDetectableContestedGuardUnitCheck u_check(this); + Acore::UnitListSearcher<Acore::NearestVisibleDetectableContestedGuardUnitCheck> searcher(this, targets, u_check); + Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS); + + // return if there are no contested guards found + if (!targets.size()) + { + return; + } + player->SetContestedPvPTimer(30000); if (!player->HasUnitState(UNIT_STATE_ATTACK_PLAYER)) { diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 44cdee243b..ebb584d902 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -1114,6 +1114,30 @@ namespace Acore NearestHostileUnitInAttackDistanceCheck(NearestHostileUnitInAttackDistanceCheck const&); }; + class NearestVisibleDetectableContestedGuardUnitCheck + { + public: + explicit NearestVisibleDetectableContestedGuardUnitCheck(Unit const* unit) : me(unit) {} + bool operator()(Unit* u) + { + if (!u->CanSeeOrDetect(me, true, true, false)) + { + return false; + } + + if (!u->IsContestedGuard()) + { + return false; + } + + return true; + } + + private: + Unit const* me; + NearestVisibleDetectableContestedGuardUnitCheck(NearestVisibleDetectableContestedGuardUnitCheck const&); + }; + class AnyAssistCreatureInRangeCheck { public: |