Scripts/Icecrown: Small event of the down Nerub'ar Broodkeep (#25410)

Updates #25193
Co-authored-by: Keader
Co-authored-by: Ovahlord (sucker)
This commit is contained in:
Houston
2020-09-08 22:52:53 +03:00
committed by GitHub
parent bb3d3a82d7
commit f8db738e8d
5 changed files with 223 additions and 57 deletions

View File

@@ -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);

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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