diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp | 135 | ||||
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h | 11 |
2 files changed, 75 insertions, 71 deletions
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp index dac3f118ec1..345089030b8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp @@ -29,7 +29,7 @@ enum Texts SAY_AGGRO = 1, // Ah, the entertainment has arrived. SAY_KILL = 2, // Baltharus leaves no survivors! - This world has enough heroes. SAY_CLONE = 3, // Twice the pain and half the fun. - SAY_DEATH = 4, // I... didn't see that coming.... + SAY_DEATH = 4 // I... didn't see that coming.... }; enum Spells @@ -42,28 +42,28 @@ enum Spells SPELL_CLONE = 74511, SPELL_REPELLING_WAVE = 74509, SPELL_CLEAR_DEBUFFS = 34098, - SPELL_SPAWN_EFFECT = 64195, + SPELL_SPAWN_EFFECT = 64195 }; enum Events { - EVENT_BLADE_TEMPEST = 1, - EVENT_CLEAVE = 2, - EVENT_ENERVATING_BRAND = 3, - EVENT_INTRO_TALK = 4, - EVENT_OOC_CHANNEL = 5, + EVENT_BLADE_TEMPEST = 1, + EVENT_CLEAVE, + EVENT_ENERVATING_BRAND, + EVENT_INTRO_TALK, + EVENT_SUMMONS_ATTACK }; enum Actions { - ACTION_CLONE = 1, + ACTION_CLONE = 1 }; enum Phases { - PHASE_ALL = 0, - PHASE_INTRO = 1, - PHASE_COMBAT = 2 + PHASE_ALL = 0, + PHASE_INTRO, + PHASE_COMBAT }; class boss_baltharus_the_warborn : public CreatureScript @@ -73,13 +73,7 @@ class boss_baltharus_the_warborn : public CreatureScript struct boss_baltharus_the_warbornAI : public BossAI { - boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN) - { - Initialize(); - _introDone = false; - } - - void Initialize() + boss_baltharus_the_warbornAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_THE_WARBORN), _introDone(false) { _cloneCount = RAID_MODE<uint8>(1, 2, 2, 2); } @@ -88,9 +82,9 @@ class boss_baltharus_the_warborn : public CreatureScript { _Reset(); events.SetPhase(PHASE_INTRO); - events.ScheduleEvent(EVENT_OOC_CHANNEL, 0, 0, PHASE_INTRO); - Initialize(); instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetMaxHealth()); + if (Creature* channelTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CRYSTAL_CHANNEL_TARGET))) + DoCast(channelTarget, SPELL_BARRIER_CHANNEL); } void DoAction(int32 action) override @@ -102,13 +96,13 @@ class boss_baltharus_the_warborn : public CreatureScript return; _introDone = true; me->setActive(true); - events.ScheduleEvent(EVENT_INTRO_TALK, 7000, 0, PHASE_INTRO); + events.ScheduleEvent(EVENT_INTRO_TALK, Seconds(7), 0, PHASE_INTRO); break; case ACTION_CLONE: { - DoCast(me, SPELL_CLEAR_DEBUFFS); - DoCast(me, SPELL_CLONE); - DoCast(me, SPELL_REPELLING_WAVE); + DoCastSelf(SPELL_CLEAR_DEBUFFS); + DoCastSelf(SPELL_CLONE); + DoCastSelf(SPELL_REPELLING_WAVE); Talk(SAY_CLONE); --_cloneCount; break; @@ -124,9 +118,9 @@ class boss_baltharus_the_warborn : public CreatureScript _EnterCombat(); events.Reset(); events.SetPhase(PHASE_COMBAT); - events.ScheduleEvent(EVENT_CLEAVE, 11000, 0, PHASE_COMBAT); - events.ScheduleEvent(EVENT_ENERVATING_BRAND, 13000, 0, PHASE_COMBAT); - events.ScheduleEvent(EVENT_BLADE_TEMPEST, 15000, 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_CLEAVE, Seconds(13), 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_ENERVATING_BRAND, Seconds(13), 0, PHASE_COMBAT); + events.ScheduleEvent(EVENT_BLADE_TEMPEST, Seconds(18), 0, PHASE_COMBAT); Talk(SAY_AGGRO); } @@ -148,7 +142,7 @@ class boss_baltharus_the_warborn : public CreatureScript { summons.Summon(summon); summon->SetHealth(me->GetHealth()); - summon->CastSpell(summon, SPELL_SPAWN_EFFECT, true); + events.ScheduleEvent(EVENT_SUMMONS_ATTACK, Seconds(2)); } void DamageTaken(Unit* /*attacker*/, uint32& damage) override @@ -170,10 +164,18 @@ class boss_baltharus_the_warborn : public CreatureScript instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage); } + void EnterEvadeMode(EvadeReason /*why*/) override + { + summons.DespawnAll(); + events.Reset(); + _DespawnAtEvade(); + } + void UpdateAI(uint32 diff) override { bool introPhase = events.IsInPhase(PHASE_INTRO); - if (!UpdateVictim() && !introPhase) + + if (!introPhase && !UpdateVictim()) return; if (!introPhase) @@ -181,7 +183,7 @@ class boss_baltharus_the_warborn : public CreatureScript events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase) + if (!introPhase && me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) @@ -191,30 +193,28 @@ class boss_baltharus_the_warborn : public CreatureScript case EVENT_INTRO_TALK: Talk(SAY_BALTHARUS_INTRO); break; - case EVENT_OOC_CHANNEL: - if (Creature* channelTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_CRYSTAL_CHANNEL_TARGET))) - DoCast(channelTarget, SPELL_BARRIER_CHANNEL); - events.ScheduleEvent(EVENT_OOC_CHANNEL, 7000, 0, PHASE_INTRO); - break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 24000, 0, PHASE_COMBAT); + events.Repeat(Seconds(20), Seconds(24)); break; case EVENT_BLADE_TEMPEST: - DoCast(me, SPELL_BLADE_TEMPEST); - events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000, 0, PHASE_COMBAT); + DoCastSelf(SPELL_BLADE_TEMPEST); + events.Repeat(Seconds(24)); break; case EVENT_ENERVATING_BRAND: for (uint8 i = 0; i < RAID_MODE<uint8>(4, 8, 8, 10); i++) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) DoCast(target, SPELL_ENERVATING_BRAND); - events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000, 0, PHASE_COMBAT); + events.Repeat(Seconds(26)); + break; + case EVENT_SUMMONS_ATTACK: + summons.DoZoneInCombat(NPC_BALTHARUS_THE_WARBORN_CLONE); break; default: break; } - if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase) + if (me->HasUnitState(UNIT_STATE_CASTING)) return; } @@ -237,33 +237,38 @@ class npc_baltharus_the_warborn_clone : public CreatureScript public: npc_baltharus_the_warborn_clone() : CreatureScript("npc_baltharus_the_warborn_clone") { } - struct npc_baltharus_the_warborn_cloneAI : public ScriptedAI + struct npc_baltharus_the_warborn_cloneAI : public BossAI { - npc_baltharus_the_warborn_cloneAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) + npc_baltharus_the_warborn_cloneAI(Creature* creature) : BossAI(creature, DATA_BALTHARUS_CLONE) { } + + void Reset() override { + DoCastSelf(SPELL_SPAWN_EFFECT); + me->SetReactState(REACT_DEFENSIVE); } void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); - _events.Reset(); - _events.ScheduleEvent(EVENT_CLEAVE, urand(5000, 10000)); - _events.ScheduleEvent(EVENT_BLADE_TEMPEST, urand(18000, 25000)); - _events.ScheduleEvent(EVENT_ENERVATING_BRAND, urand(10000, 15000)); + events.Reset(); + events.ScheduleEvent(EVENT_CLEAVE, Seconds(11)); + events.ScheduleEvent(EVENT_BLADE_TEMPEST, Seconds(15)); + events.ScheduleEvent(EVENT_ENERVATING_BRAND, Seconds(10)); } + void EnterEvadeMode(EvadeReason /*why*/) override { } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { // Setting DATA_BALTHARUS_SHARED_HEALTH to 0 when killed would bug the boss. if (me->GetHealth() > damage) - _instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage); + instance->SetData(DATA_BALTHARUS_SHARED_HEALTH, me->GetHealth() - damage); } void JustDied(Unit* killer) override { // This is here because DamageTaken wont trigger if the damage is deadly. - if (Creature* baltharus = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN))) + if (Creature* baltharus = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BALTHARUS_THE_WARBORN))) killer->Kill(baltharus); } @@ -272,42 +277,41 @@ class npc_baltharus_the_warborn_clone : public CreatureScript if (!UpdateVictim()) return; - me->SetHealth(_instance->GetData(DATA_BALTHARUS_SHARED_HEALTH)); + me->SetHealth(instance->GetData(DATA_BALTHARUS_SHARED_HEALTH)); - _events.Update(diff); + events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; - while (uint32 eventId = _events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); - _events.ScheduleEvent(EVENT_CLEAVE, 24000); + events.Repeat(Seconds(20), Seconds(24)); break; case EVENT_BLADE_TEMPEST: DoCastVictim(SPELL_BLADE_TEMPEST); - _events.ScheduleEvent(EVENT_BLADE_TEMPEST, 24000); - break; + events.Repeat(Seconds(24)); + break; case EVENT_ENERVATING_BRAND: for (uint8 i = 0; i < RAID_MODE<uint8>(4, 8, 8, 10); i++) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true)) DoCast(target, SPELL_ENERVATING_BRAND); - _events.ScheduleEvent(EVENT_ENERVATING_BRAND, 26000); + events.Repeat(Seconds(26)); break; default: break; } - } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } DoMeleeAttackIfReady(); } - - private: - EventMap _events; - InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -316,6 +320,7 @@ class npc_baltharus_the_warborn_clone : public CreatureScript } }; +// 74505 - Enervating Brand class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader { public: @@ -327,11 +332,9 @@ class spell_baltharus_enervating_brand_trigger : public SpellScriptLoader void CheckDistance() { - if (Unit* caster = GetOriginalCaster()) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); - } + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + target->CastSpell(caster, SPELL_SIPHONED_MIGHT, true); } void Register() override diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h index 849a9642a31..2d45deff9b7 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h @@ -49,6 +49,7 @@ enum RSDataTypes DATA_BURNING_TREE_4 = 16, DATA_FLAME_RING = 17, DATA_TWILIGHT_FLAME_RING = 18, + DATA_BALTHARUS_CLONE = 19 }; enum RSSharedActions @@ -56,7 +57,7 @@ enum RSSharedActions ACTION_INTRO_BALTHARUS = -3975101, ACTION_BALTHARUS_DEATH = -3975102, ACTION_INTRO_HALION = -4014601, - ACTION_INTRO_HALION_2 = -4014602, + ACTION_INTRO_HALION_2 = -4014602 }; enum RSCreaturesIds @@ -97,7 +98,7 @@ enum RSCreaturesIds NPC_COMBAT_STALKER = 40151, // Seen in sniffs but not used, so no wonder. // Xerestrasza - NPC_XERESTRASZA = 40429, + NPC_XERESTRASZA = 40429 }; enum RSGameObjectsIds @@ -112,19 +113,19 @@ enum RSGameObjectsIds GO_BURNING_TREE_1 = 203034, GO_BURNING_TREE_2 = 203035, GO_BURNING_TREE_3 = 203036, - GO_BURNING_TREE_4 = 203037, + GO_BURNING_TREE_4 = 203037 }; enum RSWorldStates { WORLDSTATE_CORPOREALITY_MATERIAL = 5049, WORLDSTATE_CORPOREALITY_TWILIGHT = 5050, - WORLDSTATE_CORPOREALITY_TOGGLE = 5051, + WORLDSTATE_CORPOREALITY_TOGGLE = 5051 }; enum RSInstanceSpell { - SPELL_BERSERK = 26662, + SPELL_BERSERK = 26662 }; template<typename AI, typename T> |