aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp242
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h12
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp15
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