19#include "G3DPosition.hpp"
100#define DEVOURING_FLAME_GROUND RAID_MODE<uint32>(64709, 64734)
101#define FLAME_BREATH RAID_MODE<uint32>(63317, 64021)
102#define CHAIN_LIGHTNING RAID_MODE<uint32>(64758, 64759)
103#define LIGHTNING_BOLT RAID_MODE<uint32>(63809, 64696)
235 { 571.9465f, -136.0118f, 391.5171f, 2.286379f },
236 { 589.9233f, -133.6223f, 391.8968f, 3.298687f },
237 { 559.1199f, -140.5058f, 391.1803f, 4.049168f },
238 { 606.2297f, -136.7212f, 391.1803f, 5.131269f }
243 { 571.9012f, -136.5541f, 391.5171f, 4.921829f },
244 { 589.9233f, -133.6223f, 391.8968f, 4.81711f },
245 { 559.1199f, -140.5058f, 391.1803f, 5.061456f },
246 { 606.2297f, -136.7212f, 391.1803f, 4.537859f }
251 { 624.3065f, -154.4163f, 391.6442f },
252 { 611.6274f, -170.9375f, 391.8087f },
253 { 572.1548f, -167.4471f, 391.8087f },
254 { 558.4640f, -165.0114f, 391.8087f },
255 { 603.3345f, -164.4297f, 391.8087f },
256 { 549.1727f, -159.1180f, 391.8087f }
261 { 574.9293f, -184.5150f, 391.8921f },
262 { 539.7838f, -178.5337f, 391.3053f },
263 { 627.1754f, -177.9638f, 391.5553f }
276 { 657.0227f, -361.1278f, 519.5406f },
277 { 698.9319f, -340.9654f, 520.4857f },
278 { 713.8673f, -290.2219f, 518.4573f },
279 { 711.1782f, -259.6798f, 524.6802f },
280 { 695.5101f, -234.6734f, 529.1528f },
281 { 666.9619f, -220.7599f, 531.4860f },
282 { 629.2765f, -219.7951f, 528.9301f },
283 { 597.4018f, -233.7745f, 526.6508f },
284 { 577.5307f, -275.4489f, 528.1241f },
285 { 583.1092f, -319.5873f, 527.9302f },
286 { 611.5800f, -353.1930f, 526.2653f }
334 init.MovebyPath(path, 0);
534 int32 enabled = active ? 1 : 0;
540 float x =
frand(540.0f, 640.0f);
541 float y =
frand(-230.0f, -195.0f);
590 uint8 random = RAID_MODE<uint8>(2,
urand(2, 4));
592 for (
uint8 n = 0; n < random; ++n)
697 for (
uint8 i = 0; i < harpoonNumber; ++i)
705 harpoon->RemoveFromWorld();
714 std::list<Creature*> Controllers;
717 for (
Creature* controller : Controllers)
718 controller->InterruptNonMeleeSpells(
false);
728 switch (harpoonNumber)
732 _harpoons.emplace_back(harpoon->GetGUID());
736 _harpoons.emplace_back(harpoon->GetGUID());
740 _harpoons.emplace_back(harpoon->GetGUID());
744 _harpoons.emplace_back(harpoon->GetGUID());
752 switch (harpoonNumber)
756 _harpoons.emplace_back(harpoon->GetGUID());
760 _harpoons.emplace_back(harpoon->GetGUID());
1257 razorscale->AI()->JustSummoned(
me);
1316 razorscale->AI()->JustSummoned(
me);
1382 razorscale->AI()->JustSummoned(
me);
1485 brokenHarpoon->RemoveFromWorld();
1516 controller->CastSpell(
nullptr, spellId,
true);
1533 return GetUlduarAI<go_razorscale_harpoonAI>(go);
1569 return GetUlduarAI<go_razorscale_mole_machineAI>(go);
1592 if (target->IsTrigger())
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
@ ENCOUNTER_FRAME_DISENGAGE
@ SPLINE_CHAIN_MOTION_TYPE
@ TEMPSUMMON_TIMED_DESPAWN
std::vector< ObjectGuid > GuidVector
float frand(float min, float max)
uint32 urand(uint32 min, uint32 max)
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
#define RegisterSpellScript(spell_script)
void CloseGossipMenuFor(Player *player)
@ TARGET_UNIT_SRC_AREA_ENTRY
@ EMOTE_STATE_USE_STANDING
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_AURA_PERIODIC_DUMMY
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
constexpr Position RazorFlightPositionPhase2
@ SAY_COMMANDER_GROUND_PHASE
@ SAY_COMMANDER_ENGINEERS_DEAD
constexpr Position RazorscaleLand
@ ACTION_START_PERMA_GROUND
@ ACTION_STOP_CONTROLLERS
@ ACTION_SHACKLE_RAZORSCALE
@ ACTION_DESTROY_HARPOONS
constexpr Position PosHarpoon[4]
@ RAZORSCALE_FIRE_STATE_10_GROUP
@ WORLD_STATE_RAZORSCALE_MUSIC
@ DATA_IRON_DWARF_MEDIUM_RARE
@ RAZORSCALE_FIRE_STATE_25_GROUP
@ RAZORSCALE_EXPEDITION_GROUP
constexpr Position TrapperPosition[3]
constexpr Position PosBrokenHarpoon[4]
@ SPELL_TRIGGER_SUMMON_IRON_VRYKUL
@ SPELL_SUMMON_MOLE_MACHINE
@ SPELL_HARPOON_FIRE_STATE
@ SPELL_TRIGGER_SUMMON_IRON_DWARVES
@ SPELL_SUMMON_IRON_DWARF_GUARDIAN
@ SPELL_TRIGGER_SUMMON_IRON_DWARVES_2
@ SPELL_TRIGGER_SUMMON_IRON_DWARVES_3
@ SPELL_SUMMON_IRON_DWARF_WATCHER
@ POINT_RAZORSCALE_TAKEOFF
@ POINT_RAZORSCALE_FLIGHT_2
@ POINT_SHACKLE_RAZORSCALE
@ POINT_RAZORSCALE_FLIGHT
@ POINT_RAZORSCALE_GROUND
@ SPLINE_ENGINEER_WEST_25_HARPOON_1
@ SPLINE_ENGINEER_NORTH_25_HARPOON_2
@ SPLINE_ENGINEER_EAST_25_HARPOON_1
@ SPLINE_ENGINEER_EAST_10_BASE
@ SPLINE_ENGINEER_NORTH_25_HARPOON_1
@ SPLINE_ENGINEER_EAST_10_HARPOON_1
@ SPLINE_ENGINEER_NORTH_10_BASE
@ SPLINE_ENGINEER_WEST_10_HARPOON_1
@ SPLINE_ENGINEER_EAST_25_HARPOON_3
@ SPLINE_ENGINEER_NORTH_10_HARPOON_1
@ SPLINE_ENGINEER_WEST_25_HARPOON_3
@ SPLINE_ENGINEER_EAST_25_HARPOON_4
@ SPLINE_ENGINEER_WEST_10_BASE
@ SPLINE_ENGINEER_NORTH_25_HARPOON_3
@ SPLINE_ENGINEER_NORTH_10_HARPOON_2
@ SPLINE_ENGINEER_WEST_25_HARPOON_4
@ SPLINE_ENGINEER_NORTH_25_BASE
@ SPLINE_ENGINEER_WEST_10_HARPOON_2
@ SPLINE_ENGINEER_EAST_25_HARPOON_2
@ SPLINE_ENGINEER_WEST_25_HARPOON_2
@ SPLINE_ENGINEER_NORTH_25_HARPOON_4
@ SPLINE_ENGINEER_WEST_25_BASE
@ SPLINE_ENGINEER_EAST_10_HARPOON_2
constexpr uint32 SummonMinionsSpells[4]
#define DEVOURING_FLAME_GROUND
void AddSC_boss_razorscale()
constexpr Position DefendersPosition[6]
constexpr Position RazorscaleGroundPosition
constexpr Position RazorscalePath[]
constexpr Position RazorFlightPosition
@ EVENT_HANDLE_DESTROY_HARPOON
@ EVENT_RESUME_MOVE_CHASE
@ EVENT_FLAME_BREATH_GROUND
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
uint8 GetStackAmount() const
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void JustSummoned(Creature *summon) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
bool CanAIAttack(Unit const *target) const override
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void SetHomePosition(float x, float y, float z, float o)
void SetImmuneToPC(bool apply) override
void GetHomePosition(float &x, float &y, float &z, float &ori) const
void SetReactState(ReactStates st)
void SetRegenerateHealth(bool value)
void SetImmuneToNPC(bool apply) override
void Repeat(Milliseconds time)
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
bool IsInPhase(uint8 phase) const
void SetPhase(uint8 phase)
void UseDoorOrButton(uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
void SetFlag(GameObjectFlags flags)
Creature * GetCreature(uint32 type)
void DoUpdateWorldState(int32 worldStateId, int32 value)
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
void MoveTakeoff(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void MoveLand(uint32 id, Position const &pos, Optional< int32 > tierTransitionId={}, Optional< float > velocity={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default)
static Creature * ToCreature(Object *o)
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Creature * GetHitCreature() const
int32 GetHitDamage() const
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHitTarget
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void DoAction(int32 info, Predicate &&predicate, uint16 max=0)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
virtual void SetData(uint32, uint32)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
virtual bool CanAIAttack(Unit const *) const
virtual uint32 GetData(uint32) const
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
SpellCastResult DoCast(uint32 spellId)
void UpdateSpeed(UnitMoveType mtype)
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
MotionMaster * GetMotionMaster()
void RemoveNpcFlag(NPCFlags flags)
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
void SetEmoteState(Emote emote)
void SetSpeedRate(UnitMoveType mtype, float rate)
void SetFacingTo(float const ori, bool force=true)
bool HasUnitState(const uint32 f) const
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
void setActive(bool isActiveObject)
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
void SetFarVisible(bool on)
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
bool OnCheck(Player *, Unit *target) override
achievement_iron_dwarf_medium_rare()
achievement_quick_shave()
bool OnCheck(Player *, Unit *target) override
GameObjectAI * GetAI(GameObject *go) const override
GameObjectAI * GetAI(GameObject *go) const override
go_razorscale_mole_machine()
void FilterTargets(std::list< WorldObject * > &targets)
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void HandleFused(AuraEffect const *)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex)
std::vector< Vector3 > PointsArray
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
constexpr std::size_t size()
constexpr void GetPosition(float &x, float &y) const
constexpr float GetOrientation() const
void SetCombatMovement(bool allowMovement)
T const & RAID_MODE(T const &normal10, T const &normal25) const
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void ScheduleGroundPhaseEvents()
void JustSummoned(Creature *summon) override
uint8 _engineersSummonCount
void DoAction(int32 actionId) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
uint32 GetData(uint32 type) const override
void SummonedCreatureDies(Creature *summon, Unit *) override
void MovementInform(uint32 type, uint32 pointId) override
bool CanAIAttack(Unit const *target) const override
void HandleMusic(bool active)
boss_razorscale(Creature *creature)
void UpdateAI(uint32 diff) override
void EnterEvadeMode(EvadeReason why) override
void JustDied(Unit *) override
void HandleInitialMovement()
void ScheduleAirPhaseEvents()
void JustEngagedWith(Unit *who) override
uint32 SelectRightSpell()
void UpdateAI(uint32 diff) override
bool OnGossipHello(Player *) override
go_razorscale_harpoonAI(GameObject *go)
void UpdateAI(uint32 diff) override
go_razorscale_mole_machineAI(GameObject *go)
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override
uint32 GetData(uint32 type) const override
npc_darkrune_guardian(Creature *creature)
void SetData(uint32 type, uint32 value) override
InstanceScript * _instance
InstanceScript * _instance
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
npc_darkrune_sentinel(Creature *creature)
void JustEngagedWith(Unit *) override
InstanceScript * _instance
npc_darkrune_watcher(Creature *creature)
void UpdateAI(uint32 diff) override
void BuildBrokenHarpoons()
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
void HandleControllersStopCast()
void DoAction(int32 actionId) override
InstanceScript * _instance
npc_expedition_commander(Creature *creature)
void UpdateAI(uint32 diff) override
void BuildHarpoon(uint8 harpoonNumber)
void SetData(uint32 type, uint32 value) override
InstanceScript * _instance
bool CanAIAttack(Unit const *target) const override
npc_expedition_defender(Creature *creature)
void MovementInform(uint32 type, uint32 pointId) override
void DoAction(int32 actionId) override
void UpdateAI(uint32 diff) override
void HandleHarpoonMovement()
void HandleFourthHarpoonMovement()
void HandleThirdHarpoonMovement()
npc_expedition_engineer(Creature *creature)
void ChangeOrientation(float orientation)
void MovementInform(uint32 type, uint32 pointId) override
void SetData(uint32 type, uint32 value) override
void HandleBaseMovement()
InstanceScript * _instance
void HandleSecondHarpoonMovement()
void DoAction(int32 actionId) override
void UpdateAI(uint32 diff) override
void SetData(uint32 type, uint32 value) override
void DoAction(int32 actionId) override
npc_expedition_trapper(Creature *creature)
InstanceScript * _instance
void MovementInform(uint32 type, uint32 pointId) override
void EnterEvadeMode(EvadeReason) override
npc_razorscale_devouring_flame(Creature *creature)
npc_razorscale_harpoon_fire_state(Creature *creature)
InstanceScript * _instance
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
npc_razorscale_spawner(Creature *creature)
@ DATA_EXPEDITION_COMMANDER
@ GO_RAZOR_BROKEN_HARPOON
#define RegisterUlduarCreatureAI(ai_name)
@ NPC_RAZORSCALE_HARPOON_FIRE_STATE
@ NPC_EXPEDITION_COMMANDER
@ NPC_RAZORSCALE_CONTROLLER
@ NPC_EXPEDITION_ENGINEER
@ NPC_EXPEDITION_DEFENDER