diff options
5 files changed, 228 insertions, 57 deletions
diff --git a/sql/updates/world/2011_03_11_1_world_sai.sql b/sql/updates/world/2011_03_11_1_world_sai.sql new file mode 100644 index 00000000000..eb5d786e86d --- /dev/null +++ b/sql/updates/world/2011_03_11_1_world_sai.sql @@ -0,0 +1,45 @@ +UPDATE `creature_template` SET `InhabitType`=7 WHERE `entry`=38153; +UPDATE `creature_template` SET `npcflag`=0 WHERE `entry` IN (37187,37200); +UPDATE `creature` SET `npcflag`=0 WHERE `entry` IN (37187,37200); +UPDATE `creature` SET `npcflag`=`npcflag`|1 WHERE `guid`=200982; -- Set gossip flag for spawn at Deathbringer's Rise + +DELETE FROM `creature_text` WHERE `entry`=37187 AND `groupid` BETWEEN 15 AND 18; +DELETE FROM `creature_text` WHERE `entry`=37200 AND `groupid` BETWEEN 13 AND 15; +DELETE FROM `creature_text` WHERE `entry`=37119 AND `groupid` IN (4,5); +DELETE FROM `creature_text` WHERE `entry`=37181 AND `groupid`=2; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(37187,15,0, 'The paladin still lives? Is it possible, Highlord? Could he have survived?',0,0,0,6,0,17107, 'High Overlord Saurfang - SAY_SAURFANG_INTRO_1'), +(37187,16,0, 'Then we must save him! If we rescue Bolvar Fordragon, we may quell the unrest between the Alliance and the Horde.',0,0,0,5,0,17108, 'High Overlord Saurfang - SAY_SAURFANG_INTRO_2'), +(37187,17,0, 'Our mission is now clear: The Lich King will answer for his crimes and we will save Highlord Bolvar Fordragon!',0,0,0,15,0,17109, 'High Overlord Saurfang - SAY_SAURFANG_INTRO_3'), +(37187,18,0, 'Kor''kron, prepare Orgrim''s Hammer for its final voyage! Champions, our gunship will find a point to dock on the upper reaches of the citadel. Meet us there!',1,0,0,22,0,17110, 'High Overlord Saurfang - SAY_SAURFANG_INTRO_4'), +(37119,4,0, 'The power of the Light knows no bounds, Saurfang. His soul is under great strain, but he lives - for now.',0,0,0,1,0,16658, 'Highlord Tirion Fordring - SAY_TIRION_INTRO_5'), +(37181,2,0, 'But that honor is no longer yours. Soon, I will have a new champion.',1,0,0,0,0,17232, 'The Lich King - SAY_LK_INTRO_3'), +(37200,13,0, 'Could it be, Lord Fordring? If Bolvar lives, mayhap there is hope fer peace between the Alliance and the Horde. We must reach the top o'' this cursed place and free the paladin!',0,0,0,6,0,16980, 'Muradin Bronzebeard - SAY_SAURFANG_INTRO_2'), +(37200,14,0, 'Prepare the Skybreaker fer an aerial assault on the citadel!',1,0,0,5,0,16981, 'Muradin Bronzebeard - SAY_SAURFANG_INTRO_3'), +(37200,15,0, 'Heroes, ye must fight yer way to a clear extraction point within Icecrown. We''ll try an'' rendezvous on the ramparts!',1,0,0,22,0,16982, 'Muradin Bronzebeard - SAY_SAURFANG_INTRO_4'), +(37119,5,0, 'By the Light, it must be so!',0,0,0,5,0,16657, 'Highlord Tirion Fordring - SAY_TIRION_INTRO_A_5'); + +SET @GUID := 200984; +SET @PATH_ID := @GUID*10; +DELETE FROM `waypoint_data` WHERE `id`=@PATH_ID; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH_ID,0,-39.2257,2211.269,27.90252,0,0,0,100,0), +(@PATH_ID,1,-27.3663,2211.575,30.11564,0,0,0,100,0), +(@PATH_ID,2,-15.8420,2211.618,30.11566,0,0,0,100,0), +(@PATH_ID,3,2.744797,2211.411,30.11566,0,0,0,100,0), +(@PATH_ID,4,24.05210,2211.306,30.11566,0,0,0,100,0), +(@PATH_ID,5,64.72570,2211.561,30.11567,0,0,0,100,0); + +DELETE FROM `creature_formations` WHERE `leaderGUID`=@GUID; +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`) VALUES +(@GUID,@GUID,0,0,0), +(@GUID,201185,2.72779,127.636,0), +(@GUID,200979,5.34512,256.1602,0), +(@GUID,200889,3.59949,206.7455,0); + +DELETE FROM `linked_respawn` WHERE `linkedGuid`=@GUID AND `linkType`=0; +INSERT INTO `linked_respawn` (`guid`,`linkedGuid`,`linkType`) VALUES +(201185,@GUID,0), +(200979,@GUID,0), +(200889,@GUID,0), +(@GUID,@GUID,0); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 627895a5c87..79442e890cd 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -206,7 +206,8 @@ enum MovePoints POINT_CHARGE = 3781302, POINT_CHOKE = 3781303, POINT_CORPSE = 3781304, - POINT_FINAL = 3781305 + POINT_FINAL = 3781305, + POINT_EXIT = 5, // waypoint id }; static const Position deathbringerPos = {-496.3542f, 2211.33f, 541.1138f, 0.0f}; @@ -638,38 +639,46 @@ class npc_high_overlord_saurfang_icc : public CreatureScript void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE) - return; - - switch (id) + if (type == POINT_MOTION_TYPE) { - case POINT_FIRST_STEP: - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - Talk(SAY_INTRO_HORDE_3); - events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); - events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); - events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H); - events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H); - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) - deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); - break; - case POINT_CORPSE: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) - { - deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs. - deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - deathbringer->setDeathState(ALIVE); - } - events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move - events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say - break; - case POINT_FINAL: - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) - deathbringer->DespawnOrUnsummon(); - me->DespawnOrUnsummon(); - break; - default: - break; + switch (id) + { + case POINT_FIRST_STEP: + me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Talk(SAY_INTRO_HORDE_3); + events.ScheduleEvent(EVENT_INTRO_HORDE_5, 15500, 0, PHASE_INTRO_H); + events.ScheduleEvent(EVENT_INTRO_HORDE_6, 29500, 0, PHASE_INTRO_H); + events.ScheduleEvent(EVENT_INTRO_HORDE_7, 43800, 0, PHASE_INTRO_H); + events.ScheduleEvent(EVENT_INTRO_HORDE_8, 47000, 0, PHASE_INTRO_H); + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) + deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); + break; + case POINT_CORPSE: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) + { + deathbringer->CastSpell(me, SPELL_RIDE_VEHICLE, true); // for the packet logs. + deathbringer->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + deathbringer->setDeathState(ALIVE); + } + events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 1000); // move + events.ScheduleEvent(EVENT_OUTRO_HORDE_6, 4000); // say + break; + case POINT_FINAL: + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) + deathbringer->DespawnOrUnsummon(); + me->DespawnOrUnsummon(); + break; + default: + break; + } + } + else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT) + { + std::list<Creature*> guards; + GetCreatureListWithEntryInGrid(guards, me, NPC_KOR_KRON_GENERAL, 50.0f); + for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + me->DespawnOrUnsummon(); } } @@ -842,14 +851,22 @@ class npc_muradin_bronzebeard_icc : public CreatureScript void MovementInform(uint32 type, uint32 id) { - if (type != POINT_MOTION_TYPE || id != POINT_FIRST_STEP) - return; - - me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); - Talk(SAY_INTRO_ALLIANCE_4); - events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); - if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) - deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); + if (type == POINT_MOTION_TYPE && id == POINT_FIRST_STEP) + { + me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); + Talk(SAY_INTRO_ALLIANCE_4); + events.ScheduleEvent(EVENT_INTRO_ALLIANCE_5, 5000, 0, PHASE_INTRO_A); + if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, deathbringerSaurfangGUID)) + deathbringer->AI()->DoAction(ACTION_CONTINUE_INTRO); + } + else if (type == WAYPOINT_MOTION_TYPE && id == POINT_EXIT) + { + std::list<Creature*> guards; + GetCreatureListWithEntryInGrid(guards, me, NPC_ALLIANCE_COMMANDER, 50.0f); + for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + me->DespawnOrUnsummon(); + } } void UpdateAI(const uint32 diff) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index a896f63d856..6cf8e170450 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -36,6 +36,8 @@ enum Texts SAY_TIRION_INTRO_2 = 1, SAY_TIRION_INTRO_3 = 2, SAY_TIRION_INTRO_4 = 3, + SAY_TIRION_INTRO_H_5 = 4, + SAY_TIRION_INTRO_A_5 = 5, // The Lich King (at Light's Hammer) SAY_LK_INTRO_1 = 0, @@ -47,6 +49,17 @@ enum Texts // Highlord Bolvar Fordragon (at Light's Hammer) SAY_BOLVAR_INTRO_1 = 0, + // High Overlord Saurfang (at Light's Hammer) + SAY_SAURFANG_INTRO_1 = 15, + SAY_SAURFANG_INTRO_2 = 16, + SAY_SAURFANG_INTRO_3 = 17, + SAY_SAURFANG_INTRO_4 = 18, + + // Muradin Bronzebeard (at Light's Hammer) + SAY_MURADIN_INTRO_1 = 13, + SAY_MURADIN_INTRO_2 = 14, + SAY_MURADIN_INTRO_3 = 15, + // Rotting Frost Giant EMOTE_DEATH_PLAGUE_WARNING = 0, }; @@ -74,25 +87,40 @@ enum Events // Highlord Tirion Fordring (at Light's Hammer) // The Lich King (at Light's Hammer) // Highlord Bolvar Fordragon (at Light's Hammer) - EVENT_TIRION_INTRO_2 = 1, // EMOTE + // High Overlord Saurfang (at Light's Hammer) + // Muradin Bronzebeard (at Light's Hammer) + EVENT_TIRION_INTRO_2 = 1, EVENT_TIRION_INTRO_3 = 2, - EVENT_TIRION_INTRO_4 = 3, // EMOTE + EVENT_TIRION_INTRO_4 = 3, EVENT_TIRION_INTRO_5 = 4, - EVENT_LK_INTRO_1 = 5, // TIRION EMOTE + EVENT_LK_INTRO_1 = 5, EVENT_TIRION_INTRO_6 = 6, EVENT_LK_INTRO_2 = 7, EVENT_LK_INTRO_3 = 8, EVENT_LK_INTRO_4 = 9, EVENT_BOLVAR_INTRO_1 = 10, EVENT_LK_INTRO_5 = 11, + EVENT_SAURFANG_INTRO_1 = 12, + EVENT_TIRION_INTRO_H_7 = 13, + EVENT_SAURFANG_INTRO_2 = 14, + EVENT_SAURFANG_INTRO_3 = 15, + EVENT_SAURFANG_INTRO_4 = 16, + EVENT_SAURFANG_RUN = 17, + EVENT_MURADIN_INTRO_1 = 18, + EVENT_MURADIN_INTRO_2 = 19, + EVENT_MURADIN_INTRO_3 = 20, + EVENT_TIRION_INTRO_A_7 = 21, + EVENT_MURADIN_INTRO_4 = 22, + EVENT_MURADIN_INTRO_5 = 23, + EVENT_MURADIN_RUN = 24, // Rotting Frost Giant - EVENT_DEATH_PLAGUE = 12, - EVENT_STOMP = 13, - EVENT_ARCTIC_BREATH = 14, + EVENT_DEATH_PLAGUE = 25, + EVENT_STOMP = 26, + EVENT_ARCTIC_BREATH = 27, // Frost Freeze Trap - EVENT_ACTIVATE_TRAP = 15, + EVENT_ACTIVATE_TRAP = 28, }; enum DataTypesICC @@ -108,7 +136,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript struct npc_highlord_tirion_fordringAI : public ScriptedAI { - npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature) + npc_highlord_tirion_fordringAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { } @@ -117,6 +145,7 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript events.Reset(); _theLichKing = 0; _bolvarFordragon = 0; + _factionNPC = 0; _damnedKills = 0; } @@ -124,6 +153,9 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript // of The Damned SAI void SetData(uint32 type, uint32 data) { + if (!instance) + return; + if (type == DATA_DAMNED_KILLS && data == 1) { if (++_damnedKills == 2) @@ -132,15 +164,20 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript { if (Creature* bolvarFordragon = me->FindNearestCreature(NPC_HIGHLORD_BOLVAR_FORDRAGON_LH, 150.0f)) { - me->setActive(true); - _theLichKing = theLichKing->GetGUID(); - theLichKing->setActive(true); - _bolvarFordragon = bolvarFordragon->GetGUID(); - bolvarFordragon->setActive(true); + if (Creature* factionNPC = me->FindNearestCreature(instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? NPC_SE_HIGH_OVERLORD_SAURFANG : NPC_SE_MURADIN_BRONZEBEARD, 50.0f)) + { + me->setActive(true); + _theLichKing = theLichKing->GetGUID(); + theLichKing->setActive(true); + _bolvarFordragon = bolvarFordragon->GetGUID(); + bolvarFordragon->setActive(true); + _factionNPC = factionNPC->GetGUID(); + factionNPC->setActive(true); + } } } - if (!_bolvarFordragon || !_theLichKing) + if (!_bolvarFordragon || !_theLichKing || !_factionNPC) return; Talk(SAY_TIRION_INTRO_1); @@ -155,6 +192,26 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript events.ScheduleEvent(EVENT_LK_INTRO_4, 86000); events.ScheduleEvent(EVENT_BOLVAR_INTRO_1, 100000); events.ScheduleEvent(EVENT_LK_INTRO_5, 108000); + + if (instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE) + { + events.ScheduleEvent(EVENT_SAURFANG_INTRO_1, 120000); + events.ScheduleEvent(EVENT_TIRION_INTRO_H_7, 129000); + events.ScheduleEvent(EVENT_SAURFANG_INTRO_2, 139000); + events.ScheduleEvent(EVENT_SAURFANG_INTRO_3, 150000); + events.ScheduleEvent(EVENT_SAURFANG_INTRO_4, 162000); + events.ScheduleEvent(EVENT_SAURFANG_RUN, 170000); + } + else + { + events.ScheduleEvent(EVENT_MURADIN_INTRO_1, 120000); + events.ScheduleEvent(EVENT_MURADIN_INTRO_2, 124000); + events.ScheduleEvent(EVENT_MURADIN_INTRO_3, 127000); + events.ScheduleEvent(EVENT_TIRION_INTRO_A_7, 136000); + events.ScheduleEvent(EVENT_MURADIN_INTRO_4, 144000); + events.ScheduleEvent(EVENT_MURADIN_INTRO_5, 151000); + events.ScheduleEvent(EVENT_MURADIN_RUN, 157000); + } } } } @@ -214,10 +271,57 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript { theLichKing->AI()->Talk(SAY_LK_INTRO_5); theLichKing->setActive(false); - me->setActive(false); - _damnedKills = 3; } break; + case EVENT_SAURFANG_INTRO_1: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_1); + break; + case EVENT_TIRION_INTRO_H_7: + Talk(SAY_TIRION_INTRO_H_5); + break; + case EVENT_SAURFANG_INTRO_2: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_2); + break; + case EVENT_SAURFANG_INTRO_3: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_3); + break; + case EVENT_SAURFANG_INTRO_4: + if (Creature* saurfang = ObjectAccessor::GetCreature(*me, _factionNPC)) + saurfang->AI()->Talk(SAY_SAURFANG_INTRO_4); + break; + case EVENT_MURADIN_RUN: + case EVENT_SAURFANG_RUN: + if (Creature* factionNPC = ObjectAccessor::GetCreature(*me, _factionNPC)) + factionNPC->GetMotionMaster()->MovePath(factionNPC->GetDBTableGUIDLow()*10, false); + me->setActive(false); + _damnedKills = 3; + break; + case EVENT_MURADIN_INTRO_1: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_1); + break; + case EVENT_MURADIN_INTRO_2: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->HandleEmoteCommand(EMOTE_ONESHOT_TALK); + break; + case EVENT_MURADIN_INTRO_3: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); + break; + case EVENT_TIRION_INTRO_A_7: + Talk(SAY_TIRION_INTRO_A_5); + break; + case EVENT_MURADIN_INTRO_4: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_2); + break; + case EVENT_MURADIN_INTRO_5: + if (Creature* muradin = ObjectAccessor::GetCreature(*me, _factionNPC)) + muradin->AI()->Talk(SAY_MURADIN_INTRO_3); + break; default: break; } @@ -226,8 +330,10 @@ class npc_highlord_tirion_fordring_lh : public CreatureScript private: EventMap events; + InstanceScript* const instance; uint64 _theLichKing; uint64 _bolvarFordragon; + uint64 _factionNPC; uint16 _damnedKills; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index f9c88f3c885..91210394eb2 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -73,6 +73,7 @@ enum DataTypes DATA_SPINESTALKER = 23, DATA_RIMEFANG = 24, DATA_COLDFLAME_JETS = 25, + DATA_TEAM_IN_INSTANCE = 26, }; #define MAX_ENCOUNTER 12 diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 4162cf4132c..3fd5d911240 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -164,7 +164,7 @@ class instance_icecrown_citadel : public InstanceMapScript break; case NPC_SE_HIGH_OVERLORD_SAURFANG: if (teamInInstance == ALLIANCE) - creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE); + creature->UpdateEntry(NPC_SE_MURADIN_BRONZEBEARD, ALLIANCE, creature->GetCreatureData()); case NPC_SE_MURADIN_BRONZEBEARD: saurfangEventNPC = creature->GetGUID(); creature->LastUsedScriptID = creature->GetScriptId(); @@ -394,6 +394,8 @@ class instance_icecrown_citadel : public InstanceMapScript return rimefangTrash; case DATA_COLDFLAME_JETS: return coldflameJetsState; + case DATA_TEAM_IN_INSTANCE: + return teamInInstance; default: break; } |