diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-08-20 19:04:21 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-10-22 00:48:20 +0200 |
commit | 6a5edf04725502d749636fc6c6bb3935d83c222f (patch) | |
tree | 57c9f011bf9cebf68f27fb9a6691dc7b50d1e074 /src/server/game/AI/CreatureAI.cpp | |
parent | 2d72e79ac4ec30cc4754024ae67c956c8fedf4a2 (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.cpp | 51 |
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 |