aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AI/CreatureAI.cpp
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-08-20 19:04:21 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-22 00:48:20 +0200
commit6a5edf04725502d749636fc6c6bb3935d83c222f (patch)
tree57c9f011bf9cebf68f27fb9a6691dc7b50d1e074 /src/server/game/AI/CreatureAI.cpp
parent2d72e79ac4ec30cc4754024ae67c956c8fedf4a2 (diff)
Core/AI: Some cleanup to DoZoneInCombat and Malygos' AI that I found while working out #22226.
(cherry picked from commit eb1972f21d6e79da32a89cb58c5c28eb98b0a4fb)
Diffstat (limited to 'src/server/game/AI/CreatureAI.cpp')
-rw-r--r--src/server/game/AI/CreatureAI.cpp51
1 files changed, 15 insertions, 36 deletions
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp
index 4e8e035bf5b..e3f3cabb5ef 100644
--- a/src/server/game/AI/CreatureAI.cpp
+++ b/src/server/game/AI/CreatureAI.cpp
@@ -67,49 +67,28 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRange
creature = me;
Map* map = creature->GetMap();
- if (creature->CanHaveThreatList())
+ if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated
{
- if (!map->IsDungeon()) //use IsDungeon instead of Instanceable, in case battlegrounds will be instantiated
- {
- TC_LOG_ERROR("misc", "DoZoneInCombat call for map that isn't an instance (creature entry = %d)", creature->GetTypeId() == TYPEID_UNIT ? creature->ToCreature()->GetEntry() : 0);
- return;
- }
-
- if (!creature->HasReactState(REACT_PASSIVE) && !creature->GetVictim())
- {
- if (Unit* nearTarget = creature->SelectNearestTarget(maxRangeToNearestTarget))
- creature->AI()->AttackStart(nearTarget);
- else if (creature->IsSummon())
- {
- if (Unit* summoner = creature->ToTempSummon()->GetSummoner())
- {
- if (creature->IsFriendlyTo(summoner))
- {
- Unit* target = summoner->getAttackerForHelper();
- if (target && creature->IsHostileTo(target))
- creature->AI()->AttackStart(target);
- }
- }
- }
- }
-
- // Intended duplicated check, the code above this should select a victim
- // If it can't find a suitable attack target then we should error out.
- if (!creature->HasReactState(REACT_PASSIVE) && !creature->GetVictim())
- {
- TC_LOG_ERROR("misc.dozoneincombat", "DoZoneInCombat called for creature that has empty threat list (creature entry = %u)", creature->GetEntry());
- return;
- }
+ TC_LOG_ERROR("misc", "DoZoneInCombat call for map that isn't an instance (creature entry = %d)", creature->GetTypeId() == TYPEID_UNIT ? creature->ToCreature()->GetEntry() : 0);
+ return;
}
Map::PlayerList const& playerList = map->GetPlayers();
if (playerList.isEmpty())
return;
- for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
- if (Player* player = itr->GetSource())
- if (player->IsAlive())
- creature->EngageWithTarget(player);
+ for (auto const& ref : playerList)
+ if (Player* player = ref.GetSource())
+ {
+ if (!player->IsAlive() || !CombatManager::CanBeginCombat(creature, player))
+ continue;
+
+ creature->EngageWithTarget(player);
+ for (Unit* pet : player->m_Controlled)
+ creature->EngageWithTarget(pet);
+ if (Unit* vehicle = player->GetVehicleBase())
+ creature->EngageWithTarget(vehicle);
+ }
}
// scripts does not take care about MoveInLineOfSight loops