mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-03-01 14:47:48 +00:00
[HOT FIX] MS build issues regarding folder / command lenght usage or rc.exe (#2038)
This commit is contained in:
3288
src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp
Normal file
3288
src/Ai/Raid/Ulduar/Action/RaidUlduarActions.cpp
Normal file
File diff suppressed because it is too large
Load Diff
503
src/Ai/Raid/Ulduar/Action/RaidUlduarActions.h
Normal file
503
src/Ai/Raid/Ulduar/Action/RaidUlduarActions.h
Normal file
@@ -0,0 +1,503 @@
|
||||
#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
|
||||
28
src/Ai/Raid/Ulduar/Multiplier/RaidUlduarMultipliers.cpp
Normal file
28
src/Ai/Raid/Ulduar/Multiplier/RaidUlduarMultipliers.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
#include "RaidUlduarMultipliers.h"
|
||||
|
||||
#include "ChooseTargetActions.h"
|
||||
#include "DKActions.h"
|
||||
#include "DruidActions.h"
|
||||
#include "DruidBearActions.h"
|
||||
#include "FollowActions.h"
|
||||
#include "GenericActions.h"
|
||||
#include "GenericSpellActions.h"
|
||||
#include "HunterActions.h"
|
||||
#include "MageActions.h"
|
||||
#include "MovementActions.h"
|
||||
#include "PaladinActions.h"
|
||||
#include "PriestActions.h"
|
||||
#include "RaidUlduarActions.h"
|
||||
#include "ReachTargetActions.h"
|
||||
#include "RogueActions.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ShamanActions.h"
|
||||
#include "UseMeetingStoneAction.h"
|
||||
#include "WarriorActions.h"
|
||||
|
||||
float FlameLeviathanMultiplier::GetValue(Action* action)
|
||||
{
|
||||
// if (dynamic_cast<FleeAction*>(action))
|
||||
// return 0.0f;
|
||||
return 1.0f;
|
||||
}
|
||||
17
src/Ai/Raid/Ulduar/Multiplier/RaidUlduarMultipliers.h
Normal file
17
src/Ai/Raid/Ulduar/Multiplier/RaidUlduarMultipliers.h
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
#ifndef _PLAYERRBOT_RAIDULDUARMULTIPLIERS_H_
|
||||
#define _PLAYERRBOT_RAIDULDUARMULTIPLIERS_H_
|
||||
|
||||
#include "Multiplier.h"
|
||||
#include "Ai/Raid/Ulduar/RaidUlduarBossHelper.h"
|
||||
|
||||
class FlameLeviathanMultiplier : public Multiplier
|
||||
{
|
||||
public:
|
||||
FlameLeviathanMultiplier(PlayerbotAI* ai) : Multiplier(ai, "flame leviathan") {}
|
||||
|
||||
public:
|
||||
virtual float GetValue(Action* action);
|
||||
};
|
||||
|
||||
#endif
|
||||
158
src/Ai/Raid/Ulduar/RaidUlduarActionContext.h
Normal file
158
src/Ai/Raid/Ulduar/RaidUlduarActionContext.h
Normal file
@@ -0,0 +1,158 @@
|
||||
// /*
|
||||
// * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
||||
// and/or modify it under version 3 of the License, or (at your option), any later version.
|
||||
// */
|
||||
|
||||
#ifndef _PLAYERBOT_RAIDULDUARACTIONCONTEXT_H
|
||||
#define _PLAYERBOT_RAIDULDUARACTIONCONTEXT_H
|
||||
|
||||
#include "Action.h"
|
||||
#include "NamedObjectContext.h"
|
||||
#include "RaidUlduarActions.h"
|
||||
#include "BossAuraActions.h"
|
||||
|
||||
class RaidUlduarActionContext : public NamedObjectContext<Action>
|
||||
{
|
||||
public:
|
||||
RaidUlduarActionContext()
|
||||
{
|
||||
creators["flame leviathan vehicle"] = &RaidUlduarActionContext::flame_leviathan_vehicle;
|
||||
creators["flame leviathan enter vehicle"] = &RaidUlduarActionContext::flame_leviathan_enter_vehicle;
|
||||
creators["razorscale avoid devouring flames"] = &RaidUlduarActionContext::razorscale_avoid_devouring_flames;
|
||||
creators["razorscale avoid sentinel"] = &RaidUlduarActionContext::razorscale_avoid_sentinel;
|
||||
creators["razorscale ignore flying alone"] = &RaidUlduarActionContext::razorscale_ignore_flying_alone;
|
||||
creators["razorscale avoid whirlwind"] = &RaidUlduarActionContext::razorscale_avoid_whirlwind;
|
||||
creators["razorscale grounded"] = &RaidUlduarActionContext::razorscale_grounded;
|
||||
creators["razorscale harpoon action"] = &RaidUlduarActionContext::razorscale_harpoon_action;
|
||||
creators["razorscale fuse armor action"] = &RaidUlduarActionContext::razorscale_fuse_armor_action;
|
||||
creators["razorscale fire resistance action"] = &RaidUlduarActionContext::razorscale_fire_resistance_action;
|
||||
creators["ignis fire resistance action"] = &RaidUlduarActionContext::ignis_fire_resistance_action;
|
||||
creators["iron assembly lightning tendrils action"] = &RaidUlduarActionContext::iron_assembly_lightning_tendrils_action;
|
||||
creators["iron assembly overload action"] = &RaidUlduarActionContext::iron_assembly_overload_action;
|
||||
creators["iron assembly rune of power action"] = &RaidUlduarActionContext::iron_assembly_rune_of_power_action;
|
||||
creators["kologarn mark dps target action"] = &RaidUlduarActionContext::kologarn_mark_dps_target_action;
|
||||
creators["kologarn fall from floor action"] = &RaidUlduarActionContext::kologarn_fall_from_floor_action;
|
||||
creators["kologarn nature resistance action"] = &RaidUlduarActionContext::kologarn_nature_resistance_action;
|
||||
creators["kologarn rubble slowdown action"] = &RaidUlduarActionContext::kologarn_rubble_slowdown_action;
|
||||
creators["kologarn eyebeam action"] = &RaidUlduarActionContext::kologarn_eyebeam_action;
|
||||
creators["kologarn rti target action"] = &RaidUlduarActionContext::kologarn_rti_target_action;
|
||||
creators["kologarn crunch armor action"] = &RaidUlduarActionContext::kologarn_crunch_armor_action;
|
||||
creators["auriaya fall from floor action"] = &RaidUlduarActionContext::auriaya_fall_from_floor_action;
|
||||
creators["hodir move snowpacked icicle"] = &RaidUlduarActionContext::hodir_move_snowpacked_icicle;
|
||||
creators["hodir biting cold jump"] = &RaidUlduarActionContext::hodir_biting_cold_jump;
|
||||
creators["hodir frost resistance action"] = &RaidUlduarActionContext::hodir_frost_resistance_action;
|
||||
creators["freya move away nature bomb"] = &RaidUlduarActionContext::freya_move_away_nature_bomb;
|
||||
creators["freya fire resistance action"] = &RaidUlduarActionContext::freya_fire_resistance_action;
|
||||
creators["freya nature resistance action"] = &RaidUlduarActionContext::freya_nature_resistance_action;
|
||||
creators["freya mark dps target action"] = &RaidUlduarActionContext::freya_mark_dps_target_action;
|
||||
creators["freya move to healing spore action"] = &RaidUlduarActionContext::freya_move_to_healing_spore_action;
|
||||
creators["thorim frost resistance action"] = &RaidUlduarActionContext::thorim_frost_resistance_action;
|
||||
creators["thorim nature resistance action"] = &RaidUlduarActionContext::thorim_nature_resistance_action;
|
||||
creators["thorim unbalancing strike action"] = &RaidUlduarActionContext::thorim_unbalancing_strike_action;
|
||||
creators["thorim mark dps target action"] = &RaidUlduarActionContext::thorim_mark_dps_target_action;
|
||||
creators["thorim arena positioning action"] = &RaidUlduarActionContext::thorim_arena_positioning_action;
|
||||
creators["thorim gauntlet positioning action"] = &RaidUlduarActionContext::thorim_gauntlet_positioning_action;
|
||||
creators["thorim phase 2 positioning action"] = &RaidUlduarActionContext::thorim_phase2_positioning_action;
|
||||
creators["mimiron fire resistance action"] = &RaidUlduarActionContext::mimiron_fire_resistance_action;
|
||||
creators["mimiron shock blast action"] = &RaidUlduarActionContext::mimiron_shock_blast_action;
|
||||
creators["mimiron phase 1 positioning action"] = &RaidUlduarActionContext::mimiron_phase_1_positioning_action;
|
||||
creators["mimiron p3wx2 laser barrage action"] = &RaidUlduarActionContext::mimiron_p3wx2_laser_barrage_action;
|
||||
creators["mimiron rapid burst action"] = &RaidUlduarActionContext::mimiron_rapid_burst_action;
|
||||
creators["mimiron aerial command unit action"] = &RaidUlduarActionContext::mimiron_aerial_command_unit_action;
|
||||
creators["mimiron rocket strike action"] = &RaidUlduarActionContext::mimiron_rocket_strike_action;
|
||||
creators["mimiron phase 4 mark dps action"] = &RaidUlduarActionContext::mimiron_phase_4_mark_dps_action;
|
||||
creators["mimiron cheat action"] = &RaidUlduarActionContext::mimiron_cheat_action;
|
||||
creators["vezax cheat action"] = &RaidUlduarActionContext::vezax_cheat_action;
|
||||
creators["vezax shadow crash action"] = &RaidUlduarActionContext::vezax_shadow_crash_action;
|
||||
creators["vezax mark of the faceless action"] = &RaidUlduarActionContext::vezax_mark_of_the_faceless_action;
|
||||
creators["vezax shadow resistance action"] = &RaidUlduarActionContext::vezax_shadow_resistance_action;
|
||||
creators["sara shadow resistance action"] = &RaidUlduarActionContext::sara_shadow_resistance_action;
|
||||
creators["yogg-saron shadow resistance action"] = &RaidUlduarActionContext::yogg_saron_shadow_resistance_action;
|
||||
creators["yogg-saron ominous cloud cheat action"] = &RaidUlduarActionContext::yogg_saron_ominous_cloud_cheat_action;
|
||||
creators["yogg-saron guardian positioning action"] = &RaidUlduarActionContext::yogg_saron_guardian_positioning_action;
|
||||
creators["yogg-saron sanity action"] = &RaidUlduarActionContext::yogg_saron_sanity_action;
|
||||
creators["yogg-saron death orb action"] = &RaidUlduarActionContext::yogg_saron_death_orb_action;
|
||||
creators["yogg-saron malady of the mind action"] = &RaidUlduarActionContext::yogg_saron_malady_of_the_mind_action;
|
||||
creators["yogg-saron mark target action"] = &RaidUlduarActionContext::yogg_saron_mark_target_action;
|
||||
creators["yogg-saron brain link action"] = &RaidUlduarActionContext::yogg_saron_brain_link_action;
|
||||
creators["yogg-saron move to enter portal action"] = &RaidUlduarActionContext::yogg_saron_move_to_enter_portal_action;
|
||||
creators["yogg-saron use portal action"] = &RaidUlduarActionContext::yogg_saron_use_portal_action;
|
||||
creators["yogg-saron fall from floor action"] = &RaidUlduarActionContext::yogg_saron_fall_from_floor_action;
|
||||
creators["yogg-saron boss room movement cheat action"] = &RaidUlduarActionContext::yogg_saron_boss_room_movement_cheat_action;
|
||||
creators["yogg-saron illusion room action"] = &RaidUlduarActionContext::yogg_saron_illusion_room_action;
|
||||
creators["yogg-saron move to exit portal action"] = &RaidUlduarActionContext::yogg_saron_move_to_exit_portal_action;
|
||||
creators["yogg-saron lunatic gaze action"] = &RaidUlduarActionContext::yogg_saron_lunatic_gaze_action;
|
||||
creators["yogg-saron phase 3 positioning action"] = &RaidUlduarActionContext::yogg_saron_phase_3_positioning_action;
|
||||
}
|
||||
|
||||
private:
|
||||
static Action* flame_leviathan_vehicle(PlayerbotAI* ai) { return new FlameLeviathanVehicleAction(ai); }
|
||||
static Action* flame_leviathan_enter_vehicle(PlayerbotAI* ai) { return new FlameLeviathanEnterVehicleAction(ai); }
|
||||
static Action* razorscale_avoid_devouring_flames(PlayerbotAI* ai) { return new RazorscaleAvoidDevouringFlameAction(ai); }
|
||||
static Action* razorscale_avoid_sentinel(PlayerbotAI* ai) { return new RazorscaleAvoidSentinelAction(ai); }
|
||||
static Action* razorscale_ignore_flying_alone(PlayerbotAI* ai) { return new RazorscaleIgnoreBossAction(ai); }
|
||||
static Action* razorscale_avoid_whirlwind(PlayerbotAI* ai) { return new RazorscaleAvoidWhirlwindAction(ai); }
|
||||
static Action* razorscale_grounded(PlayerbotAI* ai) { return new RazorscaleGroundedAction(ai); }
|
||||
static Action* razorscale_harpoon_action(PlayerbotAI* ai) { return new RazorscaleHarpoonAction(ai); }
|
||||
static Action* razorscale_fuse_armor_action(PlayerbotAI* ai) { return new RazorscaleFuseArmorAction(ai); }
|
||||
static Action* razorscale_fire_resistance_action(PlayerbotAI* ai) { return new BossFireResistanceAction(ai, "razorscale"); }
|
||||
static Action* ignis_fire_resistance_action(PlayerbotAI* ai) { return new BossFireResistanceAction(ai, "ignis the furnace master"); }
|
||||
static Action* iron_assembly_lightning_tendrils_action(PlayerbotAI* ai) { return new IronAssemblyLightningTendrilsAction(ai); }
|
||||
static Action* iron_assembly_overload_action(PlayerbotAI* ai) { return new IronAssemblyOverloadAction(ai); }
|
||||
static Action* iron_assembly_rune_of_power_action(PlayerbotAI* ai) { return new IronAssemblyRuneOfPowerAction(ai); }
|
||||
static Action* kologarn_mark_dps_target_action(PlayerbotAI* ai) { return new KologarnMarkDpsTargetAction(ai); }
|
||||
static Action* kologarn_fall_from_floor_action(PlayerbotAI* ai) { return new KologarnFallFromFloorAction(ai); }
|
||||
static Action* kologarn_nature_resistance_action(PlayerbotAI* ai) { return new BossNatureResistanceAction(ai, "kologarn"); }
|
||||
static Action* kologarn_rubble_slowdown_action(PlayerbotAI* ai) { return new KologarnRubbleSlowdownAction(ai); }
|
||||
static Action* kologarn_eyebeam_action(PlayerbotAI* ai) { return new KologarnEyebeamAction(ai); }
|
||||
static Action* kologarn_rti_target_action(PlayerbotAI* ai) { return new KologarnRtiTargetAction(ai); }
|
||||
static Action* kologarn_crunch_armor_action(PlayerbotAI* ai) { return new KologarnCrunchArmorAction(ai); }
|
||||
static Action* auriaya_fall_from_floor_action(PlayerbotAI* ai) { return new AuriayaFallFromFloorAction(ai); }
|
||||
static Action* hodir_move_snowpacked_icicle(PlayerbotAI* ai) { return new HodirMoveSnowpackedIcicleAction(ai); }
|
||||
static Action* hodir_biting_cold_jump(PlayerbotAI* ai) { return new HodirBitingColdJumpAction(ai); }
|
||||
static Action* hodir_frost_resistance_action(PlayerbotAI* ai) { return new BossFrostResistanceAction(ai, "hodir"); }
|
||||
static Action* freya_move_away_nature_bomb(PlayerbotAI* ai) { return new FreyaMoveAwayNatureBombAction(ai); }
|
||||
static Action* freya_fire_resistance_action(PlayerbotAI* ai) { return new BossFireResistanceAction(ai, "freya"); }
|
||||
static Action* freya_nature_resistance_action(PlayerbotAI* ai) { return new BossNatureResistanceAction(ai, "freya"); }
|
||||
static Action* freya_mark_dps_target_action(PlayerbotAI* ai) { return new FreyaMarkDpsTargetAction(ai); }
|
||||
static Action* freya_move_to_healing_spore_action(PlayerbotAI* ai) { return new FreyaMoveToHealingSporeAction(ai); }
|
||||
static Action* thorim_frost_resistance_action(PlayerbotAI* ai) { return new BossFrostResistanceAction(ai, "thorim"); }
|
||||
static Action* thorim_nature_resistance_action(PlayerbotAI* ai) { return new BossNatureResistanceAction(ai, "thorim"); }
|
||||
static Action* thorim_unbalancing_strike_action(PlayerbotAI* ai) { return new ThorimUnbalancingStrikeAction(ai); }
|
||||
static Action* thorim_mark_dps_target_action(PlayerbotAI* ai) { return new ThorimMarkDpsTargetAction(ai); }
|
||||
static Action* thorim_arena_positioning_action(PlayerbotAI* ai) { return new ThorimArenaPositioningAction(ai); }
|
||||
static Action* thorim_gauntlet_positioning_action(PlayerbotAI* ai) { return new ThorimGauntletPositioningAction(ai); }
|
||||
static Action* thorim_phase2_positioning_action(PlayerbotAI* ai) { return new ThorimPhase2PositioningAction(ai); }
|
||||
static Action* mimiron_fire_resistance_action(PlayerbotAI* ai) { return new BossFireResistanceAction(ai, "mimiron"); }
|
||||
static Action* mimiron_shock_blast_action(PlayerbotAI* ai) { return new MimironShockBlastAction(ai); }
|
||||
static Action* mimiron_phase_1_positioning_action(PlayerbotAI* ai) { return new MimironPhase1PositioningAction(ai); }
|
||||
static Action* mimiron_p3wx2_laser_barrage_action(PlayerbotAI* ai) { return new MimironP3Wx2LaserBarrageAction(ai); }
|
||||
static Action* mimiron_rapid_burst_action(PlayerbotAI* ai) { return new MimironRapidBurstAction(ai); }
|
||||
static Action* mimiron_aerial_command_unit_action(PlayerbotAI* ai) { return new MimironAerialCommandUnitAction(ai); }
|
||||
static Action* mimiron_rocket_strike_action(PlayerbotAI* ai) { return new MimironRocketStrikeAction(ai); }
|
||||
static Action* mimiron_phase_4_mark_dps_action(PlayerbotAI* ai) { return new MimironPhase4MarkDpsAction(ai); }
|
||||
static Action* mimiron_cheat_action(PlayerbotAI* ai) { return new MimironCheatAction(ai); }
|
||||
static Action* vezax_cheat_action(PlayerbotAI* ai) { return new VezaxCheatAction(ai); }
|
||||
static Action* vezax_shadow_crash_action(PlayerbotAI* ai) { return new VezaxShadowCrashAction(ai); }
|
||||
static Action* vezax_mark_of_the_faceless_action(PlayerbotAI* ai) { return new VezaxMarkOfTheFacelessAction(ai); }
|
||||
static Action* vezax_shadow_resistance_action(PlayerbotAI* ai) { return new BossShadowResistanceAction(ai, "general vezax"); }
|
||||
static Action* sara_shadow_resistance_action(PlayerbotAI* ai) { return new BossShadowResistanceAction(ai, "sara"); }
|
||||
static Action* yogg_saron_shadow_resistance_action(PlayerbotAI* ai) { return new BossShadowResistanceAction(ai, "yogg-saron"); }
|
||||
static Action* yogg_saron_ominous_cloud_cheat_action(PlayerbotAI* ai) { return new YoggSaronOminousCloudCheatAction(ai); }
|
||||
static Action* yogg_saron_guardian_positioning_action(PlayerbotAI* ai) { return new YoggSaronGuardianPositioningAction(ai); }
|
||||
static Action* yogg_saron_sanity_action(PlayerbotAI* ai) { return new YoggSaronSanityAction(ai); }
|
||||
static Action* yogg_saron_death_orb_action(PlayerbotAI* ai) { return new YoggSaronDeathOrbAction(ai); }
|
||||
static Action* yogg_saron_malady_of_the_mind_action(PlayerbotAI* ai) { return new YoggSaronMaladyOfTheMindAction(ai); }
|
||||
static Action* yogg_saron_mark_target_action(PlayerbotAI* ai) { return new YoggSaronMarkTargetAction(ai); }
|
||||
static Action* yogg_saron_brain_link_action(PlayerbotAI* ai) { return new YoggSaronBrainLinkAction(ai); }
|
||||
static Action* yogg_saron_move_to_enter_portal_action(PlayerbotAI* ai) { return new YoggSaronMoveToEnterPortalAction(ai); }
|
||||
static Action* yogg_saron_use_portal_action(PlayerbotAI* ai) { return new YoggSaronUsePortalAction(ai); }
|
||||
static Action* yogg_saron_fall_from_floor_action(PlayerbotAI* ai) { return new YoggSaronFallFromFloorAction(ai); }
|
||||
static Action* yogg_saron_boss_room_movement_cheat_action(PlayerbotAI* ai) { return new YoggSaronBossRoomMovementCheatAction(ai); }
|
||||
static Action* yogg_saron_illusion_room_action(PlayerbotAI* ai) { return new YoggSaronIllusionRoomAction(ai); }
|
||||
static Action* yogg_saron_move_to_exit_portal_action(PlayerbotAI* ai) { return new YoggSaronMoveToExitPortalAction(ai); }
|
||||
static Action* yogg_saron_lunatic_gaze_action(PlayerbotAI* ai) { return new YoggSaronLunaticGazeAction(ai); }
|
||||
static Action* yogg_saron_phase_3_positioning_action(PlayerbotAI* ai) { return new YoggSaronPhase3PositioningAction(ai); }
|
||||
};
|
||||
|
||||
#endif
|
||||
225
src/Ai/Raid/Ulduar/RaidUlduarBossHelper.cpp
Normal file
225
src/Ai/Raid/Ulduar/RaidUlduarBossHelper.cpp
Normal file
@@ -0,0 +1,225 @@
|
||||
#include "ChatHelper.h"
|
||||
#include "RaidUlduarBossHelper.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "GameObject.h"
|
||||
#include "Group.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Player.h"
|
||||
#include "PlayerbotAI.h"
|
||||
#include "Playerbots.h"
|
||||
#include "World.h"
|
||||
|
||||
// Prevent harpoon spam
|
||||
std::unordered_map<ObjectGuid, time_t> RazorscaleBossHelper::_harpoonCooldowns;
|
||||
// Prevent role assignment spam
|
||||
std::unordered_map<ObjectGuid, std::time_t> RazorscaleBossHelper::_lastRoleSwapTime;
|
||||
const std::time_t RazorscaleBossHelper::_roleSwapCooldown;
|
||||
|
||||
bool RazorscaleBossHelper::UpdateBossAI()
|
||||
{
|
||||
_boss = AI_VALUE2(Unit*, "find target", "razorscale");
|
||||
if (_boss)
|
||||
{
|
||||
Group* group = bot->GetGroup();
|
||||
if (group && !AreRolesAssigned())
|
||||
{
|
||||
AssignRolesBasedOnHealth();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Unit* RazorscaleBossHelper::GetBoss() const
|
||||
{
|
||||
return _boss;
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::IsGroundPhase() const
|
||||
{
|
||||
return _boss && _boss->IsAlive() &&
|
||||
(_boss->GetPositionZ() <= RAZORSCALE_FLYING_Z_THRESHOLD) &&
|
||||
(_boss->GetHealthPct() < 50.0f) &&
|
||||
!_boss->HasAura(SPELL_STUN_AURA);
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::IsFlyingPhase() const
|
||||
{
|
||||
return _boss && (!IsGroundPhase() || _boss->GetPositionZ() >= RAZORSCALE_FLYING_Z_THRESHOLD);
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::IsHarpoonFired(uint32 chainSpellId) const
|
||||
{
|
||||
return _boss && _boss->HasAura(chainSpellId);
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::IsHarpoonReady(GameObject* harpoonGO)
|
||||
{
|
||||
if (!harpoonGO)
|
||||
return false;
|
||||
|
||||
auto it = _harpoonCooldowns.find(harpoonGO->GetGUID());
|
||||
if (it != _harpoonCooldowns.end())
|
||||
{
|
||||
time_t currentTime = std::time(nullptr);
|
||||
time_t elapsedTime = currentTime - it->second;
|
||||
if (elapsedTime < HARPOON_COOLDOWN_DURATION)
|
||||
return false;
|
||||
}
|
||||
|
||||
return harpoonGO->GetGoState() == GO_STATE_READY;
|
||||
}
|
||||
|
||||
void RazorscaleBossHelper::SetHarpoonOnCooldown(GameObject* harpoonGO)
|
||||
{
|
||||
if (!harpoonGO)
|
||||
return;
|
||||
|
||||
time_t currentTime = std::time(nullptr);
|
||||
_harpoonCooldowns[harpoonGO->GetGUID()] = currentTime;
|
||||
}
|
||||
|
||||
GameObject* RazorscaleBossHelper::FindNearestHarpoon(float x, float y, float z) const
|
||||
{
|
||||
GameObject* nearestHarpoon = nullptr;
|
||||
float minDistanceSq = std::numeric_limits<float>::max();
|
||||
|
||||
for (auto const& harpoon : GetHarpoonData())
|
||||
{
|
||||
if (GameObject* harpoonGO = bot->FindNearestGameObject(harpoon.gameObjectEntry, 200.0f))
|
||||
{
|
||||
float dx = harpoonGO->GetPositionX() - x;
|
||||
float dy = harpoonGO->GetPositionY() - y;
|
||||
float dz = harpoonGO->GetPositionZ() - z;
|
||||
float distanceSq = dx * dx + dy * dy + dz * dz;
|
||||
|
||||
if (distanceSq < minDistanceSq)
|
||||
{
|
||||
minDistanceSq = distanceSq;
|
||||
nearestHarpoon = harpoonGO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nearestHarpoon;
|
||||
}
|
||||
|
||||
const std::vector<RazorscaleBossHelper::HarpoonData>& RazorscaleBossHelper::GetHarpoonData()
|
||||
{
|
||||
static const std::vector<HarpoonData> harpoonData =
|
||||
{
|
||||
{ GO_RAZORSCALE_HARPOON_1, SPELL_CHAIN_1 },
|
||||
{ GO_RAZORSCALE_HARPOON_2, SPELL_CHAIN_2 },
|
||||
{ GO_RAZORSCALE_HARPOON_3, SPELL_CHAIN_3 },
|
||||
{ GO_RAZORSCALE_HARPOON_4, SPELL_CHAIN_4 },
|
||||
};
|
||||
return harpoonData;
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::AreRolesAssigned() const
|
||||
{
|
||||
Group* group = bot->GetGroup();
|
||||
if (!group)
|
||||
return false;
|
||||
|
||||
// Retrieve the group member slot list (GUID + flags + other info)
|
||||
Group::MemberSlotList const& slots = group->GetMemberSlots();
|
||||
for (auto const& slot : slots)
|
||||
{
|
||||
// Check if this member has the MAINTANK flag
|
||||
if (slot.flags & MEMBER_FLAG_MAINTANK)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RazorscaleBossHelper::CanSwapRoles() const
|
||||
{
|
||||
// Identify the GUID of the current bot
|
||||
ObjectGuid botGuid = bot->GetGUID();
|
||||
if (!botGuid)
|
||||
return false;
|
||||
|
||||
// If no entry exists yet for this bot, initialize it to 0
|
||||
auto it = _lastRoleSwapTime.find(botGuid);
|
||||
if (it == _lastRoleSwapTime.end())
|
||||
{
|
||||
_lastRoleSwapTime[botGuid] = 0;
|
||||
it = _lastRoleSwapTime.find(botGuid);
|
||||
}
|
||||
|
||||
// Compare the current time against the stored time
|
||||
std::time_t currentTime = std::time(nullptr);
|
||||
std::time_t lastSwapTime = it->second;
|
||||
|
||||
return (currentTime - lastSwapTime) >= _roleSwapCooldown;
|
||||
}
|
||||
|
||||
void RazorscaleBossHelper::AssignRolesBasedOnHealth()
|
||||
{
|
||||
// Check if enough time has passed since last swap
|
||||
if (!CanSwapRoles())
|
||||
return;
|
||||
|
||||
Group* group = bot->GetGroup();
|
||||
if (!group)
|
||||
return;
|
||||
|
||||
// Gather all tank-capable players (bots + real players), excluding those with too many Fuse Armor stacks
|
||||
std::vector<Player*> tankCandidates;
|
||||
for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next())
|
||||
{
|
||||
Player* member = ref->GetSource();
|
||||
if (!member || !botAI->IsTank(member, true) || !member->IsAlive())
|
||||
continue;
|
||||
|
||||
Aura* fuseArmor = member->GetAura(SPELL_FUSEARMOR);
|
||||
if (fuseArmor && fuseArmor->GetStackAmount() >= FUSEARMOR_THRESHOLD)
|
||||
continue;
|
||||
|
||||
tankCandidates.push_back(member);
|
||||
}
|
||||
|
||||
// If there are no viable tanks, do nothing
|
||||
if (tankCandidates.empty())
|
||||
return;
|
||||
|
||||
// Sort by highest max health first
|
||||
std::sort(tankCandidates.begin(), tankCandidates.end(),
|
||||
[](Player* a, Player* b)
|
||||
{
|
||||
return a->GetMaxHealth() > b->GetMaxHealth();
|
||||
}
|
||||
);
|
||||
|
||||
// Pick the top candidate
|
||||
Player* newMainTank = tankCandidates[0];
|
||||
if (!newMainTank) // Safety check
|
||||
return;
|
||||
|
||||
// Unflag everyone from main tank
|
||||
for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next())
|
||||
{
|
||||
Player* member = ref->GetSource();
|
||||
if (member && botAI->IsMainTank(member))
|
||||
group->SetGroupMemberFlag(member->GetGUID(), false, MEMBER_FLAG_MAINTANK);
|
||||
}
|
||||
|
||||
// Assign the single main tank
|
||||
group->SetGroupMemberFlag(newMainTank->GetGUID(), true, MEMBER_FLAG_MAINTANK);
|
||||
|
||||
// Yell a message regardless of whether the new main tank is a bot or a real player
|
||||
const std::string playerName = newMainTank->GetName();
|
||||
const std::string text = playerName + " set as main tank!";
|
||||
bot->Yell(text, LANG_UNIVERSAL);
|
||||
|
||||
ObjectGuid botGuid = bot->GetGUID();
|
||||
if (!botGuid)
|
||||
return;
|
||||
|
||||
// Set current time in the cooldown map for this bot to start cooldown
|
||||
_lastRoleSwapTime[botGuid] = std::time(nullptr);
|
||||
}
|
||||
169
src/Ai/Raid/Ulduar/RaidUlduarBossHelper.h
Normal file
169
src/Ai/Raid/Ulduar/RaidUlduarBossHelper.h
Normal file
@@ -0,0 +1,169 @@
|
||||
#ifndef _PLAYERBOT_RAIDULDUARBOSSHELPER_H
|
||||
#define _PLAYERBOT_RAIDULDUARBOSSHELPER_H
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
#include <ctime>
|
||||
#include <limits>
|
||||
|
||||
#include "AiObject.h"
|
||||
#include "AiObjectContext.h"
|
||||
#include "EventMap.h"
|
||||
#include "Log.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "Player.h"
|
||||
#include "PlayerbotAI.h"
|
||||
#include "Playerbots.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SharedDefines.h"
|
||||
|
||||
const uint32 ULDUAR_MAP_ID = 603;
|
||||
|
||||
class RazorscaleBossHelper : public AiObject
|
||||
{
|
||||
public:
|
||||
// Enums and constants specific to Razorscale
|
||||
enum RazorscaleUnits : uint32
|
||||
{
|
||||
UNIT_RAZORSCALE = 33186,
|
||||
UNIT_DARK_RUNE_SENTINEL = 33846,
|
||||
UNIT_DARK_RUNE_WATCHER = 33453,
|
||||
UNIT_DARK_RUNE_GUARDIAN = 33388,
|
||||
UNIT_DEVOURING_FLAME = 34188,
|
||||
};
|
||||
|
||||
enum RazorscaleGameObjects : uint32
|
||||
{
|
||||
GO_RAZORSCALE_HARPOON_1 = 194519,
|
||||
GO_RAZORSCALE_HARPOON_2 = 194541,
|
||||
GO_RAZORSCALE_HARPOON_3 = 194542,
|
||||
GO_RAZORSCALE_HARPOON_4 = 194543,
|
||||
};
|
||||
|
||||
enum RazorscaleSpells : uint32
|
||||
{
|
||||
SPELL_CHAIN_1 = 49679,
|
||||
SPELL_CHAIN_2 = 49682,
|
||||
SPELL_CHAIN_3 = 49683,
|
||||
SPELL_CHAIN_4 = 49684,
|
||||
SPELL_SENTINEL_WHIRLWIND = 63806,
|
||||
SPELL_STUN_AURA = 62794,
|
||||
SPELL_FUSEARMOR = 64771
|
||||
};
|
||||
|
||||
static constexpr uint32 FUSEARMOR_THRESHOLD = 2;
|
||||
|
||||
// Constants for arena parameters
|
||||
static constexpr float RAZORSCALE_FLYING_Z_THRESHOLD = 440.0f;
|
||||
static constexpr float RAZORSCALE_ARENA_CENTER_X = 587.54f;
|
||||
static constexpr float RAZORSCALE_ARENA_CENTER_Y = -175.04f;
|
||||
static constexpr float RAZORSCALE_ARENA_RADIUS = 30.0f;
|
||||
|
||||
// Harpoon cooldown (seconds)
|
||||
static constexpr time_t HARPOON_COOLDOWN_DURATION = 5;
|
||||
|
||||
// Structure for harpoon data
|
||||
struct HarpoonData
|
||||
{
|
||||
uint32 gameObjectEntry;
|
||||
uint32 chainSpellId;
|
||||
};
|
||||
|
||||
explicit RazorscaleBossHelper(PlayerbotAI* botAI)
|
||||
: AiObject(botAI), _boss(nullptr) {}
|
||||
|
||||
bool UpdateBossAI();
|
||||
Unit* GetBoss() const;
|
||||
|
||||
bool IsGroundPhase() const;
|
||||
bool IsFlyingPhase() const;
|
||||
|
||||
bool IsHarpoonFired(uint32 chainSpellId) const;
|
||||
static bool IsHarpoonReady(GameObject* harpoonGO);
|
||||
static void SetHarpoonOnCooldown(GameObject* harpoonGO);
|
||||
GameObject* FindNearestHarpoon(float x, float y, float z) const;
|
||||
|
||||
static const std::vector<HarpoonData>& GetHarpoonData();
|
||||
|
||||
void AssignRolesBasedOnHealth();
|
||||
bool AreRolesAssigned() const;
|
||||
bool CanSwapRoles() const;
|
||||
|
||||
private:
|
||||
Unit* _boss;
|
||||
|
||||
// A map to track the last role swap *per bot* by their GUID
|
||||
static std::unordered_map<ObjectGuid, std::time_t> _lastRoleSwapTime;
|
||||
|
||||
// The cooldown that applies to every bot
|
||||
static const std::time_t _roleSwapCooldown = 10;
|
||||
|
||||
static std::unordered_map<ObjectGuid, time_t> _harpoonCooldowns;
|
||||
};
|
||||
|
||||
// template <class BossAiType>
|
||||
// class GenericBossHelper : public AiObject
|
||||
// {
|
||||
// public:
|
||||
// GenericBossHelper(PlayerbotAI* botAI, std::string name) : AiObject(botAI), _name(name) {}
|
||||
// virtual bool UpdateBossAI()
|
||||
// {
|
||||
// if (!bot->IsInCombat())
|
||||
// {
|
||||
// _unit = nullptr;
|
||||
// }
|
||||
// if (_unit && (!_unit->IsInWorld() || !_unit->IsAlive()))
|
||||
// {
|
||||
// _unit = nullptr;
|
||||
// }
|
||||
// if (!_unit)
|
||||
// {
|
||||
// _unit = AI_VALUE2(Unit*, "find target", _name);
|
||||
// if (!_unit)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// _target = _unit->ToCreature();
|
||||
// if (!_target)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// _ai = dynamic_cast<BossAiType*>(_target->GetAI());
|
||||
// if (!_ai)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// _event_map = &_ai->events;
|
||||
// if (!_event_map)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// if (!_event_map)
|
||||
// {
|
||||
// return false;
|
||||
// }
|
||||
// _timer = _event_map->GetTimer();
|
||||
// return true;
|
||||
// }
|
||||
// virtual void Reset()
|
||||
// {
|
||||
// _unit = nullptr;
|
||||
// _target = nullptr;
|
||||
// _ai = nullptr;
|
||||
// _event_map = nullptr;
|
||||
// _timer = 0;
|
||||
// }
|
||||
|
||||
// protected:
|
||||
// std::string _name;
|
||||
// Unit* _unit = nullptr;
|
||||
// Creature* _target = nullptr;
|
||||
// BossAiType* _ai = nullptr;
|
||||
// EventMap* _event_map = nullptr;
|
||||
// uint32 _timer = 0;
|
||||
// };
|
||||
|
||||
#endif
|
||||
6
src/Ai/Raid/Ulduar/RaidUlduarScripts.h
Normal file
6
src/Ai/Raid/Ulduar/RaidUlduarScripts.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _PLAYERBOT_RAIDULDUARSCRIPTS_H
|
||||
#define _PLAYERBOT_RAIDULDUARSCRIPTS_H
|
||||
|
||||
#include "../../../../src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h"
|
||||
|
||||
#endif
|
||||
162
src/Ai/Raid/Ulduar/RaidUlduarTriggerContext.h
Normal file
162
src/Ai/Raid/Ulduar/RaidUlduarTriggerContext.h
Normal file
@@ -0,0 +1,162 @@
|
||||
// /*
|
||||
// * Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
||||
// and/or modify it under version 3 of the License, or (at your option), any later version.
|
||||
// */
|
||||
|
||||
#ifndef _PLAYERBOT_RAIDULDUARTRIGGERCONTEXT_H
|
||||
#define _PLAYERBOT_RAIDULDUARTRIGGERCONTEXT_H
|
||||
|
||||
#include "AiObjectContext.h"
|
||||
#include "NamedObjectContext.h"
|
||||
#include "RaidUlduarTriggers.h"
|
||||
#include "BossAuraTriggers.h"
|
||||
|
||||
class RaidUlduarTriggerContext : public NamedObjectContext<Trigger>
|
||||
{
|
||||
public:
|
||||
RaidUlduarTriggerContext()
|
||||
{
|
||||
creators["flame leviathan on vehicle"] = &RaidUlduarTriggerContext::flame_leviathan_on_vehicle;
|
||||
creators["flame leviathan vehicle near"] = &RaidUlduarTriggerContext::flame_leviathan_vehicle_near;
|
||||
creators["razorscale flying alone"] = &RaidUlduarTriggerContext::razorscale_flying_alone;
|
||||
creators["razorscale avoid devouring flames"] = &RaidUlduarTriggerContext::razorscale_avoid_devouring_flames;
|
||||
creators["razorscale avoid sentinel"] = &RaidUlduarTriggerContext::razorscale_avoid_sentinel;
|
||||
creators["razorscale avoid whirlwind"] = &RaidUlduarTriggerContext::razorscale_avoid_whirlwind;
|
||||
creators["razorscale grounded"] = &RaidUlduarTriggerContext::razorscale_grounded;
|
||||
creators["razorscale harpoon trigger"] = &RaidUlduarTriggerContext::razorscale_harpoon_trigger;
|
||||
creators["razorscale fuse armor trigger"] = &RaidUlduarTriggerContext::razorscale_fuse_armor_trigger;
|
||||
creators["razorscale fire resistance trigger"] = &RaidUlduarTriggerContext::razorscale_fire_resistance_trigger;
|
||||
creators["ignis fire resistance trigger"] = &RaidUlduarTriggerContext::ignis_fire_resistance_trigger;
|
||||
creators["iron assembly lightning tendrils trigger"] = &RaidUlduarTriggerContext::iron_assembly_lightning_tendrils_trigger;
|
||||
creators["iron assembly overload trigger"] = &RaidUlduarTriggerContext::iron_assembly_overload_trigger;
|
||||
creators["iron assembly rune of power trigger"] = &RaidUlduarTriggerContext::iron_assembly_rune_of_power_trigger;
|
||||
creators["kologarn mark dps target trigger"] = &RaidUlduarTriggerContext::kologarn_mark_dps_target_trigger;
|
||||
creators["kologarn fall from floor trigger"] = &RaidUlduarTriggerContext::kologarn_fall_from_floor_trigger;
|
||||
creators["kologarn nature resistance trigger"] = &RaidUlduarTriggerContext::kologarn_nature_resistance_trigger;
|
||||
creators["kologarn rubble slowdown trigger"] = &RaidUlduarTriggerContext::kologarn_rubble_slowdown_trigger;
|
||||
creators["kologarn eyebeam trigger"] = &RaidUlduarTriggerContext::kologarn_eyebeam_trigger;
|
||||
creators["kologarn rti target trigger"] = &RaidUlduarTriggerContext::kologarn_rti_target_trigger;
|
||||
creators["kologarn crunch armor trigger"] = &RaidUlduarTriggerContext::kologarn_crunch_armor_trigger;
|
||||
creators["kologarn attack dps target trigger"] = &RaidUlduarTriggerContext::kologarn_attack_dps_target_trigger;
|
||||
creators["auriaya fall from floor trigger"] = &RaidUlduarTriggerContext::auriaya_fall_from_floor_trigger;
|
||||
creators["hodir biting cold"] = &RaidUlduarTriggerContext::hodir_biting_cold;
|
||||
creators["hodir near snowpacked icicle"] = &RaidUlduarTriggerContext::hodir_near_snowpacked_icicle;
|
||||
creators["hodir frost resistance trigger"] = &RaidUlduarTriggerContext::hodir_frost_resistance_trigger;
|
||||
creators["freya near nature bomb"] = &RaidUlduarTriggerContext::freya_near_nature_bomb;
|
||||
creators["freya fire resistance trigger"] = &RaidUlduarTriggerContext::freya_fire_resistance_trigger;
|
||||
creators["freya nature resistance trigger"] = &RaidUlduarTriggerContext::freya_nature_resistance_trigger;
|
||||
creators["freya mark dps target trigger"] = &RaidUlduarTriggerContext::freya_mark_dps_target_trigger;
|
||||
creators["freya move to healing spore trigger"] = &RaidUlduarTriggerContext::freya_move_to_healing_spore_trigger;
|
||||
creators["thorim frost resistance trigger"] = &RaidUlduarTriggerContext::thorim_frost_resistance_trigger;
|
||||
creators["thorim nature resistance trigger"] = &RaidUlduarTriggerContext::thorim_nature_resistance_trigger;
|
||||
creators["thorim unbalancing strike trigger"] = &RaidUlduarTriggerContext::thorim_unbalancing_strike_trigger;
|
||||
creators["thorim mark dps target trigger"] = &RaidUlduarTriggerContext::thorim_mark_dps_target_trigger;
|
||||
creators["thorim arena positioning trigger"] = &RaidUlduarTriggerContext::thorim_arena_positioning_trigger;
|
||||
creators["thorim gauntlet positioning trigger"] = &RaidUlduarTriggerContext::thorim_gauntlet_positioning_trigger;
|
||||
creators["thorim fall from floor trigger"] = &RaidUlduarTriggerContext::thorim_fall_from_floor_trigger;
|
||||
creators["thorim phase 2 positioning trigger"] = &RaidUlduarTriggerContext::thorim_phase2_positioning_trigger;
|
||||
creators["mimiron fire resistance trigger"] = &RaidUlduarTriggerContext::mimiron_fire_resistance_trigger;
|
||||
creators["mimiron shock blast trigger"] = &RaidUlduarTriggerContext::mimiron_shock_blast_trigger;
|
||||
creators["mimiron phase 1 positioning trigger"] = &RaidUlduarTriggerContext::mimiron_phase_1_positioning_trigger;
|
||||
creators["mimiron p3wx2 laser barrage trigger"] = &RaidUlduarTriggerContext::mimiron_p3wx2_laser_barrage_trigger;
|
||||
creators["mimiron rapid burst trigger"] = &RaidUlduarTriggerContext::mimiron_rapid_burst_trigger;
|
||||
creators["mimiron aerial command unit trigger"] = &RaidUlduarTriggerContext::mimiron_aerial_command_unit_trigger;
|
||||
creators["mimiron rocket strike trigger"] = &RaidUlduarTriggerContext::mimiron_rocket_strike_trigger;
|
||||
creators["mimiron phase 4 mark dps trigger"] = &RaidUlduarTriggerContext::mimiron_phase_4_mark_dps_trigger;
|
||||
creators["mimiron cheat trigger"] = &RaidUlduarTriggerContext::mimiron_cheat_trigger;
|
||||
creators["vezax cheat trigger"] = &RaidUlduarTriggerContext::vezax_cheat_trigger;
|
||||
creators["vezax shadow crash trigger"] = &RaidUlduarTriggerContext::vezax_shadow_crash_trigger;
|
||||
creators["vezax mark of the faceless trigger"] = &RaidUlduarTriggerContext::vezax_mark_of_the_faceless_trigger;
|
||||
creators["vezax shadow resistance trigger"] = &RaidUlduarTriggerContext::vezax_shadow_resistance_trigger;
|
||||
creators["sara shadow resistance trigger"] = &RaidUlduarTriggerContext::sara_shadow_resistance_trigger;
|
||||
creators["yogg-saron shadow resistance triggerr"] = &RaidUlduarTriggerContext::yogg_saron_shadow_resistance_trigger;
|
||||
creators["yogg-saron ominous cloud cheat trigger"] = &RaidUlduarTriggerContext::yogg_saron_ominous_cloud_cheat_trigger;
|
||||
creators["yogg-saron guardian positioning trigger"] = &RaidUlduarTriggerContext::yogg_saron_guardian_positioning_trigger;
|
||||
creators["yogg-saron sanity trigger"] = &RaidUlduarTriggerContext::yogg_saron_sanity_trigger;
|
||||
creators["yogg-saron death orb trigger"] = &RaidUlduarTriggerContext::yogg_saron_death_orb_trigger;
|
||||
creators["yogg-saron malady of the mind trigger"] = &RaidUlduarTriggerContext::yogg_saron_malady_of_the_mind_trigger;
|
||||
creators["yogg-saron mark target trigger"] = &RaidUlduarTriggerContext::yogg_saron_mark_target_trigger;
|
||||
creators["yogg-saron brain link trigger"] = &RaidUlduarTriggerContext::yogg_saron_brain_link_trigger;
|
||||
creators["yogg-saron move to enter portal trigger"] = &RaidUlduarTriggerContext::yogg_saron_move_to_enter_portal_trigger;
|
||||
creators["yogg-saron use portal trigger"] = &RaidUlduarTriggerContext::yogg_saron_use_portal_trigger;
|
||||
creators["yogg-saron fall from floor trigger"] = &RaidUlduarTriggerContext::yogg_saron_fall_from_floor_trigger;
|
||||
creators["yogg-saron boss room movement cheat trigger"] = &RaidUlduarTriggerContext::yogg_saron_boss_room_movement_cheat_trigger;
|
||||
creators["yogg-saron illusion room trigger"] = &RaidUlduarTriggerContext::yogg_saron_illusion_room_trigger;
|
||||
creators["yogg-saron move to exit portal trigger"] = &RaidUlduarTriggerContext::yogg_saron_move_to_exit_portal_trigger;
|
||||
creators["yogg-saron lunatic gaze trigger"] = &RaidUlduarTriggerContext::yogg_saron_lunatic_gaze_trigger;
|
||||
creators["yogg-saron phase 3 positioning trigger"] = &RaidUlduarTriggerContext::yogg_saron_phase_3_positioning_trigger;
|
||||
}
|
||||
|
||||
private:
|
||||
static Trigger* flame_leviathan_on_vehicle(PlayerbotAI* ai) { return new FlameLeviathanOnVehicleTrigger(ai); }
|
||||
static Trigger* flame_leviathan_vehicle_near(PlayerbotAI* ai) { return new FlameLeviathanVehicleNearTrigger(ai); }
|
||||
static Trigger* razorscale_flying_alone(PlayerbotAI* ai) { return new RazorscaleFlyingAloneTrigger(ai); }
|
||||
static Trigger* razorscale_avoid_devouring_flames(PlayerbotAI* ai) { return new RazorscaleDevouringFlamesTrigger(ai); }
|
||||
static Trigger* razorscale_avoid_sentinel(PlayerbotAI* ai) { return new RazorscaleAvoidSentinelTrigger(ai); }
|
||||
static Trigger* razorscale_avoid_whirlwind(PlayerbotAI* ai) { return new RazorscaleAvoidWhirlwindTrigger(ai); }
|
||||
static Trigger* razorscale_grounded(PlayerbotAI* ai) { return new RazorscaleGroundedTrigger(ai); }
|
||||
static Trigger* razorscale_harpoon_trigger(PlayerbotAI* ai) { return new RazorscaleHarpoonAvailableTrigger(ai); }
|
||||
static Trigger* razorscale_fuse_armor_trigger(PlayerbotAI* ai) { return new RazorscaleFuseArmorTrigger(ai); }
|
||||
static Trigger* razorscale_fire_resistance_trigger(PlayerbotAI* ai) { return new BossFireResistanceTrigger(ai, "razorscale"); }
|
||||
static Trigger* ignis_fire_resistance_trigger(PlayerbotAI* ai) { return new BossFireResistanceTrigger(ai, "ignis the furnace master"); }
|
||||
static Trigger* iron_assembly_lightning_tendrils_trigger(PlayerbotAI* ai) { return new IronAssemblyLightningTendrilsTrigger(ai); }
|
||||
static Trigger* iron_assembly_overload_trigger(PlayerbotAI* ai) { return new IronAssemblyOverloadTrigger(ai); }
|
||||
static Trigger* iron_assembly_rune_of_power_trigger(PlayerbotAI* ai) { return new IronAssemblyRuneOfPowerTrigger(ai); }
|
||||
static Trigger* kologarn_mark_dps_target_trigger(PlayerbotAI* ai) { return new KologarnMarkDpsTargetTrigger(ai); }
|
||||
static Trigger* kologarn_fall_from_floor_trigger(PlayerbotAI* ai) { return new KologarnFallFromFloorTrigger(ai); }
|
||||
static Trigger* kologarn_nature_resistance_trigger(PlayerbotAI* ai) { return new BossNatureResistanceTrigger(ai, "kologarn"); }
|
||||
static Trigger* kologarn_rubble_slowdown_trigger(PlayerbotAI* ai) { return new KologarnRubbleSlowdownTrigger(ai); }
|
||||
static Trigger* kologarn_eyebeam_trigger(PlayerbotAI* ai) { return new KologarnEyebeamTrigger(ai); }
|
||||
static Trigger* kologarn_rti_target_trigger(PlayerbotAI* ai) { return new KologarnRtiTargetTrigger(ai); }
|
||||
static Trigger* kologarn_crunch_armor_trigger(PlayerbotAI* ai) { return new KologarnCrunchArmorTrigger(ai); }
|
||||
static Trigger* kologarn_attack_dps_target_trigger(PlayerbotAI* ai) { return new KologarnAttackDpsTargetTrigger(ai); }
|
||||
static Trigger* auriaya_fall_from_floor_trigger(PlayerbotAI* ai) { return new AuriayaFallFromFloorTrigger(ai); }
|
||||
static Trigger* hodir_biting_cold(PlayerbotAI* ai) { return new HodirBitingColdTrigger(ai); }
|
||||
static Trigger* hodir_near_snowpacked_icicle(PlayerbotAI* ai) { return new HodirNearSnowpackedIcicleTrigger(ai); }
|
||||
static Trigger* hodir_frost_resistance_trigger(PlayerbotAI* ai) { return new BossFrostResistanceTrigger(ai, "hodir"); }
|
||||
static Trigger* freya_near_nature_bomb(PlayerbotAI* ai) { return new FreyaNearNatureBombTrigger(ai); }
|
||||
static Trigger* freya_fire_resistance_trigger(PlayerbotAI* ai) { return new BossFireResistanceTrigger(ai, "freya"); }
|
||||
static Trigger* freya_nature_resistance_trigger(PlayerbotAI* ai) { return new BossNatureResistanceTrigger(ai, "freya"); }
|
||||
static Trigger* freya_mark_dps_target_trigger(PlayerbotAI* ai) { return new FreyaMarkDpsTargetTrigger(ai); }
|
||||
static Trigger* freya_move_to_healing_spore_trigger(PlayerbotAI* ai) { return new FreyaMoveToHealingSporeTrigger(ai); }
|
||||
static Trigger* thorim_frost_resistance_trigger(PlayerbotAI* ai) { return new BossFrostResistanceTrigger(ai, "thorim"); }
|
||||
static Trigger* thorim_nature_resistance_trigger(PlayerbotAI* ai) { return new BossNatureResistanceTrigger(ai, "thorim"); }
|
||||
static Trigger* thorim_unbalancing_strike_trigger(PlayerbotAI* ai) { return new ThorimUnbalancingStrikeTrigger(ai); }
|
||||
static Trigger* thorim_mark_dps_target_trigger(PlayerbotAI* ai) { return new ThorimMarkDpsTargetTrigger(ai); }
|
||||
static Trigger* thorim_arena_positioning_trigger(PlayerbotAI* ai) { return new ThorimArenaPositioningTrigger(ai); }
|
||||
static Trigger* thorim_gauntlet_positioning_trigger(PlayerbotAI* ai) { return new ThorimGauntletPositioningTrigger(ai); }
|
||||
static Trigger* thorim_fall_from_floor_trigger(PlayerbotAI* ai) { return new ThorimFallFromFloorTrigger(ai); }
|
||||
static Trigger* thorim_phase2_positioning_trigger(PlayerbotAI* ai) { return new ThorimPhase2PositioningTrigger(ai); }
|
||||
static Trigger* mimiron_fire_resistance_trigger(PlayerbotAI* ai) { return new BossFireResistanceTrigger(ai, "mimiron"); }
|
||||
static Trigger* mimiron_shock_blast_trigger(PlayerbotAI* ai) { return new MimironShockBlastTrigger(ai); }
|
||||
static Trigger* mimiron_phase_1_positioning_trigger(PlayerbotAI* ai) { return new MimironPhase1PositioningTrigger(ai); }
|
||||
static Trigger* mimiron_p3wx2_laser_barrage_trigger(PlayerbotAI* ai) { return new MimironP3Wx2LaserBarrageTrigger(ai); }
|
||||
static Trigger* mimiron_rapid_burst_trigger(PlayerbotAI* ai) { return new MimironRapidBurstTrigger(ai); }
|
||||
static Trigger* mimiron_aerial_command_unit_trigger(PlayerbotAI* ai) { return new MimironAerialCommandUnitTrigger(ai); }
|
||||
static Trigger* mimiron_rocket_strike_trigger(PlayerbotAI* ai) { return new MimironRocketStrikeTrigger(ai); }
|
||||
static Trigger* mimiron_phase_4_mark_dps_trigger(PlayerbotAI* ai) { return new MimironPhase4MarkDpsTrigger(ai); }
|
||||
static Trigger* mimiron_cheat_trigger(PlayerbotAI* ai) { return new MimironCheatTrigger(ai); }
|
||||
static Trigger* vezax_cheat_trigger(PlayerbotAI* ai) { return new VezaxCheatTrigger(ai); }
|
||||
static Trigger* vezax_shadow_crash_trigger(PlayerbotAI* ai) { return new VezaxShadowCrashTrigger(ai); }
|
||||
static Trigger* vezax_shadow_resistance_trigger(PlayerbotAI* ai) { return new BossShadowResistanceTrigger(ai, "general vezax"); }
|
||||
static Trigger* sara_shadow_resistance_trigger(PlayerbotAI* ai) { return new BossShadowResistanceTrigger(ai, "sara"); }
|
||||
static Trigger* yogg_saron_shadow_resistance_trigger(PlayerbotAI* ai) { return new BossShadowResistanceTrigger(ai, "yogg-saron"); }
|
||||
static Trigger* vezax_mark_of_the_faceless_trigger(PlayerbotAI* ai) { return new VezaxMarkOfTheFacelessTrigger(ai); }
|
||||
static Trigger* yogg_saron_ominous_cloud_cheat_trigger(PlayerbotAI* ai) { return new YoggSaronOminousCloudCheatTrigger(ai); }
|
||||
static Trigger* yogg_saron_guardian_positioning_trigger(PlayerbotAI* ai) { return new YoggSaronGuardianPositioningTrigger(ai); }
|
||||
static Trigger* yogg_saron_sanity_trigger(PlayerbotAI* ai) { return new YoggSaronSanityTrigger(ai); }
|
||||
static Trigger* yogg_saron_death_orb_trigger(PlayerbotAI* ai) { return new YoggSaronDeathOrbTrigger(ai); }
|
||||
static Trigger* yogg_saron_malady_of_the_mind_trigger(PlayerbotAI* ai) { return new YoggSaronMaladyOfTheMindTrigger(ai); }
|
||||
static Trigger* yogg_saron_mark_target_trigger(PlayerbotAI* ai) { return new YoggSaronMarkTargetTrigger(ai); }
|
||||
static Trigger* yogg_saron_brain_link_trigger(PlayerbotAI* ai) { return new YoggSaronBrainLinkTrigger(ai); }
|
||||
static Trigger* yogg_saron_move_to_enter_portal_trigger(PlayerbotAI* ai) { return new YoggSaronMoveToEnterPortalTrigger(ai); }
|
||||
static Trigger* yogg_saron_use_portal_trigger(PlayerbotAI* ai) { return new YoggSaronUsePortalTrigger(ai); }
|
||||
static Trigger* yogg_saron_fall_from_floor_trigger(PlayerbotAI* ai) { return new YoggSaronFallFromFloorTrigger(ai); }
|
||||
static Trigger* yogg_saron_boss_room_movement_cheat_trigger(PlayerbotAI* ai) { return new YoggSaronBossRoomMovementCheatTrigger(ai); }
|
||||
static Trigger* yogg_saron_illusion_room_trigger(PlayerbotAI* ai) { return new YoggSaronIllusionRoomTrigger(ai); }
|
||||
static Trigger* yogg_saron_move_to_exit_portal_trigger(PlayerbotAI* ai) { return new YoggSaronMoveToExitPortalTrigger(ai); }
|
||||
static Trigger* yogg_saron_lunatic_gaze_trigger(PlayerbotAI* ai) { return new YoggSaronLunaticGazeTrigger(ai); }
|
||||
static Trigger* yogg_saron_phase_3_positioning_trigger(PlayerbotAI* ai) { return new YoggSaronPhase3PositioningTrigger(ai); }
|
||||
};
|
||||
|
||||
#endif
|
||||
323
src/Ai/Raid/Ulduar/Strategy/RaidUlduarStrategy.cpp
Normal file
323
src/Ai/Raid/Ulduar/Strategy/RaidUlduarStrategy.cpp
Normal file
@@ -0,0 +1,323 @@
|
||||
#include "RaidUlduarStrategy.h"
|
||||
|
||||
#include "RaidUlduarMultipliers.h"
|
||||
|
||||
void RaidUlduarStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
|
||||
{
|
||||
//
|
||||
// Flame Leviathan
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"flame leviathan vehicle near",
|
||||
{ NextAction("flame leviathan enter vehicle", ACTION_RAID + 2) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"flame leviathan on vehicle",
|
||||
{ NextAction("flame leviathan vehicle", ACTION_RAID + 1) }));
|
||||
|
||||
//
|
||||
// Razorscale
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale avoid devouring flames",
|
||||
{ NextAction("razorscale avoid devouring flames", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale avoid sentinel",
|
||||
{ NextAction("razorscale avoid sentinel", ACTION_RAID + 2) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale flying alone",
|
||||
{ NextAction("razorscale ignore flying alone", ACTION_MOVE + 5) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale avoid whirlwind",
|
||||
{ NextAction("razorscale avoid whirlwind", ACTION_RAID + 3) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale grounded",
|
||||
{ NextAction("razorscale grounded", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale harpoon trigger",
|
||||
{ NextAction("razorscale harpoon action", ACTION_MOVE) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale fuse armor trigger",
|
||||
{ NextAction("razorscale fuse armor action", ACTION_RAID + 2) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"razorscale fire resistance trigger",
|
||||
{ NextAction("razorscale fire resistance action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Ignis
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"ignis fire resistance trigger",
|
||||
{ NextAction("ignis fire resistance action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Iron Assembly
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"iron assembly lightning tendrils trigger",
|
||||
{ NextAction("iron assembly lightning tendrils action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"iron assembly overload trigger",
|
||||
{ NextAction("iron assembly overload action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"iron assembly rune of power trigger",
|
||||
{ NextAction("iron assembly rune of power action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Kologarn
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn fall from floor trigger",
|
||||
{ NextAction("kologarn fall from floor action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn rti target trigger",
|
||||
{ NextAction("kologarn rti target action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn eyebeam trigger",
|
||||
{ NextAction("kologarn eyebeam action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn attack dps target trigger",
|
||||
{ NextAction("attack rti target", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn mark dps target trigger",
|
||||
{ NextAction("kologarn mark dps target action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn nature resistance trigger",
|
||||
{ NextAction("kologarn nature resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn rubble slowdown trigger",
|
||||
{ NextAction("kologarn rubble slowdown action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"kologarn crunch armor trigger",
|
||||
{ NextAction("kologarn crunch armor action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Auriaya
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"auriaya fall from floor trigger",
|
||||
{ NextAction("auriaya fall from floor action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Hodir
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"hodir near snowpacked icicle",
|
||||
{ NextAction("hodir move snowpacked icicle", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"hodir biting cold",
|
||||
{ NextAction("hodir biting cold jump", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"hodir frost resistance trigger",
|
||||
{ NextAction("hodir frost resistance action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Freya
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"freya near nature bomb",
|
||||
{ NextAction("freya move away nature bomb", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"freya nature resistance trigger",
|
||||
{ NextAction("freya nature resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"freya fire resistance trigger",
|
||||
{ NextAction("freya fire resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"freya mark dps target trigger",
|
||||
{ NextAction("freya mark dps target action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"freya move to healing spore trigger",
|
||||
{ NextAction("freya move to healing spore action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Thorim
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim nature resistance trigger",
|
||||
{ NextAction("thorim nature resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim frost resistance trigger",
|
||||
{ NextAction("thorim frost resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim unbalancing strike trigger",
|
||||
{ NextAction("thorim unbalancing strike action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim mark dps target trigger",
|
||||
{ NextAction("thorim mark dps target action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim gauntlet positioning trigger",
|
||||
{ NextAction("thorim gauntlet positioning action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim arena positioning trigger",
|
||||
{ NextAction("thorim arena positioning action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim fall from floor trigger",
|
||||
{ NextAction("thorim fall from floor action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"thorim phase 2 positioning trigger",
|
||||
{ NextAction("thorim phase 2 positioning action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Mimiron
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron p3wx2 laser barrage trigger",
|
||||
{ NextAction("mimiron p3wx2 laser barrage action", ACTION_RAID + 2) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron shock blast trigger",
|
||||
{ NextAction("mimiron shock blast action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron fire resistance trigger",
|
||||
{ NextAction("mimiron fire resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron phase 1 positioning trigger",
|
||||
{ NextAction("mimiron phase 1 positioning action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron rapid burst trigger",
|
||||
{ NextAction("mimiron rapid burst action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron aerial command unit trigger",
|
||||
{ NextAction("mimiron aerial command unit action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron rocket strike trigger",
|
||||
{ NextAction("mimiron rocket strike action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron phase 4 mark dps trigger",
|
||||
{ NextAction("mimiron phase 4 mark dps action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"mimiron cheat trigger",
|
||||
{ NextAction("mimiron cheat action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// General Vezax
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"vezax cheat trigger",
|
||||
{ NextAction("vezax cheat action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"vezax shadow crash trigger",
|
||||
{ NextAction("vezax shadow crash action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"vezax mark of the faceless trigger",
|
||||
{ NextAction("vezax mark of the faceless action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"vezax shadow resistance trigger",
|
||||
{ NextAction("vezax shadow resistance action", ACTION_RAID) }));
|
||||
|
||||
//
|
||||
// Yogg-Saron
|
||||
//
|
||||
triggers.push_back(new TriggerNode(
|
||||
"sara shadow resistance trigger",
|
||||
{ NextAction("sara shadow resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron shadow resistance trigger",
|
||||
{ NextAction("yogg-saron shadow resistance action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron ominous cloud cheat trigger",
|
||||
{ NextAction("yogg-saron ominous cloud cheat action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron guardian positioning trigger",
|
||||
{ NextAction("yogg-saron guardian positioning action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron sanity trigger",
|
||||
{ NextAction("yogg-saron sanity action", ACTION_RAID + 1) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron death orb trigger",
|
||||
{ NextAction("yogg-saron death orb action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron malady of the mind trigger",
|
||||
{ NextAction("yogg-saron malady of the mind action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron mark target trigger",
|
||||
{ NextAction("yogg-saron mark target action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron brain link trigger",
|
||||
{ NextAction("yogg-saron brain link action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron move to enter portal trigger",
|
||||
{ NextAction("yogg-saron move to enter portal action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron use portal trigger",
|
||||
{ NextAction("yogg-saron use portal action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron fall from floor trigger",
|
||||
{ NextAction("yogg-saron fall from floor action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron boss room movement cheat trigger",
|
||||
{ NextAction("yogg-saron boss room movement cheat action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron illusion room trigger",
|
||||
{ NextAction("yogg-saron illusion room action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron move to exit portal trigger",
|
||||
{ NextAction("yogg-saron move to exit portal action", ACTION_RAID) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron lunatic gaze trigger",
|
||||
{ NextAction("yogg-saron lunatic gaze action", ACTION_EMERGENCY) }));
|
||||
|
||||
triggers.push_back(new TriggerNode(
|
||||
"yogg-saron phase 3 positioning trigger",
|
||||
{ NextAction("yogg-saron phase 3 positioning action", ACTION_RAID) }));
|
||||
}
|
||||
|
||||
void RaidUlduarStrategy::InitMultipliers(std::vector<Multiplier*>& multipliers)
|
||||
{
|
||||
multipliers.push_back(new FlameLeviathanMultiplier(botAI));
|
||||
}
|
||||
18
src/Ai/Raid/Ulduar/Strategy/RaidUlduarStrategy.h
Normal file
18
src/Ai/Raid/Ulduar/Strategy/RaidUlduarStrategy.h
Normal file
@@ -0,0 +1,18 @@
|
||||
|
||||
#ifndef _PLAYERBOT_RAIDULDUARSTRATEGY_H
|
||||
#define _PLAYERBOT_RAIDULDUARSTRATEGY_H
|
||||
|
||||
#include "AiObjectContext.h"
|
||||
#include "Multiplier.h"
|
||||
#include "Strategy.h"
|
||||
|
||||
class RaidUlduarStrategy : public Strategy
|
||||
{
|
||||
public:
|
||||
RaidUlduarStrategy(PlayerbotAI* ai) : Strategy(ai) {}
|
||||
virtual std::string const getName() override { return "uld"; }
|
||||
virtual void InitTriggers(std::vector<TriggerNode*>& triggers) override;
|
||||
virtual void InitMultipliers(std::vector<Multiplier*>& multipliers) override;
|
||||
};
|
||||
|
||||
#endif
|
||||
2389
src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp
Normal file
2389
src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.cpp
Normal file
File diff suppressed because it is too large
Load Diff
646
src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.h
Normal file
646
src/Ai/Raid/Ulduar/Trigger/RaidUlduarTriggers.h
Normal file
@@ -0,0 +1,646 @@
|
||||
#ifndef _PLAYERBOT_RAIDULDUARTRIGGERS_H
|
||||
#define _PLAYERBOT_RAIDULDUARTRIGGERS_H
|
||||
|
||||
#include "EventMap.h"
|
||||
#include "GenericTriggers.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "RaidUlduarBossHelper.h"
|
||||
#include "Trigger.h"
|
||||
|
||||
enum UlduarIDs
|
||||
{
|
||||
// Iron Assembly
|
||||
SPELL_LIGHTNING_TENDRILS_10_MAN = 61887,
|
||||
SPELL_LIGHTNING_TENDRILS_25_MAN = 63486,
|
||||
SPELL_OVERLOAD_10_MAN = 61869,
|
||||
SPELL_OVERLOAD_25_MAN = 63481,
|
||||
SPELL_OVERLOAD_10_MAN_2 = 63485,
|
||||
SPELL_OVERLOAD_25_MAN_2 = 61886,
|
||||
SPELL_RUNE_OF_POWER = 64320,
|
||||
|
||||
// Kologarn
|
||||
NPC_RIGHT_ARM = 32934,
|
||||
NPC_RUBBLE = 33768,
|
||||
SPELL_CRUNCH_ARMOR = 64002,
|
||||
|
||||
SPELL_FOCUSED_EYEBEAM_10_2 = 63346,
|
||||
SPELL_FOCUSED_EYEBEAM_10 = 63347,
|
||||
SPELL_FOCUSED_EYEBEAM_25_2 = 63976,
|
||||
SPELL_FOCUSED_EYEBEAM_25 = 63977,
|
||||
|
||||
// Hodir
|
||||
NPC_SNOWPACKED_ICICLE = 33174,
|
||||
NPC_TOASTY_FIRE = 33342,
|
||||
SPELL_FLASH_FREEZE = 61968,
|
||||
SPELL_BITING_COLD_PLAYER_AURA = 62039,
|
||||
|
||||
// Freya
|
||||
NPC_SNAPLASHER = 32916,
|
||||
NPC_STORM_LASHER = 32919,
|
||||
NPC_DETONATING_LASHER = 32918,
|
||||
NPC_ANCIENT_WATER_SPIRIT = 33202,
|
||||
NPC_ANCIENT_CONSERVATOR = 33203,
|
||||
NPC_HEALTHY_SPORE = 33215,
|
||||
NPC_EONARS_GIFT = 33228,
|
||||
GOBJECT_NATURE_BOMB = 194902,
|
||||
|
||||
// Thorim
|
||||
NPC_DARK_RUNE_ACOLYTE_I = 32886,
|
||||
NPC_CAPTURED_MERCENARY_SOLDIER_ALLY = 32885,
|
||||
NPC_CAPTURED_MERCENARY_SOLDIER_HORDE = 32883,
|
||||
NPC_CAPTURED_MERCENARY_CAPTAIN_ALLY = 32908,
|
||||
NPC_CAPTURED_MERCENARY_CAPTAIN_HORDE = 32907,
|
||||
NPC_JORMUNGAR_BEHEMOT = 32882,
|
||||
NPC_DARK_RUNE_WARBRINGER = 32877,
|
||||
NPC_DARK_RUNE_EVOKER = 32878,
|
||||
NPC_DARK_RUNE_CHAMPION = 32876,
|
||||
NPC_DARK_RUNE_COMMONER = 32904,
|
||||
NPC_IRON_RING_GUARD = 32874,
|
||||
NPC_RUNIC_COLOSSUS = 32872,
|
||||
NPC_ANCIENT_RUNE_GIANT = 32873,
|
||||
NPC_DARK_RUNE_ACOLYTE_G = 33110,
|
||||
NPC_IRON_HONOR_GUARD = 32875,
|
||||
SPELL_UNBALANCING_STRIKE = 62130,
|
||||
|
||||
// Mimiron
|
||||
NPC_LEVIATHAN_MKII = 33432,
|
||||
NPC_VX001 = 33651,
|
||||
NPC_AERIAL_COMMAND_UNIT = 33670,
|
||||
NPC_BOMB_BOT = 33836,
|
||||
NPC_ROCKET_STRIKE_N = 34047,
|
||||
NPC_ASSAULT_BOT = 34057,
|
||||
NPC_PROXIMITY_MINE = 34362,
|
||||
SPELL_P3WX2_LASER_BARRAGE_1 = 63293,
|
||||
SPELL_P3WX2_LASER_BARRAGE_2 = 63297,
|
||||
SPELL_SPINNING_UP = 63414,
|
||||
SPELL_SHOCK_BLAST = 63631,
|
||||
SPELL_P3WX2_LASER_BARRAGE_3 = 64042,
|
||||
SPELL_P3WX2_LASER_BARRAGE_AURA_1 = 63274,
|
||||
SPELL_P3WX2_LASER_BARRAGE_AURA_2 = 63300,
|
||||
|
||||
// General Vezax
|
||||
SPELL_MARK_OF_THE_FACELESS = 63276,
|
||||
SPELL_SHADOW_CRASH = 63277,
|
||||
|
||||
// Yogg-Saron
|
||||
ACTION_ILLUSION_DRAGONS = 1,
|
||||
ACTION_ILLUSION_ICECROWN = 2,
|
||||
ACTION_ILLUSION_STORMWIND = 3,
|
||||
NPC_GUARDIAN_OF_YS = 33136,
|
||||
NPC_YOGG_SARON = 33288,
|
||||
NPC_OMINOUS_CLOUD = 33292,
|
||||
NPC_RUBY_CONSORT = 33716,
|
||||
NPC_AZURE_CONSORT = 33717,
|
||||
NPC_BRONZE_CONSORT = 33718,
|
||||
NPC_EMERALD_CONSORT = 33719,
|
||||
NPC_OBSIDIAN_CONSORT = 33720,
|
||||
NPC_ALEXTRASZA = 33536,
|
||||
NPC_MALYGOS_ILLUSION = 33535,
|
||||
NPC_NELTHARION = 33523,
|
||||
NPC_YSERA = 33495,
|
||||
GO_DRAGON_SOUL = 194462,
|
||||
NPC_SARA_PHASE_1 = 33134,
|
||||
NPC_LICH_KING_ILLUSION = 33441,
|
||||
NPC_IMMOLATED_CHAMPION = 33442,
|
||||
NPC_SUIT_OF_ARMOR = 33433,
|
||||
NPC_GARONA = 33436,
|
||||
NPC_KING_LLANE = 33437,
|
||||
NPC_DEATHSWORN_ZEALOT = 33567,
|
||||
NPC_INFLUENCE_TENTACLE = 33943,
|
||||
NPC_DEATH_ORB = 33882,
|
||||
NPC_BRAIN = 33890,
|
||||
NPC_CRUSHER_TENTACLE = 33966,
|
||||
NPC_CONSTRICTOR_TENTACLE = 33983,
|
||||
NPC_CORRUPTOR_TENTACLE = 33985,
|
||||
NPC_IMMORTAL_GUARDIAN = 33988,
|
||||
NPC_LAUGHING_SKULL = 33990,
|
||||
NPC_SANITY_WELL = 33991,
|
||||
NPC_DESCEND_INTO_MADNESS = 34072,
|
||||
NPC_MARKED_IMMORTAL_GUARDIAN = 36064,
|
||||
SPELL_SANITY = 63050,
|
||||
SPELL_BRAIN_LINK = 63802,
|
||||
SPELL_MALADY_OF_THE_MIND = 63830,
|
||||
SPELL_SHADOW_BARRIER = 63894,
|
||||
SPELL_TELEPORT_TO_CHAMBER = 63997,
|
||||
SPELL_TELEPORT_TO_ICECROWN = 63998,
|
||||
SPELL_TELEPORT_TO_STORMWIND = 63989,
|
||||
SPELL_TELEPORT_BACK = 63992,
|
||||
SPELL_CANCEL_ILLUSION_AURA = 63993,
|
||||
SPELL_INDUCE_MADNESS = 64059,
|
||||
SPELL_LUNATIC_GAZE_YS = 64163,
|
||||
GO_FLEE_TO_THE_SURFACE_PORTAL = 194625,
|
||||
|
||||
// Buffs
|
||||
SPELL_FROST_TRAP = 13809
|
||||
};
|
||||
|
||||
const float ULDUAR_KOLOGARN_AXIS_Z_PATHING_ISSUE_DETECT = 420.0f;
|
||||
const float ULDUAR_KOLOGARN_EYEBEAM_RADIUS = 3.0f;
|
||||
const float ULDUAR_THORIM_AXIS_Z_FLOOR_THRESHOLD = 429.6094f;
|
||||
const float ULDUAR_THORIM_AXIS_Z_PATHING_ISSUE_DETECT = 410.0f;
|
||||
const float ULDUAR_AURIAYA_AXIS_Z_PATHING_ISSUE_DETECT = 410.0f;
|
||||
const float ULDUAR_YOGG_SARON_BOSS_ROOM_AXIS_Z_PATHING_ISSUE_DETECT = 300.0f;
|
||||
const float ULDUAR_YOGG_SARON_BRAIN_ROOM_AXIS_Z_PATHING_ISSUE_DETECT = 200.0f;
|
||||
const float ULDUAR_YOGG_SARON_STORMWIND_KEEPER_RADIUS = 150.0f;
|
||||
const float ULDUAR_YOGG_SARON_ICECROWN_CITADEL_RADIUS = 150.0f;
|
||||
const float ULDUAR_YOGG_SARON_CHAMBER_OF_ASPECTS_RADIUS = 150.0f;
|
||||
const float ULDUAR_YOGG_SARON_BRAIN_ROOM_RADIUS = 50.0f;
|
||||
|
||||
const Position ULDUAR_THORIM_NEAR_ARENA_CENTER = Position(2134.9854f, -263.11853f, 419.8465f);
|
||||
const Position ULDUAR_THORIM_NEAR_ENTRANCE_POSITION = Position(2172.4355f, -258.27957f, 418.47162f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_6_YARDS_1 = Position(2237.6187f, -265.08844f, 412.17548f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_6_YARDS_2 = Position(2237.2498f, -275.81122f, 412.17548f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_5_YARDS_1 = Position(2236.895f, -294.62448f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_10_YARDS_1 = Position(2242.1162f, -310.15308f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_10_YARDS_2 = Position(2242.018f, -318.66003f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_LEFT_SIDE_10_YARDS_3 = Position(2242.1904f, -329.0533f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_6_YARDS_1 = Position(2219.5417f, -264.77167f, 412.17548f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_6_YARDS_2 = Position(2217.446f, -275.85248f, 412.17548f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_5_YARDS_1 = Position(2217.8877f, -295.01193f, 412.13434f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_10_YARDS_1 = Position(2212.193f, -307.44992f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_10_YARDS_2 = Position(2212.1353f, -318.20795f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_GAUNTLET_RIGHT_SIDE_10_YARDS_3 = Position(2212.1956f, -328.0144f, 412.1348f);
|
||||
const Position ULDUAR_THORIM_JUMP_END_POINT = Position(2137.8818f, -278.18942f, 419.66653f);
|
||||
const Position ULDUAR_THORIM_PHASE2_TANK_SPOT = Position(2134.8572f, -287.0291f, 419.4935f);
|
||||
const Position ULDUAR_THORIM_PHASE2_RANGE1_SPOT = Position(2112.8752f, -267.69305f, 419.52814f);
|
||||
const Position ULDUAR_THORIM_PHASE2_RANGE2_SPOT = Position(2134.1296f, -257.3316f, 419.8462f);
|
||||
const Position ULDUAR_THORIM_PHASE2_RANGE3_SPOT = Position(2156.798f, -267.57434f, 419.52722f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE1RANGE_SPOT = Position(2753.708f, 2583.9617f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE1MELEE_SPOT = Position(2746.9792f, 2573.6716f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE2RANGE_SPOT = Position(2727.7224f, 2569.527f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE2MELEE_SPOT = Position(2739.4746f, 2569.4106f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE3RANGE_SPOT = Position(2754.1294f, 2553.9954f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE2_SIDE3MELEE_SPOT = Position(2746.8513f, 2565.4263f, 364.31357f);
|
||||
const Position ULDUAR_MIMIRON_PHASE4_TANK_SPOT = Position(2744.5754f, 2570.8657f, 364.3138f);
|
||||
const Position ULDUAR_VEZAX_MARK_OF_THE_FACELESS_SPOT = Position(1913.6501f, 122.93989f, 342.38083f);
|
||||
const Position ULDUAR_YOGG_SARON_MIDDLE = Position(1980.28f, -25.5868f, 329.397f);
|
||||
const Position ULDUAR_YOGG_SARON_STORMWIND_KEEPER_MIDDLE = Position(1927.1511f, 68.507256f, 242.37657f);
|
||||
const Position ULDUAR_YOGG_SARON_ICECROWN_CITADEL_MIDDLE = Position(1925.6553f, -121.59296f, 239.98965f);
|
||||
const Position ULDUAR_YOGG_SARON_CHAMBER_OF_ASPECTS_MIDDLE = Position(2104.5667f, -25.509348f, 242.64679f);
|
||||
const Position ULDUAR_YOGG_SARON_BRAIN_ROOM_MIDDLE = Position(1980.1971f, -27.854689f, 236.06789f);
|
||||
const Position ULDUAR_YOGG_SARON_STORMWIND_KEEPER_ENTRANCE = Position(1954.06f, 21.66f, 239.71f);
|
||||
const Position ULDUAR_YOGG_SARON_ICECROWN_CITADEL_ENTRANCE = Position(1950.11f, -79.284f, 239.98982f);
|
||||
const Position ULDUAR_YOGG_SARON_CHAMBER_OF_ASPECTS_ENTRANCE = Position(2048.63f, -25.5f, 239.72f);
|
||||
const Position ULDUAR_YOGG_SARON_PHASE_3_MELEE_SPOT = Position(1998.5377f, -22.90317f, 324.8895f);
|
||||
const Position ULDUAR_YOGG_SARON_PHASE_3_RANGED_SPOT = Position(2018.7628f, -18.896868f, 327.07245f);
|
||||
|
||||
//
|
||||
// Flame Levi
|
||||
//
|
||||
class FlameLeviathanOnVehicleTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
FlameLeviathanOnVehicleTrigger(PlayerbotAI* ai) : Trigger(ai, "flame leviathan on vehicle") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class FlameLeviathanVehicleNearTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
FlameLeviathanVehicleNearTrigger(PlayerbotAI* ai) : Trigger(ai, "flame leviathan vehicle near") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Razorscale
|
||||
//
|
||||
class RazorscaleFlyingAloneTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleFlyingAloneTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale flying alone") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleDevouringFlamesTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleDevouringFlamesTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale avoid devouring flames") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleAvoidSentinelTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleAvoidSentinelTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale avoid sentinel") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleAvoidWhirlwindTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleAvoidWhirlwindTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale avoid whirlwind") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleGroundedTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleGroundedTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale grounded") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleHarpoonAvailableTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleHarpoonAvailableTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale harpoon trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class RazorscaleFuseArmorTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
RazorscaleFuseArmorTrigger(PlayerbotAI* ai) : Trigger(ai, "razorscale fuse armor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Iron Assembly
|
||||
//
|
||||
class IronAssemblyLightningTendrilsTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
IronAssemblyLightningTendrilsTrigger(PlayerbotAI* ai) : Trigger(ai, "iron assembly lightning tendrils trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class IronAssemblyOverloadTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
IronAssemblyOverloadTrigger(PlayerbotAI* ai) : Trigger(ai, "iron assembly overload trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class IronAssemblyRuneOfPowerTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
IronAssemblyRuneOfPowerTrigger(PlayerbotAI* ai) : Trigger(ai, "iron assembly rune of power trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Kologarn
|
||||
//
|
||||
class KologarnMarkDpsTargetTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnMarkDpsTargetTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn mark dps target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnFallFromFloorTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnFallFromFloorTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn fall from floor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnRubbleSlowdownTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnRubbleSlowdownTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn rubble slowdown trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnEyebeamTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnEyebeamTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn eyebeam trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnAttackDpsTargetTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnAttackDpsTargetTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn attack dps target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnRtiTargetTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnRtiTargetTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn rti target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class KologarnCrunchArmorTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
KologarnCrunchArmorTrigger(PlayerbotAI* ai) : Trigger(ai, "kologarn crunch armor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Auriaya
|
||||
//
|
||||
class AuriayaFallFromFloorTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
AuriayaFallFromFloorTrigger(PlayerbotAI* ai) : Trigger(ai, "auriaya fall from floor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Hodir
|
||||
//
|
||||
class HodirBitingColdTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
HodirBitingColdTrigger(PlayerbotAI* ai) : Trigger(ai, "hodir biting cold") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class HodirNearSnowpackedIcicleTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
HodirNearSnowpackedIcicleTrigger(PlayerbotAI* ai) : Trigger(ai, "hodir near snowpacked icicle") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Freya
|
||||
//
|
||||
class FreyaNearNatureBombTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
FreyaNearNatureBombTrigger(PlayerbotAI* ai) : Trigger(ai, "freya near nature bomb") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class FreyaMarkDpsTargetTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
FreyaMarkDpsTargetTrigger(PlayerbotAI* ai) : Trigger(ai, "freya mark dps target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class FreyaMoveToHealingSporeTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
FreyaMoveToHealingSporeTrigger(PlayerbotAI* ai) : Trigger(ai, "freya move to healing spore trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Thorim
|
||||
//
|
||||
class ThorimUnbalancingStrikeTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimUnbalancingStrikeTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim unbalancing strike trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class ThorimMarkDpsTargetTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimMarkDpsTargetTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim mark dps target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class ThorimGauntletPositioningTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimGauntletPositioningTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim gauntlet positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class ThorimArenaPositioningTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimArenaPositioningTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim arena positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class ThorimFallFromFloorTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimFallFromFloorTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim fall from floor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class ThorimPhase2PositioningTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
ThorimPhase2PositioningTrigger(PlayerbotAI* ai) : Trigger(ai, "thorim phase 2 positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Mimiron
|
||||
//
|
||||
class MimironShockBlastTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironShockBlastTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron shock blast trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironPhase1PositioningTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironPhase1PositioningTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron phase 1 positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironP3Wx2LaserBarrageTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironP3Wx2LaserBarrageTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron p3wx2 laser barrage trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironRapidBurstTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironRapidBurstTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron rapid burst trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironAerialCommandUnitTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironAerialCommandUnitTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron aerial command unit trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironRocketStrikeTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironRocketStrikeTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron rocket strike trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironPhase4MarkDpsTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironPhase4MarkDpsTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron phase 4 mark dps trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class MimironCheatTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
MimironCheatTrigger(PlayerbotAI* ai) : Trigger(ai, "mimiron cheat trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// General Vezax
|
||||
//
|
||||
class VezaxCheatTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
VezaxCheatTrigger(PlayerbotAI* ai) : Trigger(ai, "vezax cheat trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class VezaxShadowCrashTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
VezaxShadowCrashTrigger(PlayerbotAI* ai) : Trigger(ai, "vezax shadow crash trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class VezaxMarkOfTheFacelessTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
VezaxMarkOfTheFacelessTrigger(PlayerbotAI* ai) : Trigger(ai, "vezax mark of the faceless trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
//
|
||||
// Yogg-Saron
|
||||
//
|
||||
class YoggSaronTrigger : public Trigger
|
||||
{
|
||||
public:
|
||||
YoggSaronTrigger(PlayerbotAI* ai, std::string const name = "yogg saron trigger", int32 checkInteval = 1)
|
||||
: Trigger(ai, name, checkInteval) {}
|
||||
|
||||
bool IsYoggSaronFight();
|
||||
bool IsPhase2();
|
||||
bool IsPhase3();
|
||||
bool IsInBrainLevel();
|
||||
bool IsInIllusionRoom();
|
||||
bool IsInStormwindKeeperIllusion();
|
||||
bool IsInIcecrownKeeperIllusion();
|
||||
bool IsInChamberOfTheAspectsIllusion();
|
||||
bool IsMasterIsInIllusionGroup();
|
||||
bool IsMasterIsInBrainRoom();
|
||||
Position GetIllusionRoomEntrancePosition();
|
||||
Unit* GetIllusionRoomRtiTarget();
|
||||
Unit* GetNextIllusionRoomRtiTarget();
|
||||
Unit* GetSaraIfAlive();
|
||||
};
|
||||
|
||||
class YoggSaronOminousCloudCheatTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronOminousCloudCheatTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron ominous cloud cheat trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronGuardianPositioningTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronGuardianPositioningTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron guardian positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronSanityTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronSanityTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron sanity trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronDeathOrbTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronDeathOrbTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron death orb trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronMaladyOfTheMindTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronMaladyOfTheMindTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron malady of the mind trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronMarkTargetTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronMarkTargetTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron mark target trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronBrainLinkTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronBrainLinkTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron brain link trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronMoveToEnterPortalTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronMoveToEnterPortalTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron move to enter portal trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronFallFromFloorTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronFallFromFloorTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron fall from floor trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronBossRoomMovementCheatTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronBossRoomMovementCheatTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron boss room movement cheat trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronUsePortalTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronUsePortalTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron use portal trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronIllusionRoomTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronIllusionRoomTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron illusion room trigger") {}
|
||||
bool IsActive() override;
|
||||
|
||||
private:
|
||||
bool GoToBrainRoomRequired();
|
||||
bool SetRtiMarkRequired();
|
||||
bool SetRtiTargetRequired();
|
||||
};
|
||||
|
||||
class YoggSaronMoveToExitPortalTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronMoveToExitPortalTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron move to exit portal trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronLunaticGazeTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronLunaticGazeTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron lunatic gaze trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
class YoggSaronPhase3PositioningTrigger : public YoggSaronTrigger
|
||||
{
|
||||
public:
|
||||
YoggSaronPhase3PositioningTrigger(PlayerbotAI* ai) : YoggSaronTrigger(ai, "yogg-saron phase 3 positioning trigger") {}
|
||||
bool IsActive() override;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user