mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-03-03 23:57:49 +00:00
Halls of Lightning implementation
Halls of Lightning implementation
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
#include "Playerbots.h"
|
||||
#include "HallsOfLightningActions.h"
|
||||
#include "HallsOfLightningStrategy.h"
|
||||
|
||||
bool BjarngrimTargetAction::Execute(Event event)
|
||||
{
|
||||
Unit* target = nullptr;
|
||||
|
||||
// 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");
|
||||
|
||||
for (auto i = targets.begin(); i != targets.end(); ++i)
|
||||
{
|
||||
Unit* unit = botAI->GetUnit(*i);
|
||||
if (unit && unit->GetEntry() == NPC_STORMFORGED_LIEUTENANT)
|
||||
{
|
||||
target = unit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// There are two, we don't want to ping-pong between them if we're attacking one already
|
||||
if (!target || AI_VALUE(Unit*, "current target") == target)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Attack(target);
|
||||
}
|
||||
|
||||
bool AvoidWhirlwindAction::Execute(Event event)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "general bjarngrim");
|
||||
if (!boss) { return false; }
|
||||
|
||||
float distance = bot->GetExactDist2d(boss->GetPosition());
|
||||
float radius = 8.0f;
|
||||
float distanceExtra = 2.0f;
|
||||
|
||||
if (distance < radius + distanceExtra)
|
||||
{
|
||||
return MoveAway(boss, radius + distanceExtra - distance);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool VolkhanTargetAction::Execute(Event event)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "volkhan");
|
||||
if (!boss || AI_VALUE(Unit*, "current target") == boss)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Attack(boss);
|
||||
}
|
||||
|
||||
bool StaticOverloadSpreadAction::Execute(Event event)
|
||||
{
|
||||
float radius = 8.0f;
|
||||
float distanceExtra = 2.0f;
|
||||
|
||||
GuidVector members = AI_VALUE(GuidVector, "group members");
|
||||
for (auto& member : members)
|
||||
{
|
||||
if (bot->GetGUID() == member)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Unit* unit = botAI->GetUnit(member);
|
||||
if (unit && unit->HasAura(SPELL_STATIC_OVERLOAD)
|
||||
&& bot->GetExactDist2d(unit) < radius)
|
||||
{
|
||||
return MoveAway(unit, radius + distanceExtra - bot->GetExactDist2d(unit));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool BallLightningSpreadAction::Execute(Event event)
|
||||
{
|
||||
float radius = 6.0f;
|
||||
float distanceExtra = 1.0f;
|
||||
|
||||
GuidVector members = AI_VALUE(GuidVector, "group members");
|
||||
for (auto& member : members)
|
||||
{
|
||||
if (bot->GetGUID() == member)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Unit* unit = botAI->GetUnit(member);
|
||||
if (unit && bot->GetExactDist2d(unit) < radius + distanceExtra)
|
||||
{
|
||||
return MoveAway(unit, radius + distanceExtra - bot->GetExactDist2d(unit));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IonarTankPositionAction::isUseful() { return bot->GetExactDist2d(IONAR_TANK_POSITION) > 10.0f; }
|
||||
bool IonarTankPositionAction::Execute(Event event)
|
||||
{
|
||||
return MoveTo(bot->GetMapId(), IONAR_TANK_POSITION.GetPositionX(), IONAR_TANK_POSITION.GetPositionY(), IONAR_TANK_POSITION.GetPositionZ(),
|
||||
false, false, false, true, MovementPriority::MOVEMENT_COMBAT);
|
||||
}
|
||||
|
||||
bool DispersePositionAction::isUseful() { return bot->GetExactDist2d(DISPERSE_POSITION) > 8.0f; }
|
||||
bool DispersePositionAction::Execute(Event event)
|
||||
{
|
||||
return MoveTo(bot->GetMapId(), DISPERSE_POSITION.GetPositionX(), DISPERSE_POSITION.GetPositionY(), DISPERSE_POSITION.GetPositionZ(),
|
||||
false, false, false, true, MovementPriority::MOVEMENT_COMBAT);
|
||||
}
|
||||
|
||||
bool LokenStackAction::isUseful()
|
||||
{
|
||||
// Minimum hunter range is 5, but values too close to this seem to cause issues..
|
||||
// Hunter bots will try and melee in between ranged attacks, or just melee entirely at 5 as they are in range.
|
||||
// 6.5 or 7.0 solves this.
|
||||
if(bot->getClass() == CLASS_HUNTER)
|
||||
{
|
||||
return AI_VALUE2(float, "distance", "current target") > 6.5f;
|
||||
}
|
||||
// else
|
||||
return AI_VALUE2(float, "distance", "current target") > 2.0f;
|
||||
}
|
||||
bool LokenStackAction::Execute(Event event)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "loken");
|
||||
if (!boss) { return false; }
|
||||
|
||||
if (!boss->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
if(bot->getClass() == CLASS_HUNTER)
|
||||
{
|
||||
return Move(bot->GetAngle(boss), fmin(bot->GetExactDist2d(boss) - 6.5f, 10.0f));
|
||||
}
|
||||
// else
|
||||
return Move(bot->GetAngle(boss), fmin(bot->GetExactDist2d(boss), 10.0f));
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool AvoidLightningNovaAction::Execute(Event event)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "loken");
|
||||
if (!boss) { return false; }
|
||||
|
||||
float distance = bot->GetExactDist2d(boss->GetPosition());
|
||||
float radius = 20.0f;
|
||||
float distanceExtra = 2.0f;
|
||||
|
||||
if (distance < radius + distanceExtra)
|
||||
{
|
||||
return MoveAway(boss, radius + distanceExtra - distance);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user