diff options
Diffstat (limited to 'src')
4 files changed, 207 insertions, 204 deletions
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp index b10edbf31c9..be92981a0a1 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_king_dred.cpp @@ -15,93 +15,112 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* - * Comment: MAYBE need more improve the "Raptor Call". - */ - #include "ScriptMgr.h" #include "drak_tharon_keep.h" +#include "Containers.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "SpellInfo.h" -enum Spells +enum DredTexts { - SPELL_BELLOWING_ROAR = 22686, // fears the group, can be resisted/dispelled - SPELL_GRIEVOUS_BITE = 48920, - SPELL_MANGLING_SLASH = 48873, // cast on the current tank, adds debuf - SPELL_FEARSOME_ROAR = 48849, - SPELL_PIERCING_SLASH = 48878, // debuff --> Armor reduced by 75% - SPELL_RAPTOR_CALL = 59416, // dummy - SPELL_GUT_RIP = 49710, - SPELL_REND = 13738 + EMOTE_SLASH = 0 }; -enum Misc +enum DredSpells { - ACTION_RAPTOR_KILLED = 1, - DATA_RAPTORS_KILLED = 2 + // Dred + SPELL_BELLOWING_ROAR = 22686, + SPELL_GRIEVOUS_BITE = 48920, + SPELL_FEARSOME_ROAR = 48849, + SPELL_RAPTOR_CALL = 59416, + SPELL_MULTI_SLASH = 48856, + SPELL_PIERCING_SLASH = 48878, + SPELL_MANGLING_SLASH = 48873, + + // Raptors + SPELL_GUT_RIP = 49710, + SPELL_REND = 13738 }; -enum Events +enum DredEvents { - EVENT_BELLOWING_ROAR = 1, + EVENT_BELLOWING_ROAR = 1, EVENT_GRIEVOUS_BITE, - EVENT_MANGLING_SLASH, EVENT_FEARSOME_ROAR, + EVENT_RAPTOR_CALL, + EVENT_MULTI_SLASH, EVENT_PIERCING_SLASH, - EVENT_RAPTOR_CALL + EVENT_MANGLING_SLASH }; -struct boss_king_dred : public BossAI +enum DredMisc { - boss_king_dred(Creature* creature) : BossAI(creature, DATA_KING_DRED) - { - Initialize(); - } + ACTION_RAPTOR_KILLED = 1, + DATA_RAPTORS_KILLED = 2 +}; - void Initialize() - { - raptorsKilled = 0; - } +// 27483 - King Dred +struct boss_king_dred : public BossAI +{ + boss_king_dred(Creature* creature) : BossAI(creature, DATA_KING_DRED), _raptorsKilled(0) { } void Reset() override { - Initialize(); _Reset(); + _raptorsKilled = 0; } void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, 33s); - events.ScheduleEvent(EVENT_GRIEVOUS_BITE, 20s); - events.ScheduleEvent(EVENT_MANGLING_SLASH, 18500ms); + events.ScheduleEvent(EVENT_BELLOWING_ROAR, 15s, 25s); + events.ScheduleEvent(EVENT_GRIEVOUS_BITE, 15s, 20s); events.ScheduleEvent(EVENT_FEARSOME_ROAR, 10s, 20s); - events.ScheduleEvent(EVENT_PIERCING_SLASH, 15s); - events.ScheduleEvent(EVENT_RAPTOR_CALL, 20s, 25s); + events.ScheduleEvent(EVENT_RAPTOR_CALL, 15s, 20s); + events.ScheduleEvent(EVENT_MULTI_SLASH, 18s, 22s); + } + + void OnSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_MULTI_SLASH) + Talk(EMOTE_SLASH); + } + + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_MULTI_SLASH) + { + events.ScheduleEvent(EVENT_PIERCING_SLASH, 1s); + events.ScheduleEvent(EVENT_MANGLING_SLASH, 3s); + } + + if (spellInfo->Id == SPELL_RAPTOR_CALL) + { + /// @todo: This is wrong. Engage nearby alive not yet engaged raptor instead + float x, y, z; + + me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 10.0f); + me->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1s); + } } void DoAction(int32 action) override { if (action == ACTION_RAPTOR_KILLED) - ++raptorsKilled; + ++_raptorsKilled; } uint32 GetData(uint32 type) const override { if (type == DATA_RAPTORS_KILLED) - return raptorsKilled; + return _raptorsKilled; return 0; } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -118,32 +137,29 @@ struct boss_king_dred : public BossAI { case EVENT_BELLOWING_ROAR: DoCastAOE(SPELL_BELLOWING_ROAR); - events.ScheduleEvent(EVENT_BELLOWING_ROAR, 33s); + events.Repeat(15s, 20s); break; case EVENT_GRIEVOUS_BITE: DoCastVictim(SPELL_GRIEVOUS_BITE); - events.ScheduleEvent(EVENT_GRIEVOUS_BITE, 20s); - break; - case EVENT_MANGLING_SLASH: - DoCastVictim(SPELL_MANGLING_SLASH); - events.ScheduleEvent(EVENT_MANGLING_SLASH, 18500ms); + events.Repeat(20s); break; case EVENT_FEARSOME_ROAR: DoCastAOE(SPELL_FEARSOME_ROAR); - events.ScheduleEvent(EVENT_FEARSOME_ROAR, 10s, 20s); + events.Repeat(10s, 20s); + break; + case EVENT_RAPTOR_CALL: + DoCastSelf(SPELL_RAPTOR_CALL); + events.Repeat(30s); + break; + case EVENT_MULTI_SLASH: + DoCastSelf(SPELL_MULTI_SLASH); + events.Repeat(18s, 22s); break; case EVENT_PIERCING_SLASH: DoCastVictim(SPELL_PIERCING_SLASH); - events.ScheduleEvent(EVENT_PIERCING_SLASH, 15s); break; - case EVENT_RAPTOR_CALL: - DoCastVictim(SPELL_RAPTOR_CALL); - - float x, y, z; - - me->GetClosePoint(x, y, z, me->GetCombatReach() / 3, 10.0f); - me->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), x, y, z, 0, TEMPSUMMON_DEAD_DESPAWN, 1s); - events.ScheduleEvent(EVENT_RAPTOR_CALL, 20s, 25s); + case EVENT_MANGLING_SLASH: + DoCastVictim(SPELL_MANGLING_SLASH); break; default: break; @@ -157,29 +173,32 @@ struct boss_king_dred : public BossAI } private: - uint8 raptorsKilled; + uint8 _raptorsKilled; }; +// 26641 - Drakkari Gutripper struct npc_drakkari_gutripper : public ScriptedAI { - npc_drakkari_gutripper(Creature* creature) : ScriptedAI(creature) + npc_drakkari_gutripper(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void Reset() override { - Initialize(); - instance = me->GetInstanceScript(); + _scheduler.CancelAll(); } - void Initialize() + void JustEngagedWith(Unit* /*who*/) override { - GutRipTimer = urand(10000, 15000); + _scheduler.Schedule(10s, 15s, [this](TaskContext task) + { + DoCastVictim(SPELL_GUT_RIP); + task.Repeat(10s, 15s); + }); } - InstanceScript* instance; - - uint32 GutRipTimer; - - void Reset() override + void JustDied(Unit* /*killer*/) override { - Initialize(); + if (Creature* dred = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_KING_DRED))) + dred->AI()->DoAction(ACTION_RAPTOR_KILLED); } void UpdateAI(uint32 diff) override @@ -187,44 +206,39 @@ struct npc_drakkari_gutripper : public ScriptedAI if (!UpdateVictim()) return; - if (GutRipTimer <= diff) - { - DoCastVictim(SPELL_GUT_RIP, false); - GutRipTimer = urand(10000, 15000); - } - else - GutRipTimer -= diff; + _scheduler.Update(diff); DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override - { - if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KING_DRED))) - Dred->AI()->DoAction(ACTION_RAPTOR_KILLED); - } +private: + TaskScheduler _scheduler; + InstanceScript* _instance; }; +// 26628 - Drakkari Scytheclaw struct npc_drakkari_scytheclaw : public ScriptedAI { - npc_drakkari_scytheclaw(Creature* creature) : ScriptedAI(creature) + npc_drakkari_scytheclaw(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + + void Reset() override { - Initialize(); - instance = me->GetInstanceScript(); + _scheduler.CancelAll(); } - void Initialize() + void JustEngagedWith(Unit* /*who*/) override { - uiRendTimer = urand(10000, 15000); + _scheduler.Schedule(10s, 15s, [this](TaskContext task) + { + DoCastVictim(SPELL_REND); + task.Repeat(10s, 15s); + }); } - InstanceScript* instance; - - uint32 uiRendTimer; - - void Reset() override + void JustDied(Unit* /*killer*/) override { - Initialize(); + if (Creature* dred = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_KING_DRED))) + dred->AI()->DoAction(ACTION_RAPTOR_KILLED); } void UpdateAI(uint32 diff) override @@ -232,22 +246,14 @@ struct npc_drakkari_scytheclaw : public ScriptedAI if (!UpdateVictim()) return; - if (uiRendTimer <= diff) - { - DoCastVictim(SPELL_REND, false); - uiRendTimer = urand(10000, 15000); - } - else - uiRendTimer -= diff; + _scheduler.Update(diff); DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override - { - if (Creature* Dred = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KING_DRED))) - Dred->AI()->DoAction(ACTION_RAPTOR_KILLED); - } +private: + TaskScheduler _scheduler; + InstanceScript* _instance; }; class achievement_king_dred : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 684982ff1f4..acdb2578d26 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -24,7 +24,7 @@ #include "ScriptedCreature.h" #include "SpellScript.h" -enum Yells +enum NovosTexts { SAY_AGGRO = 0, SAY_KILL = 1, @@ -34,7 +34,7 @@ enum Yells EMOTE_SUMMONING_ADDS = 5 // unused }; -enum Spells +enum NovosSpells { SPELL_BEAM_CHANNEL = 52106, SPELL_ARCANE_FIELD = 47346, @@ -52,7 +52,7 @@ enum Spells SPELL_SUMMON_MINIONS = 59910 }; -enum Misc +enum NovosMisc { ACTION_RESET_CRYSTALS, ACTION_ACTIVATE_CRYSTAL, @@ -77,6 +77,7 @@ const SummonerInfo summoners[] = #define MAX_Y_COORD_OH_NOVOS -771.95f +// 26631 - Novos the Summoner struct boss_novos : public BossAI { boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS) @@ -148,12 +149,12 @@ struct boss_novos : public BossAI { case EVENT_SUMMON_MINIONS: DoCast(SPELL_SUMMON_MINIONS); - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); + events.Repeat(15s); break; case EVENT_ATTACK: if (Unit* victim = SelectTarget(SelectTargetMethod::Random)) DoCast(victim, RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY)); - events.ScheduleEvent(EVENT_ATTACK, 3s); + events.Repeat(3s); break; default: break; @@ -274,6 +275,7 @@ private: bool _bubbled; }; +// 26712 - Crystal Channel Target struct npc_crystal_channel_target : public ScriptedAI { npc_crystal_channel_target(Creature* creature) : ScriptedAI(creature) @@ -334,17 +336,6 @@ private: uint32 _temp; }; -class achievement_oh_novos : public AchievementCriteriaScript -{ -public: - achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { } - - bool OnCheck(Player* /*player*/, Unit* target) override - { - return target && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(DATA_NOVOS_ACHIEV); - } -}; - // 59910 - Summon Minions class spell_novos_summon_minions : public SpellScript { @@ -367,6 +358,17 @@ class spell_novos_summon_minions : public SpellScript } }; +class achievement_oh_novos : public AchievementCriteriaScript +{ +public: + achievement_oh_novos() : AchievementCriteriaScript("achievement_oh_novos") { } + + bool OnCheck(Player* /*player*/, Unit* target) override + { + return target && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(DATA_NOVOS_ACHIEV); + } +}; + void AddSC_boss_novos() { RegisterDrakTharonKeepCreatureAI(boss_novos); diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index 8fd09c0642b..ea0d311b30c 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -15,6 +15,10 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* + * Known Issues: Spell 49356 and 53463 will be interrupted for an unknown reason + */ + #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" @@ -22,11 +26,16 @@ #include "Player.h" #include "drak_tharon_keep.h" -/* - * Known Issues: Spell 49356 and 53463 will be interrupted for an unknown reason - */ +enum TharonjaTexts +{ + SAY_AGGRO = 0, + SAY_KILL = 1, + SAY_FLESH = 2, + SAY_SKELETON = 3, + SAY_DEATH = 4 +}; -enum Spells +enum TharonjaSpells { // Skeletal Spells (phase 1) SPELL_CURSE_OF_LIFE = 49527, @@ -45,7 +54,7 @@ enum Spells SPELL_DUMMY = 49551 }; -enum Events +enum TharonjaEvents { EVENT_CURSE_OF_LIFE = 1, EVENT_RAIN_OF_FIRE, @@ -61,20 +70,12 @@ enum Events EVENT_GOING_SKELETAL }; -enum Yells -{ - SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_FLESH = 2, - SAY_SKELETON = 3, - SAY_DEATH = 4 -}; - -enum Models +enum TharonjaMisc { MODEL_FLESH = 27073 }; +// 26632 - The Prophet Tharon'ja struct boss_tharon_ja : public BossAI { boss_tharon_ja(Creature* creature) : BossAI(creature, DATA_THARON_JA) { } @@ -128,30 +129,30 @@ struct boss_tharon_ja : public BossAI case EVENT_CURSE_OF_LIFE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) DoCast(target, SPELL_CURSE_OF_LIFE); - events.ScheduleEvent(EVENT_CURSE_OF_LIFE, 10s, 15s); + events.Repeat(10s, 15s); return; case EVENT_SHADOW_VOLLEY: DoCastVictim(SPELL_SHADOW_VOLLEY); - events.ScheduleEvent(EVENT_SHADOW_VOLLEY, 8s, 10s); + events.Repeat(8s, 10s); return; case EVENT_RAIN_OF_FIRE: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) DoCast(target, SPELL_RAIN_OF_FIRE); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 14s, 18s); + events.Repeat(14s, 18s); return; case EVENT_LIGHTNING_BREATH: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) DoCast(target, SPELL_LIGHTNING_BREATH); - events.ScheduleEvent(EVENT_LIGHTNING_BREATH, 6s, 7s); + events.Repeat(6s, 7s); return; case EVENT_EYE_BEAM: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) DoCast(target, SPELL_EYE_BEAM); - events.ScheduleEvent(EVENT_EYE_BEAM, 4s, 6s); + events.Repeat(4s, 6s); return; case EVENT_POISON_CLOUD: DoCastAOE(SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_POISON_CLOUD, 10s, 12s); + events.Repeat(10s, 12s); return; case EVENT_DECAY_FLESH: DoCastAOE(SPELL_DECAY_FLESH); diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index e90e23b2cf0..90c4b3b8f75 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -24,7 +24,16 @@ #include "SpellAuraEffects.h" #include "SpellScript.h" -enum Spells +enum TrollgoreTexts +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_CONSUME = 2, + SAY_EXPLODE = 3, + SAY_DEATH = 4 +}; + +enum TrollgoreSpells { SPELL_INFECTED_WOUND = 49637, SPELL_CRUSH = 49639, @@ -43,48 +52,32 @@ enum Spells #define SPELL_CONSUME_BUFF_HELPER DUNGEON_MODE<uint32>(SPELL_CONSUME_BUFF, SPELL_CONSUME_BUFF_H) -enum Yells +enum TrollgoreEvents { - SAY_AGGRO = 0, - SAY_KILL = 1, - SAY_CONSUME = 2, - SAY_EXPLODE = 3, - SAY_DEATH = 4 + EVENT_CONSUME = 1, + EVENT_CRUSH, + EVENT_INFECTED_WOUND, + EVENT_CORPSE_EXPLODE, + EVENT_SPAWN }; -enum Misc +enum TrollgoreMisc { DATA_CONSUMPTION_JUNCTION = 1, POINT_LANDING = 1 }; -enum Events -{ - EVENT_CONSUME = 1, - EVENT_CRUSH, - EVENT_INFECTED_WOUND, - EVENT_CORPSE_EXPLODE, - EVENT_SPAWN -}; - Position const Landing = { -263.0534f, -660.8658f, 26.50903f, 0.0f }; +// 26630 - Trollgore struct boss_trollgore : public BossAI { - boss_trollgore(Creature* creature) : BossAI(creature, DATA_TROLLGORE) - { - Initialize(); - } - - void Initialize() - { - _consumptionJunction = true; - } + boss_trollgore(Creature* creature) : BossAI(creature, DATA_TROLLGORE), _consumptionJunction(true) { } void Reset() override { _Reset(); - Initialize(); + _consumptionJunction = true; } void JustEngagedWith(Unit* who) override @@ -99,6 +92,34 @@ struct boss_trollgore : public BossAI events.ScheduleEvent(EVENT_SPAWN, 30s, 40s); } + uint32 GetData(uint32 type) const override + { + if (type == DATA_CONSUMPTION_JUNCTION) + return _consumptionJunction ? 1 : 0; + + return 0; + } + + void JustSummoned(Creature* summon) override + { + summon->GetMotionMaster()->MovePoint(POINT_LANDING, Landing); + summons.Summon(summon); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + Talk(SAY_SLAY); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -116,27 +137,27 @@ struct boss_trollgore : public BossAI case EVENT_CONSUME: Talk(SAY_CONSUME); DoCastAOE(SPELL_CONSUME); - events.ScheduleEvent(EVENT_CONSUME, 15s); + events.Repeat(15s); break; case EVENT_CRUSH: DoCastVictim(SPELL_CRUSH); - events.ScheduleEvent(EVENT_CRUSH, 10s, 15s); + events.Repeat(10s, 15s); break; case EVENT_INFECTED_WOUND: DoCastVictim(SPELL_INFECTED_WOUND); - events.ScheduleEvent(EVENT_INFECTED_WOUND, 25s, 35s); + events.Repeat(25s, 35s); break; case EVENT_CORPSE_EXPLODE: Talk(SAY_EXPLODE); DoCastAOE(SPELL_CORPSE_EXPLODE); - events.ScheduleEvent(EVENT_CORPSE_EXPLODE, 15s, 19s); + events.Repeat(15s, 19s); break; case EVENT_SPAWN: for (uint8 i = 0; i < 3; ++i) if (Creature* trigger = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TROLLGORE_INVADER_SUMMONER_1 + i))) trigger->CastSpell(trigger, RAND(SPELL_SUMMON_INVADER_A, SPELL_SUMMON_INVADER_B, SPELL_SUMMON_INVADER_C), me->GetGUID()); - events.ScheduleEvent(EVENT_SPAWN, 30s, 40s); + events.Repeat(30s, 40s); break; default: break; @@ -156,38 +177,11 @@ struct boss_trollgore : public BossAI DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - - uint32 GetData(uint32 type) const override - { - if (type == DATA_CONSUMPTION_JUNCTION) - return _consumptionJunction ? 1 : 0; - - return 0; - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_KILL); - } - - void JustSummoned(Creature* summon) override - { - summon->GetMotionMaster()->MovePoint(POINT_LANDING, Landing); - summons.Summon(summon); - } - - private: - bool _consumptionJunction; +private: + bool _consumptionJunction; }; +// 27709, 27753, 27754 - Drakkari Invader struct npc_drakkari_invader : public ScriptedAI { npc_drakkari_invader(Creature* creature) : ScriptedAI(creature) { } |
