mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-17 10:45:43 +00:00
104 lines
2.9 KiB
C++
104 lines
2.9 KiB
C++
#include "Playerbots.h"
|
|
#include "VioletHoldActions.h"
|
|
#include "VioletHoldStrategy.h"
|
|
|
|
|
|
bool AttackErekemAction::Execute(Event event)
|
|
{
|
|
// Focus boss first, adds after
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "erekem");
|
|
if (!boss) { return false; }
|
|
|
|
if (AI_VALUE(Unit*, "current target") != boss)
|
|
{
|
|
return Attack(boss);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool AttackIchorGlobuleAction::Execute(Event event)
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "ichoron");
|
|
if (!boss) { return false; }
|
|
|
|
Unit* currentTarget = AI_VALUE(Unit*, "current target");
|
|
|
|
// Tank prioritise boss if it's up
|
|
if (botAI->IsTank(bot) && !boss->HasAura(SPELL_DRAINED))
|
|
{
|
|
if (AI_VALUE(Unit*, "current target") != boss)
|
|
{
|
|
return Attack(boss);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Target is not findable from threat table using AI_VALUE2(),
|
|
// therefore need to search manually for the unit name
|
|
GuidVector targets = AI_VALUE(GuidVector, "possible targets");
|
|
|
|
for (auto i = targets.begin(); i != targets.end(); ++i)
|
|
{
|
|
Unit* unit = botAI->GetUnit(*i);
|
|
if (unit && unit->GetEntry() == NPC_ICHOR_GLOBULE)
|
|
{
|
|
// Check IDs here, NOT Unit* pointers:
|
|
// Don't keep swapping between sentries.
|
|
// If we're already attacking one, don't retarget another
|
|
if (currentTarget && currentTarget->GetEntry() == NPC_ICHOR_GLOBULE)
|
|
{
|
|
return false;
|
|
}
|
|
return Attack(unit);
|
|
}
|
|
}
|
|
// No ichor globules left alive, fall back to targeting boss
|
|
if (currentTarget != boss)
|
|
{
|
|
return Attack(boss);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool AttackVoidSentryAction::Execute(Event event)
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "zuramat the obliterator");
|
|
if (!boss) { return false; }
|
|
|
|
Unit* currentTarget = AI_VALUE(Unit*, "current target");
|
|
|
|
// Target is not findable from threat table using AI_VALUE2(),
|
|
// therefore need to search manually for the unit name
|
|
// GuidVector targets = AI_VALUE(GuidVector, "possible targets no los");
|
|
GuidVector targets = AI_VALUE(GuidVector, "possible targets no los");
|
|
|
|
for (auto i = targets.begin(); i != targets.end(); ++i)
|
|
{
|
|
Unit* unit = botAI->GetUnit(*i);
|
|
if (unit && unit->GetEntry() == NPC_VOID_SENTRY)
|
|
{
|
|
// Check IDs here, NOT Unit* pointers:
|
|
// Don't keep swapping between sentries.
|
|
// If we're already attacking one, don't retarget another
|
|
if (currentTarget && currentTarget->GetEntry() == NPC_VOID_SENTRY)
|
|
{
|
|
return false;
|
|
}
|
|
return Attack(unit);
|
|
}
|
|
}
|
|
// No void sentries left alive, fall back to targeting boss
|
|
if (currentTarget != boss)
|
|
{
|
|
return Attack(boss);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool StopAttackAction::Execute(Event event)
|
|
{
|
|
return bot->AttackStop();
|
|
}
|