Files
mod-playerbots/src/Ai/Raid/Onyxia/Trigger/RaidOnyxiaTriggers.cpp
gtkk f5711dc6f7 FIX Onyxia Crash (#2062)
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.
2026-01-25 14:03:53 +01:00

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