aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-20 17:42:06 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-09 00:05:52 +0100
commit50d8c824e2c3cb6154ca88caa0d8f524d8fc03a8 (patch)
tree76bd6effca44c5d7f681286fbf21f7badc7f9b12 /src
parent2d5a833ea53a0711fba2a428d32eb1230cee2f2f (diff)
Scripts/Oculus: Update Varos to new model (#26444)
(cherry picked from commit f05e0360fc8b3ed9b29849a07a5a5b7468161d9a)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp545
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);
}