mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-08 07:48:02 +00:00
refactor(Core/Combat): Cleanup DoZoneInCombat function. (#8789)
* Core/Combat: Cleanup DoZoneInCombat function. Updates #7960 * Restore distance parameter. * You don't belong here. * Update
This commit is contained in:
@@ -56,13 +56,47 @@ void CreatureAI::Talk(uint8 id, WorldObject const* whisperTarget /*= nullptr*/)
|
|||||||
sCreatureTextMgr->SendChat(me, id, whisperTarget);
|
sCreatureTextMgr->SendChat(me, id, whisperTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRangeToNearestTarget /* = 50.0f*/)
|
inline bool IsValidCombatTarget(Creature* source, Player* target)
|
||||||
|
{
|
||||||
|
if (target->IsGameMaster())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!source->IsInWorld() || !target->IsInWorld())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!source->IsAlive() || !target->IsAlive())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!source->InSamePhase(target))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source->HasUnitState(UNIT_STATE_IN_FLIGHT) || target->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRangeToNearestTarget /*= 250.0f*/)
|
||||||
{
|
{
|
||||||
if (!creature)
|
if (!creature)
|
||||||
|
{
|
||||||
creature = me;
|
creature = me;
|
||||||
|
}
|
||||||
|
|
||||||
if (!creature->CanHaveThreatList() || creature->IsInEvadeMode())
|
if (creature->IsInEvadeMode())
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Map* map = creature->GetMap();
|
Map* map = creature->GetMap();
|
||||||
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
|
||||||
@@ -71,45 +105,31 @@ void CreatureAI::DoZoneInCombat(Creature* creature /*= nullptr*/, float maxRange
|
|||||||
return;
|
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()->GetSummonerUnit())
|
|
||||||
{
|
|
||||||
Unit* target = summoner->getAttackerForHelper();
|
|
||||||
if (!target && summoner->CanHaveThreatList() && !summoner->getThreatMgr().isThreatListEmpty())
|
|
||||||
target = summoner->getThreatMgr().getHostilTarget();
|
|
||||||
if (target && (creature->IsFriendlyTo(summoner) || creature->IsHostileTo(target)))
|
|
||||||
creature->AI()->AttackStart(target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!creature->HasReactState(REACT_PASSIVE) && !creature->GetVictim())
|
|
||||||
{
|
|
||||||
LOG_ERROR("entities.unit.ai", "DoZoneInCombat called for creature that has empty threat list (creature entry = %u)", creature->GetEntry());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map::PlayerList const& playerList = map->GetPlayers();
|
Map::PlayerList const& playerList = map->GetPlayers();
|
||||||
|
|
||||||
if (playerList.isEmpty())
|
if (playerList.isEmpty())
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
|
for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr)
|
||||||
{
|
{
|
||||||
if (Player* player = itr->GetSource())
|
if (Player* player = itr->GetSource())
|
||||||
{
|
{
|
||||||
if (player->IsGameMaster())
|
if (!IsValidCombatTarget(creature, player))
|
||||||
continue;
|
{
|
||||||
|
continue;
|
||||||
if (player->IsAlive())
|
}
|
||||||
|
|
||||||
|
if (!creature->IsWithinDistInMap(player, maxRangeToNearestTarget))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
creature->SetInCombatWith(player);
|
||||||
|
player->SetInCombatWith(creature);
|
||||||
|
|
||||||
|
if (creature->CanHaveThreatList())
|
||||||
{
|
{
|
||||||
creature->SetInCombatWith(player);
|
|
||||||
player->SetInCombatWith(creature);
|
|
||||||
creature->AddThreat(player, 0.0f);
|
creature->AddThreat(player, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ public:
|
|||||||
// Called at reaching home after evade
|
// Called at reaching home after evade
|
||||||
virtual void JustReachedHome() {}
|
virtual void JustReachedHome() {}
|
||||||
|
|
||||||
void DoZoneInCombat(Creature* creature = nullptr, float maxRangeToNearestTarget = 50.0f);
|
void DoZoneInCombat(Creature* creature = nullptr, float maxRangeToNearestTarget = 250.0f);
|
||||||
|
|
||||||
// Called at text emote receive from player
|
// Called at text emote receive from player
|
||||||
virtual void ReceiveEmote(Player* /*player*/, uint32 /*emoteId*/) {}
|
virtual void ReceiveEmote(Player* /*player*/, uint32 /*emoteId*/) {}
|
||||||
|
|||||||
@@ -2549,40 +2549,8 @@ void Creature::SendZoneUnderAttackMessage(Player* attacker)
|
|||||||
|
|
||||||
void Creature::SetInCombatWithZone()
|
void Creature::SetInCombatWithZone()
|
||||||
{
|
{
|
||||||
if (!CanHaveThreatList())
|
if (IsAIEnabled)
|
||||||
{
|
AI()->DoZoneInCombat();
|
||||||
LOG_ERROR("entities.unit", "Creature entry %u call SetInCombatWithZone but creature cannot have threat list.", GetEntry());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map* map = GetMap();
|
|
||||||
|
|
||||||
if (!map->IsDungeon())
|
|
||||||
{
|
|
||||||
LOG_ERROR("entities.unit", "Creature entry %u call SetInCombatWithZone for map (id: %u) that isn't an instance.", GetEntry(), map->GetId());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Map::PlayerList const& PlList = map->GetPlayers();
|
|
||||||
|
|
||||||
if (PlList.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
|
|
||||||
{
|
|
||||||
if (Player* player = i->GetSource())
|
|
||||||
{
|
|
||||||
if (player->IsGameMaster())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (player->IsAlive())
|
|
||||||
{
|
|
||||||
this->SetInCombatWith(player);
|
|
||||||
player->SetInCombatWith(this);
|
|
||||||
AddThreat(player, 0.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Creature::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs)
|
void Creature::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs)
|
||||||
|
|||||||
Reference in New Issue
Block a user