diff options
Diffstat (limited to 'src/server/scripts')
3 files changed, 124 insertions, 57 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 917fca5b0ba..5b0852e5261 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -30,24 +30,23 @@ EndScriptData */  #include "naxxramas.h"  #include "Player.h" -enum Yells +enum Texts  { -    //when shappiron dies. dialog between kel and lich king (in this order) -    SAY_SAPP_DIALOG1                                       = 0, //not used -    SAY_SAPP_DIALOG2_LICH                                  = 1, //not used -    SAY_SAPP_DIALOG3                                       = 2, //not used -    SAY_SAPP_DIALOG4_LICH                                  = 3, //not used -    SAY_SAPP_DIALOG5                                       = 4, //not used -      SAY_AGGRO                                              = 7,      SAY_SLAY                                               = 8,      SAY_DEATH                                              = 9,      SAY_CHAIN                                              = 10,      SAY_FROST_BLAST                                        = 11,      SAY_REQUEST_AID                                        = 12, //start of phase 3 -    SAY_ANSWER_REQUEST                                     = 13, //lich king answer +    EMOTE_PHASE_TWO                                        = 13,      SAY_SUMMON_MINIONS                                     = 14, //start of phase 1 -    SAY_SPECIAL                                            = 15 +    SAY_SPECIAL                                            = 15, + +    // The Lich King +    SAY_ANSWER_REQUEST                                     = 3, + +    // Old World Trigger +    SAY_GUARDIAN_SPAWNED                                   = 0  };  enum Events @@ -68,7 +67,10 @@ enum Events      EVENT_TRIGGER,      EVENT_PHASE, -    EVENT_MORTAL_WOUND +    EVENT_MORTAL_WOUND, + +    EVENT_ANSWER_REQUEST, +    EVENT_SUMMON_GUARDIANS  };  enum Spells @@ -121,6 +123,13 @@ enum Spells      SPELL_MORTAL_WOUND                                     = 28467  }; +enum Phases +{ +    PHASE_ONE   = 1,   // Players move in the circle and Kel'Thuzad spawns his minions. +    PHASE_TWO   = 2,   // Starts on a timer. +    PHASE_THREE = 3    // At 45% health. +}; +  enum Creatures  {      NPC_WASTE                                              = 16427, // Soldiers of the Frozen Wastes @@ -268,15 +277,11 @@ public:          void Initialize()          {              nGuardiansOfIcecrownCount = 0; -            uiGuardiansOfIcecrownTimer = 5000; // 5 seconds for summoning each Guardian of Icecrown in phase 3 -            Phase = 0;              nAbomination = 0;              nWeaver = 0;          } -        uint32 Phase; -        uint32 uiGuardiansOfIcecrownTimer;          uint32 uiFaction;          uint8  nGuardiansOfIcecrownCount; @@ -343,7 +348,6 @@ public:          void EnterCombat(Unit* /*who*/) override          {              me->setFaction(uiFaction); -              _EnterCombat();              for (uint8 i = 0; i <= 3; ++i)              { @@ -352,10 +356,10 @@ public:              }              DoCast(me, SPELL_KELTHUZAD_CHANNEL, false);              Talk(SAY_SUMMON_MINIONS); -            Phase = 1;              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);              me->SetFloatValue(UNIT_FIELD_COMBATREACH, 4);              me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 4); +            events.SetPhase(PHASE_ONE);              events.ScheduleEvent(EVENT_TRIGGER, 5000);              events.ScheduleEvent(EVENT_WASTE, 15000);              events.ScheduleEvent(EVENT_ABOMIN, 30000); @@ -363,6 +367,23 @@ public:              events.ScheduleEvent(EVENT_PHASE, 228000);          } +        void DamageTaken(Unit* /*attacker*/, uint32& damage) override +        { +            if (events.IsInPhase(PHASE_TWO) && me->HealthBelowPctDamaged(45, damage)) +            { +                Talk(SAY_REQUEST_AID); +                events.SetPhase(PHASE_THREE); +                events.ScheduleEvent(EVENT_ANSWER_REQUEST, 4000); + +                for (uint8 i = 0; i <= 3; ++i) +                { +                    if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i))) +                        if (portal->getLootState() == GO_READY) +                            portal->UseDoorOrButton(); +                } +            } +        } +          void UpdateAI(uint32 diff) override          {              if (!UpdateVictim()) @@ -370,7 +391,7 @@ public:              events.Update(diff); -            if (Phase == 1) +            if (events.IsInPhase(PHASE_ONE))              {                  while (uint32 eventId = events.ExecuteEvent())                  { @@ -403,6 +424,7 @@ public:                          case EVENT_PHASE:                              events.Reset();                              Talk(SAY_AGGRO); +                            Talk(EMOTE_PHASE_TWO);                              spawns.DespawnAll();                              me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE);                              me->CastStop(); @@ -415,7 +437,7 @@ public:                              events.ScheduleEvent(EVENT_BLAST, urand(60000, 120000));                              if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)                                  events.ScheduleEvent(EVENT_CHAIN, urand(30000, 60000)); -                            Phase = 2; +                            events.SetPhase(PHASE_TWO);                              break;                          default:                              break; @@ -424,38 +446,6 @@ public:              }              else              { -                //start phase 3 when we are 45% health -                if (Phase != 3) -                { -                    if (HealthBelowPct(45)) -                    { -                        Phase = 3; -                        Talk(SAY_REQUEST_AID); -                        //here Lich King should respond to KelThuzad but I don't know which Creature to make talk -                        //so for now just make Kelthuzad says it. -                        Talk(SAY_ANSWER_REQUEST); - -                        for (uint8 i = 0; i <= 3; ++i) -                        { -                            if (GameObject* portal = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_KELTHUZAD_PORTAL01 + i))) -                                if (portal->getLootState() == GO_READY) -                                    portal->UseDoorOrButton(); -                        } -                    } -                } -                else if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4)) -                { -                    if (uiGuardiansOfIcecrownTimer <= diff) -                    { -                        /// @todo Add missing text -                        if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)])) -                            guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2); -                        ++nGuardiansOfIcecrownCount; -                        uiGuardiansOfIcecrownTimer = 5000; -                    } -                    else uiGuardiansOfIcecrownTimer -= diff; -                } -                  if (me->HasUnitState(UNIT_STATE_CASTING))                      return; @@ -607,6 +597,18 @@ public:                                  Talk(SAY_FROST_BLAST);                              events.Repeat(30000, 90000);                              break; +                        case EVENT_ANSWER_REQUEST: +                            if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_LICH_KING))) +                                lichKing->AI()->Talk(SAY_ANSWER_REQUEST); +                            events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000); +                            break; +                        case EVENT_SUMMON_GUARDIANS: +                            if (Creature* guardian = DoSummon(NPC_ICECROWN, Pos[RAND(2, 5, 8, 11)])) +                                guardian->SetFloatValue(UNIT_FIELD_COMBATREACH, 2); +                            ++nGuardiansOfIcecrownCount; +                            if (nGuardiansOfIcecrownCount < RAID_MODE(2, 4)) +                                events.ScheduleEvent(EVENT_SUMMON_GUARDIANS, 5000); +                            break;                          default:                              break;                      } diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 7a0930dc2f3..929faf72698 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -157,6 +157,9 @@ class instance_naxxramas : public InstanceMapScript                      case NPC_KEL_THUZAD:                          KelthuzadGUID = creature->GetGUID();                          break; +                    case NPC_LICH_KING: +                        LichKingGUID = creature->GetGUID(); +                        break;                      default:                          break;                  } @@ -202,6 +205,9 @@ class instance_naxxramas : public InstanceMapScript                      case GO_KELTHUZAD_TRIGGER:                          KelthuzadTriggerGUID = go->GetGUID();                          break; +                    case GO_ROOM_KELTHUZAD: +                        KelthuzadDoorGUID = go->GetGUID(); +                        break;                      default:                          break;                  } @@ -337,6 +343,8 @@ class instance_naxxramas : public InstanceMapScript                          return PortalsGUID[3];                      case DATA_KELTHUZAD_TRIGGER:                          return KelthuzadTriggerGUID; +                    case DATA_LICH_KING: +                        return LichKingGUID;                  }                  return ObjectGuid::Empty; @@ -370,6 +378,10 @@ class instance_naxxramas : public InstanceMapScript                              events.ScheduleEvent(EVENT_KELTHUZAD_WING_TAUNT, 6000);                          }                          break; +                    case BOSS_SAPPHIRON: +                        if (state == DONE) +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD, 6000); +                        break;                      default:                          break;                  } @@ -431,6 +443,37 @@ class instance_naxxramas : public InstanceMapScript                                  kelthuzad->AI()->Talk(CurrentWingTaunt);                              ++CurrentWingTaunt;                              break; +                        case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD: +                            if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) +                                kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD); +                            HandleGameObject(KelthuzadDoorGUID, false); +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING, 6000); +                            break; +                        case EVENT_DIALOGUE_SAPPHIRON_LICHKING: +                            if (Creature* lichKing = instance->GetCreature(LichKingGUID)) +                                lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING); +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2, 16000); +                            break; +                        case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2: +                            if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) +                                kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2); +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_LICHKING2, 9000); +                            break; +                        case EVENT_DIALOGUE_SAPPHIRON_LICHKING2: +                            if (Creature* lichKing = instance->GetCreature(LichKingGUID)) +                                lichKing->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_LICH_KING2); +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3, 12000); +                            break; +                        case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3: +                            if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) +                                kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3); +                            events.ScheduleEvent(EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4, 6000); +                            break; +                        case EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4: +                            if (Creature* kelthuzad = instance->GetCreature(KelthuzadGUID)) +                                kelthuzad->AI()->Talk(SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4); +                            HandleGameObject(KelthuzadDoorGUID, true); +                            break;                          default:                              break;                      } @@ -538,6 +581,8 @@ class instance_naxxramas : public InstanceMapScript              ObjectGuid KelthuzadGUID;              ObjectGuid KelthuzadTriggerGUID;              ObjectGuid PortalsGUID[4]; +            ObjectGuid KelthuzadDoorGUID; +            ObjectGuid LichKingGUID;              uint8 AbominationCount;              uint8 CurrentWingTaunt; diff --git a/src/server/scripts/Northrend/Naxxramas/naxxramas.h b/src/server/scripts/Northrend/Naxxramas/naxxramas.h index a1c8a1c79d4..eb77980f3ba 100644 --- a/src/server/scripts/Northrend/Naxxramas/naxxramas.h +++ b/src/server/scripts/Northrend/Naxxramas/naxxramas.h @@ -71,6 +71,7 @@ enum Data64      DATA_KELTHUZAD_PORTAL03,      DATA_KELTHUZAD_PORTAL04,      DATA_KELTHUZAD_TRIGGER, +    DATA_LICH_KING  };  enum CreaturesIds @@ -90,7 +91,9 @@ enum CreaturesIds      NPC_NAXXRAMAS_FOLLOWER      = 16505,      NPC_FOLLOWER_WORSHIPPER     = 16506,      NPC_DK_UNDERSTUDY           = 16803, -    NPC_BIGGLESWORTH            = 16998 +    NPC_BIGGLESWORTH            = 16998, +    NPC_LICH_KING               = 16980, +    NPC_OLD_WORLD_TRIGGER       = 15384  };  enum GameObjectsIds @@ -156,18 +159,35 @@ enum InstanceEvents      EVENT_DIALOGUE_GOTHIK_RIVENDARE2,      // Dialogue that happens after each wing. -    EVENT_KELTHUZAD_WING_TAUNT +    EVENT_KELTHUZAD_WING_TAUNT, + +    // Dialogue that happens after Sapphiron's death. +    EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD, +    EVENT_DIALOGUE_SAPPHIRON_LICHKING, +    EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD2, +    EVENT_DIALOGUE_SAPPHIRON_LICHKING2, +    EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD3, +    EVENT_DIALOGUE_SAPPHIRON_KELTHUZAD4  };  enum InstanceTexts  {      // The Four Horsemen -    SAY_DIALOGUE_GOTHIK_HORSEMAN   = 5, -    SAY_DIALOGUE_GOTHIK_HORSEMAN2  = 6, +    SAY_DIALOGUE_GOTHIK_HORSEMAN      = 5, +    SAY_DIALOGUE_GOTHIK_HORSEMAN2     = 6,      // Kel'Thuzad -    SAY_KELTHUZAD_CAT_DIED         = 5, -    SAY_KELTHUZAD_FIRST_WING_TAUNT = 16 +    SAY_DIALOGUE_SAPPHIRON_KELTHUZAD  = 0, +    SAY_DIALOGUE_SAPPHIRON_KELTHUZAD2 = 2, +    SAY_DIALOGUE_SAPPHIRON_KELTHUZAD3 = 4, +    SAY_DIALOGUE_SAPPHIRON_KELTHUZAD4 = 20, + +    SAY_KELTHUZAD_CAT_DIED            = 5, +    SAY_KELTHUZAD_FIRST_WING_TAUNT    = 16, + +    // Lich King +    SAY_DIALOGUE_SAPPHIRON_LICH_KING  = 1, +    SAY_DIALOGUE_SAPPHIRON_LICH_KING2 = 2  };  /*  | 
