diff options
-rw-r--r-- | sql/updates/world/3.3.5/2020_09_08_00_world.sql (renamed from sql/updates/world/3.3.5/2020_09_08_00_world) | 0 | ||||
-rw-r--r-- | sql/updates/world/3.3.5/2020_09_08_01_world.sql | 11 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp | 242 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h | 12 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp | 15 |
5 files changed, 223 insertions, 57 deletions
diff --git a/sql/updates/world/3.3.5/2020_09_08_00_world b/sql/updates/world/3.3.5/2020_09_08_00_world.sql index 97bfb0b992d..97bfb0b992d 100644 --- a/sql/updates/world/3.3.5/2020_09_08_00_world +++ b/sql/updates/world/3.3.5/2020_09_08_00_world.sql diff --git a/sql/updates/world/3.3.5/2020_09_08_01_world.sql b/sql/updates/world/3.3.5/2020_09_08_01_world.sql new file mode 100644 index 00000000000..1449331f8a3 --- /dev/null +++ b/sql/updates/world/3.3.5/2020_09_08_01_world.sql @@ -0,0 +1,11 @@ +-- Nerub'ar broodkeep +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (5611,5612); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(5611, 'at_icc_nerubar_broodkeeper'), +(5612, 'at_icc_nerubar_broodkeeper'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=36725; +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_icc_nerubar_broodkeeper' WHERE `entry`=36725; +UPDATE `creature_template` SET `flags_extra`=512 WHERE `entry` IN (36725,38058); +UPDATE `creature_template_addon` SET `bytes1`=0 WHERE `entry` IN (36725,38058); +UPDATE `creature_template_movement` SET `Flight`=0, `Ground`=1 WHERE `CreatureId` IN (36725,38058); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index db8c99e0ff6..fb09eb3c0a9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -36,36 +36,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, @@ -74,61 +74,67 @@ 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, // 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 @@ -159,6 +165,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, @@ -194,8 +205,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 @@ -501,6 +513,9 @@ class npc_rotting_frost_giant : public CreatureScript default: break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } DoMeleeAttackIfReady(); @@ -1043,6 +1058,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->SetUInt32Value(UNIT_NPC_EMOTESTATE, 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->SetUInt32Value(UNIT_NPC_EMOTESTATE, 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) { } @@ -1547,6 +1661,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(); @@ -1562,6 +1694,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); @@ -1576,4 +1709,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 4499704cfe6..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 b88a3a0d9ac..a8185a2599d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -212,6 +212,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; @@ -1118,6 +1124,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; } @@ -1538,6 +1552,7 @@ class instance_icecrown_citadel : public InstanceMapScript bool IsNauseaEligible; bool IsOrbWhispererEligible; bool IsFactionBuffActive; + std::array<GuidVector, 2> nerubarBroodkeepersGUIDs; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override |