aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp7
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp15
2 files changed, 13 insertions, 9 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 663976fca6a..fbdfedc6625 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -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;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6e485f64fc2..6d5b164f594 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -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)