diff options
Diffstat (limited to 'src/server/scripts')
3 files changed, 212 insertions, 57 deletions
| diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 7a6a18c809f..7b4aaf428a6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -30,36 +30,36 @@  enum ICCTexts  {      // Highlord Tirion Fordring (at Light's Hammer) -    SAY_TIRION_INTRO_1 = 0, -    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, +    SAY_TIRION_INTRO_1          = 0, +    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, -    SAY_LK_INTRO_2 = 1, -    SAY_LK_INTRO_3 = 2, -    SAY_LK_INTRO_4 = 3, -    SAY_LK_INTRO_5 = 4, +    SAY_LK_INTRO_1              = 0, +    SAY_LK_INTRO_2              = 1, +    SAY_LK_INTRO_3              = 2, +    SAY_LK_INTRO_4              = 3, +    SAY_LK_INTRO_5              = 4,      // Highlord Bolvar Fordragon (at Light's Hammer) -    SAY_BOLVAR_INTRO_1 = 0, +    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, +    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, +    SAY_MURADIN_INTRO_1        = 13, +    SAY_MURADIN_INTRO_2        = 14, +    SAY_MURADIN_INTRO_3        = 15,      // Deathbound Ward -    SAY_TRAP_ACTIVATE = 0, +    SAY_TRAP_ACTIVATE          = 0,      // Rotting Frost Giant      EMOTE_DEATH_PLAGUE_WARNING = 0, @@ -68,62 +68,68 @@ enum ICCTexts  enum ICCSpells  {      // Rotting Frost Giant -    SPELL_DEATH_PLAGUE = 72879, -    SPELL_DEATH_PLAGUE_AURA = 72865, -    SPELL_RECENTLY_INFECTED = 72884, -    SPELL_DEATH_PLAGUE_KILL = 72867, -    SPELL_STOMP = 64652, -    SPELL_ARCTIC_BREATH = 72848, +    SPELL_DEATH_PLAGUE              = 72879, +    SPELL_DEATH_PLAGUE_AURA         = 72865, +    SPELL_RECENTLY_INFECTED         = 72884, +    SPELL_DEATH_PLAGUE_KILL         = 72867, +    SPELL_STOMP                     = 64652, +    SPELL_ARCTIC_BREATH             = 72848,      // Frost Freeze Trap -    SPELL_COLDFLAME_JETS = 70460, +    SPELL_COLDFLAME_JETS            = 70460,      // Alchemist Adrianna -    SPELL_HARVEST_BLIGHT_SPECIMEN = 72155, +    SPELL_HARVEST_BLIGHT_SPECIMEN   = 72155,      SPELL_HARVEST_BLIGHT_SPECIMEN25 = 72162,      // Invisible Stalker (Float, Uninteractible, LargeAOI) -    SPELL_SOUL_MISSILE = 72585, +    SPELL_SOUL_MISSILE              = 72585,      // Empowering Blood Orb -    SPELL_EMPOWERED_BLOOD_2 = 70232, -    SPELL_EMPOWERED_BLOOD_3 = 70304, -    SPELL_EMPOWERED_BLOOD_4 = 70320, -    SPELL_ORB_CONTROLLER_ACTIVE = 70293, +    SPELL_EMPOWERED_BLOOD_2         = 70232, +    SPELL_EMPOWERED_BLOOD_3         = 70304, +    SPELL_EMPOWERED_BLOOD_4         = 70320, +    SPELL_ORB_CONTROLLER_ACTIVE     = 70293,      // Darkfallen Generic -    SPELL_BLOOD_ORB_VISUAL = 72099, -    SPELL_SIPHON_ESSENCE = 70299, +    SPELL_BLOOD_ORB_VISUAL          = 72099, +    SPELL_SIPHON_ESSENCE            = 70299,      // Darkfallen Blood Knight -    SPELL_VAMPIRIC_AURA = 71736, -    SPELL_BLOOD_MIRROR = 70450, -    SPELL_BLOOD_MIRROR_2 = 70451, +    SPELL_VAMPIRIC_AURA             = 71736, +    SPELL_BLOOD_MIRROR              = 70450, +    SPELL_BLOOD_MIRROR_2            = 70451,      SPELL_BLOOD_MIRROR_DAMAGE_SHARE = 70445, -    SPELL_UNHOLY_STRIKE = 70437, +    SPELL_UNHOLY_STRIKE             = 70437,      // Darkfallen Noble -    SPELL_SHADOW_BOLT = 72960, -    SPELL_CHAINS_OF_SHADOW = 72960, +    SPELL_SHADOW_BOLT               = 72960, +    SPELL_CHAINS_OF_SHADOW          = 72960,      // Darkfallen Archmage -    SPELL_FIREBALL = 70409, -    SPELL_AMPLIFY_MAGIC = 70408, -    SPELL_BLAST_WAVE = 70407, -    SPELL_POLYMORPH_ALLY = 72106, -    SPELL_POLYMORPH = 70410, +    SPELL_FIREBALL                  = 70409, +    SPELL_AMPLIFY_MAGIC             = 70408, +    SPELL_BLAST_WAVE                = 70407, +    SPELL_POLYMORPH_ALLY            = 72106, +    SPELL_POLYMORPH                 = 70410,      // Darkfallen Advisor -    SPELL_LICH_SLAP = 72057, -    SPELL_SHROUD_OF_SPELL_WARDING = 72066, +    SPELL_LICH_SLAP                 = 72057, +    SPELL_SHROUD_OF_SPELL_WARDING   = 72066,      // Vampiric Fiend -    SPELL_DISEASE_CLOUD = 41290, -    SPELL_LEECHING_ROOT = 70671, +    SPELL_DISEASE_CLOUD             = 41290, +    SPELL_LEECHING_ROOT             = 70671,      // Darkfallen Tactician -    SPELL_SHADOWSTEP = 70431, -    SPELL_BLOOD_SAP = 70432 +    SPELL_SHADOWSTEP                = 70431, +    SPELL_BLOOD_SAP                 = 70432, + +    // Nerubar broodkeeper +    SPELL_WEB_BEAM                  = 69887, +    SPELL_CRYPT_SCARABS             = 70965, +    SPELL_WEB_WRAP                  = 70980, +    SPELL_DARK_MENDING              = 71020  };  enum ICCTimedEventIds @@ -154,6 +160,11 @@ enum ICCTimedEventIds      EVENT_MURADIN_INTRO_5,      EVENT_MURADIN_RUN, +    // Nerub'ar Broodkeeper +    EVENT_CRYPT_SCARABS, +    EVENT_WEB_WRAP, +    EVENT_DARK_MENDING, +      // Rotting Frost Giant      EVENT_DEATH_PLAGUE,      EVENT_STOMP, @@ -189,8 +200,9 @@ enum ICCEventIds  enum ICCMisc  { -    GOSSIP_MENUID_ALLY = 11204, -    GOSSIP_MENUID_HORDE = 11207 +    GOSSIP_MENUID_ALLY  = 11204, +    GOSSIP_MENUID_HORDE = 11207, +    POINT_LAND          = 1,  };  // at Light's Hammer @@ -496,6 +508,9 @@ class npc_rotting_frost_giant : public CreatureScript                          default:                              break;                      } + +                    if (me->HasUnitState(UNIT_STATE_CASTING)) +                        return;                  }                  DoMeleeAttackIfReady(); @@ -1038,6 +1053,105 @@ struct npc_darkfallen_tactician : public DarkFallenAI      }  }; +struct npc_icc_nerubar_broodkeeper : public ScriptedAI +{ +    npc_icc_nerubar_broodkeeper(Creature* creature) : ScriptedAI(creature) { } + +    // We set the anim tier and flags manually because we don't need them anymore once the spiders are down +    void InitializeAI() override +    { +        me->SetDisableGravity(true); +        me->SetImmuneToAll(true); +        me->SetEmoteState(EMOTE_STATE_CUSTOM_SPELL_03); +    } + +    void Reset() override +    { +        _events.Reset(); +    } + +    void JustEngagedWith(Unit* /*who*/) override +    { +        _events.ScheduleEvent(EVENT_CRYPT_SCARABS, 1s, 3s); +        _events.ScheduleEvent(EVENT_DARK_MENDING, 5s); +        _events.ScheduleEvent(EVENT_WEB_WRAP, 20s); +    } + +    void DoAction(int32 action) override +    { +        if (action != ACTION_NERUBAR_FALL) +            return; + +        DoCastSelf(SPELL_WEB_BEAM); +        float x, y, z; +        me->GetPosition(x, y); +        z = me->GetFloorZ(); +        me->SetHomePosition(x, y, z, me->GetOrientation()); + +        me->GetMotionMaster()->MoveLand(POINT_LAND, Position(x, y, z)); +        me->SetEmoteState(EMOTE_ONESHOT_NONE); +    } + +    void MovementInform(uint32 type, uint32 id) override +    { +        if (type == EFFECT_MOTION_TYPE && id == POINT_LAND) +        { +            me->SetImmuneToAll(false); +            me->SetDisableGravity(false); +        } +    } + +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +            return; + +        _events.Update(diff); + +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; + +        while (uint32 eventId = _events.ExecuteEvent()) +        { +            switch (eventId) +            { +                case EVENT_CRYPT_SCARABS: +                    DoCastVictim(SPELL_CRYPT_SCARABS); +                    _events.Repeat(4s, 10s); +                    break; +                case EVENT_DARK_MENDING: +                { +                    // Select a friendly target between 1% and 75% hp +                    Unit* target = nullptr; +                    Trinity::MostHPPercentMissingInRange u_check(me, 40.0f, 1, 75); +                    Trinity::UnitLastSearcher<Trinity::MostHPPercentMissingInRange> searcher(me, target, u_check); +                    Cell::VisitGridObjects(me, searcher, 40.0f); + +                    if (target) +                        DoCast(target, SPELL_DARK_MENDING); +                    _events.Repeat(3s, 10s); +                    break; +                } +                case EVENT_WEB_WRAP: +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f)) +                        DoCast(target, SPELL_WEB_WRAP); +                    _events.Repeat(16s, 20s); +                    break; +                default: +                    break; +            } + +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; +        } + +        DoMeleeAttackIfReady(); +    } + +private: +    EventMap _events; +}; +  struct go_empowering_blood_orb : public GameObjectAI  {      go_empowering_blood_orb(GameObject* go) : GameObjectAI(go) { } @@ -1542,6 +1656,24 @@ class at_icc_start_blood_quickening : public AreaTriggerScript          }  }; +class at_icc_nerubar_broodkeeper : public OnlyOnceAreaTriggerScript +{ +    public: +        at_icc_nerubar_broodkeeper() : OnlyOnceAreaTriggerScript("at_icc_nerubar_broodkeeper") { } + +        bool TryHandleOnce(Player* player, AreaTriggerEntry const* areaTrigger) override +        { +            if (InstanceScript* instance = player->GetInstanceScript()) +            { +                if (player->IsGameMaster()) +                    return false; + +                instance->SetData(DATA_NERUBAR_BROODKEEPER_EVENT, areaTrigger->ID); +            } +            return true; +        } +}; +  void AddSC_icecrown_citadel()  {      new npc_highlord_tirion_fordring_lh(); @@ -1557,6 +1689,7 @@ void AddSC_icecrown_citadel()      RegisterIcecrownCitadelCreatureAI(npc_darkfallen_archmage);      RegisterIcecrownCitadelCreatureAI(npc_darkfallen_advisor);      RegisterIcecrownCitadelCreatureAI(npc_darkfallen_tactician); +    RegisterIcecrownCitadelCreatureAI(npc_icc_nerubar_broodkeeper);      RegisterGameObjectAI(go_empowering_blood_orb);      RegisterSpellScript(spell_icc_empowered_blood);      RegisterSpellScript(spell_icc_empowered_blood_3); @@ -1571,4 +1704,5 @@ void AddSC_icecrown_citadel()      new at_icc_saurfang_portal();      new at_icc_shutdown_traps();      new at_icc_start_blood_quickening(); +    new at_icc_nerubar_broodkeeper();  } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index d63b9664bc1..8dd11837c8c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -118,7 +118,8 @@ enum ICDataTypes      DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL = 42,      DATA_BLOOD_PRINCE_COUNCIL_INTRO    = 43,      DATA_SINDRAGOSA_INTRO              = 44, -    DATA_FACTION_BUFF                  = 45 // used by conditions +    DATA_FACTION_BUFF                  = 45, // used by conditions +    DATA_NERUBAR_BROODKEEPER_EVENT     = 46  };  enum ICCreaturesIds @@ -148,6 +149,7 @@ enum ICCreaturesIds      NPC_MURADIN_BRONZEBEARD_QUEST               = 38607,      NPC_UTHER_THE_LIGHTBRINGER_QUEST            = 38608,      NPC_LADY_SYLVANAS_WINDRUNNER_QUEST          = 38609, +    NPC_NERUBAR_BROODKEEPER                     = 36725,      // Weekly quests      NPC_INFILTRATOR_MINCHAR                     = 38471, @@ -477,6 +479,9 @@ enum ICAchievementCriteriaIds  enum ICSharedActions  { +    // Nerub'ar Broodkeeper event +    ACTION_NERUBAR_FALL          = 1, +      // Icecrown Gunship Battle      ACTION_ENEMY_GUNSHIP_TALK   = -369390,      ACTION_EXIT_SHIP            = -369391, @@ -530,9 +535,10 @@ enum ICWorldStatesICC      WORLDSTATE_ATTEMPTS_MAX         = 4942  }; -enum ICAreaIds +enum ICMisc  { -    AREA_ICECROWN_CITADEL = 4812 +    AREA_ICECROWN_CITADEL   = 4812, +    AT_NERUBAR_BROODKEEPER  = 5611  };  struct Position; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 27108645951..8250cd2b519 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -213,6 +213,12 @@ class instance_icecrown_citadel : public InstanceMapScript                  switch (creature->GetEntry())                  { +                    case NPC_NERUBAR_BROODKEEPER: +                    { +                        uint8 group = (creature->GetPositionX() > -230.0f) ? 0 : 1; +                        nerubarBroodkeepersGUIDs[group].emplace_back(creature->GetGUID()); +                        break; +                    }                      case NPC_LORD_MARROWGAR:                          LordMarrowgarGUID = creature->GetGUID();                          break; @@ -1100,6 +1106,14 @@ class instance_icecrown_citadel : public InstanceMapScript                          if (!IsFactionBuffActive)                              DoRemoveAurasDueToSpellOnPlayers(TeamInInstance == ALLIANCE ? SPELL_STRENGHT_OF_WRYNN : SPELL_HELLSCREAMS_WARSONG, true, true);                          break; +                    case DATA_NERUBAR_BROODKEEPER_EVENT: +                    { +                        uint8 group = (data == AT_NERUBAR_BROODKEEPER) ? 0 : 1; +                        for (ObjectGuid guid : nerubarBroodkeepersGUIDs[group]) +                            if (Creature* nerubar = instance->GetCreature(guid)) +                                nerubar->AI()->DoAction(ACTION_NERUBAR_FALL); +                        break; +                    }                      default:                          break;                  } @@ -1536,6 +1550,7 @@ class instance_icecrown_citadel : public InstanceMapScript              bool IsNauseaEligible;              bool IsOrbWhispererEligible;              bool IsFactionBuffActive; +            std::array<GuidVector, 2> nerubarBroodkeepersGUIDs;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const override | 
