aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h4
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp183
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp12
3 files changed, 143 insertions, 56 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
index fcfe5bc930d..ab87545688a 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
@@ -20,7 +20,7 @@
uint32 const EncounterCount = 22;
-#define UBRSScriptName "instance_blackrock_spire"
+#define BRSScriptName "instance_blackrock_spire"
enum DataTypes
{
@@ -91,7 +91,7 @@ enum GameObjectsIds
GO_GYTH_EXIT_DOOR = 175186,
GO_DRAKKISATH_DOOR_1 = 175946,
GO_DRAKKISATH_DOOR_2 = 175947,
- GO_BLACKROCK_ALTAR = 175706,
+ GO_BLACKROCK_ALTAR = 175706, // Altar used to start Pyroguard Emberseer event
// 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 9331f767197..45270ee6a1c 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp
@@ -30,24 +30,39 @@ enum Text
enum Spells
{
- SPELL_ENCAGED_EMBERSEER = 15282, // Self on spawn
- SPELL_FIRE_SHIELD_TRIGGER = 13377, // Self on spawn missing from 335 dbc
+ SPELL_ENCAGED_EMBERSEER = 15282,
+ SPELL_FIRE_SHIELD_TRIGGER = 13377, // Self on spawn missing from 335 dbc triggers SPELL_FIRE_SHIELD every 3 sec
+ SPELL_FIRE_SHIELD = 13376, // Triggered by SPELL_FIRE_SHIELD_TRIGGER
SPELL_FREEZE_ANIM = 16245, // Self on event start
SPELL_EMBERSEER_GROWING = 16048, // Self on event start
+ SPELL_EMBERSEER_GROWING_TRIGGER = 16049, // Triggered by SPELL_EMBERSEER_GROWING
SPELL_EMBERSEER_FULL_STRENGTH = 16047, // Emberseer Full Strength
SPELL_FIRENOVA = 23462, // Combat
SPELL_FLAMEBUFFET = 23341, // Combat
- SPELL_PYROBLAST = 17274 // Combat
+ SPELL_PYROBLAST = 17274, // Combat
+ // Blackhand Incarcerator Spells
+ SPELL_ENCAGE_EMBERSEER = 15281, // Emberseer on spawn
+ SPELL_STRIKE = 15580, // Combat
+ SPELL_ENCAGE = 16045 // Combat
};
enum Events
{
- // OOC
+ // Respawn
EVENT_RESPAWN = 1,
+ // Pre fight
+ EVENT_PRE_FIGHT_1 = 2,
+ EVENT_PRE_FIGHT_2 = 3,
// Combat
- EVENT_FIRENOVA = 2,
- EVENT_FLAMEBUFFET = 3,
- EVENT_PYROBLAST = 4
+ EVENT_FIRENOVA = 4,
+ EVENT_FLAMEBUFFET = 5,
+ EVENT_PYROBLAST = 6,
+ // Reset
+ EVENT_RESET_ALTAR = 7,
+ // Hack due to trigger spell not in dbc
+ EVENT_FIRE_SHIELD = 8,
+ // Make sure all players have aura from altar
+ EVENT_PLAYER_CHECK = 9
};
class boss_pyroguard_emberseer : public CreatureScript
@@ -68,22 +83,29 @@ public:
{
if (instance)
{
- // Apply auras on spawn and reset
- DoCast(me, SPELL_ENCAGED_EMBERSEER);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
+ // Apply auras on spawn and reset
// 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);
+ // Hack for missing trigger spell
+ events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000);
+ }
+ }
- instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED);
+ void JustReachedHome()
+ {
+ if (instance)
+ {
+ // respawn any dead Blackhand Incarcerators & reset Altar
+ events.ScheduleEvent(EVENT_RESPAWN, 1000);
+ events.ScheduleEvent(EVENT_RESET_ALTAR, 6000);
}
}
@@ -91,20 +113,19 @@ public:
{
if (instance && type == 1 && data == 1)
{
- instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
+ events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000);
+ }
- // Close these two doors on encounter start
+ if (instance && type == 1 && data == 2)
+ {
+ // Close these two doors on Blackhand Incarcerators aggro
if (GameObject* door1 = me->GetMap()->GetGameObject(instance->GetData64(GO_EMBERSEER_IN)))
- door1->SetGoState(GO_STATE_READY);
+ if (door1->GetGoState() == GO_STATE_ACTIVE)
+ 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 ###
+ if (door2->GetGoState() == GO_STATE_ACTIVE)
+ door2->SetGoState(GO_STATE_READY);
}
-
-
}
void EnterCombat(Unit* /*who*/)
@@ -117,7 +138,6 @@ public:
void JustDied(Unit* /*killer*/)
{
-
if (instance)
{
// Activate all the runes
@@ -143,6 +163,31 @@ public:
}
}
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_ENCAGE_EMBERSEER)
+ if (me->GetAuraCount(SPELL_ENCAGED_EMBERSEER) == 0)
+ DoCast(me, SPELL_ENCAGED_EMBERSEER);
+
+ if (spell->Id == SPELL_EMBERSEER_GROWING_TRIGGER)
+ {
+ if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 10)
+ Talk(EMOTE_TEN_STACK);
+
+ if (me->GetAuraCount(SPELL_EMBERSEER_GROWING_TRIGGER) == 20)
+ {
+ me->RemoveAura(SPELL_ENCAGED_EMBERSEER);
+ me->RemoveAura(SPELL_FREEZE_ANIM);
+ me->CastSpell(me, SPELL_EMBERSEER_FULL_STRENGTH);
+ Talk(EMOTE_FREE_OF_BONDS);
+ Talk(YELL_FREE_OF_BONDS);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC|UNIT_FLAG_NOT_SELECTABLE);
+ AttackStart(me->SelectNearestPlayer(30.0f));
+ }
+ }
+
+ }
+
void OpenDoors(bool Boss_Killed)
{
// These two doors reopen on reset or boss kill
@@ -161,25 +206,60 @@ public:
{
events.Update(diff);
- if (!UpdateVictim())
+ while (uint32 eventId = events.ExecuteEvent())
{
- while (uint32 eventId = events.ExecuteEvent())
+ switch (eventId)
{
- switch (eventId)
+ case EVENT_RESPAWN:
{
- 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;
+ // Respawn all Blackhand Incarcerators
+ 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;
}
+ case EVENT_PRE_FIGHT_1:
+ {
+ // Set data on all Blackhand Incarcerators
+ 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)
+ creatureList->AI()->SetData(1, 1);
+
+ // Lock Blackrock Altar
+ if (GameObject* altar = me->GetMap()->GetGameObject(instance->GetData64(GO_BLACKROCK_ALTAR)))
+ altar->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000);
+ break;
+ }
+ case EVENT_PRE_FIGHT_2:
+ me->CastSpell(me, SPELL_FREEZE_ANIM);
+ me->CastSpell(me, SPELL_EMBERSEER_GROWING);
+ Talk(EMOTE_ONE_STACK);
+ break;
+ case EVENT_RESET_ALTAR:
+ if (GameObject* altar = me->GetMap()->GetGameObject(instance->GetData64(GO_BLACKROCK_ALTAR)))
+ altar->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
+ case EVENT_FIRE_SHIELD:
+ DoCast(SPELL_FIRE_SHIELD);
+ events.ScheduleEvent(SPELL_FIRE_SHIELD, 3000);
+ break;
+ case EVENT_PLAYER_CHECK:
+ // TODO add check to ensure all players are clicking altar
+ events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1000);
+ instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS);
+ break;
}
- return;
}
+ if (!UpdateVictim())
+ return;
+
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -211,16 +291,9 @@ public:
## 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
+ // OOC
EVENT_ENCAGED_EMBERSEER = 1,
// Combat
EVENT_STRIKE = 2,
@@ -239,7 +312,6 @@ public:
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
-
_events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000);
}
@@ -253,13 +325,17 @@ public:
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 ###
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ _events.CancelEvent(EVENT_ENCAGED_EMBERSEER);
}
-
}
+
void EnterCombat(Unit* /*who*/)
{
+ // Used to close doors
+ if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true))
+ Emberseer->AI()->SetData(1, 2);
+
_events.ScheduleEvent(EVENT_STRIKE, urand(8000, 16000));
_events.ScheduleEvent(EVENT_ENCAGE, urand(10000, 20000));
}
@@ -275,10 +351,11 @@ public:
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);
+ if(me->GetPositionX() == me->GetHomePosition().GetPositionX())
+ 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, 5000);
break;
}
}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
index e5b5194b494..2751648ebf9 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
@@ -35,7 +35,7 @@ enum EventIds
class instance_blackrock_spire : public InstanceMapScript
{
public:
- instance_blackrock_spire() : InstanceMapScript(UBRSScriptName, 229) { }
+ instance_blackrock_spire() : InstanceMapScript(BRSScriptName, 229) { }
struct instance_blackrock_spireMapScript : public InstanceScript
{
@@ -61,6 +61,7 @@ public:
go_emberseerin = 0;
go_doors = 0;
go_emberseerout = 0;
+ go_blackrockaltar = 0;
}
void OnPlayerEnter(Player* /*player*/)
@@ -156,6 +157,11 @@ public:
if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
go->SetGoState(GO_STATE_ACTIVE);
break;
+ case GO_BLACKROCK_ALTAR:
+ go_blackrockaltar = go->GetGUID();
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
case GO_ROOM_1_RUNE:
go_roomrunes[0] = go->GetGUID();
if ((GetBossState(DATA_ROOM_1_RUNE) == DONE))
@@ -327,6 +333,9 @@ public:
case GO_EMBERSEER_OUT:
return go_emberseerout;
break;
+ case GO_BLACKROCK_ALTAR:
+ return go_blackrockaltar;
+ break;
case GO_ROOM_1_RUNE:
return go_roomrunes[0];
break;
@@ -548,6 +557,7 @@ public:
uint64 go_emberseerin;
uint64 go_doors;
uint64 go_emberseerout;
+ uint64 go_blackrockaltar;
uint64 go_roomrunes[7];
uint64 go_emberseerrunes[7];
uint64 runecreaturelist[7] [5];