diff --git a/zone/aggro.cpp b/zone/aggro.cpp index a8b23037e..4ddfb759a 100644 --- a/zone/aggro.cpp +++ b/zone/aggro.cpp @@ -452,8 +452,26 @@ bool Mob::CheckWillAggro(Mob *mob) { return false; } - // Don't aggro new clients if we are already engaged unless SpecialAbility::ProximityAggro is set - if (IsEngaged() && (!GetSpecialAbility(SpecialAbility::ProximityAggro) || (GetSpecialAbility(SpecialAbility::ProximityAggro) && !CombatRange(mob)))) { + // Don't aggro new clients if we are already engaged unless PROX_AGGRO is set + // Frustrated mobs (all rooted up with no one to kill) + // will engage without PROX_AGGRO ability if someone new is close now. + + const bool is_frustrated = IsRooted() && !CombatRange(target); + + if ( + !is_frustrated && + IsEngaged() && + ( + ( + !GetSpecialAbility(SpecialAbility::ProximityAggro) && + GetBodyType() != BodyType::Undead + ) || + ( + GetSpecialAbility(SpecialAbility::ProximityAggro) && + !CombatRange(mob) + ) + ) + ) { LogAggro( "[{}] is in combat, and does not have prox_aggro, or does and is out of combat range with [{}]", GetName(),