Files
mod-playerbots/src/strategy/raids/ulduar/RaidUlduarActions.h
kadeshar 77c2354c3f Yogg-Saron strategy (#1565)
* - wip

* - Added Yogg-Saron strategy

* - Added Yogg-Saron sanity strategy

* - WIP

* - WIP

* - WIP

* - WIP

* - Added Yogg-Saron strategy

* - code refactoring

* - Code fix after pr
2025-08-18 12:02:19 +02:00

504 lines
14 KiB
C++

#ifndef _PLAYERBOT_RAIDULDUARACTIONS_H
#define _PLAYERBOT_RAIDULDUARACTIONS_H
#include "Action.h"
#include "AttackAction.h"
#include "GenericActions.h"
#include "GenericSpellActions.h"
#include "MovementActions.h"
#include "PlayerbotAI.h"
#include "Playerbots.h"
#include "RaidUlduarBossHelper.h"
#include "RaidUlduarTriggers.h"
#include "Vehicle.h"
//
// Flame Leviathan
//
class FlameLeviathanVehicleAction : public MovementAction
{
public:
FlameLeviathanVehicleAction(PlayerbotAI* botAI) : MovementAction(botAI, "flame leviathan vehicle") {}
bool Execute(Event event) override;
protected:
bool MoveAvoidChasing(Unit* target);
bool DemolisherAction(Unit* target);
bool DemolisherTurretAction(Unit* target);
bool SiegeEngineAction(Unit* target);
bool SiegeEngineTurretAction(Unit* target);
bool ChopperAction(Unit* target);
Unit* GetAttacker();
Unit* vehicleBase_;
Vehicle* vehicle_;
int avoidChaseIdx = -1;
};
class FlameLeviathanEnterVehicleAction : public MovementAction
{
public:
FlameLeviathanEnterVehicleAction(PlayerbotAI* botAI) : MovementAction(botAI, "flame leviathan enter vehicle") {}
bool Execute(Event event);
protected:
bool EnterVehicle(Unit* vehicleBase, bool moveIfFar);
bool ShouldEnter(Unit* vehicleBase);
bool AllMainVehiclesOnUse();
};
//
// Razorscale
//
class RazorscaleAvoidDevouringFlameAction : public MovementAction
{
public:
RazorscaleAvoidDevouringFlameAction(PlayerbotAI* botAI) : MovementAction(botAI, "razorscale avoid devouring flames") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleAvoidSentinelAction : public MovementAction
{
public:
RazorscaleAvoidSentinelAction(PlayerbotAI* botAI) : MovementAction(botAI, "razorscale avoid sentinel") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleIgnoreBossAction : public AttackAction
{
public:
RazorscaleIgnoreBossAction(PlayerbotAI* botAI) : AttackAction(botAI, "razorscale ignore flying alone") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleAvoidWhirlwindAction : public MovementAction
{
public:
RazorscaleAvoidWhirlwindAction(PlayerbotAI* botAI) : MovementAction(botAI, "razorscale avoid whirlwind") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleGroundedAction : public AttackAction
{
public:
RazorscaleGroundedAction(PlayerbotAI* botAI) : AttackAction(botAI, "razorscale grounded") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleHarpoonAction : public MovementAction
{
public:
RazorscaleHarpoonAction(PlayerbotAI* botAI) : MovementAction(botAI, "razorscale harpoon action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class RazorscaleFuseArmorAction : public MovementAction
{
public:
RazorscaleFuseArmorAction(PlayerbotAI* botAI) : MovementAction(botAI, "razorscale fuse armor action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class HodirMoveSnowpackedIcicleAction : public MovementAction
{
public:
HodirMoveSnowpackedIcicleAction(PlayerbotAI* botAI) : MovementAction(botAI, "hodir move snowpacked icicle") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class IronAssemblyLightningTendrilsAction : public MovementAction
{
public:
IronAssemblyLightningTendrilsAction(PlayerbotAI* botAI) : MovementAction(botAI, "iron assembly lightning tendrils action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class IronAssemblyOverloadAction : public MovementAction
{
public:
IronAssemblyOverloadAction(PlayerbotAI* botAI) : MovementAction(botAI, "iron assembly overload action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class IronAssemblyRuneOfPowerAction : public MovementAction
{
public:
IronAssemblyRuneOfPowerAction(PlayerbotAI* botAI) : MovementAction(botAI, "iron assembly rune of power action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class KologarnMarkDpsTargetAction : public Action
{
public:
KologarnMarkDpsTargetAction(PlayerbotAI* botAI) : Action(botAI, "kologarn mark dps target action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class KologarnFallFromFloorAction : public Action
{
public:
KologarnFallFromFloorAction(PlayerbotAI* botAI) : Action(botAI, "kologarn fall from floor action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class KologarnRubbleSlowdownAction : public Action
{
public:
KologarnRubbleSlowdownAction(PlayerbotAI* botAI) : Action(botAI, "kologarn rubble slowdown action") {}
bool Execute(Event event) override;
};
class KologarnEyebeamAction : public MovementAction
{
public:
KologarnEyebeamAction(PlayerbotAI* botAI) : MovementAction(botAI, "kologarn eyebeam action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class KologarnRtiTargetAction : public Action
{
public:
KologarnRtiTargetAction(PlayerbotAI* botAI) : Action(botAI, "kologarn rti target action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class KologarnCrunchArmorAction : public Action
{
public:
KologarnCrunchArmorAction(PlayerbotAI* botAI) : Action(botAI, "kologarn crunch armor action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class AuriayaFallFromFloorAction : public Action
{
public:
AuriayaFallFromFloorAction(PlayerbotAI* botAI) : Action(botAI, "auriaya fall from floor action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class HodirBitingColdJumpAction : public MovementAction
{
public:
HodirBitingColdJumpAction(PlayerbotAI* ai) : MovementAction(ai, "hodir biting cold jump") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class FreyaMoveAwayNatureBombAction : public MovementAction
{
public:
FreyaMoveAwayNatureBombAction(PlayerbotAI* botAI) : MovementAction(botAI, "freya move away nature bomb") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class FreyaMarkDpsTargetAction : public MovementAction
{
public:
FreyaMarkDpsTargetAction(PlayerbotAI* botAI) : MovementAction(botAI, "freya mark dps target action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class FreyaMoveToHealingSporeAction : public MovementAction
{
public:
FreyaMoveToHealingSporeAction(PlayerbotAI* ai) : MovementAction(ai, "freya move to healing spore action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimUnbalancingStrikeAction : public Action
{
public:
ThorimUnbalancingStrikeAction(PlayerbotAI* ai) : Action(ai, "thorim unbalancing strike action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimMarkDpsTargetAction : public Action
{
public:
ThorimMarkDpsTargetAction(PlayerbotAI* ai) : Action(ai, "thorim mark dps target action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimArenaPositioningAction : public MovementAction
{
public:
ThorimArenaPositioningAction(PlayerbotAI* ai) : MovementAction(ai, "thorim arena positioning action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimGauntletPositioningAction : public MovementAction
{
public:
ThorimGauntletPositioningAction(PlayerbotAI* ai) : MovementAction(ai, "thorim gauntlet positioning action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimFallFromFloorAction : public Action
{
public:
ThorimFallFromFloorAction(PlayerbotAI* botAI) : Action(botAI, "thorim fall from floor action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class ThorimPhase2PositioningAction : public MovementAction
{
public:
ThorimPhase2PositioningAction(PlayerbotAI* ai) : MovementAction(ai, "thorim phase 2 positioning action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class MimironShockBlastAction : public MovementAction
{
public:
MimironShockBlastAction(PlayerbotAI* ai) : MovementAction(ai, "mimiron shock blast action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class MimironPhase1PositioningAction : public MovementAction
{
public:
MimironPhase1PositioningAction(PlayerbotAI* ai) : MovementAction(ai, "mimiron phase 1 positioning action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class MimironP3Wx2LaserBarrageAction : public MovementAction
{
public:
MimironP3Wx2LaserBarrageAction(PlayerbotAI* ai, float distance = 24.0f, float delta_angle = M_PI / 8)
: MovementAction(ai, "mimiron p3wx2 laser barrage action")
{
this->distance = distance;
this->delta_angle = delta_angle;
}
virtual bool Execute(Event event);
protected:
float distance, delta_angle;
};
class MimironRapidBurstAction : public MovementAction
{
public:
MimironRapidBurstAction(PlayerbotAI* ai) : MovementAction(ai, "mimiron rapid burst action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class MimironAerialCommandUnitAction : public Action
{
public:
MimironAerialCommandUnitAction(PlayerbotAI* ai) : Action(ai, "mimiron aerial command unit action") {}
bool Execute(Event event) override;
};
class MimironRocketStrikeAction : public MovementAction
{
public:
MimironRocketStrikeAction(PlayerbotAI* ai) : MovementAction(ai, "mimiron rocket strike action") {}
bool Execute(Event event) override;
bool isUseful() override;
};
class MimironPhase4MarkDpsAction : public Action
{
public:
MimironPhase4MarkDpsAction(PlayerbotAI* ai) : Action(ai, "mimiron phase 4 mark dps action") {}
bool Execute(Event event) override;
};
class MimironCheatAction : public Action
{
public:
MimironCheatAction(PlayerbotAI* ai) : Action(ai, "mimiron cheat action") {}
bool Execute(Event event) override;
};
class VezaxCheatAction : public Action
{
public:
VezaxCheatAction(PlayerbotAI* ai) : Action(ai, "vezax cheat action") {}
bool Execute(Event event) override;
};
class VezaxShadowCrashAction : public MovementAction
{
public:
VezaxShadowCrashAction(PlayerbotAI* ai) : MovementAction(ai, "vezax shadow crash action") {}
bool Execute(Event event) override;
};
class VezaxMarkOfTheFacelessAction : public MovementAction
{
public:
VezaxMarkOfTheFacelessAction(PlayerbotAI* ai) : MovementAction(ai, "vezax mark of the faceless action") {}
bool Execute(Event event) override;
};
class YoggSaronOminousCloudCheatAction : public Action
{
public:
YoggSaronOminousCloudCheatAction(PlayerbotAI* ai) : Action(ai, "yogg-saron ominous cloud cheat action") {}
bool Execute(Event event) override;
};
class YoggSaronGuardianPositioningAction : public MovementAction
{
public:
YoggSaronGuardianPositioningAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron guardian positioning action") {}
bool Execute(Event event) override;
};
class YoggSaronSanityAction : public MovementAction
{
public:
YoggSaronSanityAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron sanity action") {}
bool Execute(Event event) override;
};
class YoggSaronDeathOrbAction : public MoveAwayFromCreatureAction
{
public:
YoggSaronDeathOrbAction(PlayerbotAI* ai) : MoveAwayFromCreatureAction(ai, "yogg-saron death orb action", NPC_DEATH_ORB, 10.0f) {}
};
class YoggSaronMaladyOfTheMindAction : public MoveAwayFromPlayerWithDebuffAction
{
public:
YoggSaronMaladyOfTheMindAction(PlayerbotAI* ai) : MoveAwayFromPlayerWithDebuffAction(ai, "yogg-saron malady of the mind action", SPELL_MALADY_OF_THE_MIND, 15.0f) {}
};
class YoggSaronMarkTargetAction : public Action
{
public:
YoggSaronMarkTargetAction(PlayerbotAI* ai) : Action(ai, "yogg-saron mark target action") {}
bool Execute(Event event) override;
};
class YoggSaronBrainLinkAction : public MovementAction
{
public:
YoggSaronBrainLinkAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron brain link action") {}
bool Execute(Event event) override;
};
class YoggSaronMoveToEnterPortalAction : public MovementAction
{
public:
YoggSaronMoveToEnterPortalAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron move to enter portal action") {}
bool Execute(Event event) override;
};
class YoggSaronFallFromFloorAction : public MovementAction
{
public:
YoggSaronFallFromFloorAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron fall from floor action") {}
bool Execute(Event event) override;
};
class YoggSaronBossRoomMovementCheatAction : public MovementAction
{
public:
YoggSaronBossRoomMovementCheatAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron boss room movement cheat action") {}
bool Execute(Event event) override;
};
class YoggSaronUsePortalAction : public Action
{
public:
YoggSaronUsePortalAction(PlayerbotAI* ai) : Action(ai, "yogg-saron use portal action") {}
bool Execute(Event event) override;
};
class YoggSaronIllusionRoomAction : public MovementAction
{
public:
YoggSaronIllusionRoomAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron illusion room action") {}
bool Execute(Event event) override;
private:
bool SetRtiMark(YoggSaronTrigger yoggSaronTrigger);
bool SetIllusionRtiTarget(YoggSaronTrigger yoggSaronTrigger);
bool SetBrainRtiTarget(YoggSaronTrigger yoggSaronTrigger);
};
class YoggSaronMoveToExitPortalAction : public MovementAction
{
public:
YoggSaronMoveToExitPortalAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron move to exit portal action") {}
bool Execute(Event event) override;
};
class YoggSaronLunaticGazeAction : public MovementAction
{
public:
YoggSaronLunaticGazeAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron lunatic gaze action") {}
bool Execute(Event event) override;
};
class YoggSaronPhase3PositioningAction : public MovementAction
{
public:
YoggSaronPhase3PositioningAction(PlayerbotAI* ai) : MovementAction(ai, "yogg-saron phase 3 positioning action") {}
bool Execute(Event event) override;
};
#endif