Files
mod-playerbots/src/strategy/raids/aq20/RaidAq20Actions.cpp
2024-09-01 20:09:35 +10:00

50 lines
1.9 KiB
C++

#include "RaidAq20Actions.h"
#include "Playerbots.h"
#include "RaidAq20Utils.h"
bool Aq20UseCrystalAction::Execute(Event event)
{
if (Unit* boss = AI_VALUE2(Unit*, "find target", "ossirian the unscarred"))
{
if (GameObject* crystal = RaidAq20Utils::GetNearestCrystal(boss))
{
float botDist = bot->GetDistance(crystal);
if (botDist > INTERACTION_DISTANCE)
return MoveTo(bot->GetMapId(),
crystal->GetPositionX() + frand(-3.5f, 3.5f),
crystal->GetPositionY() + frand(-3.5f, 3.5f),
crystal->GetPositionZ());
// if we're already in range just wait here until it's time to activate crystal
SetNextMovementDelay(500);
// don't activate crystal if boss too far or its already been activated
if (boss->GetDistance(crystal) > 25.0f ||
crystal->HasGameObjectFlag(GO_FLAG_IN_USE))
return false;
// don't activate crystal if boss doesn't have buff yet AND isn't going to have it soon
// (though ideally bot should activate it ~5 seconds early due to time it takes for
// crystal to activate and remove buff)
if (!RaidAq20Utils::IsOssirianBuffActive(boss) &&
RaidAq20Utils::GetOssirianDebuffTimeRemaining(boss) > 5000)
return false;
// this makes crystal do its animation (then disappear after)
WorldPacket data1(CMSG_GAMEOBJ_USE);
data1 << crystal->GetGUID();
bot->GetSession()->HandleGameObjectUseOpcode(data1);
// this makes crystal actually remove the buff and put on debuff (took a while to figure that out)
WorldPacket data2(CMSG_GAMEOBJ_USE);
data2 << crystal->GetGUID();
bot->GetSession()->HandleGameobjectReportUse(data2);
return true;
}
}
return false;
}