mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 01:37:37 +01:00
Partial revert of 15a207f, which was causing issues (ref #4943 and #19768). Instead, fix the underlying issue from 15a207f one level further down - Unit::getAttackerForHelper() shouldn't return units that we aren't in combat with (victim can be such a unit for players/player pets, which can startattack from a distance without entering combat). (#19814)
Fixes the following issues:
- Player pets would aggro neutral mobs as soon as they start autocasting (Imp's Firebolt) if they're in react range (due to victim != null, autocast counts as autoattack and sets victim)
- Neutral mobs would randomly evade when aggro switched between targets.
Closes #19768, #19485 and #10921.
(from PR #19814)
(cherry picked from commit 69fd6245dc)
This commit is contained in:
@@ -2425,14 +2425,9 @@ bool Creature::_IsTargetAcceptable(Unit const* target) const
|
||||
Unit const* targetVictim = target->getAttackerForHelper();
|
||||
|
||||
// if I'm already fighting target, or I'm hostile towards the target, the target is acceptable
|
||||
if (GetVictim() == target || IsHostileTo(target))
|
||||
if (IsInCombatWith(target) || IsHostileTo(target))
|
||||
return true;
|
||||
|
||||
// a player is targeting me, but I'm not hostile towards it, and not currently attacking it, the target is not acceptable
|
||||
// (players may set their victim from a distance, and doesn't mean we should attack)
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && targetVictim == this)
|
||||
return false;
|
||||
|
||||
// if the target's victim is friendly, and the target is neutral, the target is acceptable
|
||||
if (targetVictim && IsFriendlyTo(targetVictim))
|
||||
return true;
|
||||
|
||||
@@ -5635,13 +5635,22 @@ void Unit::_removeAttacker(Unit* pAttacker)
|
||||
|
||||
Unit* Unit::getAttackerForHelper() const // If someone wants to help, who to give them
|
||||
{
|
||||
if (GetVictim() != NULL)
|
||||
return GetVictim();
|
||||
if (Unit* victim = GetVictim())
|
||||
if (!IsControlledByPlayer() || IsInCombatWith(victim) || victim->IsInCombatWith(this))
|
||||
return victim;
|
||||
|
||||
if (!m_attackers.empty())
|
||||
return *(m_attackers.begin());
|
||||
|
||||
return NULL;
|
||||
if (Player* owner = GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
{
|
||||
HostileRefManager& refs = owner->getHostileRefManager();
|
||||
for (Reference<Unit, ThreatManager> const& ref : refs)
|
||||
if (Unit* hostile = ref.GetSource()->GetOwner())
|
||||
return hostile;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Unit::Attack(Unit* victim, bool meleeAttack)
|
||||
|
||||
Reference in New Issue
Block a user