aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.sql11
-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
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