mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-02-14 15:53:45 +00:00
50 lines
1.9 KiB
C++
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;
|
|
}
|