diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 9d62cfd23..4398579f9 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1937,17 +1937,8 @@ bool Creature::CanStartAttack(Unit const* who) const if (!_IsTargetAcceptable(who)) return false; - // pussywizard: at this point we are either hostile to who or friendly to who->getAttackerForHelper() - // pussywizard: if who is in combat and has an attacker, help him if the distance is right (help because who is hostile or help because attacker is friendly) - bool assist = false; - if (who->IsEngaged() && IsWithinDist(who, ATTACK_DISTANCE)) - if (Unit* victim = who->getAttackerForHelper()) - if (IsWithinDistInMap(victim, sWorld->getFloatConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS))) - assist = true; - - if (!assist) - if (IsNeutralToAll() || !IsWithinDistInMap(who, GetAggroRange(who) + m_CombatDistance, true, false)) // pussywizard: +m_combatDistance for turrets and similar - return false; + if (IsNeutralToAll() || !IsWithinDistInMap(who, GetAggroRange(who) + m_CombatDistance, true, false)) // pussywizard: +m_combatDistance for turrets and similar + return false; if (!CanCreatureAttack(who)) return false; @@ -1955,6 +1946,9 @@ bool Creature::CanStartAttack(Unit const* who) const if (HasUnitState(UNIT_STATE_STUNNED)) return false; + if (!IsHostileTo(who)) + return false; + return IsWithinLOSInMap(who); } @@ -2537,6 +2531,9 @@ bool Creature::CanAssistTo(Unit const* u, Unit const* enemy, bool checkfaction / { if (GetFaction() != u->GetFaction()) return false; + + if (!RespondsToCallForHelp()) + return false; } else { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 5c6330efc..eedca78a0 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -986,6 +986,13 @@ public: return false; } + [[nodiscard]] bool RespondsToCallForHelp() const + { + if (FactionTemplateEntry const* entry = GetFactionTemplateEntry()) + return entry->FactionRespondsToCallForHelp(); + + return false; + } [[nodiscard]] bool IsInSanctuary() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY); } [[nodiscard]] bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); } [[nodiscard]] bool IsFFAPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); } diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index 027135276..e62cbd68d 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -986,6 +986,7 @@ struct FactionTemplateEntry return hostileMask == 0 && friendlyMask == 0; } [[nodiscard]] bool IsContestedGuardFaction() const { return (factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS) != 0; } + [[nodiscard]] bool FactionRespondsToCallForHelp() const { return (factionFlags & FACTION_TEMPLATE_FLAG_RESPOND_TO_CALL_FOR_HELP) != 0; } }; struct GameObjectArtKitEntry