diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-20 17:42:06 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-09 00:05:52 +0100 |
commit | 50d8c824e2c3cb6154ca88caa0d8f524d8fc03a8 (patch) | |
tree | 76bd6effca44c5d7f681286fbf21f7badc7f9b12 | |
parent | 2d5a833ea53a0711fba2a428d32eb1230cee2f2f (diff) |
Scripts/Oculus: Update Varos to new model (#26444)
(cherry picked from commit f05e0360fc8b3ed9b29849a07a5a5b7468161d9a)
-rw-r--r-- | src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 545 |
1 files changed, 245 insertions, 300 deletions
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 2064ffded7c..5edde113c3b 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -55,358 +55,303 @@ enum Events EVENT_ENERGIZE_CORES_VISUAL }; -class boss_varos : public CreatureScript +struct boss_varos : public BossAI { - public: - boss_varos() : CreatureScript("boss_varos") { } - - struct boss_varosAI : public BossAI + boss_varos(Creature* creature) : BossAI(creature, DATA_VAROS) + { + Initialize(); + } + + void Initialize() + { + firstCoreEnergize = false; + coreEnergizeOrientation = 0.0f; + } + + void InitializeAI() override + { + BossAI::InitializeAI(); + if (instance->GetBossState(DATA_DRAKOS) != DONE) + DoCast(me, SPELL_CENTRIFUGE_SHIELD); + } + + void Reset() override + { + _Reset(); + + events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, 20s, 25s); + events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5s); + // not sure if this is handled by a timer or hp percentage + events.ScheduleEvent(EVENT_CALL_AZURE, 15s, 30s); + + Initialize(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + + Talk(SAY_AGGRO); + } + + float GetCoreEnergizeOrientation() + { + return coreEnergizeOrientation; + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS) - { - Initialize(); - } - - void Initialize() - { - firstCoreEnergize = false; - coreEnergizeOrientation = 0.0f; - } - - void InitializeAI() override - { - BossAI::InitializeAI(); - if (instance->GetBossState(DATA_DRAKOS) != DONE) - DoCast(me, SPELL_CENTRIFUGE_SHIELD); - } - - void Reset() override - { - _Reset(); - - events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, 20s, 25s); - events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5s); - // not sure if this is handled by a timer or hp percentage - events.ScheduleEvent(EVENT_CALL_AZURE, 15s, 30s); - - Initialize(); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - - Talk(SAY_AGGRO); - } - - float GetCoreEnergizeOrientation() - { - return coreEnergizeOrientation; - } - - void UpdateAI(uint32 diff) override + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_ENERGIZE_CORES: + DoCast(me, SPELL_ENERGIZE_CORES); + events.CancelEvent(EVENT_ENERGIZE_CORES); + break; + case EVENT_ENERGIZE_CORES_VISUAL: + if (!firstCoreEnergize) { - case EVENT_ENERGIZE_CORES: - DoCast(me, SPELL_ENERGIZE_CORES); - events.CancelEvent(EVENT_ENERGIZE_CORES); - break; - case EVENT_ENERGIZE_CORES_VISUAL: - if (!firstCoreEnergize) - { - coreEnergizeOrientation = me->GetOrientation(); - firstCoreEnergize = true; - } - else - coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f); - - DoCast(me, SPELL_ENERGIZE_CORES_VISUAL); - events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5s); - events.ScheduleEvent(EVENT_ENERGIZE_CORES, 4s); - break; - case EVENT_CALL_AZURE: - // not sure how blizz handles this, i cant see any pattern between the differnt spells - DoCast(me, SPELL_CALL_AZURE_RING_CAPTAIN); - Talk(SAY_AZURE); - Talk(SAY_AZURE_EMOTE); - events.ScheduleEvent(EVENT_CALL_AZURE, 20s, 25s); - break; - case EVENT_AMPLIFY_MAGIC: - DoCastVictim(SPELL_CALL_AMPLIFY_MAGIC); - events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, 17s, 20s); - break; - default: - break; + coreEnergizeOrientation = me->GetOrientation(); + firstCoreEnergize = true; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + else + coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f); + + DoCast(me, SPELL_ENERGIZE_CORES_VISUAL); + events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5s); + events.ScheduleEvent(EVENT_ENERGIZE_CORES, 4s); + break; + case EVENT_CALL_AZURE: + // not sure how blizz handles this, i cant see any pattern between the differnt spells + DoCast(me, SPELL_CALL_AZURE_RING_CAPTAIN); + Talk(SAY_AZURE); + Talk(SAY_AZURE_EMOTE); + events.ScheduleEvent(EVENT_CALL_AZURE, 20s, 25s); + break; + case EVENT_AMPLIFY_MAGIC: + DoCastVictim(SPELL_CALL_AMPLIFY_MAGIC); + events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, 17s, 20s); + break; + default: + break; } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - private: - bool firstCoreEnergize; - float coreEnergizeOrientation; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetOculusAI<boss_varosAI>(creature); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur + } + +private: + bool firstCoreEnergize; + float coreEnergizeOrientation; }; -class npc_azure_ring_captain : public CreatureScript +struct npc_azure_ring_captain : public ScriptedAI { - public: - npc_azure_ring_captain() : CreatureScript("npc_azure_ring_captain") { } - - struct npc_azure_ring_captainAI : public ScriptedAI + npc_azure_ring_captain(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + instance = creature->GetInstanceScript(); + } + + void Initialize() + { + targetGUID.Clear(); + } + + void Reset() override + { + Initialize(); + + me->SetWalk(true); + //! HACK: Creature's can't have MOVEMENTFLAG_FLYING + me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); + me->SetReactState(REACT_AGGRESSIVE); + } + + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_ICE_BEAM) { - npc_azure_ring_captainAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - } - - void Initialize() - { - targetGUID.Clear(); - } - - void Reset() override - { - Initialize(); - - me->SetWalk(true); - //! HACK: Creature's can't have MOVEMENTFLAG_FLYING - me->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - me->SetReactState(REACT_AGGRESSIVE); - } - - void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_ICE_BEAM) - { - target->CastSpell(target, SPELL_SUMMON_ARCANE_BEAM, true); - me->DespawnOrUnsummon(); - } - } + target->CastSpell(target, SPELL_SUMMON_ARCANE_BEAM, true); + me->DespawnOrUnsummon(); + } + } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 /*diff*/) override + { + if (!UpdateVictim()) + return; - DoMeleeAttackIfReady(); - } + DoMeleeAttackIfReady(); + } - void MovementInform(uint32 type, uint32 id) override - { - if (type != POINT_MOTION_TYPE || - id != ACTION_CALL_DRAGON_EVENT) - return; + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE || + id != ACTION_CALL_DRAGON_EVENT) + return; - me->GetMotionMaster()->MoveIdle(); + me->GetMotionMaster()->MoveIdle(); - if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID)) - DoCast(target, SPELL_ICE_BEAM); - } + if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID)) + DoCast(target, SPELL_ICE_BEAM); + } - void DoAction(int32 action) override - { - switch (action) + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_CALL_DRAGON_EVENT: + if (Creature* varos = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VAROS))) { - case ACTION_CALL_DRAGON_EVENT: - if (Creature* varos = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VAROS))) - { - if (Unit* victim = varos->AI()->SelectTarget(SelectTargetMethod::Random, 0)) - { - me->SetReactState(REACT_PASSIVE); - me->SetWalk(false); - me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f); - targetGUID = victim->GetGUID(); - } - } - break; + if (Unit* victim = varos->AI()->SelectTarget(SelectTargetMethod::Random, 0)) + { + me->SetReactState(REACT_PASSIVE); + me->SetWalk(false); + me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT, victim->GetPositionX(), victim->GetPositionY(), victim->GetPositionZ() + 20.0f); + targetGUID = victim->GetGUID(); + } } - } - - private: - ObjectGuid targetGUID; - InstanceScript* instance; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetOculusAI<npc_azure_ring_captainAI>(creature); + break; } + } + +private: + ObjectGuid targetGUID; + InstanceScript* instance; }; -class spell_varos_centrifuge_shield : public SpellScriptLoader +class spell_varos_centrifuge_shield : public AuraScript { - public: - spell_varos_centrifuge_shield() : SpellScriptLoader("spell_varos_centrifuge_shield") { } - - class spell_varos_centrifuge_shield_AuraScript : public AuraScript - { - PrepareAuraScript(spell_varos_centrifuge_shield_AuraScript); - - bool Load() override - { - Unit* caster = GetCaster(); - return caster && caster->GetTypeId() == TYPEID_UNIT; - } - - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - // flags taken from sniffs - if (caster->HasUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_UNK_6))) - { - caster->ToCreature()->SetReactState(REACT_PASSIVE); - caster->AddUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_UNK_6)); - caster->SetImmuneToAll(true, true); - } - } - } + PrepareAuraScript(spell_varos_centrifuge_shield); - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - caster->ToCreature()->SetReactState(REACT_AGGRESSIVE); - caster->RemoveUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_UNK_6)); - caster->SetImmuneToAll(false); - } - } + bool Load() override + { + Unit* caster = GetCaster(); + return caster && caster->GetTypeId() == TYPEID_UNIT; + } - void Register() override + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + { + // flags taken from sniffs + if (caster->HasUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_IMMUNE_TO_NPC | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_UNK_6))) { - OnEffectRemove += AuraEffectRemoveFn(spell_varos_centrifuge_shield_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectApply += AuraEffectApplyFn(spell_varos_centrifuge_shield_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + caster->ToCreature()->SetReactState(REACT_PASSIVE); + caster->AddUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_UNK_6)); + caster->SetImmuneToAll(true, true); } - }; + } + } - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - return new spell_varos_centrifuge_shield_AuraScript(); + caster->ToCreature()->SetReactState(REACT_AGGRESSIVE); + caster->RemoveUnitFlag(UnitFlags(UNIT_FLAG_CAN_SWIM | UNIT_FLAG_UNK_6)); + caster->SetImmuneToAll(false); } + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_varos_centrifuge_shield::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_varos_centrifuge_shield::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; -class spell_varos_energize_core_area_enemy : public SpellScriptLoader +class spell_varos_energize_core_area_enemy : public SpellScript { - public: - spell_varos_energize_core_area_enemy() : SpellScriptLoader("spell_varos_energize_core_area_enemy") { } + PrepareSpellScript(spell_varos_energize_core_area_enemy); - class spell_varos_energize_core_area_enemySpellScript : public SpellScript - { - PrepareSpellScript(spell_varos_energize_core_area_enemySpellScript); + void FilterTargets(std::list<WorldObject*>& targets) + { + Creature* varos = GetCaster()->ToCreature(); + if (!varos) + return; - void FilterTargets(std::list<WorldObject*>& targets) - { - Creature* varos = GetCaster()->ToCreature(); - if (!varos) - return; - - if (varos->GetEntry() != NPC_VAROS) - return; - - float orientation = ENSURE_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); - - for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) - { - float angle = varos->GetAbsoluteAngle((*itr)->GetPositionX(), (*itr)->GetPositionY()); - float diff = std::fabs(orientation - angle); - - if (diff > 1.0f) - itr = targets.erase(itr); - else - ++itr; - } - } + if (varos->GetEntry() != NPC_VAROS) + return; - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_enemySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; + float orientation = ENSURE_AI(boss_varos, varos->AI())->GetCoreEnergizeOrientation(); - SpellScript* GetSpellScript() const override + for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) { - return new spell_varos_energize_core_area_enemySpellScript(); + float angle = varos->GetAbsoluteAngle((*itr)->GetPositionX(), (*itr)->GetPositionY()); + float diff = std::fabs(orientation - angle); + + if (diff > 1.0f) + itr = targets.erase(itr); + else + ++itr; } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_enemy::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } }; -class spell_varos_energize_core_area_entry : public SpellScriptLoader +class spell_varos_energize_core_area_entry : public SpellScript { - public: - spell_varos_energize_core_area_entry() : SpellScriptLoader("spell_varos_energize_core_area_entry") { } + PrepareSpellScript(spell_varos_energize_core_area_entry); - class spell_varos_energize_core_area_entrySpellScript : public SpellScript - { - PrepareSpellScript(spell_varos_energize_core_area_entrySpellScript); + void FilterTargets(std::list<WorldObject*>& targets) + { + Creature* varos = GetCaster()->ToCreature(); + if (!varos) + return; - void FilterTargets(std::list<WorldObject*>& targets) - { - Creature* varos = GetCaster()->ToCreature(); - if (!varos) - return; - - if (varos->GetEntry() != NPC_VAROS) - return; + if (varos->GetEntry() != NPC_VAROS) + return; - float orientation = ENSURE_AI(boss_varos::boss_varosAI, varos->AI())->GetCoreEnergizeOrientation(); - - for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) - { - float angle = varos->GetAbsoluteAngle((*itr)->GetPositionX(), (*itr)->GetPositionY()); - float diff = std::fabs(orientation - angle); + float orientation = ENSURE_AI(boss_varos, varos->AI())->GetCoreEnergizeOrientation(); - if (diff > 1.0f) - itr = targets.erase(itr); - else - ++itr; - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_entrySpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override + for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end();) { - return new spell_varos_energize_core_area_entrySpellScript(); + float angle = varos->GetAbsoluteAngle((*itr)->GetPositionX(), (*itr)->GetPositionY()); + float diff = std::fabs(orientation - angle); + + if (diff > 1.0f) + itr = targets.erase(itr); + else + ++itr; } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_varos_energize_core_area_entry::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } }; void AddSC_boss_varos() { - new boss_varos(); - new npc_azure_ring_captain(); - new spell_varos_centrifuge_shield(); - new spell_varos_energize_core_area_enemy(); - new spell_varos_energize_core_area_entry(); + RegisterOculusCreatureAI(boss_varos); + RegisterOculusCreatureAI(npc_azure_ring_captain); + RegisterSpellScript(spell_varos_centrifuge_shield); + RegisterSpellScript(spell_varos_energize_core_area_enemy); + RegisterSpellScript(spell_varos_energize_core_area_entry); } |