mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-25 14:36:22 +00:00
Solve these two problems #2043 #1981 @Regrad is the main contributor of the code, while I was just helping to submit the pull request. Express my gratitude to him. After testing, the code is proven to be effective.
111 lines
3.3 KiB
C++
111 lines
3.3 KiB
C++
#include "RaidOnyxiaTriggers.h"
|
|
|
|
#include "GenericTriggers.h"
|
|
#include "ObjectAccessor.h"
|
|
#include "PlayerbotAI.h"
|
|
#include "Playerbots.h"
|
|
#include "NearestNpcsValue.h"
|
|
|
|
OnyxiaDeepBreathTrigger::OnyxiaDeepBreathTrigger(PlayerbotAI* botAI) : Trigger(botAI, "ony deep breath warning") {}
|
|
|
|
bool OnyxiaDeepBreathTrigger::IsActive()
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia");
|
|
if (!boss || !boss->HasUnitState(UNIT_STATE_CASTING))
|
|
return false;
|
|
|
|
// Check if Onyxia is casting
|
|
Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL);
|
|
|
|
if (!currentSpell || !currentSpell->m_spellInfo)
|
|
return false;
|
|
|
|
uint32 spellId = currentSpell->m_spellInfo->Id;
|
|
|
|
if (spellId == 17086 || // North to South
|
|
spellId == 18351 || // South to North
|
|
spellId == 18576 || // East to West
|
|
spellId == 18609 || // West to East
|
|
spellId == 18564 || // Southeast to Northwest
|
|
spellId == 18584 || // Northwest to Southeast
|
|
spellId == 18596 || // Southwest to Northeast
|
|
spellId == 18617 // Northeast to Southwest
|
|
)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
OnyxiaNearTailTrigger::OnyxiaNearTailTrigger(PlayerbotAI* botAI) : Trigger(botAI, "ony near tail") {}
|
|
|
|
bool OnyxiaNearTailTrigger::IsActive()
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia");
|
|
if (!boss || botAI->IsTank(bot))
|
|
return false;
|
|
|
|
// Skip if Onyxia is in air or transitioning
|
|
if (!boss->IsInCombat() || boss->IsFlying() || !boss->GetVictim())
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
RaidOnyxiaFireballSplashTrigger::RaidOnyxiaFireballSplashTrigger(PlayerbotAI* botAI)
|
|
: Trigger(botAI, "ony fireball splash incoming")
|
|
{
|
|
}
|
|
|
|
bool RaidOnyxiaFireballSplashTrigger::IsActive()
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia");
|
|
if (!boss || !boss->HasUnitState(UNIT_STATE_CASTING))
|
|
return false;
|
|
|
|
// Check if Onyxia is casting Fireball
|
|
Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL);
|
|
if (!currentSpell || !currentSpell->m_spellInfo || currentSpell->m_spellInfo->Id != 18392) // 18392 is the classic Fireball ID // 18392 is the classic Fireball ID
|
|
return false;
|
|
|
|
GuidVector nearbyUnits = AI_VALUE(GuidVector, "nearest friendly players");
|
|
|
|
for (ObjectGuid guid : nearbyUnits)
|
|
{
|
|
Unit* unit = botAI->GetUnit(guid);
|
|
if (!unit || unit == bot || !unit->IsAlive())
|
|
continue;
|
|
|
|
if (bot->GetDistance(unit) < 8.0f)
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
RaidOnyxiaWhelpsSpawnTrigger::RaidOnyxiaWhelpsSpawnTrigger(PlayerbotAI* botAI) : Trigger(botAI, "ony whelps spawn") {}
|
|
|
|
bool RaidOnyxiaWhelpsSpawnTrigger::IsActive()
|
|
{
|
|
Unit* boss = AI_VALUE2(Unit*, "find target", "onyxia");
|
|
if (!boss)
|
|
return false;
|
|
|
|
return !botAI->IsHeal(bot) && boss->IsFlying(); // DPS + Tanks only
|
|
}
|
|
|
|
OnyxiaAvoidEggsTrigger::OnyxiaAvoidEggsTrigger(PlayerbotAI* botAI) : Trigger(botAI, "ony avoid eggs") {}
|
|
|
|
bool OnyxiaAvoidEggsTrigger::IsActive()
|
|
{
|
|
Position botPos = Position(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ());
|
|
|
|
if (botPos.GetExactDist2d(-35.0f, -165.0f) <= 5.0f)
|
|
return true;
|
|
|
|
if (botPos.GetExactDist2d(-35.0f, -260.0f) <= 5.0f)
|
|
return true;
|
|
|
|
return false;
|
|
}
|