aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h5
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp219
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp77
3 files changed, 272 insertions, 29 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
index 21ba1854c40..fcfe5bc930d 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
@@ -67,13 +67,13 @@ enum CreaturesIds
NPC_GENERAL_DRAKKISATH = 10363,
NPC_BLACKHAND_DREADWEAVER = 9817,
NPC_BLACKHAND_SUMMONER = 9818,
- NPC_BLACKHAND_VETERAN = 9819
+ NPC_BLACKHAND_VETERAN = 9819,
+ NPC_BLACKHAND_INCARCERATOR = 10316
};
enum AdditionalData
{
SPELL_SUMMON_ROOKERY_WHELP = 15745,
- MAX_DRAGONSPIRE_HALL_RUNES = 7,
EVENT_PYROGUARD_EMBERSEER = 4884,
AREATRIGGER_ENTER_UBRS = 2046,
AREATRIGGER_STADIUM = 2026
@@ -91,6 +91,7 @@ enum GameObjectsIds
GO_GYTH_EXIT_DOOR = 175186,
GO_DRAKKISATH_DOOR_1 = 175946,
GO_DRAKKISATH_DOOR_2 = 175947,
+ GO_BLACKROCK_ALTAR = 175706,
// Runes in dragonspire hall
GO_ROOM_1_RUNE = 175197,
GO_ROOM_2_RUNE = 175199,
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
index 38e930b8533..9331f767197 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
@@ -42,12 +42,14 @@ enum Spells
enum Events
{
- EVENT_FIRENOVA = 1,
- EVENT_FLAMEBUFFET = 2,
- EVENT_PYROBLAST = 3
+ // OOC
+ EVENT_RESPAWN = 1,
+ // Combat
+ EVENT_FIRENOVA = 2,
+ EVENT_FLAMEBUFFET = 3,
+ EVENT_PYROBLAST = 4
};
-
class boss_pyroguard_emberseer : public CreatureScript
{
public:
@@ -64,17 +66,50 @@ public:
void Reset()
{
- if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS)
- OpenDoors(false);
- // respawn any dead Blackhand Incarcerators
- DoCast(me, SPELL_ENCAGED_EMBERSEER);
- //DoCast(me, SPELL_FIRE_SHIELD_TRIGGER);
- _Reset();
+ if (instance)
+ {
+ // Apply auras on spawn and reset
+ DoCast(me, SPELL_ENCAGED_EMBERSEER);
+
+ // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible
+
+ // Open doors on reset
+ if (instance->GetBossState(DATA_PYROGAURD_EMBERSEER) == IN_PROGRESS)
+ OpenDoors(false); // Opens 2 entrance doors
+
+ // ### TODO Reset Blackrock Altar ###
+
+ // respawn any dead Blackhand Incarcerators
+ events.ScheduleEvent(EVENT_RESPAWN, 1000);
+
+
+ instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED);
+ }
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ if (instance && type == 1 && data == 1)
+ {
+ instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
+
+ // Close these two doors on encounter start
+ if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
+ door1->SetGoState(GO_STATE_READY);
+ if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS)))
+ door2->SetGoState(GO_STATE_READY);
+
+ // ### TODO Script pre fight scripting of Emberseer ###
+ // ### TODO Set data on Blackhand Incarcerator ###
+ // ### TODO disable Blackrock Altar ###
+ }
+
+
}
void EnterCombat(Unit* /*who*/)
{
- _EnterCombat();
+ // ### TODO Check combat timing ###
events.ScheduleEvent(EVENT_FIRENOVA, 6000);
events.ScheduleEvent(EVENT_FLAMEBUFFET, 3000);
events.ScheduleEvent(EVENT_PYROBLAST, 14000);
@@ -82,16 +117,41 @@ public:
void JustDied(Unit* /*killer*/)
{
- OpenDoors(true);
- _JustDied();
+
+ if (instance)
+ {
+ // Activate all the runes
+ if (GameObject* rune1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_1)))
+ rune1->SetGoState(GO_STATE_READY);
+ if (GameObject* rune2 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_2)))
+ rune2->SetGoState(GO_STATE_READY);
+ if (GameObject* rune3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_3)))
+ rune3->SetGoState(GO_STATE_READY);
+ if (GameObject* rune4 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_4)))
+ rune4->SetGoState(GO_STATE_READY);
+ if (GameObject* rune5 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_5)))
+ rune5->SetGoState(GO_STATE_READY);
+ if (GameObject* rune6 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_6)))
+ rune6->SetGoState(GO_STATE_READY);
+ if (GameObject* rune7 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_RUNE_7)))
+ rune7->SetGoState(GO_STATE_READY);
+
+ // Opens all 3 doors
+ OpenDoors(true);
+
+ instance->SetBossState(DATA_PYROGAURD_EMBERSEER, DONE);
+ }
}
void OpenDoors(bool Boss_Killed)
{
+ // These two doors reopen on reset or boss kill
if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
door1->SetGoState(GO_STATE_ACTIVE);
if (GameObject* door2 = me->GetMap()->GetGameObject(instance->GetData64(GO_DOORS)))
door2->SetGoState(GO_STATE_ACTIVE);
+
+ // This door opens on boss kill
if (Boss_Killed)
if (GameObject* door3 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_OUT)))
door3->SetGoState(GO_STATE_ACTIVE);
@@ -99,10 +159,26 @@ public:
void UpdateAI(uint32 diff)
{
+ events.Update(diff);
+
if (!UpdateVictim())
+ {
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RESPAWN:
+ std::list<Creature*> creatureList;
+ GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 35.0f);
+ for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
+ if (Creature* creatureList = *itr)
+ if (!creatureList->IsAlive())
+ creatureList->Respawn();
+ break;
+ }
+ }
return;
-
- events.Update(diff);
+ }
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -113,26 +189,133 @@ public:
{
case EVENT_FIRENOVA:
DoCastVictim(SPELL_FIRENOVA);
- events.ScheduleEvent(EVENT_FIRENOVA, 6 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FIRENOVA, 6000);
break;
case EVENT_FLAMEBUFFET:
DoCastVictim(SPELL_FLAMEBUFFET);
- events.ScheduleEvent(EVENT_FLAMEBUFFET, 14 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FLAMEBUFFET, 14000);
break;
case EVENT_PYROBLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
DoCast(target, SPELL_PYROBLAST);
- events.ScheduleEvent(EVENT_PYROBLAST, 15 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_PYROBLAST, 15000);
break;
}
}
+ DoMeleeAttackIfReady();
+ }
+ };
+};
+
+/*####
+## npc_blackhand_incarcerator
+####*/
+
+enum IncarceratorSpells
+{
+ SPELL_ENCAGE_EMBERSEER = 15281, // Emberseer on spawn
+ SPELL_STRIKE = 15580, // Combat
+ SPELL_ENCAGE = 16045 // Combat
+};
+enum IncarceratorEvents
+{
+ // Out of combat
+ EVENT_ENCAGED_EMBERSEER = 1,
+ // Combat
+ EVENT_STRIKE = 2,
+ EVENT_ENCAGE = 3
+};
+
+class npc_blackhand_incarcerator : public CreatureScript
+{
+public:
+ npc_blackhand_incarcerator() : CreatureScript("npc_blackhand_incarcerator") { }
+
+ struct npc_blackhand_incarceratorAI : public ScriptedAI
+ {
+ npc_blackhand_incarceratorAI(Creature* creature) : ScriptedAI(creature) {}
+
+ void Reset()
+ {
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+
+ _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ me->DespawnOrUnsummon(10000);
+ }
+
+ void SetData(uint32 data, uint32 value)
+ {
+ if (data == 1 && value == 1)
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+ me->RemoveAura(SPELL_ENCAGE_EMBERSEER);
+ // ### TODO attack nearest target ###
+ }
+
+ }
+ void EnterCombat(Unit* /*who*/)
+ {
+ _events.ScheduleEvent(EVENT_STRIKE, urand(8000, 16000));
+ _events.ScheduleEvent(EVENT_ENCAGE, urand(10000, 20000));
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ _events.Update(diff);
+
+ if (!UpdateVictim())
+ {
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ENCAGED_EMBERSEER:
+ if(!me->HasAura(SPELL_ENCAGE_EMBERSEER))
+ if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true))
+ DoCast(Emberseer, SPELL_ENCAGE_EMBERSEER);
+ _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000);
+ break;
+ }
+ }
+ return;
+ }
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_STRIKE:
+ DoCastVictim(SPELL_STRIKE, true);
+ _events.ScheduleEvent(EVENT_STRIKE, urand(14000, 23000));
+ break;
+ case EVENT_ENCAGE:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), EVENT_ENCAGE, true);
+ _events.ScheduleEvent(EVENT_ENCAGE, urand(6000, 12000));
+ break;
+ default:
+ break;
+ }
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap _events;
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_blackhand_incarceratorAI(creature);
+ }
};
void AddSC_boss_pyroguard_emberseer()
{
new boss_pyroguard_emberseer();
+ new npc_blackhand_incarcerator();
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
index 501b51321b4..e5b5194b494 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
@@ -112,6 +112,8 @@ public:
break;
case NPC_PYROGAURD_EMBERSEER:
PyroguardEmberseer = creature->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ creature->DespawnOrUnsummon();
break;
case NPC_WARCHIEF_REND_BLACKHAND:
WarchiefRendBlackhand = creature->GetGUID();
@@ -141,19 +143,16 @@ public:
break;
case GO_EMBERSEER_IN:
go_emberseerin = go->GetGUID();
-
if ((GetBossState(DATA_DRAGONSPIRE_ROOM) == DONE))
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_DOORS:
go_doors = go->GetGUID();
-
if ((GetBossState(DATA_DRAGONSPIRE_ROOM) == DONE))
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_EMBERSEER_OUT:
go_emberseerout = go->GetGUID();
-
if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
go->SetGoState(GO_STATE_ACTIVE);
break;
@@ -192,6 +191,41 @@ public:
if ((GetBossState(DATA_ROOM_7_RUNE) == DONE))
go->SetGoState(GO_STATE_READY);
break;
+ case GO_EMBERSEER_RUNE_1:
+ go_emberseerrunes[0] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_2:
+ go_emberseerrunes[1] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_3:
+ go_emberseerrunes[2] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_4:
+ go_emberseerrunes[3] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_5:
+ go_emberseerrunes[4] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_6:
+ go_emberseerrunes[5] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
+ case GO_EMBERSEER_RUNE_7:
+ go_emberseerrunes[6] = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_READY);
+ break;
}
}
@@ -230,7 +264,8 @@ public:
{
case EVENT_PYROGUARD_EMBERSEER:
if (GetBossState(DATA_PYROGAURD_EMBERSEER) == NOT_STARTED)
- SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
+ if (Creature* Emberseer = instance->GetCreature(PyroguardEmberseer))
+ Emberseer->AI()->SetData(1, 1);
break;
default:
break;
@@ -297,6 +332,7 @@ public:
break;
case GO_ROOM_2_RUNE:
return go_roomrunes[1];
+ break;
case GO_ROOM_3_RUNE:
return go_roomrunes[2];
break;
@@ -312,6 +348,27 @@ public:
case GO_ROOM_7_RUNE:
return go_roomrunes[6];
break;
+ case GO_EMBERSEER_RUNE_1:
+ return go_emberseerrunes[0];
+ break;
+ case GO_EMBERSEER_RUNE_2:
+ return go_emberseerrunes[1];
+ break;
+ case GO_EMBERSEER_RUNE_3:
+ return go_emberseerrunes[2];
+ break;
+ case GO_EMBERSEER_RUNE_4:
+ return go_emberseerrunes[3];
+ break;
+ case GO_EMBERSEER_RUNE_5:
+ return go_emberseerrunes[4];
+ break;
+ case GO_EMBERSEER_RUNE_6:
+ return go_emberseerrunes[5];
+ break;
+ case GO_EMBERSEER_RUNE_7:
+ return go_emberseerrunes[6];
+ break;
}
return 0;
}
@@ -341,10 +398,12 @@ public:
void Dragonspireroomstore()
{
- uint8 creaturecount = 0;
+ uint8 creaturecount;
for (uint8 i = 0; i < 7; ++i)
{
+ creaturecount = 0;
+
if (GameObject* rune = instance->GetGameObject(go_roomrunes[i]))
{
for (uint8 ii = 0; ii < 3; ++ii)
@@ -360,7 +419,6 @@ public:
}
}
}
- creaturecount = 0;
}
}
}
@@ -416,8 +474,8 @@ public:
}
if (GetBossState(DATA_ROOM_1_RUNE) == DONE && GetBossState(DATA_ROOM_2_RUNE) == DONE && GetBossState(DATA_ROOM_3_RUNE) == DONE &&
- GetBossState(DATA_ROOM_4_RUNE) == DONE &&GetBossState(DATA_ROOM_5_RUNE) == DONE && GetBossState(DATA_ROOM_6_RUNE) == DONE &&
- GetBossState(DATA_ROOM_7_RUNE) == DONE)
+ GetBossState(DATA_ROOM_4_RUNE) == DONE &&GetBossState(DATA_ROOM_5_RUNE) == DONE && GetBossState(DATA_ROOM_6_RUNE) == DONE &&
+ GetBossState(DATA_ROOM_7_RUNE) == DONE)
{
SetBossState(DATA_DRAGONSPIRE_ROOM, DONE);
if (GameObject* door1 = instance->GetGameObject(go_emberseerin))
@@ -490,7 +548,8 @@ public:
uint64 go_emberseerin;
uint64 go_doors;
uint64 go_emberseerout;
- uint64 go_roomrunes[MAX_DRAGONSPIRE_HALL_RUNES];
+ uint64 go_roomrunes[7];
+ uint64 go_emberseerrunes[7];
uint64 runecreaturelist[7] [5];
};