diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-15 15:11:16 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-08 22:29:16 +0100 |
commit | f00afe59f7a112a4f03bcb3a65c17fa199304859 (patch) | |
tree | c50613fdc9ec346e30ffadfa3a739fde6796ffbb /src | |
parent | f4310752c54ac606bcb32421b8ce171a13b644df (diff) |
Scripts/Utgarde Keep: Update Keleseth to new model (#26409)
Co-authored-by: offl <offl@users.noreply.github.com>
(cherry picked from commit 8afe80bce3567aa6fa1603bcbfb58ef44cc04b4d)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp | 460 |
1 files changed, 208 insertions, 252 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index b2089cbf55a..a048d527a47 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -76,296 +76,252 @@ float const SkeletonSpawnPoint[1][2] = float AttackLoc[3]= {197.636f, 194.046f, 40.8164f}; -class npc_frost_tomb : public CreatureScript +struct npc_frost_tomb : public ScriptedAI { - public: - npc_frost_tomb() : CreatureScript("npc_frost_tomb") { } - - struct npc_frost_tombAI : public ScriptedAI - { - npc_frost_tombAI(Creature* creature) : ScriptedAI(creature) - { - _instance = creature->GetInstanceScript(); - } - - void IsSummonedBy(WorldObject* summonerWO) override - { - Unit* summoner = summonerWO->ToUnit(); - if (!summoner) - return; - DoCast(summoner, SPELL_FROST_TOMB, true); - } - - void UpdateAI(uint32 /*diff*/) override { } - - void JustDied(Unit* /*killer*/) override - { - if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_PRINCE_KELESETH))) - keleseth->AI()->SetData(DATA_ON_THE_ROCKS, false); - } - - private: - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<npc_frost_tombAI>(creature); - } + npc_frost_tomb(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + } + + void IsSummonedBy(WorldObject* summonerWO) override + { + Unit* summoner = summonerWO->ToUnit(); + if (!summoner) + return; + DoCast(summoner, SPELL_FROST_TOMB, true); + } + + void UpdateAI(uint32 /*diff*/) override { } + + void JustDied(Unit* /*killer*/) override + { + if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_PRINCE_KELESETH))) + keleseth->AI()->SetData(DATA_ON_THE_ROCKS, false); + } + +private: + InstanceScript* _instance; }; -class boss_keleseth : public CreatureScript +struct boss_keleseth : public BossAI { - public: - boss_keleseth() : CreatureScript("boss_keleseth") { } - - struct boss_kelesethAI : public BossAI + boss_keleseth(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) + { + Initialize(); + } + + void Initialize() + { + onTheRocks = true; + } + + void Reset() override + { + _Reset(); + events.ScheduleEvent(EVENT_SHADOWBOLT, 2s, 3s); + events.ScheduleEvent(EVENT_FROST_TOMB, 14s, 19s); + events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6s); + + Initialize(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_START_COMBAT); + + if (!who) + return; + + std::list<Creature*> guards; + me->GetCreatureListWithEntryInGrid(guards, NPC_RUNEMAGE, 60.0f); + me->GetCreatureListWithEntryInGrid(guards, NPC_STRATEGIST, 60.0f); + if (!guards.empty()) { - boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) - { - Initialize(); - } - - void Initialize() + for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr) { - onTheRocks = true; + if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me)) + (*itr)->AI()->AttackStart(who); } + } + } - void Reset() override - { - _Reset(); - events.ScheduleEvent(EVENT_SHADOWBOLT, 2s, 3s); - events.ScheduleEvent(EVENT_FROST_TOMB, 14s, 19s); - events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6s); + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - Initialize(); - } + void SetData(uint32 data, uint32 value) override + { + if (data == DATA_ON_THE_ROCKS) + onTheRocks = value != 0; + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_START_COMBAT); - - if (!who) - return; - - std::list<Creature*> guards; - me->GetCreatureListWithEntryInGrid(guards, NPC_RUNEMAGE, 60.0f); - me->GetCreatureListWithEntryInGrid(guards, NPC_STRATEGIST, 60.0f); - if (!guards.empty()) - { - for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr) - { - if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me)) - (*itr)->AI()->AttackStart(who); - } - } - } + uint32 GetData(uint32 data) const override + { + if (data == DATA_ON_THE_ROCKS) + return onTheRocks; - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + return 0; + } - void SetData(uint32 data, uint32 value) override - { - if (data == DATA_ON_THE_ROCKS) - onTheRocks = value != 0; - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - uint32 GetData(uint32 data) const override - { - if (data == DATA_ON_THE_ROCKS) - return onTheRocks; + events.Update(diff); - return 0; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_SUMMON_SKELETONS: + Talk(SAY_SUMMON_SKELETONS); + SummonSkeletons(); + break; + case EVENT_SHADOWBOLT: + DoCastVictim(SPELL_SHADOWBOLT); + events.ScheduleEvent(EVENT_SHADOWBOLT, 2s, 3s); + break; + case EVENT_FROST_TOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_FROST_TOMB)) { - case EVENT_SUMMON_SKELETONS: - Talk(SAY_SUMMON_SKELETONS); - SummonSkeletons(); - break; - case EVENT_SHADOWBOLT: - DoCastVictim(SPELL_SHADOWBOLT); - events.ScheduleEvent(EVENT_SHADOWBOLT, 2s, 3s); - break; - case EVENT_FROST_TOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true, true, -SPELL_FROST_TOMB)) - { - Talk(SAY_FROST_TOMB); - Talk(SAY_FROST_TOMB_EMOTE, target); - - DoCast(target, SPELL_FROST_TOMB_STUN, true); - // checked from sniffs - the player casts the spell - target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true); - } - events.ScheduleEvent(EVENT_FROST_TOMB, 14s, 19s); - break; - default: - break; - } + Talk(SAY_FROST_TOMB); + Talk(SAY_FROST_TOMB_EMOTE, target); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + DoCast(target, SPELL_FROST_TOMB_STUN, true); + // checked from sniffs - the player casts the spell + target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true); + } + events.ScheduleEvent(EVENT_FROST_TOMB, 14s, 19s); + break; + default: + break; } - void SummonSkeletons() - { - // I could not found any spell cast for this - for (uint8 i = 0; i < 4; ++i) - me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - private: - bool onTheRocks; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<boss_kelesethAI>(creature); - } + void SummonSkeletons() + { + // I could not found any spell cast for this + for (uint8 i = 0; i < 4; ++i) + me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0); + } + +private: + bool onTheRocks; }; -class npc_vrykul_skeleton : public CreatureScript +struct npc_vrykul_skeleton : public ScriptedAI { - public: - npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { } + npc_vrykul_skeleton(Creature* creature) : ScriptedAI(creature) { } - struct npc_vrykul_skeletonAI : public ScriptedAI - { - npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) { } + void Reset() override + { + events.Reset(); + events.ScheduleEvent(EVENT_DECREPIFY, 4s, 6s); + } - void Reset() override - { - events.Reset(); - events.ScheduleEvent(EVENT_DECREPIFY, 4s, 6s); - } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + { + damage = 0; - void DamageTaken(Unit* /*attacker*/, uint32& damage) override + // There are some issues with pets + // they will still attack. I would say it is a PetAI bug + if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) { - if (damage >= me->GetHealth()) - { - damage = 0; + // from sniffs + me->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_DEAD); - // There are some issues with pets - // they will still attack. I would say it is a PetAI bug - if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) - { - // from sniffs - me->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_DEAD); - - events.Reset(); - events.ScheduleEvent(EVENT_RESURRECT, 18s, 22s); + events.Reset(); + events.ScheduleEvent(EVENT_RESURRECT, 18s, 22s); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); - } - } + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveIdle(); } + } + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_DECREPIFY: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_DECREPIFY)) - DoCast(target, SPELL_DECREPIFY); - events.ScheduleEvent(EVENT_DECREPIFY, 1s, 5s); - break; - case EVENT_RESURRECT: - events.ScheduleEvent(EVENT_FULL_HEAL, 1s); - events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1s); - break; - case EVENT_FULL_HEAL: - DoCast(me, SPELL_FULL_HEAL, true); - break; - case EVENT_SHADOW_FISSURE: - DoCast(me, SPELL_SHADOW_FISSURE, true); - DoCastAOE(SPELL_BONE_ARMOR, true); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - events.ScheduleEvent(EVENT_DECREPIFY, 4s, 6s); - break; - default: - break; - } + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_DECREPIFY: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_DECREPIFY)) + DoCast(target, SPELL_DECREPIFY); + events.ScheduleEvent(EVENT_DECREPIFY, 1s, 5s); + break; + case EVENT_RESURRECT: + events.ScheduleEvent(EVENT_FULL_HEAL, 1s); + events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1s); + break; + case EVENT_FULL_HEAL: + DoCast(me, SPELL_FULL_HEAL, true); + break; + case EVENT_SHADOW_FISSURE: + DoCast(me, SPELL_SHADOW_FISSURE, true); + DoCastAOE(SPELL_BONE_ARMOR, true); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + events.ScheduleEvent(EVENT_DECREPIFY, 4s, 6s); + break; + default: + break; } - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<npc_vrykul_skeletonAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } -}; - -class spell_frost_tomb : public SpellScriptLoader -{ - public: - spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { } - class spell_frost_tomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_frost_tomb_AuraScript); + if (!me->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) + DoMeleeAttackIfReady(); + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) - if (Unit* caster = GetCaster()) - if (caster->IsAlive()) - if (Creature* creature = caster->ToCreature()) - creature->DespawnOrUnsummon(1s); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_frost_tomb_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; +private: + EventMap events; +}; - AuraScript* GetAuraScript() const override - { - return new spell_frost_tomb_AuraScript(); - } +class spell_frost_tomb : public AuraScript +{ + PrepareAuraScript(spell_frost_tomb); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + if (Unit* caster = GetCaster()) + if (caster->IsAlive()) + if (Creature* creature = caster->ToCreature()) + creature->DespawnOrUnsummon(1s); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_frost_tomb::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } }; class achievement_on_the_rocks : public AchievementCriteriaScript @@ -381,9 +337,9 @@ class achievement_on_the_rocks : public AchievementCriteriaScript void AddSC_boss_keleseth() { - new boss_keleseth(); - new npc_frost_tomb(); - new npc_vrykul_skeleton(); - new spell_frost_tomb(); + RegisterUtgardeKeepCreatureAI(boss_keleseth); + RegisterUtgardeKeepCreatureAI(npc_frost_tomb); + RegisterUtgardeKeepCreatureAI(npc_vrykul_skeleton); + RegisterSpellScript(spell_frost_tomb); new achievement_on_the_rocks(); } |