diff options
author | Keader <keader.android@gmail.com> | 2019-01-05 01:14:57 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-18 22:41:57 +0100 |
commit | dd067390dcc05b707c40c27758a9f06807cc0803 (patch) | |
tree | 24f1fcb9a62f83af08e9b3ec7ef4efe9758f2681 /src | |
parent | 3b1ed434aeacfa57f392387c2176dfb4438b13f8 (diff) |
Scripts/Icecrown Citadel: Some fixes for Valithria Dreamwalker's encounter
Closes #22754 #21887 #17882
Ty sirikfoll for all help
Bonus fixes: Abomination letting worms when fight end, visual missing, archmages stop respawn if corpse despawn
(cherry picked from commit dd81978f432f9c1ecb72ebcadcb5a50042e005ad)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp | 88 |
1 files changed, 49 insertions, 39 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 698b89ade1e..7a98e95b134 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -147,22 +147,16 @@ enum Misc ACTION_ENTER_COMBAT = 1, MISSED_PORTALS = 2, ACTION_DEATH = 3, - DATA_SUPPRESSERS_COUNT = 4 + ACTION_SETUP_ARCHMAGES = 4, + DATA_SUPPRESSERS_COUNT = 4, + POINT_VALITHRIA = 42, + SUMMON_GROUP_ALL = 1, + SUMMON_GROUP_10 = 2, + SUMMON_GROUP_25 = 3 }; Position const ValithriaSpawnPos = {4210.813f, 2484.443f, 364.9558f, 0.01745329f}; -class RisenArchmageCheck -{ - public: - // look for all permanently spawned Risen Archmages that are not yet in combat - bool operator()(Creature* creature) - { - return creature->IsAlive() && creature->GetEntry() == NPC_RISEN_ARCHMAGE && - creature->GetSpawnId() && !creature->IsInCombat(); - } -}; - struct ManaVoidSelector : public std::unary_function<Unit*, bool> { explicit ManaVoidSelector(WorldObject const* source) : _source(source) { } @@ -246,6 +240,7 @@ class ValithriaDespawner : public BasicEvent case NPC_COLUMN_OF_FROST: case NPC_ROT_WORM: case NPC_RISEN_ARCHMAGE: + case NPC_GREEN_DRAGON_COMBAT_TRIGGER: break; default: return; @@ -293,6 +288,7 @@ class boss_valithria_dreamwalker : public CreatureScript void Reset() override { + _events.Reset(); me->SetHealth(_spawnHealth); me->SetReactState(REACT_PASSIVE); me->LoadCreaturesAddon(); @@ -387,11 +383,11 @@ class boss_valithria_dreamwalker : public CreatureScript me->SetDisplayId(11686); me->AddUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->DespawnOrUnsummon(4000); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) - lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST, false); - if (Creature* trigger = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_TRIGGER))) Unit::Kill(me, trigger); + + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) + lichKing->CastSpell(lichKing, SPELL_SPAWN_CHEST); } } @@ -494,13 +490,23 @@ class npc_green_dragon_combat_trigger : public CreatureScript { _Reset(); me->SetReactState(REACT_PASSIVE); + summons.DespawnAll(); + // Setup Archmages + me->SummonCreatureGroup(SUMMON_GROUP_ALL); + if (Is25ManRaid()) + me->SummonCreatureGroup(SUMMON_GROUP_25); + else + me->SummonCreatureGroup(SUMMON_GROUP_10); + + EntryCheckPredicate pred(NPC_RISEN_ARCHMAGE); + summons.DoAction(ACTION_SETUP_ARCHMAGES, pred); } void JustEnteredCombat(Unit* target) override { if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer())) { - EnterEvadeMode(); + EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK); instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); return; } @@ -510,6 +516,8 @@ class npc_green_dragon_combat_trigger : public CreatureScript instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS); if (Creature* valithria = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER))) valithria->AI()->DoAction(ACTION_ENTER_COMBAT); + EntryCheckPredicate pred(NPC_RISEN_ARCHMAGE); + summons.DoAction(ACTION_ENTER_COMBAT, pred); } void AttackStart(Unit* target) override @@ -526,6 +534,9 @@ class npc_green_dragon_combat_trigger : public CreatureScript void JustExitedCombat() override { me->setActive(false); + // JustExitedCombat is called on death too, so if creature is dead, avoid "respawn" event + if (!me->IsAlive()) + return; DoAction(ACTION_DEATH); } @@ -535,6 +546,8 @@ class npc_green_dragon_combat_trigger : public CreatureScript { instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, NOT_STARTED); me->m_Events.AddEventAtOffset(new ValithriaDespawner(me), 5s); + if (Creature* lichKing = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) + lichKing->AI()->EnterEvadeMode(); } } @@ -680,6 +693,7 @@ class npc_risen_archmage : public CreatureScript void Initialize() { _canCallJustEngagedWith = true; + _isInitialArchmage = false; } bool CanAIAttack(Unit const* target) const override @@ -699,15 +713,8 @@ class npc_risen_archmage : public CreatureScript void JustEngagedWith(Unit* target) override { me->FinishSpell(CURRENT_CHANNELED_SPELL, false); - if (me->GetSpawnId() && _canCallJustEngagedWith) + if (_isInitialArchmage && _canCallJustEngagedWith) { - std::list<Creature*> archmages; - RisenArchmageCheck check; - Trinity::CreatureListSearcher<RisenArchmageCheck> searcher(me, archmages, check); - Cell::VisitGridObjects(me, searcher, 100.0f); - for (std::list<Creature*>::iterator itr = archmages.begin(); itr != archmages.end(); ++itr) - (*itr)->AI()->DoAction(ACTION_ENTER_COMBAT); - if (Creature* lichKing = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_LICH_KING))) { lichKing->EngageWithTarget(target); @@ -724,12 +731,14 @@ class npc_risen_archmage : public CreatureScript void DoAction(int32 action) override { - if (action != ACTION_ENTER_COMBAT) - return; - - _canCallJustEngagedWith = false; - DoZoneInCombat(); - _canCallJustEngagedWith = true; + if (action == ACTION_ENTER_COMBAT) + { + _canCallJustEngagedWith = false; + DoZoneInCombat(); + _canCallJustEngagedWith = true; + } + else if (action == ACTION_SETUP_ARCHMAGES) + _isInitialArchmage = true; } void JustSummoned(Creature* summon) override @@ -742,10 +751,8 @@ class npc_risen_archmage : public CreatureScript void UpdateAI(uint32 diff) override { - if (!me->IsInCombat()) - if (me->GetSpawnId()) - if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) - DoCast(me, SPELL_CORRUPTION); + if (!me->IsInCombat() && _isInitialArchmage && !me->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + DoCastSelf(SPELL_CORRUPTION); if (!UpdateVictim()) return; @@ -785,6 +792,7 @@ class npc_risen_archmage : public CreatureScript EventMap _events; InstanceScript* _instance; bool _canCallJustEngagedWith; + bool _isInitialArchmage; }; CreatureAI* GetAI(Creature* creature) const override @@ -877,15 +885,14 @@ class npc_suppresser : public CreatureScript { float x, y, z; valithria->GetContactPoint(me, x,y,z); - me->GetMotionMaster()->MovePoint(42, x, y, z); + me->GetMotionMaster()->MovePoint(POINT_VALITHRIA, x, y, z); } } void MovementInform(uint32 /*type*/, uint32 id) override { - if (id == 42) + if (id == POINT_VALITHRIA) { - me->SetReactState(REACT_AGGRESSIVE); if (Creature* valithria = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_VALITHRIA_DREAMWALKER))) { AttackStart(valithria); @@ -983,9 +990,12 @@ class npc_gluttonous_abomination : public CreatureScript _events.ScheduleEvent(EVENT_GUT_SPRAY, 10s, 13s); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { - DoCast(me, SPELL_ROT_WORM_SPAWNER, true); + if (killer->GetEntry() == NPC_VALITHRIA_DREAMWALKER) + return; + + DoCastSelf(SPELL_ROT_WORM_SPAWNER, true); } void UpdateAI(uint32 diff) override |