diff options
5 files changed, 415 insertions, 133 deletions
diff --git a/sql/updates/world/2013_06_30_00_world_waypoints.sql b/sql/updates/world/2013_06_30_00_world_waypoints.sql new file mode 100644 index 00000000000..f2a4c58fcf8 --- /dev/null +++ b/sql/updates/world/2013_06_30_00_world_waypoints.sql @@ -0,0 +1,42 @@ +-- Pathing for Lord Victor Nefarius Entry: 10162 +SET @PATH := 1379670; +DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2); +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,168.7847,-444.8676,121.9753,0,0,0,0,100,0), +(@PATH,2,159.7806,-444.8137,121.9753,0,0,0,0,100,0), +(@PATH+1,1,163.1683,-444.165,121.9753,0,0,0,0,100,0), +(@PATH+1,2,163.2364,-443.4956,121.9753,0,0,0,0,100,0), +(@PATH+1,3,163.3028,-442.0108,122.2531,1.570796,0,0,0,100,0), +(@PATH+2,1,165.5801,-457.3273,121.9753,0,0,1,0,100,0), +(@PATH+2,2,165.5504,-465.8904,116.8073,0,0,1,0,100,0), +(@PATH+2,3,165.3594,-470.635,116.8296,0,0,1,0,100,0), +(@PATH+2,4,168.4351,-473.7489,116.8424,0,0,1,0,100,0), +(@PATH+2,5,179.0059,-473.894,116.8424,0,0,1,0,100,0); + +-- Pathing for Warchief Rend Blackhand Entry: 10429 +SET @PATH := 1379680; +DELETE FROM `waypoint_data` WHERE `id` IN (@PATH); +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,165.4778,-452.2761,121.9753,0,0,0,0,100,0), +(@PATH,2,165.5801,-457.3273,121.9753,0,0,0,0,100,0), +(@PATH,3,165.5504,-465.8904,116.8073,0,0,0,0,100,0), +(@PATH,4,165.3594,-470.635,116.8296,0,0,0,0,100,0), +(@PATH,5,168.4351,-473.7489,116.8424,0,0,0,0,100,0), +(@PATH,6,179.0059,-473.894,116.8424,0,52000,0,0,100,0), +(@PATH,7,216.6058,-430.4544,110.9169,0,0,0,0,100,0), +(@PATH,8,216.5664,-412.0932,110.9822,0,0,0,0,100,0), +(@PATH,9,217.1734,-401.2561,111.0617,0,0,0,0,100,0), +(@PATH,10,216.5286,-397.7477,111.0883,0,0,0,0,100,0), +(@PATH,11,214.8428,-395.8612,111.1051,0,0,0,0,100,0), +(@PATH,12,213.5363,-395.6153,111.1093,0,0,0,0,100,0); + +-- Pathing for Gyth Entry: 10339 +SET @PATH := 1379681; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,211.4939,-399.5368,111.0848,0,0,1,0,100,0), +(@PATH,2,209.2005,-409.7201,110.9367,0,0,1,0,100,0), +(@PATH,3,201.0632,-420.6352,110.9231,0,0,1,0,100,0), +(@PATH,4,178.1997,-420.3415,110.4723,0,0,1,0,100,0), +(@PATH,5,154.2494,-420.948,110.4723,0,0,1,0,100,0), +(@PATH,6,127.872,-420.4601,110.4723,0,0,1,0,100,0); diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp index 75e9ad6a140..3c79a08487c 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp @@ -29,6 +29,13 @@ enum Spells SPELL_SUMMON_REND = 16328 // Summons Rend near death }; +enum Misc +{ + NEFARIUS_PATH_2 = 1379671, + NEFARIUS_PATH_3 = 1379672, + GYTH_PATH_1 = 1379681, +}; + enum Events { EVENT_CORROSIVE_ACID = 1, @@ -67,7 +74,7 @@ public: events.ScheduleEvent(EVENT_CORROSIVE_ACID, urand(8000, 16000)); events.ScheduleEvent(EVENT_FREEZE, urand(8000, 16000)); events.ScheduleEvent(EVENT_FLAME_BREATH, urand(8000, 16000)); - events.ScheduleEvent(EVENT_FLAME_BREATH, urand(12000, 18000)); + events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(12000, 18000)); } void JustDied(Unit* /*killer*/) @@ -75,33 +82,55 @@ public: _JustDied(); } - void IsSummonedBy(Unit* /*summoner*/) + void SetData(uint32 /*type*/, uint32 data) { - events.ScheduleEvent(EVENT_SUMMONED, 8000); + switch (data) + { + case 1: + events.ScheduleEvent(EVENT_SUMMONED, 1000); + break; + default: + break; + } } void UpdateAI(uint32 diff) { - if (!UpdateVictim()) - return; if (!SummonedRend && HealthBelowPct(5)) { - DoCast(me, SPELL_SUMMON_REND); + DoCast(me, SPELL_SUMMON_REND); // Rend will despawn on Gyth death. Core issue with summoned npc's all despawning after summoner dies. me->RemoveAura(SPELL_REND_MOUNTS); SummonedRend = true; } + if (!UpdateVictim()) + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMONED: + me->AddAura(SPELL_REND_MOUNTS, me); + me->GetMotionMaster()->MovePath(GYTH_PATH_1, false); + if (GameObject* portcullis = me->FindNearestGameObject(GO_DR_PORTCULLIS, 25.0f)) + portcullis->UseDoorOrButton(); + if (Creature* victor = me->FindNearestCreature(NPC_LORD_VICTOR_NEFARIUS, 75.0f, true)) + victor->GetMotionMaster()->MovePath(NEFARIUS_PATH_2, false); + break; + } + } + return; + } + events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_SUMMONED: - DoCast(me, SPELL_REND_MOUNTS); - // Load Path - break; case EVENT_CORROSIVE_ACID: DoCast(me, SPELL_CORROSIVE_ACID); events.ScheduleEvent(EVENT_CORROSIVE_ACID, urand(10000, 16000)); diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp index 24a1fbad457..fdf3f0066ba 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_pyroguard_emberseer.cpp @@ -85,12 +85,10 @@ public: events.Reset(); // Apply auras on spawn and reset // DoCast(me, SPELL_FIRE_SHIELD_TRIGGER); // Need to find this in old DBC if possible - - instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED); me->RemoveAura(SPELL_EMBERSEER_FULL_STRENGTH); me->RemoveAura(SPELL_EMBERSEER_GROWING); me->RemoveAura(SPELL_EMBERSEER_GROWING_TRIGGER); - events.ScheduleEvent(EVENT_RESPAWN, 1000); + events.ScheduleEvent(EVENT_RESPAWN, 5000); // Hack for missing trigger spell events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); @@ -209,52 +207,56 @@ public: void UpdateAI(uint32 diff) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + if (!UpdateVictim()) { - switch (eventId) + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_RESPAWN: + switch (eventId) { - // 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()) + case EVENT_RESPAWN: + { + // 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) { - creatureList->Respawn(); + if (!creatureList->IsAlive()) + { + creatureList->Respawn(); + } + creatureList->AI()->SetData(1, 2); } - creatureList->AI()->SetData(1, 2); - } - 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) + me->AddAura(SPELL_ENCAGED_EMBERSEER, me); + instance->SetBossState(DATA_PYROGAURD_EMBERSEER, NOT_STARTED); + break; + } + case EVENT_PRE_FIGHT_1: { - if (Creature* creatureList = *itr) - creatureList->AI()->SetData(1, 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); + } + events.ScheduleEvent(EVENT_PRE_FIGHT_2, 32000); + break; } - 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_FIRE_SHIELD: - // #### Spell isn't doing any damage ??? #### - DoCast(me, SPELL_FIRE_SHIELD); - events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); - break; - case EVENT_PLAYER_CHECK: + case EVENT_PRE_FIGHT_2: + me->CastSpell(me, SPELL_FREEZE_ANIM); + me->CastSpell(me, SPELL_EMBERSEER_GROWING); + Talk(EMOTE_ONE_STACK); + break; + case EVENT_FIRE_SHIELD: + // #### Spell isn't doing any damage ??? #### + DoCast(me, SPELL_FIRE_SHIELD); + events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); + break; + case EVENT_PLAYER_CHECK: { // Check to see if all players in instance have aura SPELL_EMBERSEER_START before starting event bool _hasAura = true; @@ -269,32 +271,40 @@ public: events.ScheduleEvent(EVENT_PRE_FIGHT_1, 1000); instance->SetBossState(DATA_PYROGAURD_EMBERSEER, IN_PROGRESS); } - break; + break; } - case EVENT_ENTER_COMBAT: - AttackStart(me->SelectNearestPlayer(30.0f)); + case EVENT_ENTER_COMBAT: + AttackStart(me->SelectNearestPlayer(30.0f)); + break; + default: + break; + } + } + return; + } + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FIRE_SHIELD: + DoCast(me, SPELL_FIRE_SHIELD); + events.ScheduleEvent(EVENT_FIRE_SHIELD, 3000); break; case EVENT_FIRENOVA: - if (UpdateVictim()) - { - DoCast(me, SPELL_FIRENOVA); + DoCast(me, SPELL_FIRENOVA); events.ScheduleEvent(EVENT_FIRENOVA, 6000); - } break; case EVENT_FLAMEBUFFET: - if (UpdateVictim()) - { - DoCast(me, SPELL_FLAMEBUFFET); + DoCast(me, SPELL_FLAMEBUFFET); events.ScheduleEvent(EVENT_FLAMEBUFFET, 14000); - } break; case EVENT_PYROBLAST: - if (UpdateVictim()) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_PYROBLAST); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_PYROBLAST); events.ScheduleEvent(EVENT_PYROBLAST, 15000); - } break; default: break; @@ -355,7 +365,7 @@ public: if (data == 1 && value == 2) { - _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 5000); + _events.ScheduleEvent(EVENT_ENCAGED_EMBERSEER, 1000); } } @@ -364,18 +374,28 @@ public: // Used to close doors if (Creature* Emberseer = me->FindNearestCreature(NPC_PYROGAURD_EMBERSEER, 30.0f, true)) Emberseer->AI()->SetData(1, 2); - me->CallForHelp(60.0f); + + // Had to do this because CallForHelp will ignore any npcs without LOS + std::list<Creature*> creatureList; + GetCreatureListWithEntryInGrid(creatureList, me, NPC_BLACKHAND_INCARCERATOR, 60.0f); + for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { + if (Creature* creatureList = *itr) + creatureList->SetInCombatWithZone(); // AI()->AttackStart(me->GetVictim()); + } + _events.ScheduleEvent(EVENT_STRIKE, urand(8000, 16000)); _events.ScheduleEvent(EVENT_ENCAGE, urand(10000, 20000)); - me->CallForHelp(60.0f); // double call because not all are aggroing on first call. } void UpdateAI(uint32 diff) { - _events.Update(diff); + if (!UpdateVictim()) { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) @@ -391,6 +411,8 @@ public: return; } + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp index 4297ac591f7..d975300c35b 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp @@ -27,7 +27,7 @@ enum Spells SPELL_CLEAVE = 15284, SPELL_MORTAL_STRIKE = 16856, SPELL_FRENZY = 8269, - SPELL_KNOCKDOWN = 13360 // On spawn during Gyth fight + SPELL_KNOCKDOWN = 13360 // On spawn during Gyth fight }; enum Says @@ -37,16 +37,16 @@ enum Says SAY_BLACKHAND_2 = 1, EMOTE_BLACKHAND_DISMOUNT = 2, // Victor Nefarius - SAY_NEFARIUS_1 = 0, - SAY_NEFARIUS_2 = 1, - SAY_NEFARIUS_3 = 2, - SAY_NEFARIUS_4 = 3, - SAY_NEFARIUS_5 = 4, - SAY_NEFARIUS_6 = 5, - SAY_NEFARIUS_7 = 6, - SAY_NEFARIUS_8 = 7, - SAY_NEFARIUS_9 = 8, - SAY_NEFARIUS_10 = 9, + SAY_NEFARIUS_0 = 0, + SAY_NEFARIUS_1 = 1, + SAY_NEFARIUS_2 = 2, + SAY_NEFARIUS_3 = 3, + SAY_NEFARIUS_4 = 4, + SAY_NEFARIUS_5 = 5, + SAY_NEFARIUS_6 = 6, + SAY_NEFARIUS_7 = 7, + SAY_NEFARIUS_8 = 8, + SAY_NEFARIUS_9 = 9, }; enum Adds @@ -55,6 +55,16 @@ enum Adds NPC_CHROMATIC_DRAGONSPAWN = 10447, NPC_BLACKHAND_DRAGON_HANDLER = 10742 }; + +enum Misc +{ + NEFARIUS_PATH_1 = 1379670, + NEFARIUS_PATH_2 = 1379671, + NEFARIUS_PATH_3 = 1379672, + REND_PATH_1 = 1379680, + REND_PATH_2 = 1379681, +}; + /* struct Wave { @@ -106,19 +116,45 @@ static Wave Wave6[]= // 27 sec { 10442, 212.2642f, -430.7648f, 110.9807f, 5.934119f } }; */ + +Position const GythLoc = { 211.762f, -397.5885f, 111.1817f, 4.747295f }; +Position const Teleport1Loc = { 194.2993f, -474.0814f, 121.4505f, -0.01225555f }; +Position const Teleport2Loc = { 216.485f, -434.93f, 110.888f, -0.01225555f }; + enum Events { - EVENT_WHIRLWIND = 1, - EVENT_CLEAVE = 2, - EVENT_MORTAL_STRIKE = 3, - - EVENT_GYTH_1 = 5, - EVENT_GYTH_2 = 6, - EVENT_GYTH_3 = 7, - EVENT_GYTH_4 = 8, - EVENT_GYTH_5 = 9, - EVENT_GYTH_6 = 10, - EVENT_PORTCULLIS = 11, + EVENT_START_1 = 1, + EVENT_START_2 = 2, + EVENT_START_3 = 3, + EVENT_START_4 = 4, + EVENT_TURN_TO_REND = 5, + EVENT_TURN_TO_PLAYER = 6, + EVENT_TURN_TO_FACING_1 = 7, + EVENT_TURN_TO_FACING_2 = 8, + EVENT_TURN_TO_FACING_3 = 9, + EVENT_WAVE_1 = 10, + EVENT_WAVE_2 = 11, + EVENT_WAVE_3 = 12, + EVENT_WAVE_4 = 13, + EVENT_WAVE_5 = 14, + EVENT_WAVE_6 = 15, + EVENT_WAVES_TEXT_1 = 16, + EVENT_WAVES_TEXT_2 = 17, + EVENT_WAVES_TEXT_3 = 18, + EVENT_WAVES_TEXT_4 = 19, + EVENT_WAVES_TEXT_5 = 20, + EVENT_WAVES_COMPLETE_TEXT_1 = 21, + EVENT_WAVES_COMPLETE_TEXT_2 = 22, + EVENT_WAVES_COMPLETE_TEXT_3 = 23, + EVENT_WAVES_EMOTE_1 = 24, + EVENT_WAVES_EMOTE_2 = 25, + EVENT_PATH_REND = 26, + EVENT_PATH_NEFARIUS = 27, + EVENT_TELEPORT_1 = 28, + EVENT_TELEPORT_2 = 29, + EVENT_WHIRLWIND = 30, + EVENT_CLEAVE = 31, + EVENT_MORTAL_STRIKE = 32, }; class boss_rend_blackhand : public CreatureScript @@ -133,9 +169,8 @@ public: void Reset() { _Reset(); - _gythEvent = false; - _victorGUID = 0; - _portcullisGUID = 0; + gythEvent = false; + victorGUID = 0; } void EnterCombat(Unit* /*who*/) @@ -156,33 +191,43 @@ public: { if (instance && type == AREATRIGGER && data == AREATRIGGER_BLACKROCK_STADIUM) { - if (!_gythEvent) + if (!gythEvent) { - _gythEvent = true; + gythEvent = true; if (Creature* victor = me->FindNearestCreature(NPC_LORD_VICTOR_NEFARIUS, 5.0f, true)) - _victorGUID = victor->GetGUID(); + victorGUID = victor->GetGUID(); if (GameObject* portcullis = me->FindNearestGameObject(GO_DR_PORTCULLIS, 50.0f)) - _portcullisGUID = portcullis->GetGUID(); + portcullisGUID = portcullis->GetGUID(); - if (Creature* victor = me->GetCreature(*me, _victorGUID)) - { - if (Unit* player = victor->SelectNearestPlayer(40.0f)) - { - victor->SetInFront(player); - victor->SendMovementFlagUpdate(); - } - } + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + events.ScheduleEvent(EVENT_START_1, 1000); } + } + } - events.ScheduleEvent(EVENT_GYTH_1, 1000); + void MovementInform(uint32 type, uint32 id) + { + if (type == WAYPOINT_MOTION_TYPE) + { + switch (id) + { + case 5: + events.ScheduleEvent(EVENT_TELEPORT_1, 2000); + break; + case 11: + if (Creature* gyth = me->FindNearestCreature(NPC_GYTH, 10.0f, true)) + gyth->AI()->SetData(1, 1); + me->DespawnOrUnsummon(1000); + break; + } } } void UpdateAI(uint32 diff) { - if (_gythEvent) + if (gythEvent) { events.Update(diff); @@ -190,31 +235,172 @@ public: { switch (eventId) { - case EVENT_GYTH_1: - if (Creature* victor = me->GetCreature(*me, _victorGUID)) - victor->AI()->Talk(SAY_NEFARIUS_1); - events.ScheduleEvent(EVENT_GYTH_2, 4000); + case EVENT_START_1: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_0); + events.ScheduleEvent(EVENT_START_2, 4000); break; - case EVENT_GYTH_2: - if (Creature* victor = me->GetCreature(*me, _victorGUID)) + case EVENT_START_2: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) victor->HandleEmoteCommand(EMOTE_ONESHOT_POINT); - events.ScheduleEvent(EVENT_GYTH_3, 4000); + events.ScheduleEvent(EVENT_START_3, 4000); break; - case EVENT_GYTH_3: - if (Creature* victor = me->GetCreature(*me, _victorGUID)) - victor->AI()->Talk(SAY_NEFARIUS_2); - events.ScheduleEvent(EVENT_PORTCULLIS, 2000); - events.ScheduleEvent(EVENT_GYTH_4, 4000); + case EVENT_START_3: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_1); + events.ScheduleEvent(EVENT_WAVE_1, 2000); + events.ScheduleEvent(EVENT_TURN_TO_REND, 4000); + events.ScheduleEvent(EVENT_WAVES_TEXT_1, 20000); break; - case EVENT_GYTH_4: - if (Creature* victor = me->GetCreature(*me, _victorGUID)) + case EVENT_TURN_TO_REND: + if (Creature* victor = me->GetCreature(*me, victorGUID)) { victor->SetInFront(me); victor->SendMovementFlagUpdate(); + victor->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + } + break; + case EVENT_TURN_TO_PLAYER: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + if (Unit* player = victor->SelectNearestPlayer(60.0f)) + { + victor->SetInFront(player); + victor->SendMovementFlagUpdate(); + } + break; + case EVENT_TURN_TO_FACING_1: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + { + victor->SetOrientation(1.518436f); + victor->SendMovementFlagUpdate(); } break; - case EVENT_PORTCULLIS: - if (GameObject* portcullis = me->FindNearestGameObject(GO_DR_PORTCULLIS, 50.0f)) + case EVENT_TURN_TO_FACING_2: + me->SetOrientation(1.658063f); + me->SendMovementFlagUpdate(); + break; + case EVENT_TURN_TO_FACING_3: + me->SetOrientation(1.500983f); + me->SendMovementFlagUpdate(); + break; + case EVENT_WAVES_EMOTE_1: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->HandleEmoteCommand(EMOTE_ONESHOT_QUESTION); + break; + case EVENT_WAVES_EMOTE_2: + me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); + break; + case EVENT_WAVES_TEXT_1: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_2); + me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); + events.ScheduleEvent(EVENT_WAVES_EMOTE_1, 5000); + events.ScheduleEvent(EVENT_WAVE_2, 2000); + events.ScheduleEvent(EVENT_WAVES_TEXT_2, 20000); + break; + case EVENT_WAVES_TEXT_2: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_3); + events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); + events.ScheduleEvent(EVENT_WAVE_3, 2000); + events.ScheduleEvent(EVENT_WAVES_TEXT_3, 20000); + break; + case EVENT_WAVES_TEXT_3: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_4); + events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); + events.ScheduleEvent(EVENT_WAVE_4, 2000); + events.ScheduleEvent(EVENT_WAVES_TEXT_4, 20000); + break; + case EVENT_WAVES_TEXT_4: + Talk(SAY_BLACKHAND_1); + events.ScheduleEvent(EVENT_WAVES_EMOTE_2, 4000); + events.ScheduleEvent(EVENT_TURN_TO_FACING_3, 8000); + events.ScheduleEvent(EVENT_WAVE_5, 2000); + events.ScheduleEvent(EVENT_WAVES_TEXT_5, 20000); + break; + case EVENT_WAVES_TEXT_5: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_5); + events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); + events.ScheduleEvent(EVENT_WAVE_6, 2000); + events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_1, 20000); + break; + case EVENT_WAVES_COMPLETE_TEXT_1: + events.ScheduleEvent(EVENT_TURN_TO_PLAYER, 0); + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_6); + events.ScheduleEvent(EVENT_TURN_TO_FACING_1, 4000); + events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_2, 13000); + break; + case EVENT_WAVES_COMPLETE_TEXT_2: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_7); + Talk(SAY_BLACKHAND_2); + events.ScheduleEvent(EVENT_PATH_REND, 1000); + events.ScheduleEvent(EVENT_WAVES_COMPLETE_TEXT_3, 4000); + break; + case EVENT_WAVES_COMPLETE_TEXT_3: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->AI()->Talk(SAY_NEFARIUS_8); + events.ScheduleEvent(EVENT_PATH_NEFARIUS, 1000); + events.ScheduleEvent(EVENT_PATH_REND, 1000); + break; + case EVENT_PATH_NEFARIUS: + if (Creature* victor = me->GetCreature(*me, victorGUID)) + victor->GetMotionMaster()->MovePath(NEFARIUS_PATH_1, true); + break; + case EVENT_PATH_REND: + // path to gyth and spawn gyth. + // after despawn gyth fight will start + me->GetMotionMaster()->MovePath(REND_PATH_1, false); + break; + case EVENT_TELEPORT_1: + me->NearTeleportTo(194.2993f, -474.0814f, 121.4505f, -0.01225555f); + events.ScheduleEvent(EVENT_TELEPORT_2, 50000); + break; + case EVENT_TELEPORT_2: + me->NearTeleportTo(216.485f, -434.93f, 110.888f, -0.01225555f); + me->SummonCreature(NPC_GYTH, 211.762f, -397.5885f, 111.1817f, 4.747295f); + break; + case EVENT_WAVE_1: + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) + portcullis->UseDoorOrButton(); + // move wave + break; + case EVENT_WAVE_2: + // spawn wave + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) + portcullis->UseDoorOrButton(); + // move wave + break; + case EVENT_WAVE_3: + // spawn wave + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) + portcullis->UseDoorOrButton(); + // move wave + break; + case EVENT_WAVE_4: + // spawn wave + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) + portcullis->UseDoorOrButton(); + // move wave + break; + case EVENT_WAVE_5: + // spawn wave + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) + portcullis->UseDoorOrButton(); + // move wave + break; + case EVENT_WAVE_6: + // spawn wave + if (GameObject* portcullis = me->GetMap()->GetGameObject(portcullisGUID)) portcullis->UseDoorOrButton(); // move wave break; @@ -252,11 +438,11 @@ public: } DoMeleeAttackIfReady(); } - private: - bool _gythEvent; - uint64 _victorGUID; - uint64 _portcullisGUID; + private: + bool gythEvent; + uint64 victorGUID; + uint64 portcullisGUID; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp index 7b80f75255a..ab462319450 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp @@ -437,7 +437,10 @@ public: { bool _mobAlive = false; rune = instance->GetGameObject(go_roomrunes[i]); - if (rune && rune->GetGoState() == GO_STATE_ACTIVE) + if (!rune) + continue; + + if (rune->GetGoState() == GO_STATE_ACTIVE) { for (uint8 ii = 0; ii < 5; ++ii) { @@ -559,7 +562,7 @@ public: uint64 go_blackrockaltar; uint64 go_roomrunes[7]; uint64 go_emberseerrunes[7]; - uint64 runecreaturelist[7] [5]; + uint64 runecreaturelist[7][5]; }; InstanceScript* GetInstanceScript(InstanceMap* map) const |