diff options
author | Lopin <davca.hr@seznam.cz> | 2011-05-27 14:34:16 +0200 |
---|---|---|
committer | Supabad <Supabad.trinity@gmail.com> | 2011-05-27 14:34:16 +0200 |
commit | b533dfdca947324690b7574cfe2c31ccc84ece03 (patch) | |
tree | 5a216476e9002c6fbb69dd0298944cb7b9d2a335 /src | |
parent | 889cdda614f92b74c63ee2744e7bb6e4ed0b0d58 (diff) |
Scripts/Ulduar: Remove redudant parts of code in Freya's script.
Cleaned up Vezax's script and fixed Shadow Crash targeting.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp | 60 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp | 557 |
2 files changed, 290 insertions, 327 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp index 1ec996c2ad5..3ba72c46df5 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_freya.cpp @@ -269,8 +269,6 @@ class boss_freya : public CreatureScript { boss_freyaAI(Creature* creature) : BossAI(creature, BOSS_FREYA) { - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip } uint64 ElementalGUID[3][2]; @@ -339,12 +337,9 @@ class boss_freya : public CreatureScript me->ForcedDespawn(7500); Creature* Elder[3]; - Elder[0] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0); // Brightleaf - Elder[1] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0); // Stonebark - Elder[2] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0); // Ironbranch - for (uint8 n = 0; n < 3; ++n) { + Elder[n] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF + n) : 0); if (Elder[n] && Elder[n]->isAlive()) { Elder[n]->setFaction(35); @@ -362,12 +357,9 @@ class boss_freya : public CreatureScript _EnterCombat(); DoZoneInCombat(); Creature* Elder[3]; - Elder[0] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF) : 0); // Brightleaf - Elder[1] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_STONEBARK) : 0); // Stonebark - Elder[2] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_IRONBRANCH) : 0); // Ironbranch - for (uint8 n = 0; n < 3; ++n) { + Elder[n] = ObjectAccessor::GetCreature(*me, instance ? instance->GetData64(BOSS_BRIGHTLEAF + n) : 0); if (Elder[n] && Elder[n]->isAlive()) { me->AddAura(SPELL_DRAINED_OF_POWER, Elder[n]); @@ -401,7 +393,7 @@ class boss_freya : public CreatureScript else DoScriptText(SAY_AGGRO_WITH_ELDER, me); - DoCast(me, SPELL_ATTUNED_TO_NATURE); + me->CastCustomSpell(SPELL_ATTUNED_TO_NATURE, SPELLVALUE_AURA_STACK, 150, me, true); events.ScheduleEvent(EVENT_WAVE, 10000); events.ScheduleEvent(EVENT_EONAR_GIFT, 25000); @@ -1365,14 +1357,6 @@ class npc_healthy_spore : public CreatureScript void UpdateAI(uint32 const diff) { - std::list<Player*> PlayerList; - Trinity::AnyPlayerInObjectRangeCheck checker(me, 6.0f); - Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, PlayerList, checker); - me->VisitNearbyWorldObject(6.0f, searcher); - if (!PlayerList.empty()) - for (std::list<Player*>::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) - (*itr)->RemoveAurasDueToSpell(SPELL_CONSERVATOR_GRIP); - if (lifeTimer <= diff) { me->RemoveAurasDueToSpell(SPELL_GROW); @@ -1409,14 +1393,6 @@ class npc_eonars_gift : public CreatureScript void UpdateAI(uint32 const diff) { - std::list<Player*> PlayerList; - Trinity::AnyPlayerInObjectRangeCheck checker(me, 6.0f); - Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, PlayerList, checker); - me->VisitNearbyWorldObject(6.0f, searcher); - if (!PlayerList.empty()) - for (std::list<Player *>::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) - (*itr)->RemoveAurasDueToSpell(SPELL_CONSERVATOR_GRIP); - if (lifeBindersGiftTimer <= diff) { me->RemoveAurasDueToSpell(SPELL_GROW); @@ -1605,35 +1581,6 @@ class spell_freya_iron_roots : public SpellScriptLoader } }; -class spell_freya_attuned_to_nature : public SpellScriptLoader -{ - public: - spell_freya_attuned_to_nature() : SpellScriptLoader("spell_freya_attuned_to_nature") - { - } - - class spell_freya_attuned_to_nature_SpellScript : public SpellScript - { - PrepareSpellScript(spell_freya_attuned_to_nature_SpellScript); - - void ModAuraStack() - { - if (Aura* aura = GetHitAura()) - aura->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); - } - - void Register() - { - AfterHit += SpellHitFn(spell_freya_attuned_to_nature_SpellScript::ModAuraStack); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_freya_attuned_to_nature_SpellScript(); - } -}; - void AddSC_boss_freya() { new boss_freya(); @@ -1653,5 +1600,4 @@ void AddSC_boss_freya() new npc_iron_roots(); new spell_attuned_to_nature_dose_reduction(); new spell_freya_iron_roots(); - new spell_freya_attuned_to_nature(); } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp index 97541c5a12f..3f557cf26bd 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_general_vezax.cpp @@ -21,7 +21,7 @@ #include "SpellAuraEffects.h" #include "ulduar.h" -enum eYells +enum VezaxYells { SAY_AGGRO = -1603290, SAY_SLAY_1 = -1603291, @@ -32,7 +32,7 @@ enum eYells SAY_HARDMODE = -1603296, }; -enum eEmotes +enum VezaxEmotes { EMOTE_VAPORS = -1603289, EMOTE_ANIMUS = -1603297, @@ -40,7 +40,7 @@ enum eEmotes EMOTE_SURGE_OF_DARKNESS = -1603299, }; -enum eSpells +enum VezaxSpells { SPELL_AURA_OF_DESPAIR = 62692, SPELL_MARK_OF_THE_FACELESS = 63276, @@ -52,32 +52,38 @@ enum eSpells SPELL_SURGE_OF_DARKNESS = 62662, SPELL_SARONITE_VAPORS = 63323, SPELL_SUMMON_SARONITE_VAPORS = 63081, - SPELL_PROFOUND_OF_DARKNESS = 63420, SPELL_BERSERK = 26662, SPELL_SUMMON_SARONITE_ANIMUS = 63145, SPELL_VISUAL_SARONITE_ANIMUS = 63319, - SPELL_PROFOUND_DARKNESS = 63420, + SPELL_PROFOUND_OF_DARKNESS = 63420, SPELL_CORRUPTED_RAGE = 68415, SPELL_SHAMANTIC_RAGE = 30823, }; -enum eActions +enum VezaxActions { ACTION_VAPORS_SPAWN, ACTION_VAPORS_DIE, ACTION_ANIMUS_DIE, }; -enum eEvents +enum VezaxEvents { + // Vezax EVENT_SHADOW_CRASH = 1, EVENT_SEARING_FLAMES = 2, EVENT_SURGE_OF_DARKNESS = 3, EVENT_MARK_OF_THE_FACELESS = 4, EVENT_SARONITE_VAPORS = 5, EVENT_BERSERK = 6, + + // Saronite Animus + EVENT_PROFOUND_OF_DARKNESS = 7, + + // Saronite Vapor + EVENT_RANDOM_MOVE = 8, }; #define ACHIEVEMENT_SMELL_SARONITE RAID_MODE<uint32>(3181, 3188) @@ -85,331 +91,350 @@ enum eEvents class boss_general_vezax : public CreatureScript { -public: - boss_general_vezax() : CreatureScript("boss_general_vezax") { } - - CreatureAI* GetAI(Creature* pCreature) const - { - return new boss_general_vezaxAI(pCreature); - } + public: + boss_general_vezax() : CreatureScript("boss_general_vezax") { } - struct boss_general_vezaxAI : public BossAI - { - boss_general_vezaxAI(Creature *pCreature) : BossAI(pCreature, BOSS_VEZAX) + struct boss_general_vezaxAI : public BossAI { - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect - } + boss_general_vezaxAI(Creature* creature) : BossAI(creature, BOSS_VEZAX) + { + } - bool bShadowDodger; - bool bSmellSaronite; /*HardMode*/ - bool bAnimusDead; /*Check against getting a HardMode achievement before killing Saronite Animus*/ - uint8 uiVaporCount; + bool shadowDodger; + bool smellSaronite; // HardMode + bool animusDead; // Check against getting a HardMode achievement before killing Saronite Animus + uint8 vaporCount; - void Reset() - { - _Reset(); + void Reset() + { + _Reset(); - bShadowDodger = true; - bSmellSaronite = true; - bAnimusDead = false; - uiVaporCount = 0; - } + shadowDodger = true; + smellSaronite = true; + animusDead = false; + vaporCount = 0; + } - void EnterCombat(Unit * /*pWho*/) - { - _EnterCombat(); - - DoScriptText(SAY_AGGRO, me); - DoCast(me, SPELL_AURA_OF_DESPAIR); - CheckShamanisticRage(); - - events.Reset(); - events.ScheduleEvent(EVENT_SHADOW_CRASH, urand(8000, 10000)); - events.ScheduleEvent(EVENT_SEARING_FLAMES, 12000); - events.ScheduleEvent(EVENT_MARK_OF_THE_FACELESS, urand(35000, 40000)); - events.ScheduleEvent(EVENT_SARONITE_VAPORS, 30000); - events.ScheduleEvent(EVENT_SURGE_OF_DARKNESS, 60000); - events.ScheduleEvent(EVENT_BERSERK, 600000); - } + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + + DoScriptText(SAY_AGGRO, me); + DoCast(me, SPELL_AURA_OF_DESPAIR); + CheckShamanisticRage(); + + events.ScheduleEvent(EVENT_SHADOW_CRASH, urand(8000, 10000)); + events.ScheduleEvent(EVENT_SEARING_FLAMES, 12000); + events.ScheduleEvent(EVENT_MARK_OF_THE_FACELESS, urand(35000, 40000)); + events.ScheduleEvent(EVENT_SARONITE_VAPORS, 30000); + events.ScheduleEvent(EVENT_SURGE_OF_DARKNESS, 60000); + events.ScheduleEvent(EVENT_BERSERK, 600000); + } - void UpdateAI(const uint32 uiDiff) - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; - events.Update(uiDiff); + events.Update(diff); - if (me->HasUnitState(UNIT_STAT_CASTING)) - return; + if (me->HasUnitState(UNIT_STAT_CASTING)) + return; - while (uint32 uiEventId = events.ExecuteEvent()) - { - switch (uiEventId) + while (uint32 eventId = events.ExecuteEvent()) { - case EVENT_SHADOW_CRASH: - if (Unit * pTarget = GetPlayerAtMinimumRange(15.0f)) - DoCast(pTarget, SPELL_SHADOW_CRASH); - events.ScheduleEvent(EVENT_SHADOW_CRASH, urand(8000, 12000)); - break; - case EVENT_SEARING_FLAMES: - DoCastAOE(SPELL_SEARING_FLAMES); - events.ScheduleEvent(EVENT_SEARING_FLAMES, urand(14000, 17500)); - break; - case EVENT_MARK_OF_THE_FACELESS: + switch (eventId) { - /* He will not cast this on players within 15 yards of him. - However, if there are not at least 9 people outside of 15 yards - he will start casting it on players inside 15 yards melee and tank included. - */ - Unit* target = CheckPlayersInRange(RAID_MODE<uint32>(4, 9), 15.0f, 50.f); - if (!target) - target = SelectTarget(SELECT_TARGET_RANDOM); - DoCast(target, SPELL_MARK_OF_THE_FACELESS); - events.ScheduleEvent(EVENT_MARK_OF_THE_FACELESS, urand(35000, 45000)); - break; - } - case EVENT_SURGE_OF_DARKNESS: - DoScriptText(EMOTE_SURGE_OF_DARKNESS, me); - DoScriptText(SAY_SURGE_OF_DARKNESS, me); - DoCast(me, SPELL_SURGE_OF_DARKNESS); - events.ScheduleEvent(EVENT_SURGE_OF_DARKNESS, urand(50000, 70000)); - break; - case EVENT_SARONITE_VAPORS: - DoCast(SPELL_SUMMON_SARONITE_VAPORS); - events.ScheduleEvent(EVENT_SARONITE_VAPORS, urand(30000, 35000)); - - if (++uiVaporCount == 6 && bSmellSaronite) + case EVENT_SHADOW_CRASH: { - DoScriptText(SAY_HARDMODE, me); - DoScriptText(EMOTE_BARRIER, me); - summons.DespawnAll(); - DoCast(me, SPELL_SARONITE_BARRIER); - DoCast(SPELL_SUMMON_SARONITE_ANIMUS); - me->AddLootMode(LOOT_MODE_HARD_MODE_1); - events.CancelEvent(EVENT_SARONITE_VAPORS); - events.CancelEvent(EVENT_SEARING_FLAMES); + Unit* target = CheckPlayersInRange(RAID_MODE<uint8>(4, 9), 15.0f, 50.0f); + if (!target) + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f, true); + if (target) + DoCast(target, SPELL_SHADOW_CRASH); + events.ScheduleEvent(EVENT_SHADOW_CRASH, urand(8000, 12000)); + break; } - break; - case EVENT_BERSERK: - DoScriptText(SAY_BERSERK, me); - DoCast(me, SPELL_BERSERK); - break; + case EVENT_SEARING_FLAMES: + DoCastAOE(SPELL_SEARING_FLAMES); + events.ScheduleEvent(EVENT_SEARING_FLAMES, urand(14000, 17500)); + break; + case EVENT_MARK_OF_THE_FACELESS: + { + Unit* target = CheckPlayersInRange(RAID_MODE<uint8>(4, 9), 15.0f, 50.0f); + if (!target) + target = SelectTarget(SELECT_TARGET_RANDOM, 0, 150.0f, true); + if (target) + DoCast(target, SPELL_MARK_OF_THE_FACELESS); + events.ScheduleEvent(EVENT_MARK_OF_THE_FACELESS, urand(35000, 45000)); + break; + } + case EVENT_SURGE_OF_DARKNESS: + DoScriptText(EMOTE_SURGE_OF_DARKNESS, me); + DoScriptText(SAY_SURGE_OF_DARKNESS, me); + DoCast(me, SPELL_SURGE_OF_DARKNESS); + events.ScheduleEvent(EVENT_SURGE_OF_DARKNESS, urand(50000, 70000)); + break; + case EVENT_SARONITE_VAPORS: + DoCast(SPELL_SUMMON_SARONITE_VAPORS); + events.ScheduleEvent(EVENT_SARONITE_VAPORS, urand(30000, 35000)); + if (++vaporCount == 6 && smellSaronite) + { + DoScriptText(SAY_HARDMODE, me); + DoScriptText(EMOTE_BARRIER, me); + summons.DespawnAll(); + DoCast(me, SPELL_SARONITE_BARRIER); + DoCast(SPELL_SUMMON_SARONITE_ANIMUS); + me->AddLootMode(LOOT_MODE_HARD_MODE_1); + events.CancelEvent(EVENT_SARONITE_VAPORS); + events.CancelEvent(EVENT_SEARING_FLAMES); + } + break; + case EVENT_BERSERK: + DoScriptText(SAY_BERSERK, me); + DoCast(me, SPELL_BERSERK); + break; + } } - } - DoMeleeAttackIfReady(); - } + DoMeleeAttackIfReady(); + } - void SpellHitTarget(Unit * pWho, const SpellEntry * pSpell) - { - if (pWho && pWho->GetTypeId() == TYPEID_PLAYER && pSpell->Id == SPELL_SHADOW_CRASH_HIT) - bShadowDodger = false; - } + void SpellHitTarget(Unit* who, const SpellEntry* spell) + { + if (who && who->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_SHADOW_CRASH_HIT) + shadowDodger = false; + } - void KilledUnit(Unit * /*pWho*/) - { - DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); - } + void KilledUnit(Unit* /*who*/) + { + DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); + } - void JustDied(Unit * /*pWho*/) - { - _JustDied(); + void JustDied(Unit* /*who*/) + { + _JustDied(); - DoScriptText(SAY_DEATH, me); + DoScriptText(SAY_DEATH, me); - if (instance) - { - if (bShadowDodger) - instance->DoCompleteAchievement(ACHIEVEMENT_SHADOWDODGER); + if (instance) + { + if (shadowDodger) + instance->DoCompleteAchievement(ACHIEVEMENT_SHADOWDODGER); - if (bSmellSaronite && bAnimusDead) - instance->DoCompleteAchievement(ACHIEVEMENT_SMELL_SARONITE); + if (smellSaronite && animusDead) + instance->DoCompleteAchievement(ACHIEVEMENT_SMELL_SARONITE); + } } - } - void CheckShamanisticRage() - { - if (instance) + void CheckShamanisticRage() { - Map * pMap = me->GetMap(); - if (pMap && pMap->IsDungeon()) + if (instance) { - /* If Shaman has Shamanistic Rage and use it during the fight, it will cast Corrupted Rage on him */ - Map::PlayerList const &Players = pMap->GetPlayers(); - for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end(); ++itr) - if (Player * pPlayer = itr->getSource()) - if (pPlayer->HasSpell(SPELL_SHAMANTIC_RAGE)) - pPlayer->CastSpell(pPlayer, SPELL_CORRUPTED_RAGE, false); + std::list<Player*> targets; + SelectRandomTarget(false, &targets); + if (!targets.empty()) + {// If Shaman has Shamanistic Rage and use it during the fight, it will cast Corrupted Rage on him + for (std::list<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) + { + if (*itr->HasSpell(SPELL_SHAMANTIC_RAGE)) + *itr->CastSpell(*itr, SPELL_CORRUPTED_RAGE, false); + } + } } } - } - void DoAction(const int32 uiAction) - { - switch (uiAction) + void DoAction(int32 const action) { - case ACTION_VAPORS_DIE: - bSmellSaronite = false; - break; - case ACTION_ANIMUS_DIE: - me->RemoveAurasDueToSpell(SPELL_SARONITE_BARRIER); - events.ScheduleEvent(EVENT_SEARING_FLAMES, urand(7000, 12000)); - bAnimusDead = true; - break; + switch (action) + { + case ACTION_VAPORS_DIE: + smellSaronite = false; + break; + case ACTION_ANIMUS_DIE: + me->RemoveAurasDueToSpell(SPELL_SARONITE_BARRIER); + events.ScheduleEvent(EVENT_SEARING_FLAMES, urand(7000, 12000)); + animusDead = true; + break; + } } - } - /* Player Range Check - Purpose: If there are uiPlayersMin people within uiRangeMin, uiRangeMax: return a random players in that range. - If not, return NULL and allow other target selection - */ - Unit* CheckPlayersInRange(uint32 uiPlayersMin, float uiRangeMin, float uiRangeMax) - { - Map* pMap = me->GetMap(); - if (pMap && pMap->IsDungeon()) + /* Player Range Check + Purpose: If there are playersMin people within rangeMin, rangeMax: return a random players in that range. + If not, return NULL and allow other target selection + */ + Unit* CheckPlayersInRange(uint8 playersMin, float rangeMin, float rangeMax) { - std::list<Player*> PlayerList; - Map::PlayerList const &Players = pMap->GetPlayers(); - for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end(); ++itr) + Map* map = me->GetMap(); + if (map && map->IsDungeon()) { - if (Player * pPlayer = itr->getSource()) + std::list<Player*> PlayerList; + Map::PlayerList const& Players = map->GetPlayers(); + for (Map::PlayerList::const_iterator itr = Players.begin(); itr != Players.end(); ++itr) { - float uiDistance = pPlayer->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); - if (uiRangeMin < uiDistance || uiDistance > uiRangeMax) - continue; + if (Player* player = itr->getSource()) + { + float distance = player->GetDistance(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); + if (rangeMin > distance || distance > rangeMax) + continue; - PlayerList.push_back(pPlayer); + PlayerList.push_back(player); + } } - } - if (PlayerList.empty()) - return NULL; + if (PlayerList.empty()) + return NULL; - size_t size = PlayerList.size(); - if (size < uiPlayersMin) - return NULL; + size_t size = PlayerList.size(); + if (size < playersMin) + return NULL; - std::list<Player*>::const_iterator itr = PlayerList.begin(); - std::advance(itr, urand(0, size - 1)); - return *itr; - } - else + std::list<Player*>::const_iterator itr = PlayerList.begin(); + std::advance(itr, urand(0, size - 1)); + return *itr; + } + return NULL; + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_general_vezaxAI(creature); } - }; }; class boss_saronite_animus : public CreatureScript { -public: - boss_saronite_animus() : CreatureScript("npc_saronite_animus") { } - - CreatureAI* GetAI(Creature* pCreature) const - { - return new boss_saronite_animusAI(pCreature); - } + public: + boss_saronite_animus() : CreatureScript("npc_saronite_animus") { } - struct boss_saronite_animusAI : public ScriptedAI - { - boss_saronite_animusAI(Creature *pCreature) : ScriptedAI(pCreature) + struct boss_saronite_animusAI : public ScriptedAI { - pInstance = pCreature->GetInstanceScript(); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect - DoScriptText(EMOTE_BARRIER, me); - } + boss_saronite_animusAI(Creature* creature) : ScriptedAI(creature) + { + instance = me->GetInstanceScript(); + DoScriptText(EMOTE_BARRIER, me); + } - InstanceScript * pInstance; + void Reset() + { + DoCast(me, SPELL_VISUAL_SARONITE_ANIMUS); + events.Reset(); + events.ScheduleEvent(EVENT_PROFOUND_OF_DARKNESS, 3000); + } - uint32 uiProfoundOfDarknessTimer; + void JustDied(Unit* /*who*/) + { + if (Creature* Vezax = me->GetCreature(*me, instance ? instance->GetData64(BOSS_VEZAX) : 0)) + Vezax->AI()->DoAction(ACTION_ANIMUS_DIE); + } - void Reset() - { - DoCast(me, SPELL_VISUAL_SARONITE_ANIMUS); - uiProfoundOfDarknessTimer = 3000; - } + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; - void JustDied(Unit * /*pWho*/) - { - if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_VEZAX) : 0)) - pVezax->AI()->DoAction(ACTION_ANIMUS_DIE); - } + events.Update(diff); - void UpdateAI(const uint32 uiDiff) - { - if (!UpdateVictim()) - return; + if (me->HasUnitState(UNIT_STAT_CASTING)) + return; - if (uiProfoundOfDarknessTimer <= uiDiff) - { - DoCastAOE(SPELL_PROFOUND_DARKNESS); - uiProfoundOfDarknessTimer = 3000; + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_PROFOUND_OF_DARKNESS: + DoCastAOE(SPELL_PROFOUND_OF_DARKNESS, true); + events.ScheduleEvent(EVENT_PROFOUND_OF_DARKNESS, 3000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); } - else - uiProfoundOfDarknessTimer -= uiDiff; - DoMeleeAttackIfReady(); + private: + InstanceScript* instance; + EventMap events; + }; + + CreatureAI* GetAI(Creature* pCreature) const + { + return new boss_saronite_animusAI(pCreature); } - }; }; class npc_saronite_vapors : public CreatureScript { -public: - npc_saronite_vapors() : CreatureScript("npc_saronite_vapors") { } - - CreatureAI* GetAI(Creature* pCreature) const - { - return new npc_saronite_vaporsAI(pCreature); - } + public: + npc_saronite_vapors() : CreatureScript("npc_saronite_vapors") { } - struct npc_saronite_vaporsAI : public ScriptedAI - { - npc_saronite_vaporsAI(Creature *pCreature) : ScriptedAI(pCreature) + struct npc_saronite_vaporsAI : public ScriptedAI { - DoScriptText(EMOTE_VAPORS, me); - pInstance = pCreature->GetInstanceScript(); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); - me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect - me->SetReactState(REACT_PASSIVE); - uiRandomMoveTimer = 1000; - } - - InstanceScript * pInstance; + npc_saronite_vaporsAI(Creature* creature) : ScriptedAI(creature) + { + DoScriptText(EMOTE_VAPORS, me); + instance = me->GetInstanceScript(); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); + me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip jump effect + me->SetReactState(REACT_PASSIVE); + } - uint32 uiRandomMoveTimer; + void Reset() + { + events.Reset(); + events.ScheduleEvent(EVENT_RANDOM_MOVE, urand(5000, 7500)); + } - void UpdateAI(const uint32 uiDiff) - { - if (uiRandomMoveTimer <= uiDiff) + void UpdateAI(uint32 const diff) { - me->GetMotionMaster()->MoveRandom(30.0f); - uiRandomMoveTimer = urand(5000, 7500); + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RANDOM_MOVE: + me->GetMotionMaster()->MoveRandom(30.0f); + events.ScheduleEvent(EVENT_RANDOM_MOVE, urand(5000, 7500)); + break; + default: + break; + } + } } - else - uiRandomMoveTimer -= uiDiff; - } - void DamageTaken(Unit * /*pWho*/, uint32 &uiDamage) - { - // This can't be on JustDied. In 63322 dummy handler caster needs to be this NPC - // if caster == target then damage mods will increase the damage taken - if (uiDamage >= me->GetHealth()) + void DamageTaken(Unit* /*who*/, uint32& damage) { - uiDamage = 0; - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); - me->SetStandState(UNIT_STAND_STATE_DEAD); - me->SetHealth(me->GetMaxHealth()); - me->RemoveAllAuras(); - DoCast(me, SPELL_SARONITE_VAPORS); - me->DespawnOrUnsummon(30000); - - if (Creature * pVezax = me->GetCreature(*me, pInstance ? pInstance->GetData64(BOSS_VEZAX) : 0)) - pVezax->AI()->DoAction(ACTION_VAPORS_DIE); + // This can't be on JustDied. In 63322 dummy handler caster needs to be this NPC + // if caster == target then damage mods will increase the damage taken + if (damage >= me->GetHealth()) + { + damage = 0; + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE); + me->SetStandState(UNIT_STAND_STATE_DEAD); + me->SetHealth(me->GetMaxHealth()); + me->RemoveAllAuras(); + DoCast(me, SPELL_SARONITE_VAPORS); + me->DespawnOrUnsummon(30000); + + if (Creature* Vezax = me->GetCreature(*me, instance ? instance->GetData64(BOSS_VEZAX) : 0)) + Vezax->AI()->DoAction(ACTION_VAPORS_DIE); + } } + + private: + InstanceScript* instance; + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_saronite_vaporsAI(creature); } - }; }; class spell_mark_of_the_faceless : public SpellScriptLoader @@ -423,15 +448,7 @@ class spell_mark_of_the_faceless : public SpellScriptLoader void HandleEffectPeriodic(AuraEffect const* aurEff) { - Unit* target = GetTarget(); - Unit* caster = GetCaster(); - - if (!caster || !target) - return; - - // Casted by CastCustomSpell() because when it's cast by CastSpell(), damage is 1 - int32 damage = int32(aurEff->GetBase()->GetEffect(EFFECT_0)->GetAmount()); - caster->CastCustomSpell(SPELL_MARK_OF_THE_FACELESS_DAMAGE, SPELLVALUE_BASE_POINT1, damage, target, true); + GetCaster()->CastCustomSpell(SPELL_MARK_OF_THE_FACELESS_DAMAGE, SPELLVALUE_BASE_POINT1, aurEff->GetAmount(), GetTarget(), true); } void Register() |