diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-07-14 22:23:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-14 22:23:17 +0300 |
commit | 572b480a2e030e55ac5d1c2ded1b72c5c7ade5cd (patch) | |
tree | 431346f759becca75e090bdd2182674379ac7ebf | |
parent | f7ecd86a248bec990b994bcec459742923eb1087 (diff) |
Scripts/BWL: Update scripts to new register model (3/3) (#26691)
-rw-r--r-- | src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp | 235 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp | 310 |
2 files changed, 245 insertions, 300 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index df6fee7fbb8..243cbf79ced 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -64,174 +64,141 @@ enum EVENTS EVENT_CONFLAGRATION = 4 }; -class boss_razorgore : public CreatureScript +struct boss_razorgore : public BossAI { -public: - boss_razorgore() : CreatureScript("boss_razorgore") { } + boss_razorgore(Creature* creature) : BossAI(creature, DATA_RAZORGORE_THE_UNTAMED) + { + Initialize(); + } - struct boss_razorgoreAI : public BossAI + void Initialize() { - boss_razorgoreAI(Creature* creature) : BossAI(creature, DATA_RAZORGORE_THE_UNTAMED) - { - Initialize(); - } + secondPhase = false; + } - void Initialize() - { - secondPhase = false; - } + void Reset() override + { + _Reset(); - void Reset() override - { - _Reset(); + Initialize(); + instance->SetData(DATA_EGG_EVENT, NOT_STARTED); + } - Initialize(); - instance->SetData(DATA_EGG_EVENT, NOT_STARTED); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); + instance->SetData(DATA_EGG_EVENT, NOT_STARTED); + } - instance->SetData(DATA_EGG_EVENT, NOT_STARTED); - } + void DoChangePhase() + { + events.ScheduleEvent(EVENT_CLEAVE, 15s); + events.ScheduleEvent(EVENT_STOMP, 35s); + events.ScheduleEvent(EVENT_FIREBALL, 7s); + events.ScheduleEvent(EVENT_CONFLAGRATION, 12s); + + secondPhase = true; + me->RemoveAllAuras(); + me->SetFullHealth(); + } - void DoChangePhase() - { - events.ScheduleEvent(EVENT_CLEAVE, 15s); - events.ScheduleEvent(EVENT_STOMP, 35s); - events.ScheduleEvent(EVENT_FIREBALL, 7s); - events.ScheduleEvent(EVENT_CONFLAGRATION, 12s); - - secondPhase = true; - me->RemoveAllAuras(); - me->SetFullHealth(); - } + void DoAction(int32 action) override + { + if (action == ACTION_PHASE_TWO) + DoChangePhase(); + } - void DoAction(int32 action) override - { - if (action == ACTION_PHASE_TWO) - DoChangePhase(); - } + void DamageTaken(Unit* /*who*/, uint32& damage) override + { + // @todo this is wrong - razorgore should still take damage, he should just nuke the whole room and respawn if he dies during P1 + if (!secondPhase) + damage = 0; + } - void DamageTaken(Unit* /*who*/, uint32& damage) override - { - // @todo this is wrong - razorgore should still take damage, he should just nuke the whole room and respawn if he dies during P1 - if (!secondPhase) - damage = 0; - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + events.Update(diff); - events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 7s, 10s); - break; - case EVENT_STOMP: - DoCastVictim(SPELL_WARSTOMP); - events.ScheduleEvent(EVENT_STOMP, 15s, 25s); - break; - case EVENT_FIREBALL: - DoCastVictim(SPELL_FIREBALLVOLLEY); - events.ScheduleEvent(EVENT_FIREBALL, 12s, 15s); - break; - case EVENT_CONFLAGRATION: - DoCastVictim(SPELL_CONFLAGRATION); - events.ScheduleEvent(EVENT_CONFLAGRATION, 30s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, 7s, 10s); + break; + case EVENT_STOMP: + DoCastVictim(SPELL_WARSTOMP); + events.ScheduleEvent(EVENT_STOMP, 15s, 25s); + break; + case EVENT_FIREBALL: + DoCastVictim(SPELL_FIREBALLVOLLEY); + events.ScheduleEvent(EVENT_FIREBALL, 12s, 15s); + break; + case EVENT_CONFLAGRATION: + DoCastVictim(SPELL_CONFLAGRATION); + events.ScheduleEvent(EVENT_CONFLAGRATION, 30s); + break; } - DoMeleeAttackIfReady(); - } - private: - bool secondPhase; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackwingLairAI<boss_razorgoreAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + DoMeleeAttackIfReady(); } + +private: + bool secondPhase; }; -class go_orb_of_domination : public GameObjectScript +struct go_orb_of_domination : public GameObjectAI { - public: - go_orb_of_domination() : GameObjectScript("go_orb_of_domination") { } - - struct go_orb_of_dominationAI : public GameObjectAI - { - go_orb_of_dominationAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } + go_orb_of_domination(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { } - InstanceScript* instance; + InstanceScript* instance; - bool OnGossipHello(Player* player) override + bool OnGossipHello(Player* player) override + { + if (instance->GetData(DATA_EGG_EVENT) != DONE) + { + if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { - if (instance->GetData(DATA_EGG_EVENT) != DONE) - { - if (Creature* razorgore = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) - { - razorgore->Attack(player, true); - player->CastSpell(razorgore, SPELL_MINDCONTROL); - } - } - return true; + razorgore->Attack(player, true); + player->CastSpell(razorgore, SPELL_MINDCONTROL); } - }; - - GameObjectAI* GetAI(GameObject* go) const override - { - return GetBlackwingLairAI<go_orb_of_dominationAI>(go); } + return true; + } }; // 19873 - Destroy Egg -class spell_egg_event : public SpellScriptLoader +class spell_egg_event : public SpellScript { - public: - spell_egg_event() : SpellScriptLoader("spell_egg_event") { } - - class spell_egg_eventSpellScript : public SpellScript - { - PrepareSpellScript(spell_egg_eventSpellScript); + PrepareSpellScript(spell_egg_event); - void HandleOnHit() - { - if (InstanceScript* instance = GetCaster()->GetInstanceScript()) - instance->SetData(DATA_EGG_EVENT, SPECIAL); - } - - void Register() override - { - OnHit += SpellHitFn(spell_egg_eventSpellScript::HandleOnHit); - } - }; + void HandleOnHit() + { + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SetData(DATA_EGG_EVENT, SPECIAL); + } - SpellScript* GetSpellScript() const override - { - return new spell_egg_eventSpellScript(); - } + void Register() override + { + OnHit += SpellHitFn(spell_egg_event::HandleOnHit); + } }; void AddSC_boss_razorgore() { - new boss_razorgore(); - new go_orb_of_domination(); - new spell_egg_event(); + RegisterBlackwingLairCreatureAI(boss_razorgore); + RegisterBlackwingLairGameObjectAI(go_orb_of_domination); + RegisterSpellScript(spell_egg_event); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index e95aa62c934..c1ee7bc464f 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -64,218 +64,196 @@ enum Events EVENT_BURNINGADRENALINE_TANK = 11 }; -class boss_vaelastrasz : public CreatureScript +struct boss_vaelastrasz : public BossAI { -public: - boss_vaelastrasz() : CreatureScript("boss_vaelastrasz") { } - - struct boss_vaelAI : public BossAI + boss_vaelastrasz(Creature* creature) : BossAI(creature, DATA_VAELASTRAZ_THE_CORRUPT) { - boss_vaelAI(Creature* creature) : BossAI(creature, DATA_VAELASTRAZ_THE_CORRUPT) - { - Initialize(); - creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - creature->SetFaction(FACTION_FRIENDLY); - creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void Initialize() - { - PlayerGUID.Clear(); - HasYelled = false; - } + Initialize(); + creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + creature->SetFaction(FACTION_FRIENDLY); + creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } - void Reset() override - { - _Reset(); + void Initialize() + { + PlayerGUID.Clear(); + HasYelled = false; + } - me->SetStandState(UNIT_STAND_STATE_DEAD); - Initialize(); - } + void Reset() override + { + _Reset(); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); + me->SetStandState(UNIT_STAND_STATE_DEAD); + Initialize(); + } - DoCast(me, SPELL_ESSENCEOFTHERED); - me->SetHealth(me->CountPctFromMaxHealth(30)); - // now drop damage requirement to be able to take loot - me->ResetPlayerDamageReq(); + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + + DoCast(me, SPELL_ESSENCEOFTHERED); + me->SetHealth(me->CountPctFromMaxHealth(30)); + // now drop damage requirement to be able to take loot + me->ResetPlayerDamageReq(); + + events.ScheduleEvent(EVENT_CLEAVE, 10s); + events.ScheduleEvent(EVENT_FLAMEBREATH, 15s); + events.ScheduleEvent(EVENT_FIRENOVA, 20s); + events.ScheduleEvent(EVENT_TAILSWIPE, 11s); + events.ScheduleEvent(EVENT_BURNINGADRENALINE_CASTER, 15s); + events.ScheduleEvent(EVENT_BURNINGADRENALINE_TANK, 45s); + } - events.ScheduleEvent(EVENT_CLEAVE, 10s); - events.ScheduleEvent(EVENT_FLAMEBREATH, 15s); - events.ScheduleEvent(EVENT_FIRENOVA, 20s); - events.ScheduleEvent(EVENT_TAILSWIPE, 11s); - events.ScheduleEvent(EVENT_BURNINGADRENALINE_CASTER, 15s); - events.ScheduleEvent(EVENT_BURNINGADRENALINE_TANK, 45s); - } + void BeginSpeech(Unit* target) + { + PlayerGUID = target->GetGUID(); + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + events.ScheduleEvent(EVENT_SPEECH_1, 1s); + } - void BeginSpeech(Unit* target) - { - PlayerGUID = target->GetGUID(); - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - events.ScheduleEvent(EVENT_SPEECH_1, 1s); - } + void KilledUnit(Unit* victim) override + { + if (rand32() % 5) + return; - void KilledUnit(Unit* victim) override - { - if (rand32() % 5) - return; + Talk(SAY_KILLTARGET, victim); + } - Talk(SAY_KILLTARGET, victim); - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + // Speech + if (!UpdateVictim()) { - events.Update(diff); - - // Speech - if (!UpdateVictim()) - { - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SPEECH_1: - Talk(SAY_LINE1); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_SPEECH_2, 12s); - break; - case EVENT_SPEECH_2: - Talk(SAY_LINE2); - me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_SPEECH_3, 12s); - break; - case EVENT_SPEECH_3: - Talk(SAY_LINE3); - me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_SPEECH_4, 16s); - break; - case EVENT_SPEECH_4: - me->SetFaction(FACTION_DRAGONFLIGHT_BLACK); - if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) - AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; - break; - } - } - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_CLEAVE: - events.ScheduleEvent(EVENT_CLEAVE, 15s); - DoCastVictim(SPELL_CLEAVE); + case EVENT_SPEECH_1: + Talk(SAY_LINE1); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_2, 12s); break; - case EVENT_FLAMEBREATH: - DoCastVictim(SPELL_FLAMEBREATH); - events.ScheduleEvent(EVENT_FLAMEBREATH, 8s, 14s); + case EVENT_SPEECH_2: + Talk(SAY_LINE2); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_3, 12s); break; - case EVENT_FIRENOVA: - DoCastVictim(SPELL_FIRENOVA); - events.ScheduleEvent(EVENT_FIRENOVA, 15s); + case EVENT_SPEECH_3: + Talk(SAY_LINE3); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_4, 16s); break; - case EVENT_TAILSWIPE: - //Only cast if we are behind - /*if (!me->HasInArc(M_PI, me->GetVictim())) - { - DoCast(me->GetVictim(), SPELL_TAILSWIPE); - }*/ - events.ScheduleEvent(EVENT_TAILSWIPE, 15s); - break; - case EVENT_BURNINGADRENALINE_CASTER: - { - //selects a random target that isn't the current victim and is a mana user (selects mana users) but not pets - //it also ignores targets who have the aura. We don't want to place the debuff on the same target twice. - if (Unit *target = SelectTarget(SelectTargetMethod::Random, 1, [&](Unit* u) { return u && !u->IsPet() && u->GetPowerType() == POWER_MANA && !u->HasAura(SPELL_BURNINGADRENALINE); })) - { - me->CastSpell(target, SPELL_BURNINGADRENALINE, true); - } - } - //reschedule the event - events.ScheduleEvent(EVENT_BURNINGADRENALINE_CASTER, 15s); - break; - case EVENT_BURNINGADRENALINE_TANK: - //Vael has to cast it himself; contrary to the previous commit's comment. Nothing happens otherwise. - me->CastSpell(me->GetVictim(), SPELL_BURNINGADRENALINE, true); - events.ScheduleEvent(EVENT_BURNINGADRENALINE_TANK, 45s); + case EVENT_SPEECH_4: + me->SetFaction(FACTION_DRAGONFLIGHT_BLACK); + if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) + AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; break; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } + return; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - // Yell if hp lower than 15% - if (HealthBelowPct(15) && !HasYelled) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - Talk(SAY_HALFLIFE); - HasYelled = true; + case EVENT_CLEAVE: + events.ScheduleEvent(EVENT_CLEAVE, 15s); + DoCastVictim(SPELL_CLEAVE); + break; + case EVENT_FLAMEBREATH: + DoCastVictim(SPELL_FLAMEBREATH); + events.ScheduleEvent(EVENT_FLAMEBREATH, 8s, 14s); + break; + case EVENT_FIRENOVA: + DoCastVictim(SPELL_FIRENOVA); + events.ScheduleEvent(EVENT_FIRENOVA, 15s); + break; + case EVENT_TAILSWIPE: + //Only cast if we are behind + /*if (!me->HasInArc(M_PI, me->GetVictim())) + { + DoCast(me->GetVictim(), SPELL_TAILSWIPE); + }*/ + events.ScheduleEvent(EVENT_TAILSWIPE, 15s); + break; + case EVENT_BURNINGADRENALINE_CASTER: + { + //selects a random target that isn't the current victim and is a mana user (selects mana users) but not pets + //it also ignores targets who have the aura. We don't want to place the debuff on the same target twice. + if (Unit *target = SelectTarget(SelectTargetMethod::Random, 1, [&](Unit* u) { return u && !u->IsPet() && u->GetPowerType() == POWER_MANA && !u->HasAura(SPELL_BURNINGADRENALINE); })) + { + me->CastSpell(target, SPELL_BURNINGADRENALINE, true); + } + } + //reschedule the event + events.ScheduleEvent(EVENT_BURNINGADRENALINE_CASTER, 15s); + break; + case EVENT_BURNINGADRENALINE_TANK: + //Vael has to cast it himself; contrary to the previous commit's comment. Nothing happens otherwise. + me->CastSpell(me->GetVictim(), SPELL_BURNINGADRENALINE, true); + events.ScheduleEvent(EVENT_BURNINGADRENALINE_TANK, 45s); + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + // Yell if hp lower than 15% + if (HealthBelowPct(15) && !HasYelled) { - if (menuId == GOSSIP_ID && gossipListId == 0) - { - CloseGossipMenuFor(player); - BeginSpeech(player); - } - return false; + Talk(SAY_HALFLIFE); + HasYelled = true; } - private: - ObjectGuid PlayerGUID; - bool HasYelled; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { - return GetBlackwingLairAI<boss_vaelAI>(creature); + if (menuId == GOSSIP_ID && gossipListId == 0) + { + CloseGossipMenuFor(player); + BeginSpeech(player); + } + return false; } + + private: + ObjectGuid PlayerGUID; + bool HasYelled; }; //Need to define an aurascript for EVENT_BURNINGADRENALINE's death effect. // 18173 - Burning Adrenaline -class spell_vael_burning_adrenaline : public SpellScriptLoader +class spell_vael_burning_adrenaline : public AuraScript { -public: - spell_vael_burning_adrenaline() : SpellScriptLoader("spell_vael_burning_adrenaline") { } + PrepareAuraScript(spell_vael_burning_adrenaline); - class spell_vael_burning_adrenaline_AuraScript : public AuraScript + void OnAuraRemoveHandler(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_vael_burning_adrenaline_AuraScript); - - void OnAuraRemoveHandler(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - //The tooltip says the on death the AoE occurs. According to information: http://qaliaresponse.stage.lithium.com/t5/WoW-Mayhem/Surviving-Burning-Adrenaline-For-tanks/td-p/48609 - //Burning Adrenaline can be survived therefore Blizzard's implementation was an AoE bomb that went off if you were still alive and dealt - //damage to the target. You don't have to die for it to go off. It can go off whether you live or die. - GetTarget()->CastSpell(GetTarget(), SPELL_BURNINGADRENALINE_EXPLOSION, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_vael_burning_adrenaline_AuraScript::OnAuraRemoveHandler, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; + //The tooltip says the on death the AoE occurs. According to information: http://qaliaresponse.stage.lithium.com/t5/WoW-Mayhem/Surviving-Burning-Adrenaline-For-tanks/td-p/48609 + //Burning Adrenaline can be survived therefore Blizzard's implementation was an AoE bomb that went off if you were still alive and dealt + //damage to the target. You don't have to die for it to go off. It can go off whether you live or die. + GetTarget()->CastSpell(GetTarget(), SPELL_BURNINGADRENALINE_EXPLOSION, true); + } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_vael_burning_adrenaline_AuraScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_vael_burning_adrenaline::OnAuraRemoveHandler, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; void AddSC_boss_vaelastrasz() { - new boss_vaelastrasz(); - new spell_vael_burning_adrenaline(); + RegisterBlackwingLairCreatureAI(boss_vaelastrasz); + RegisterSpellScript(spell_vael_burning_adrenaline); } |