Files
mod-playerbots/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleActions.cpp
Bobblybook 3aa43cbb3c UP and CoS dungeons
- Utgarde Pinnacle implementation
- Culling of Stratholme implementation
- Added additional value ("nearest hostile npcs") needed to expose some hidden trigger-type npc units (eg. frost breath on Skadi fight in UP)
2024-11-03 21:19:04 +08:00

62 lines
1.9 KiB
C++

#include "Playerbots.h"
#include "UtgardePinnacleActions.h"
#include "UtgardePinnacleStrategy.h"
bool AvoidFreezingCloudAction::Execute(Event event)
{
Unit* closestTrigger = nullptr;
GuidVector objects = AI_VALUE(GuidVector, "nearest hostile npcs");
for (auto i = objects.begin(); i != objects.end(); ++i)
{
Unit* unit = botAI->GetUnit(*i);
if (unit && unit->GetEntry() == NPC_BREATH_TRIGGER)
{
if (!closestTrigger || bot->GetExactDist2d(unit) < bot->GetExactDist2d(closestTrigger))
{
closestTrigger = unit;
}
}
}
if (!closestTrigger) { return false; }
float distance = bot->GetExactDist2d(closestTrigger->GetPosition());
float radius = 3.0f;
// Large buffer for this - the radius of the breath is a lot smaller than the graphic, but it looks dumb
// if the bot stands just outside the hitbox but still visibly in the cloud patches.
float distanceExtra = 3.0f;
if (distance < radius + distanceExtra - 1.0f)
{
// bot->Yell("MOVING", LANG_UNIVERSAL);
return MoveAway(closestTrigger, radius + distanceExtra - distance);
}
return false;
}
bool AvoidSkadiWhirlwindAction::Execute(Event event)
{
Unit* boss = AI_VALUE2(Unit*, "find target", "skadi the ruthless");
if (!boss) { return false; }
float distance = bot->GetExactDist2d(boss->GetPosition());
float radius = 5.0f;
float distanceExtra = 2.0f;
if (distance < radius + distanceExtra)
{
if (botAI->IsTank(bot))
{
// The boss chases tank during this, leads to jittery stutter-stepping
// by the tank if we don't pre-move additional range. 2*radius seems ok
return MoveAway(boss, (2.0f * radius) + distanceExtra - distance);
}
// else
return MoveAway(boss, radius + distanceExtra - distance);
}
return false;
}