mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-02-13 15:23:46 +00:00
Wotlk dungeon structure & Utgarde Keep
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
#include "UtgardeKeepMultipliers.h"
|
||||
#include "UtgardeKeepActions.h"
|
||||
#include "GenericSpellActions.h"
|
||||
#include "ChooseTargetActions.h"
|
||||
#include "UtgardeKeepTriggers.h"
|
||||
|
||||
float PrinceKelesethMultiplier::GetValue(Action* action)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "prince keleseth");
|
||||
|
||||
if (!boss)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
if (dynamic_cast<DpsAssistAction*>(action))
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
return 1.0f;
|
||||
}
|
||||
float SkarvaldAndDalronnMultiplier::GetValue(Action* action)
|
||||
{
|
||||
// Unit* skarvald = AI_VALUE2(Unit*, "find target", "skarvald the constructor");
|
||||
Unit* dalronn = AI_VALUE2(Unit*, "find target", "dalronn the controller");
|
||||
|
||||
if (!dalronn)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
if (dynamic_cast<DpsAssistAction*>(action))
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
float IngvarThePlundererMultiplier::GetValue(Action* action)
|
||||
{
|
||||
Unit* boss = AI_VALUE2(Unit*, "find target", "ingvar the plunderer");
|
||||
bool isTank = botAI->IsTank(bot);
|
||||
if (!boss)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
// Prevent movement actions overriding current movement, we're probably dodging a slam
|
||||
if (isTank && bot->isMoving() && dynamic_cast<MovementAction*>(action))
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
// If boss is casting a roar, do not allow beginning a spell cast that is non-instant
|
||||
if (boss->HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
if (boss->FindCurrentSpellBySpellId(SPELL_STAGGERING_ROAR) ||
|
||||
boss->FindCurrentSpellBySpellId(SPELL_DREADFUL_ROAR))
|
||||
{
|
||||
if (dynamic_cast<CastSpellAction*>(action))
|
||||
{
|
||||
std::string const name = action->getName();
|
||||
uint32 spellId = AI_VALUE2(uint32, "spell id", name);
|
||||
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
||||
if (!spellInfo)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
uint32 castTime = spellInfo->CalcCastTime(bot);
|
||||
if (castTime != 0)
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Done with non-tank logic
|
||||
if (!isTank)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
// TANK ONLY
|
||||
if (boss->FindCurrentSpellBySpellId(SPELL_SMASH) ||
|
||||
boss->FindCurrentSpellBySpellId(SPELL_DARK_SMASH))
|
||||
{
|
||||
// Prevent movement actions during smash which can mess up boss position.
|
||||
// Allow through IngvarDodgeSmashAction only, as well as any non-movement actions.
|
||||
if (dynamic_cast<MovementAction*>(action) && !dynamic_cast<IngvarDodgeSmashAction*>(action))
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1.0f;
|
||||
}
|
||||
Reference in New Issue
Block a user