#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; }