complete overhaul for the basic scripts, merge with TC

This commit is contained in:
FALL1N1
2020-11-10 06:17:35 +02:00
parent 89d5a76386
commit 8964a87dc7
11 changed files with 435 additions and 399 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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<boss_broodlordAI>(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

View File

@@ -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<boss_chromaggusAI>(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_chromaggus_leverAI>(go);
}
};
void AddSC_boss_chromaggus()
{
new boss_chromaggus();
new go_chromaggus_lever();
}

View File

@@ -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<boss_ebonrocAI>(creature);
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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<Creature*> constructList;
me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f);

View File

@@ -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()
{

View File

@@ -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<boss_vaelAI>(creature);
}
};
//Need to define an aurascript for EVENT_BURNINGADRENALINE's death effect.
// 18173 - Burning Adrenaline
class spell_vael_burning_adrenaline : public SpellScriptLoader

View File

@@ -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<uint64>::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<uint64> 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();
}