From 8964a87dc7844873c9d105255db6c5cc4ecf13cb Mon Sep 17 00:00:00 2001 From: FALL1N1 Date: Tue, 10 Nov 2020 06:17:35 +0200 Subject: [PATCH] complete overhaul for the basic scripts, merge with TC --- data/sql/updates/db_world/0000_00_00_00.sql | 30 +- .../BlackwingLair/blackwing_lair.h | 58 ++-- .../boss_broodlord_lashlayer.cpp | 22 +- .../BlackwingLair/boss_chromaggus.cpp | 113 ++++-- .../BlackwingLair/boss_ebonroc.cpp | 26 +- .../BlackwingLair/boss_firemaw.cpp | 20 +- .../BlackwingLair/boss_flamegor.cpp | 24 +- .../BlackwingLair/boss_nefarian.cpp | 10 +- .../BlackwingLair/boss_razorgore.cpp | 2 +- .../BlackwingLair/boss_vaelastrasz.cpp | 207 +++++------ .../BlackwingLair/instance_blackwing_lair.cpp | 322 ++++++++---------- 11 files changed, 435 insertions(+), 399 deletions(-) diff --git a/data/sql/updates/db_world/0000_00_00_00.sql b/data/sql/updates/db_world/0000_00_00_00.sql index 7e3bced674..ed89531b47 100644 --- a/data/sql/updates/db_world/0000_00_00_00.sql +++ b/data/sql/updates/db_world/0000_00_00_00.sql @@ -241,10 +241,10 @@ INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, (84534, 84533, 0, 0, 3, 0, 0); -- Make NPC 11981 (Flamegor) roam -UPDATE creature SET MovementType=1, spawndist=5 WHERE id = 11981; +UPDATE `creature` SET `MovementType`=1, `wander_distance`=10 WHERE `id` = 11981; -- Add waypoints for Ebonroc (14601) -SET @EBONROCGUID = 3120753; +SET @EBONROCGUID = 85780; UPDATE `creature` SET `spawndist`=0, `MovementType`=2 WHERE `id`=@EBONROCGUID; DELETE FROM `creature_addon` WHERE `guid`=@EBONROCGUID; INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@EBONROCGUID,@EBONROCGUID*10,0,0,0,0, ''); @@ -264,3 +264,29 @@ INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `positio (@EBONROCGUID*10, 12, -7368.8, -983.092, 477.167), (@EBONROCGUID*10, 13, -7358.19, -994.32, 477.167); +-- Add waypoints for Firemaw ( NOT BLIZZLIKE !!! ) +SET @FIREMAW = 84572; +UPDATE `creature` SET `spawndist`=0, `MovementType`=2 WHERE `id`=@FIREMAW; +DELETE FROM `creature_addon` WHERE `guid`=@FIREMAW; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@FIREMAW,@FIREMAW*10,0,0,0,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@FIREMAW*10; +INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`) VALUES +(@FIREMAW*10, 1, -7534.64, -1036.18, 448.907), +(@FIREMAW*10, 2, -7494.43, -1007.4, 448.907), +(@FIREMAW*10, 3, -7466.28, -987.258, 449.73), +(@FIREMAW*10, 4, -7506.56, -923.1, 457.856), +(@FIREMAW*10, 5, -7459.02, -889.93, 465.217), +(@FIREMAW*10, 6, -7442.65, -911.727, 465.355), +(@FIREMAW*10, 7, -7459.02, -889.93, 465.217), +(@FIREMAW*10, 8, -7506.56, -923.1, 457.856), +(@FIREMAW*10, 9, -7466.28, -987.258, 449.73), +(@FIREMAW*10, 10, -7494.43, -1007.4, 448.907), +(@FIREMAW*10, 11, -7534.64, -1036.18, 448.907); + +-- scriptname for the bwl shadowflame +SET @SHADOWFLAME_BWL = 22539; +DELETE FROM `spell_script_names` WHERE `spell_id` = @SHADOWFLAME_BWL; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES (@SHADOWFLAME_BWL, 'spell_bwl_shadowflame'); + +-- attaching lever script to gob +UPDATE `gameobject_template` SET `ScriptName`='go_chromaggus_lever' WHERE `entry`=179148; diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h index 1b5831b2c8..ef0b1de625 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h @@ -7,23 +7,33 @@ #ifndef DEF_BLACKWING_LAIR_H #define DEF_BLACKWING_LAIR_H +#include "CreatureAIImpl.h" + uint32 const EncounterCount = 8; -#define BRLScriptName "instance_blackwing_lair" +#define BWLScriptName "instance_blackwing_lair" +#define DataHeader "BWL" enum BWLEncounter { - BOSS_RAZORGORE = 0, - BOSS_VAELASTRAZ = 1, - BOSS_BROODLORD = 2, - BOSS_FIREMAW = 3, - BOSS_EBONROC = 4, - BOSS_FLAMEGOR = 5, - BOSS_CHROMAGGUS = 6, - BOSS_NEFARIAN = 7 + // Encounter States/Boss GUIDs + DATA_RAZORGORE_THE_UNTAMED = 0, + DATA_VAELASTRAZ_THE_CORRUPT = 1, + DATA_BROODLORD_LASHLAYER = 2, + DATA_FIREMAW = 3, + DATA_EBONROC = 4, + DATA_FLAMEGOR = 5, + DATA_CHROMAGGUS = 6, + DATA_NEFARIAN = 7, + + // Additional Data + DATA_LORD_VICTOR_NEFARIUS = 8, + + // Doors + DATA_GO_CHROMAGGUS_DOOR = 9 }; -enum CreatureIds +enum BWLCreatureIds { NPC_RAZORGORE = 12435, NPC_BLACKWING_DRAGON = 12422, @@ -32,7 +42,7 @@ enum CreatureIds NPC_BLACKWING_WARLOCK = 12459, NPC_VAELASTRAZ = 13020, NPC_BROODLORD = 12017, - NPC_FIRENAW = 11983, + NPC_FIREMAW = 11983, NPC_EBONROC = 14601, NPC_FLAMEGOR = 11981, NPC_CHROMAGGUS = 14020, @@ -40,17 +50,18 @@ enum CreatureIds NPC_NEFARIAN = 11583 }; -enum BWLData64 +enum BWLGameObjectIds { - DATA_RAZORGORE_THE_UNTAMED = 1, - DATA_VAELASTRAZ_THE_CORRUPT, - DATA_BROODLORD_LASHLAYER, - DATA_FIRENAW, - DATA_EBONROC, - DATA_FLAMEGOR, - DATA_CHROMAGGUS, - DATA_LORD_VICTOR_NEFARIUS, - DATA_NEFARIAN + GO_BLACK_DRAGON_EGG = 177807, + GO_PORTCULLIS_RAZORGORE = 176965, + GO_PORTCULLIS_VAELASTRASZ = 179364, + GO_PORTCULLIS_BROODLORD = 179365, + GO_PORTCULLIS_THREEDRAGONS = 179115, + GO_PORTCULLIS_CHROMAGGUS = 179117, //Door after you kill him, not the one for his room + GO_CHROMAGGUS_LEVER = 179148, + GO_CHROMAGGUS_DOOR = 179116, + GO_PORTCULLIS_NEFARIAN = 176966, + GO_SUPPRESSION_DEVICE = 179784 }; enum BWLEvents @@ -68,9 +79,4 @@ enum BWLMisc TALK_EGG_BROKEN_RAND = 3, }; -enum Gameobjects -{ - GO_SUPPRESSION_DEVICE = 179784 -}; - #endif diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp index 5a0f1d4943..b63b2c4ab9 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp @@ -50,17 +50,11 @@ public: struct boss_broodlordAI : public BossAI { - boss_broodlordAI(Creature* creature) : BossAI(creature, BOSS_BROODLORD) { } + boss_broodlordAI(Creature* creature) : BossAI(creature, DATA_BROODLORD_LASHLAYER) { } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) override { - if (instance->GetBossState(BOSS_VAELASTRAZ) != DONE) - { - EnterEvadeMode(); - return; - } - - _EnterCombat(); + BossAI::EnterCombat(who); Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_CLEAVE, 8000); @@ -80,7 +74,7 @@ public: ((*itr)->AI()->DoAction(ACTION_DEACTIVATE)); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; @@ -105,8 +99,8 @@ public: break; case EVENT_KNOCKBACK: DoCastVictim(SPELL_KNOCKBACK); - if (me->getThreatManager().getThreat(me->GetVictim())) - me->getThreatManager().modifyThreatPercent(me->GetVictim(), -50); + if (DoGetThreat(me->GetVictim())) + DoModifyThreatPercent(me->GetVictim(), -50); events.ScheduleEvent(EVENT_KNOCKBACK, 15000, 30000); break; case EVENT_CHECK: @@ -124,7 +118,7 @@ public: } }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } @@ -147,7 +141,7 @@ class go_suppression_device : public GameObjectScript return; } - _events.ScheduleEvent(EVENT_SUPPRESSION_CAST, 1000, 5000); + _events.ScheduleEvent(EVENT_SUPPRESSION_CAST, 5000); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 41c78bce1f..3da5564959 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -5,9 +5,13 @@ */ #include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "Player.h" #include "blackwing_lair.h" +#include "InstanceScript.h" +#include "GameObject.h" +#include "GameObjectAI.h" +#include "Map.h" +#include "Player.h" +#include "ScriptedCreature.h" enum Emotes { @@ -59,8 +63,13 @@ public: struct boss_chromaggusAI : public BossAI { - boss_chromaggusAI(Creature* creature) : BossAI(creature, BOSS_CHROMAGGUS) + boss_chromaggusAI(Creature* creature) : BossAI(creature, DATA_CHROMAGGUS) { + Initialize(); + + Breath1_Spell = 0; + Breath2_Spell = 0; + // Select the 2 breaths that we are going to use until despawned // 5 possiblities for the first breath, 4 for the second, 20 total possiblites // This way we don't end up casting 2 of the same breath @@ -85,7 +94,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - // B1 - TL + // B1 - TL case 4: Breath1_Spell = SPELL_TIMELAPSE; Breath2_Spell = SPELL_INCINERATE; @@ -103,7 +112,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Acid + //B1 - Acid case 8: Breath1_Spell = SPELL_CORROSIVEACID; Breath2_Spell = SPELL_INCINERATE; @@ -121,7 +130,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Ignite + //B1 - Ignite case 12: Breath1_Spell = SPELL_IGNITEFLESH; Breath2_Spell = SPELL_INCINERATE; @@ -139,7 +148,7 @@ public: Breath2_Spell = SPELL_FROSTBURN; break; - //B1 - Frost + //B1 - Frost case 16: Breath1_Spell = SPELL_FROSTBURN; Breath2_Spell = SPELL_INCINERATE; @@ -161,31 +170,31 @@ public: EnterEvadeMode(); } - void Reset() + void Initialize() { - _Reset(); - CurrentVurln_Spell = 0; // We use this to store our last vulnerabilty spell so we can remove it later Enraged = false; } - void EnterCombat(Unit* /*who*/) + void Reset() override { - if (instance->GetBossState(BOSS_FLAMEGOR) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); + _Reset(); - events.ScheduleEvent(EVENT_SHIMMER, 0); + Initialize(); + } + + void EnterCombat(Unit* victim) override + { + BossAI::EnterCombat(victim); + + events.ScheduleEvent(EVENT_SHIMMER, 1000); events.ScheduleEvent(EVENT_BREATH_1, 30000); events.ScheduleEvent(EVENT_BREATH_2, 60000); events.ScheduleEvent(EVENT_AFFLICTION, 10000); events.ScheduleEvent(EVENT_FRENZY, 15000); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; @@ -214,13 +223,13 @@ public: break; } case EVENT_BREATH_1: - DoCastVictim(Breath1_Spell); - events.ScheduleEvent(EVENT_BREATH_1, 60000); - break; + DoCastVictim(Breath1_Spell); + events.ScheduleEvent(EVENT_BREATH_1, 60000); + break; case EVENT_BREATH_2: - DoCastVictim(Breath2_Spell); - events.ScheduleEvent(EVENT_BREATH_2, 60000); - break; + DoCastVictim(Breath2_Spell); + events.ScheduleEvent(EVENT_BREATH_2, 60000); + break; case EVENT_AFFLICTION: { Map::PlayerList const& players = me->GetMap()->GetPlayers(); @@ -230,14 +239,14 @@ public: { DoCast(player, RAND(SPELL_BROODAF_BLUE, SPELL_BROODAF_BLACK, SPELL_BROODAF_RED, SPELL_BROODAF_BRONZE, SPELL_BROODAF_GREEN), true); - if (player->HasAura(SPELL_BROODAF_BLUE) && + if (player->HasAura(SPELL_BROODAF_BLUE) && player->HasAura(SPELL_BROODAF_BLACK) && player->HasAura(SPELL_BROODAF_RED) && player->HasAura(SPELL_BROODAF_BRONZE) && player->HasAura(SPELL_BROODAF_GREEN)) - { - DoCast(player, SPELL_CHROMATIC_MUT_1); - } + { + DoCast(player, SPELL_CHROMATIC_MUT_1); + } } } @@ -246,9 +255,12 @@ public: break; case EVENT_FRENZY: DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, urand(10000, 15000)); + events.ScheduleEvent(EVENT_FRENZY, 10000, 15000); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } // Enrage if not already enraged and below 20% @@ -268,13 +280,52 @@ public: bool Enraged; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } }; +class go_chromaggus_lever : public GameObjectScript +{ + public: + go_chromaggus_lever() : GameObjectScript("go_chromaggus_lever") { } + + struct go_chromaggus_leverAI : public GameObjectAI + { + go_chromaggus_leverAI(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { } + + bool OnGossipHello(Player* player) + { + if (_instance->GetBossState(DATA_CHROMAGGUS) != DONE && _instance->GetBossState(DATA_CHROMAGGUS) != IN_PROGRESS) + { + _instance->SetBossState(DATA_CHROMAGGUS, IN_PROGRESS); + + if (Creature* creature = _instance->instance->GetCreature(DATA_CHROMAGGUS)) + creature->AI()->AttackStart(player); + + if (GameObject* go = _instance->instance->GetGameObject(DATA_GO_CHROMAGGUS_DOOR)) + _instance->HandleGameObject(0, true, go); + } + + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE); + go->SetGoState(GO_STATE_ACTIVE); + + return true; + } + + private: + InstanceScript* _instance; + }; + + GameObjectAI* GetAI(GameObject* go) const override + { + return GetInstanceAI(go); + } +}; + void AddSC_boss_chromaggus() { new boss_chromaggus(); + new go_chromaggus_lever(); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 90d83f918c..7fd4c6a95b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -29,23 +29,18 @@ public: struct boss_ebonrocAI : public BossAI { - boss_ebonrocAI(Creature* creature) : BossAI(creature, BOSS_EBONROC) { } + boss_ebonrocAI(Creature* creature) : BossAI(creature, DATA_EBONROC) { } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); + BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); events.ScheduleEvent(EVENT_WINGBUFFET, 30000); - events.ScheduleEvent(EVENT_SHADOWOFEBONROC, urand(8000, 10000)); + events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8000, 10000); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; @@ -61,7 +56,7 @@ public: { case EVENT_SHADOWFLAME: DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); break; case EVENT_WINGBUFFET: DoCastVictim(SPELL_WINGBUFFET); @@ -69,16 +64,19 @@ public: break; case EVENT_SHADOWOFEBONROC: DoCastVictim(SPELL_SHADOWOFEBONROC); - events.ScheduleEvent(EVENT_SHADOWOFEBONROC, urand(8000, 10000)); + events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8000, 10000); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } DoMeleeAttackIfReady(); } }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return GetInstanceAI(creature); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index 716c259b57..8162685e83 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -29,23 +29,18 @@ public: struct boss_firemawAI : public BossAI { - boss_firemawAI(Creature* creature) : BossAI(creature, BOSS_FIREMAW) { } + boss_firemawAI(Creature* creature) : BossAI(creature, DATA_FIREMAW) { } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) override { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); + BossAI::EnterCombat(who); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); events.ScheduleEvent(EVENT_WINGBUFFET, 30000); events.ScheduleEvent(EVENT_FLAMEBUFFET, 5000); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; @@ -61,7 +56,7 @@ public: { case EVENT_SHADOWFLAME: DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); break; case EVENT_WINGBUFFET: DoCastVictim(SPELL_WINGBUFFET); @@ -74,6 +69,9 @@ public: events.ScheduleEvent(EVENT_FLAMEBUFFET, 5000); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index 55d3849e15..de32768517 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -8,6 +8,8 @@ #include "ScriptedCreature.h" #include "blackwing_lair.h" +constexpr uint32 GATE_ENTRY = 185483; + enum Emotes { EMOTE_FRENZY = 0, @@ -34,23 +36,18 @@ public: struct boss_flamegorAI : public BossAI { - boss_flamegorAI(Creature* creature) : BossAI(creature, BOSS_FLAMEGOR) { } + boss_flamegorAI(Creature* creature) : BossAI(creature, DATA_FLAMEGOR) { } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* victim) { - if (instance->GetBossState(BOSS_BROODLORD) != DONE) - { - EnterEvadeMode(); - return; - } - _EnterCombat(); + BossAI::EnterCombat(victim); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); events.ScheduleEvent(EVENT_WINGBUFFET, 30000); events.ScheduleEvent(EVENT_FRENZY, 10000); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; @@ -66,7 +63,7 @@ public: { case EVENT_SHADOWFLAME: DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, urand(10000, 20000)); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10000, 20000); break; case EVENT_WINGBUFFET: DoCastVictim(SPELL_WINGBUFFET); @@ -77,9 +74,12 @@ public: case EVENT_FRENZY: Talk(EMOTE_FRENZY); DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, urand(8000, 10000)); + events.ScheduleEvent(EVENT_FRENZY, 8000, 10000); break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index 17138a12ab..67b03062f1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -154,7 +154,7 @@ public: struct boss_victor_nefariusAI : public BossAI { - boss_victor_nefariusAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) { } + boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { } void Reset() { @@ -171,7 +171,7 @@ public: _Reset(); // pussywizard: - if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE || instance->GetBossState(BOSS_NEFARIAN) == IN_PROGRESS) + if (!instance || instance->GetBossState(DATA_NEFARIAN) == DONE || instance->GetBossState(DATA_NEFARIAN) == IN_PROGRESS) me->SetVisible(false); else me->SetVisible(true); @@ -369,7 +369,7 @@ public: { // pussywizard: InstanceScript* instance = player->GetInstanceScript(); - if (!instance || instance->GetBossState(BOSS_NEFARIAN) == DONE) + if (!instance || instance->GetBossState(DATA_NEFARIAN) == DONE) return; CloseGossipMenuFor(player); @@ -395,7 +395,7 @@ public: struct boss_nefarianAI : public BossAI { - boss_nefarianAI(Creature* creature) : BossAI(creature, BOSS_NEFARIAN) { } + boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) { } void Reset() { @@ -451,7 +451,7 @@ public: { if (canDespawn && DespawnTimer <= diff) { - instance->SetBossState(BOSS_NEFARIAN, FAIL); + instance->SetBossState(DATA_NEFARIAN, FAIL); std::list constructList; me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 40858a118e..c61f9c2df5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -56,7 +56,7 @@ public: struct boss_razorgoreAI : public BossAI { - boss_razorgoreAI(Creature* creature) : BossAI(creature, BOSS_RAZORGORE) { } + boss_razorgoreAI(Creature* creature) : BossAI(creature, DATA_RAZORGORE_THE_UNTAMED) { } void Reset() { diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp index c0c100fa92..e8e8eff081 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp @@ -5,52 +5,52 @@ */ #include "ScriptMgr.h" -#include "ScriptedCreature.h" #include "blackwing_lair.h" -#include "ScriptedGossip.h" #include "ObjectAccessor.h" #include "Player.h" +#include "ScriptedCreature.h" +#include "ScriptedGossip.h" #include "SpellAuraEffects.h" -#include "SpellScript.h" +#include "SpellScript.h" enum Says { - SAY_LINE1 = 0, - SAY_LINE2 = 1, - SAY_LINE3 = 2, - SAY_HALFLIFE = 3, - SAY_KILLTARGET = 4 + SAY_LINE1 = 0, + SAY_LINE2 = 1, + SAY_LINE3 = 2, + SAY_HALFLIFE = 3, + SAY_KILLTARGET = 4 }; enum Gossip { - GOSSIP_ID = 21334, + GOSSIP_ID = 6101, }; enum Spells { - SPELL_ESSENCEOFTHERED = 23513, - SPELL_FLAMEBREATH = 23461, - SPELL_FIRENOVA = 23462, - SPELL_TAILSWIPE = 15847, - SPELL_BURNINGADRENALINE = 18173, //Cast this one. It's what 3.3.5 DBM expects. - SPELL_BURNINGADRENALINE_EXPLOSION = 23478, - SPELL_CLEAVE = 19983 //Chain cleave is most likely named something different and contains a dummy effect + SPELL_ESSENCEOFTHERED = 23513, + SPELL_FLAMEBREATH = 23461, + SPELL_FIRENOVA = 23462, + SPELL_TAILSWIPE = 15847, + SPELL_BURNINGADRENALINE = 18173, //Cast this one. It's what 3.3.5 DBM expects. + SPELL_BURNINGADRENALINE_EXPLOSION = 23478, + SPELL_CLEAVE = 19983 //Chain cleave is most likely named something different and contains a dummy effect }; enum Events { - EVENT_SPEECH_1 = 1, - EVENT_SPEECH_2 = 2, - EVENT_SPEECH_3 = 3, - EVENT_SPEECH_4 = 4, - EVENT_ESSENCEOFTHERED = 5, - EVENT_FLAMEBREATH = 6, - EVENT_FIRENOVA = 7, - EVENT_TAILSWIPE = 8, - EVENT_CLEAVE = 9, - EVENT_BURNINGADRENALINE_CASTER = 10, - EVENT_BURNINGADRENALINE_TANK = 11 + EVENT_SPEECH_1 = 1, + EVENT_SPEECH_2 = 2, + EVENT_SPEECH_3 = 3, + EVENT_SPEECH_4 = 4, + EVENT_ESSENCEOFTHERED = 5, + EVENT_FLAMEBREATH = 6, + EVENT_FIRENOVA = 7, + EVENT_TAILSWIPE = 8, + EVENT_CLEAVE = 9, + EVENT_BURNINGADRENALINE_CASTER = 10, + EVENT_BURNINGADRENALINE_TANK = 11 }; class boss_vaelastrasz : public CreatureScript @@ -60,26 +60,31 @@ public: struct boss_vaelAI : public BossAI { - boss_vaelAI(Creature* creature) : BossAI(creature, BOSS_VAELASTRAZ) + boss_vaelAI(Creature* creature) : BossAI(creature, DATA_VAELASTRAZ_THE_CORRUPT) { + Initialize(); creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); creature->setFaction(35); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void Reset() + void Initialize() + { + PlayerGUID = 0; + HasYelled = false; + } + + void Reset() override { _Reset(); me->SetStandState(UNIT_STAND_STATE_DEAD); - PlayerGUID = 0; - - HasYelled = false; + Initialize(); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* victim) override { - _EnterCombat(); + BossAI::EnterCombat(victim); DoCast(me, SPELL_ESSENCEOFTHERED); me->SetHealth(me->CountPctFromMaxHealth(30)); @@ -101,15 +106,15 @@ public: events.ScheduleEvent(EVENT_SPEECH_1, 1000); } - void KilledUnit(Unit* victim) + void KilledUnit(Unit* victim) override { - if (rand() % 5) + if (rand32() % 5) return; Talk(SAY_KILLTARGET, victim); } - void UpdateAI(uint32 diff) + void UpdateAI(uint32 diff) override { events.Update(diff); @@ -120,27 +125,27 @@ public: { 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, 12000); - break; - case EVENT_SPEECH_2: - Talk(SAY_LINE2); - me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_SPEECH_3, 12000); - break; - case EVENT_SPEECH_3: - Talk(SAY_LINE3); - me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_SPEECH_4, 16000); - break; - case EVENT_SPEECH_4: - me->setFaction(103); + case EVENT_SPEECH_1: + Talk(SAY_LINE1); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_2, 12000); + break; + case EVENT_SPEECH_2: + Talk(SAY_LINE2); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_3, 12000); + break; + case EVENT_SPEECH_3: + Talk(SAY_LINE3); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_SPEECH_4, 16000); + break; + case EVENT_SPEECH_4: + me->setFaction(103); // Black Dragonflight if (PlayerGUID && ObjectAccessor::GetUnit(*me, PlayerGUID)) AttackStart(ObjectAccessor::GetUnit(*me, PlayerGUID));; - break; + break; } } return; @@ -153,43 +158,43 @@ public: { switch (eventId) { - case EVENT_CLEAVE: - events.ScheduleEvent(EVENT_CLEAVE, 15000); - DoCastVictim(SPELL_CLEAVE); - break; - case EVENT_FLAMEBREATH: - DoCastVictim(SPELL_FLAMEBREATH); - events.ScheduleEvent(EVENT_FLAMEBREATH, urand(8000, 14000)); - break; - case EVENT_FIRENOVA: - DoCastVictim(SPELL_FIRENOVA); - events.ScheduleEvent(EVENT_FIRENOVA, 15000); - 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, 15000); - 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(SELECT_TARGET_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, 15000); - 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, 45000); - break; + case EVENT_CLEAVE: + events.ScheduleEvent(EVENT_CLEAVE, 15000); + DoCastVictim(SPELL_CLEAVE); + break; + case EVENT_FLAMEBREATH: + DoCastVictim(SPELL_FLAMEBREATH); + events.ScheduleEvent(EVENT_FLAMEBREATH, 8000, 14000); + break; + case EVENT_FIRENOVA: + DoCastVictim(SPELL_FIRENOVA); + events.ScheduleEvent(EVENT_FIRENOVA, 15000); + 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, 15000); + 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(SELECT_TARGET_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, 15000); + 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, 45000); + break; } if (me->HasUnitState(UNIT_STATE_CASTING)) @@ -206,27 +211,27 @@ public: DoMeleeAttackIfReady(); } - void sGossipSelect(Player* player, uint32 sender, uint32 action) + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) { - if (sender == GOSSIP_ID && action == 0) + if (menuId == GOSSIP_ID && gossipListId == 0) { CloseGossipMenuFor(player); BeginSpeech(player); } + return false; } - private: - uint64 PlayerGUID; - bool HasYelled; + private: + uint64 PlayerGUID; + bool HasYelled; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { - return new boss_vaelAI(creature); + return GetInstanceAI(creature); } }; - //Need to define an aurascript for EVENT_BURNINGADRENALINE's death effect. // 18173 - Burning Adrenaline class spell_vael_burning_adrenaline : public SpellScriptLoader diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index b7a18afa13..81e6083220 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -5,22 +5,47 @@ */ #include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "PassiveAI.h" #include "blackwing_lair.h" +#include "GameObject.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" #include "Player.h" +#include "ScriptedCreature.h" +#include "TemporarySummon.h" -/* -Blackwing Lair Encounter: -1 - boss_razorgore.cpp -2 - boss_vaelastrasz.cpp -3 - boss_broodlord_lashlayer.cpp -4 - boss_firemaw.cpp -5 - boss_ebonroc.cpp -6 - boss_flamegor.cpp -7 - boss_chromaggus.cpp -8 - boss_nefarian.cpp -*/ +DoorData const doorData[] = +{ + { GO_PORTCULLIS_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_VAELASTRASZ, DATA_VAELASTRAZ_THE_CORRUPT, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_BROODLORD, DATA_BROODLORD_LASHLAYER, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_THREEDRAGONS, DATA_FIREMAW, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_THREEDRAGONS, DATA_EBONROC, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_THREEDRAGONS, DATA_FLAMEGOR, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_CHROMAGGUS, DATA_CHROMAGGUS, DOOR_TYPE_PASSAGE }, + { GO_PORTCULLIS_NEFARIAN, DATA_NEFARIAN, DOOR_TYPE_ROOM }, + { 0, 0, DOOR_TYPE_ROOM } // END +}; + +uint64 const creatureData[10][2] = +{ + { NPC_RAZORGORE, DATA_RAZORGORE_THE_UNTAMED }, + { NPC_VAELASTRAZ, DATA_VAELASTRAZ_THE_CORRUPT }, + { NPC_BROODLORD, DATA_BROODLORD_LASHLAYER }, + { NPC_FIREMAW, DATA_FIREMAW }, + { NPC_EBONROC, DATA_EBONROC }, + { NPC_FLAMEGOR, DATA_FLAMEGOR }, + { NPC_CHROMAGGUS, DATA_CHROMAGGUS }, + { NPC_NEFARIAN, DATA_NEFARIAN }, + { NPC_VICTOR_NEFARIUS, DATA_LORD_VICTOR_NEFARIUS }, + { 0, 0 } // END +}; + +uint64 const gameObjectData[2][2] = +{ + { GO_CHROMAGGUS_DOOR, DATA_GO_CHROMAGGUS_DOOR }, + { 0, 0 } //END +}; Position const SummonPosition[8] = { @@ -39,135 +64,101 @@ uint32 const Entry[5] = {12422, 12458, 12416, 12420, 12459}; class instance_blackwing_lair : public InstanceMapScript { public: - instance_blackwing_lair() : InstanceMapScript(BRLScriptName, 469) { } + instance_blackwing_lair() : InstanceMapScript(BWLScriptName, 469) { } struct instance_blackwing_lair_InstanceMapScript : public InstanceScript { instance_blackwing_lair_InstanceMapScript(Map* map) : InstanceScript(map) { + //SetHeaders(DataHeader); SetBossNumber(EncounterCount); - } + LoadDoorData(doorData); + //LoadObjectData(creatureData, gameObjectData); - void Initialize() - { // Razorgore EggCount = 0; EggEvent = 0; - RazorgoreTheUntamedGUID = 0; - RazorgoreDoorGUID = 0; - EggList.clear(); - // Vaelastrasz the Corrupt - VaelastraszTheCorruptGUID = 0; - VaelastraszDoorGUID = 0; - // Broodlord Lashlayer - BroodlordLashlayerGUID = 0; - BroodlordDoorGUID = 0; - // 3 Dragons - FiremawGUID = 0; - EbonrocGUID = 0; - FlamegorGUID = 0; - ChrommagusDoorGUID = 0; - // Chormaggus - ChromaggusGUID = 0; - NefarianDoorGUID = 0; - // Nefarian - LordVictorNefariusGUID = 0; - NefarianGUID = 0; } - void OnCreatureCreate(Creature* creature) + void OnCreatureCreate(Creature* creature) override { + InstanceScript::OnCreatureCreate(creature); + switch (creature->GetEntry()) { - case NPC_RAZORGORE: - RazorgoreTheUntamedGUID = creature->GetGUID(); - break; case NPC_BLACKWING_DRAGON: case NPC_BLACKWING_TASKMASTER: case NPC_BLACKWING_LEGIONAIRE: case NPC_BLACKWING_WARLOCK: - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) - razor->AI()->JustSummoned(creature); + if (Creature* razor = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) + if (CreatureAI* razorAI = razor->AI()) + razorAI->JustSummoned(creature); break; - case NPC_VAELASTRAZ: - VaelastraszTheCorruptGUID = creature->GetGUID(); - break; - case NPC_BROODLORD: - BroodlordLashlayerGUID = creature->GetGUID(); - break; - case NPC_FIRENAW: - FiremawGUID = creature->GetGUID(); - break; - case NPC_EBONROC: - EbonrocGUID = creature->GetGUID(); - break; - case NPC_FLAMEGOR: - FlamegorGUID = creature->GetGUID(); - break; - case NPC_CHROMAGGUS: - ChromaggusGUID = creature->GetGUID(); - break; - case NPC_VICTOR_NEFARIUS: - LordVictorNefariusGUID = creature->GetGUID(); - break; - case NPC_NEFARIAN: - NefarianGUID = creature->GetGUID(); + default: break; } } - void OnGameObjectCreate(GameObject* go) + void OnGameObjectCreate(GameObject* go) override { - switch (go->GetEntry()) + InstanceScript::OnGameObjectCreate(go); + + switch(go->GetEntry()) { - case 177807: // Egg - if (GetBossState(BOSS_FIREMAW) == DONE) + case GO_BLACK_DRAGON_EGG: + if (GetBossState(DATA_FIREMAW) == DONE) go->SetPhaseMask(2, true); else EggList.push_back(go->GetGUID()); break; - case 175946: // Door - RazorgoreDoorGUID = go->GetGUID(); - HandleGameObject(0, GetBossState(BOSS_RAZORGORE) == DONE, go); - break; - case 175185: // Door - VaelastraszDoorGUID = go->GetGUID(); - HandleGameObject(0, GetBossState(BOSS_VAELASTRAZ) == DONE, go); - break; - case 180424: // Door - BroodlordDoorGUID = go->GetGUID(); - HandleGameObject(0, GetBossState(BOSS_BROODLORD) == DONE, go); - break; - case 185483: // Door - ChrommagusDoorGUID = go->GetGUID(); - HandleGameObject(0, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE, go); - break; - case 181125: // Door - NefarianDoorGUID = go->GetGUID(); - HandleGameObject(0, GetBossState(BOSS_CHROMAGGUS) == DONE, go); + default: break; } } - void OnGameObjectRemove(GameObject* go) + void OnGameObjectRemove(GameObject* go) override { - if (go->GetEntry() == 177807) // Egg + InstanceScript::OnGameObjectRemove(go); + + if (go->GetEntry() == GO_BLACK_DRAGON_EGG) EggList.remove(go->GetGUID()); } - bool SetBossState(uint32 type, EncounterState state) + bool CheckRequiredBosses(uint32 bossId, Player const* player /*= nullptr*/) const override { - // pussywizard: - if (GetBossState(type) == DONE && state != DONE) // prevent undoneing a boss xd - return false; + switch (bossId) + { + case DATA_BROODLORD_LASHLAYER: + if (GetBossState(DATA_VAELASTRAZ_THE_CORRUPT) != DONE) + return false; + break; + case DATA_FIREMAW: + case DATA_EBONROC: + case DATA_FLAMEGOR: + if (GetBossState(DATA_BROODLORD_LASHLAYER) != DONE) + return false; + break; + case DATA_CHROMAGGUS: + if (GetBossState(DATA_FIREMAW) != DONE + || GetBossState(DATA_EBONROC) != DONE + || GetBossState(DATA_FLAMEGOR) != DONE) + return false; + break; + default: + break; + } + return true; + } + + bool SetBossState(uint32 type, EncounterState state) override + { if (!InstanceScript::SetBossState(type, state)) return false; switch (type) { - case BOSS_RAZORGORE: - HandleGameObject(RazorgoreDoorGUID, state == DONE); + case DATA_RAZORGORE_THE_UNTAMED: if (state == DONE) { for (std::list::const_iterator itr = EggList.begin(); itr != EggList.end(); ++itr) @@ -176,30 +167,16 @@ public: } SetData(DATA_EGG_EVENT, NOT_STARTED); break; - case BOSS_VAELASTRAZ: - HandleGameObject(VaelastraszDoorGUID, state == DONE); - break; - case BOSS_BROODLORD: - HandleGameObject(BroodlordDoorGUID, state == DONE); - break; - case BOSS_FIREMAW: - case BOSS_EBONROC: - case BOSS_FLAMEGOR: - HandleGameObject(ChrommagusDoorGUID, GetBossState(BOSS_FIREMAW) == DONE && GetBossState(BOSS_EBONROC) == DONE && GetBossState(BOSS_FLAMEGOR) == DONE); - break; - case BOSS_CHROMAGGUS: - HandleGameObject(NefarianDoorGUID, state == DONE); - break; - case BOSS_NEFARIAN: + case DATA_NEFARIAN: switch (state) { case NOT_STARTED: - if (Creature* nefarian = instance->GetCreature(NefarianGUID)) + if (Creature* nefarian = instance->GetCreature(DATA_NEFARIAN)) nefarian->DespawnOrUnsummon(); break; case FAIL: - _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15 * IN_MILLISECONDS * MINUTE); - SetBossState(BOSS_NEFARIAN, NOT_STARTED); + _events.ScheduleEvent(EVENT_RESPAWN_NEFARIUS, 15 * 60 * IN_MILLISECONDS); //15min + SetBossState(DATA_NEFARIAN, NOT_STARTED); break; default: break; @@ -209,41 +186,14 @@ public: return true; } - uint64 GetData64(uint32 id) const - { - switch (id) - { - case DATA_RAZORGORE_THE_UNTAMED: - return RazorgoreTheUntamedGUID; - case DATA_VAELASTRAZ_THE_CORRUPT: - return VaelastraszTheCorruptGUID; - case DATA_BROODLORD_LASHLAYER: - return BroodlordLashlayerGUID; - case DATA_FIRENAW: - return FiremawGUID; - case DATA_EBONROC: - return EbonrocGUID; - case DATA_FLAMEGOR: - return FlamegorGUID; - case DATA_CHROMAGGUS: - return ChromaggusGUID; - case DATA_LORD_VICTOR_NEFARIUS: - return LordVictorNefariusGUID; - case DATA_NEFARIAN: - return NefarianGUID; - } - - return 0; - } - - void SetData(uint32 type, uint32 data) + void SetData(uint32 type, uint32 data) override { if (type == DATA_EGG_EVENT) { switch (data) { case IN_PROGRESS: - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45 * IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 45000); EggEvent = data; EggCount = 0; break; @@ -255,13 +205,13 @@ public: case SPECIAL: if (++EggCount == 15) { - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) { SetData(DATA_EGG_EVENT, DONE); razor->RemoveAurasDueToSpell(42013); // MindControl DoRemoveAurasDueToSpellOnPlayers(42013); } - _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, IN_MILLISECONDS); + _events.ScheduleEvent(EVENT_RAZOR_PHASE_TWO, 1000); _events.CancelEvent(EVENT_RAZOR_SPAWN); } if (EggEvent == NOT_STARTED) @@ -271,14 +221,14 @@ public: } } - void OnUnitDeath(Unit* unit) + void OnUnitDeath(Unit* unit) override { //! HACK, needed because of buggy CreatureAI after charm - if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(BOSS_RAZORGORE) != DONE) - SetBossState(BOSS_RAZORGORE, DONE); + if (unit->GetEntry() == NPC_RAZORGORE && GetBossState(DATA_RAZORGORE_THE_UNTAMED) != DONE) + SetBossState(DATA_RAZORGORE_THE_UNTAMED, DONE); } - void Update(uint32 diff) + void Update(uint32 diff) override { if (_events.Empty()) return; @@ -290,21 +240,21 @@ public: switch (eventId) { case EVENT_RAZOR_SPAWN: - for (uint8 i = urand(2, 5); i > 0 ; --i) - if (Creature* summon = instance->SummonCreature(Entry[urand(0, 4)], SummonPosition[urand(0, 7)])) - summon->SetInCombatWithZone(); - _events.ScheduleEvent(EVENT_RAZOR_SPAWN, urand(12, 17)*IN_MILLISECONDS); + for (uint8 i = urand(2, 5); i > 0; --i) + if (Creature* summon = instance->SummonCreature(Entry[urand(0, 4)], SummonPosition[urand(0, 7)])) + summon->AI()->DoZoneInCombat(); + _events.ScheduleEvent(EVENT_RAZOR_SPAWN, 12000, 17000); break; case EVENT_RAZOR_PHASE_TWO: _events.CancelEvent(EVENT_RAZOR_SPAWN); - if (Creature* razor = instance->GetCreature(RazorgoreTheUntamedGUID)) + if (Creature* razor = instance->GetCreature(DATA_RAZORGORE_THE_UNTAMED)) razor->AI()->DoAction(ACTION_PHASE_TWO); break; case EVENT_RESPAWN_NEFARIUS: - if (Creature* nefarius = instance->GetCreature(LordVictorNefariusGUID)) + if (Creature* nefarius = instance->GetCreature(DATA_LORD_VICTOR_NEFARIUS)) { nefarius->SetPhaseMask(1, true); - nefarius->setActive(true); + nefarius->setActive(true); nefarius->Respawn(); nefarius->GetMotionMaster()->MoveTargetedHome(); } @@ -316,43 +266,51 @@ public: protected: // Misc EventMap _events; + // Razorgore uint8 EggCount; uint32 EggEvent; - uint64 RazorgoreTheUntamedGUID; - uint64 RazorgoreDoorGUID; std::list EggList; - - // Vaelastrasz the Corrupt - uint64 VaelastraszTheCorruptGUID; - uint64 VaelastraszDoorGUID; - - // Broodlord Lashlayer - uint64 BroodlordLashlayerGUID; - uint64 BroodlordDoorGUID; - - // 3 Dragons - uint64 FiremawGUID; - uint64 EbonrocGUID; - uint64 FlamegorGUID; - uint64 ChrommagusDoorGUID; - - // Chormaggus - uint64 ChromaggusGUID; - uint64 NefarianDoorGUID; - - // Nefarian - uint64 LordVictorNefariusGUID; - uint64 NefarianGUID; }; - InstanceScript* GetInstanceScript(InstanceMap* map) const + InstanceScript* GetInstanceScript(InstanceMap* map) const override { return new instance_blackwing_lair_InstanceMapScript(map); } }; +// 22539 - Shadowflame (used in Blackwing Lair) +class spell_bwl_shadowflame : public SpellScriptLoader +{ +public: + spell_bwl_shadowflame() : SpellScriptLoader("spell_bwl_shadowflame") { } + + class spell_bwl_shadowflame_SpellScript : public SpellScript + { + PrepareSpellScript(spell_bwl_shadowflame_SpellScript); + + void HandleEffectScriptEffect(SpellEffIndex /*effIndex*/) + { + // If the victim of the spell does not have "Onyxia Scale Cloak" - add the Shadow Flame DoT (22682) + if (Unit* victim = GetHitUnit()) + if(!victim->HasAura(22683)) + victim->AddAura(22682, victim); + } + + void Register() + { + OnEffectHitTarget += SpellEffectFn(spell_bwl_shadowflame_SpellScript::HandleEffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_bwl_shadowflame_SpellScript; + } +}; + void AddSC_instance_blackwing_lair() { new instance_blackwing_lair(); + new spell_bwl_shadowflame(); }