diff options
-rw-r--r-- | src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp | 471 |
1 files changed, 219 insertions, 252 deletions
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 0ccaf9a798a..e3b510eea81 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -77,283 +77,261 @@ const SummonerInfo summoners[] = #define MAX_Y_COORD_OH_NOVOS -771.95f -class boss_novos : public CreatureScript +struct boss_novos : public BossAI { -public: - boss_novos() : CreatureScript("boss_novos") { } + boss_novos(Creature* creature) : BossAI(creature, DATA_NOVOS) + { + Initialize(); + _bubbled = false; + } - struct boss_novosAI : public BossAI + void Initialize() { - boss_novosAI(Creature* creature) : BossAI(creature, DATA_NOVOS) - { - Initialize(); - _bubbled = false; - } + _ohNovos = true; + _crystalHandlerCount = 0; + } - void Initialize() - { - _ohNovos = true; - _crystalHandlerCount = 0; - } + void Reset() override + { + _Reset(); - void Reset() override - { - _Reset(); + Initialize(); + SetCrystalsStatus(false); + SetSummonerStatus(false); + SetBubbled(false); + } - Initialize(); - SetCrystalsStatus(false); - SetSummonerStatus(false); - SetBubbled(false); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); + SetCrystalsStatus(true); + SetSummonerStatus(true); + SetBubbled(true); + } - SetCrystalsStatus(true); - SetSummonerStatus(true); - SetBubbled(true); - } + void AttackStart(Unit* target) override + { + if (!target) + return; - void AttackStart(Unit* target) override - { - if (!target) - return; + if (me->Attack(target, true)) + DoStartNoMovement(target); + } - if (me->Attack(target, true)) - DoStartNoMovement(target); - } + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() || _bubbled) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim() || _bubbled) - return; + events.Update(diff); - events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMON_MINIONS: + DoCast(SPELL_SUMMON_MINIONS); + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); + break; + case EVENT_ATTACK: + if (Unit* victim = SelectTarget(SelectTargetMethod::Random)) + DoCast(victim, RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY)); + events.ScheduleEvent(EVENT_ATTACK, 3s); + break; + default: + break; + } if (me->HasUnitState(UNIT_STATE_CASTING)) return; + } + } - if (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SUMMON_MINIONS: - DoCast(SPELL_SUMMON_MINIONS); - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); - break; - case EVENT_ATTACK: - if (Unit* victim = SelectTarget(SelectTargetMethod::Random)) - DoCast(victim, RAND(SPELL_ARCANE_BLAST, SPELL_BLIZZARD, SPELL_FROSTBOLT, SPELL_WRATH_OF_MISERY)); - events.ScheduleEvent(EVENT_ATTACK, 3s); - break; - default: - break; - } + void DoAction(int32 action) override + { + if (action == ACTION_CRYSTAL_HANDLER_DIED) + CrystalHandlerDied(); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - } + void MoveInLineOfSight(Unit* who) override + { + BossAI::MoveInLineOfSight(who); - void DoAction(int32 action) override - { - if (action == ACTION_CRYSTAL_HANDLER_DIED) - CrystalHandlerDied(); - } + if (!_ohNovos || !who || who->GetTypeId() != TYPEID_UNIT || who->GetPositionY() > MAX_Y_COORD_OH_NOVOS) + return; - void MoveInLineOfSight(Unit* who) override - { - BossAI::MoveInLineOfSight(who); + uint32 entry = who->GetEntry(); + if (entry == NPC_HULKING_CORPSE || entry == NPC_RISEN_SHADOWCASTER || entry == NPC_FETID_TROLL_CORPSE) + _ohNovos = false; + } - if (!_ohNovos || !who || who->GetTypeId() != TYPEID_UNIT || who->GetPositionY() > MAX_Y_COORD_OH_NOVOS) - return; + uint32 GetData(uint32 type) const override + { + return type == DATA_NOVOS_ACHIEV && _ohNovos ? 1 : 0; + } - uint32 entry = who->GetEntry(); - if (entry == NPC_HULKING_CORPSE || entry == NPC_RISEN_SHADOWCASTER || entry == NPC_FETID_TROLL_CORPSE) - _ohNovos = false; - } + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + } - uint32 GetData(uint32 type) const override +private: + void SetBubbled(bool state) + { + _bubbled = state; + if (!state) { - return type == DATA_NOVOS_ACHIEV && _ohNovos ? 1 : 0; + if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (me->HasUnitState(UNIT_STATE_CASTING)) + me->CastStop(); } - - void JustSummoned(Creature* summon) override + else { - summons.Summon(summon); + if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + DoCast(SPELL_ARCANE_FIELD); } + } - private: - void SetBubbled(bool state) - { - _bubbled = state; - if (!state) - { - if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - if (me->HasUnitState(UNIT_STATE_CASTING)) - me->CastStop(); - } - else - { - if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE)) - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - DoCast(SPELL_ARCANE_FIELD); - } - } + void SetSummonerStatus(bool active) + { + for (uint8 i = 0; i < 4; i++) + if (ObjectGuid guid = instance->GetGuidData(summoners[i].data)) + if (Creature* crystalChannelTarget = ObjectAccessor::GetCreature(*me, guid)) + { + if (active) + crystalChannelTarget->AI()->SetData(summoners[i].spell, summoners[i].timer); + else + crystalChannelTarget->AI()->Reset(); + } + } - void SetSummonerStatus(bool active) - { - for (uint8 i = 0; i < 4; i++) - if (ObjectGuid guid = instance->GetGuidData(summoners[i].data)) - if (Creature* crystalChannelTarget = ObjectAccessor::GetCreature(*me, guid)) - { - if (active) - crystalChannelTarget->AI()->SetData(summoners[i].spell, summoners[i].timer); - else - crystalChannelTarget->AI()->Reset(); - } - } + void SetCrystalsStatus(bool active) + { + for (uint8 i = 0; i < 4; i++) + if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_CRYSTAL_1 + i)) + if (GameObject* crystal = ObjectAccessor::GetGameObject(*me, guid)) + SetCrystalStatus(crystal, active); + } - void SetCrystalsStatus(bool active) + void SetCrystalStatus(GameObject* crystal, bool active) + { + crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY); + if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f)) { - for (uint8 i = 0; i < 4; i++) - if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_CRYSTAL_1 + i)) - if (GameObject* crystal = ObjectAccessor::GetGameObject(*me, guid)) - SetCrystalStatus(crystal, active); + if (active) + crystalChannelTarget->CastSpell(nullptr, SPELL_BEAM_CHANNEL); + else if (crystalChannelTarget->HasUnitState(UNIT_STATE_CASTING)) + crystalChannelTarget->CastStop(); } + } - void SetCrystalStatus(GameObject* crystal, bool active) - { - crystal->SetGoState(active ? GO_STATE_ACTIVE : GO_STATE_READY); - if (Creature* crystalChannelTarget = crystal->FindNearestCreature(NPC_CRYSTAL_CHANNEL_TARGET, 5.0f)) - { - if (active) - crystalChannelTarget->CastSpell(nullptr, SPELL_BEAM_CHANNEL); - else if (crystalChannelTarget->HasUnitState(UNIT_STATE_CASTING)) - crystalChannelTarget->CastStop(); - } - } + void CrystalHandlerDied() + { + for (uint8 i = 0; i < 4; i++) + if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_CRYSTAL_1 + i)) + if (GameObject* crystal = ObjectAccessor::GetGameObject(*me, guid)) + if (crystal->GetGoState() == GO_STATE_ACTIVE) + { + SetCrystalStatus(crystal, false); + break; + } - void CrystalHandlerDied() + if (++_crystalHandlerCount >= 4) { - for (uint8 i = 0; i < 4; i++) - if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_CRYSTAL_1 + i)) - if (GameObject* crystal = ObjectAccessor::GetGameObject(*me, guid)) - if (crystal->GetGoState() == GO_STATE_ACTIVE) - { - SetCrystalStatus(crystal, false); - break; - } - - if (++_crystalHandlerCount >= 4) - { - Talk(SAY_ARCANE_FIELD); - SetSummonerStatus(false); - SetBubbled(false); - events.ScheduleEvent(EVENT_ATTACK, 3s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); - } - else if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_SUMMONER_4)) - if (Creature* crystalChannelTarget = ObjectAccessor::GetCreature(*me, guid)) - crystalChannelTarget->AI()->SetData(SPELL_SUMMON_CRYSTAL_HANDLER, 15000); + Talk(SAY_ARCANE_FIELD); + SetSummonerStatus(false); + SetBubbled(false); + events.ScheduleEvent(EVENT_ATTACK, 3s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15s); } - - uint8 _crystalHandlerCount; - bool _ohNovos; - bool _bubbled; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetDrakTharonKeepAI<boss_novosAI>(creature); + else if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS_SUMMONER_4)) + if (Creature* crystalChannelTarget = ObjectAccessor::GetCreature(*me, guid)) + crystalChannelTarget->AI()->SetData(SPELL_SUMMON_CRYSTAL_HANDLER, 15000); } + + uint8 _crystalHandlerCount; + bool _ohNovos; + bool _bubbled; }; -class npc_crystal_channel_target : public CreatureScript +struct npc_crystal_channel_target : public ScriptedAI { -public: - npc_crystal_channel_target() : CreatureScript("npc_crystal_channel_target") { } - - struct npc_crystal_channel_targetAI : public ScriptedAI + npc_crystal_channel_target(Creature* creature) : ScriptedAI(creature) { - npc_crystal_channel_targetAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + Initialize(); + } - void Initialize() - { - _spell = 0; - _timer = 0; - _temp = 0; - } + void Initialize() + { + _spell = 0; + _timer = 0; + _temp = 0; + } - void Reset() override - { - Initialize(); - } + void Reset() override + { + Initialize(); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (_spell) { - if (_spell) + if (_temp <= diff) { - if (_temp <= diff) - { - DoCast(_spell); - _temp = _timer; - } - else - _temp -= diff; + DoCast(_spell); + _temp = _timer; } + else + _temp -= diff; } + } - void SetData(uint32 id, uint32 value) override - { - _spell = id; - _timer = value; - _temp = value; - } - - void JustSummoned(Creature* summon) override - { - if (InstanceScript* instance = me->GetInstanceScript()) - if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS)) - if (Creature* novos = ObjectAccessor::GetCreature(*me, guid)) - novos->AI()->JustSummoned(summon); - - if (summon) - summon->GetMotionMaster()->MovePath(summon->GetEntry() * 100, false); + void SetData(uint32 id, uint32 value) override + { + _spell = id; + _timer = value; + _temp = value; + } - if (_spell == SPELL_SUMMON_CRYSTAL_HANDLER) - Reset(); - } + void JustSummoned(Creature* summon) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + if (ObjectGuid guid = instance->GetGuidData(DATA_NOVOS)) + if (Creature* novos = ObjectAccessor::GetCreature(*me, guid)) + novos->AI()->JustSummoned(summon); - private: - uint32 _spell; - uint32 _timer; - uint32 _temp; - }; + if (summon) + summon->GetMotionMaster()->MovePath(summon->GetEntry() * 100, false); - CreatureAI* GetAI(Creature* creature) const override - { - return GetDrakTharonKeepAI<npc_crystal_channel_targetAI>(creature); + if (_spell == SPELL_SUMMON_CRYSTAL_HANDLER) + Reset(); } + +private: + uint32 _spell; + uint32 _timer; + uint32 _temp; }; class achievement_oh_novos : public AchievementCriteriaScript @@ -368,42 +346,31 @@ public: }; // 59910 - Summon Minions -class spell_novos_summon_minions : public SpellScriptLoader +class spell_novos_summon_minions : public SpellScript { - public: - spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { } - - class spell_novos_summon_minions_SpellScript : public SpellScript - { - PrepareSpellScript(spell_novos_summon_minions_SpellScript); + PrepareSpellScript(spell_novos_summon_minions); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_SUMMON_COPY_OF_MINIONS }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - for (uint8 i = 0; i < 2; ++i) - GetCaster()->CastSpell(nullptr, SPELL_SUMMON_COPY_OF_MINIONS, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUMMON_COPY_OF_MINIONS }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + for (uint8 i = 0; i < 2; ++i) + GetCaster()->CastSpell(nullptr, SPELL_SUMMON_COPY_OF_MINIONS, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_novos_summon_minions_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; void AddSC_boss_novos() { - new boss_novos(); - new npc_crystal_channel_target(); - new spell_novos_summon_minions(); + RegisterDrakTharonKeepCreatureAI(boss_novos); + RegisterDrakTharonKeepCreatureAI(npc_crystal_channel_target); + RegisterSpellScript(spell_novos_summon_minions); new achievement_oh_novos(); } |