diff options
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 |