mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-17 21:50:50 -04:00
Creature/AI: Fix incorrect evade logic (closes #16461)
This commit is contained in:
@@ -2142,6 +2142,11 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool /*force*/) const
|
||||
if (GetMap()->IsDungeon())
|
||||
return true;
|
||||
|
||||
// if the mob is actively being damaged, do not reset due to distance unless it's a world boss
|
||||
if (!isWorldBoss())
|
||||
if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME)
|
||||
return true;
|
||||
|
||||
//Use AttackDistance in distance check if threat radius is lower. This prevents creature bounce in and out of combat every update tick.
|
||||
float dist = std::max(GetAttackDistance(victim), sWorld->getFloatConfig(CONFIG_THREAT_RADIUS)) + m_CombatDistance;
|
||||
|
||||
|
||||
@@ -12750,7 +12750,7 @@ Unit* Creature::SelectVictim()
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
if (target && _IsTargetAcceptable(target) && CanCreatureAttack(target))
|
||||
{
|
||||
@@ -12759,14 +12759,6 @@ Unit* Creature::SelectVictim()
|
||||
return target;
|
||||
}
|
||||
|
||||
// Case where mob is being kited.
|
||||
// Mob may not be in range to attack or may have dropped target. In any case,
|
||||
// don't evade if damage received within the last 10 seconds
|
||||
// Does not apply to world bosses to prevent kiting to cities
|
||||
if (!isWorldBoss() && !GetInstanceId())
|
||||
if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME)
|
||||
return target;
|
||||
|
||||
// last case when creature must not go to evade mode:
|
||||
// it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list
|
||||
// for example at owner command to pet attack some far away creature
|
||||
@@ -12775,12 +12767,12 @@ Unit* Creature::SelectVictim()
|
||||
{
|
||||
if ((*itr) && !CanCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER
|
||||
&& !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/// @todo a vehicle may eat some mob, so mob should not evade
|
||||
if (GetVehicle())
|
||||
return NULL;
|
||||
return nullptr;
|
||||
|
||||
// search nearby enemy before enter evade mode
|
||||
if (HasReactState(REACT_AGGRESSIVE))
|
||||
@@ -12798,17 +12790,17 @@ Unit* Creature::SelectVictim()
|
||||
{
|
||||
if ((*itr)->GetBase()->IsPermanent())
|
||||
{
|
||||
AI()->EnterEvadeMode();
|
||||
AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_OTHER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// enter in evade mode in other case
|
||||
AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_NO_HOSTILES);
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//======================================================================
|
||||
|
||||
Reference in New Issue
Block a user