diff options
author | Keader <keader.android@gmail.com> | 2020-04-24 13:52:28 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-01-01 20:15:51 +0100 |
commit | a21ad2079a9d90013f85ca18f685e82fa83d1975 (patch) | |
tree | c14978984dfdcdb231bb6d5e2dd5aaf4efe9b16a | |
parent | 6bddc8ff5e2896c8a473da8a73441853cff59356 (diff) |
Scripts/Black Temple: Fixed Reliquary of Souls after combat rewrite changes.
Closes #23879
* Fixed combat start/evade issue
* Fixed visual issue in Soul Release spell
* Fixed some timers issue
* Fixed some codestyle issues
PS: Please, stop break my black temple babys.
(cherry picked from commit d8e726de586070d24bec3c43a9ae795cf5482be0)
4 files changed, 114 insertions, 65 deletions
diff --git a/sql/updates/world/master/2022_01_01_33_world_2020_04_24_00_world.sql b/sql/updates/world/master/2022_01_01_33_world_2020_04_24_00_world.sql new file mode 100644 index 00000000000..45c650cd8ab --- /dev/null +++ b/sql/updates/world/master/2022_01_01_33_world_2020_04_24_00_world.sql @@ -0,0 +1,2 @@ +-- Reliquary of Souls Combat Trigger +UPDATE `creature_template` SET `flags_extra`=`flags_extra`&~128, `ScriptName` = 'npc_reliquary_combat_trigger' WHERE `entry`=23417; diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 37c66443abe..1150096f748 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -55,7 +55,8 @@ enum BTDataTypes DATA_ESSENCE_OF_ANGER = 22, DATA_ILLIDAN_MUSIC_CONTROLLER = 23, DATA_TERON_GOREFIEND_INTRO = 24, - DATA_AKAMA_ILLIDAN_INTRO = 25 + DATA_AKAMA_ILLIDAN_INTRO = 25, + DATA_RELIQUARY_COMBAT_TRIGGER = 26 }; enum TriggerEmotes @@ -108,7 +109,8 @@ enum BTCreatureIds NPC_DEMON_FIRE = 23069, NPC_PARASITIC_SHADOWFIEND = 23498, NPC_BLAZE = 23259, - NPC_FLAME_CRASH = 23336 + NPC_FLAME_CRASH = 23336, + NPC_RELIQUARY_COMBAT_TRIGGER = 23417 }; enum BTGameObjectIds diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 1b7d61192cf..ca060286dfd 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -95,6 +95,7 @@ enum Misc ACTION_ESSENCE_OF_SUFFERING_DEAD, ACTION_ESSENCE_OF_DESIRE_DEAD, ACTION_KILL_SELF, + ACTION_START_COMBAT, ANGER_SOUND_ID_DEATH = 11401 }; @@ -140,10 +141,7 @@ class EnslavedSoulEvent : public BasicEvent struct boss_reliquary_of_souls : public BossAI { - boss_reliquary_of_souls(Creature* creature) : BossAI(creature, DATA_RELIQUARY_OF_SOULS), _inCombat(false) - { - creature->m_SightDistance = 70.0f; - } + boss_reliquary_of_souls(Creature* creature) : BossAI(creature, DATA_RELIQUARY_OF_SOULS), _inCombat(false) { } void Reset() override { @@ -153,15 +151,10 @@ struct boss_reliquary_of_souls : public BossAI events.SetPhase(PHASE_ESSENCE_OF_SUFFERING); } - void MoveInLineOfSight(Unit* who) override + void JustSummoned(Creature* summon) override { - if (!_inCombat && who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && CanAIAttack(who)) - { - _inCombat = true; - DoZoneInCombat(); - me->SetStandState(UNIT_STAND_STATE_STAND); - events.ScheduleEvent(EVENT_SUBMERGE, 10s); - } + summons.Summon(summon); + summon->AI()->DoZoneInCombat(); } uint32 GetSummonSpell() @@ -194,6 +187,15 @@ struct boss_reliquary_of_souls : public BossAI break; case ACTION_KILL_SELF: me->KillSelf(); + if (Creature* combatTrigger = instance->GetCreature(DATA_RELIQUARY_COMBAT_TRIGGER)) + combatTrigger->AI()->DoAction(ACTION_KILL_SELF); + break; + case ACTION_START_COMBAT: + _inCombat = true; + me->SetStandState(UNIT_STAND_STATE_STAND); + events.ScheduleEvent(EVENT_SUBMERGE, 10s); + break; + default: break; } } @@ -214,19 +216,19 @@ struct boss_reliquary_of_souls : public BossAI { Creature* wTrigger = _worldTriggerList[i]; if (i < 3) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(4000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 4s); else if (i < 6) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(8000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 8s); else if (i < 9) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(12000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 12s); else if (i < 12) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(16000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 16s); else if (i < 15) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(20000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 20s); else if (i < 18) - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(24000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 24s); else - wTrigger->m_Events.AddEvent(new EnslavedSoulEvent(wTrigger), wTrigger->m_Events.CalculateTime(28000)); + wTrigger->m_Events.AddEventAtOffset(new EnslavedSoulEvent(wTrigger), 28s); } } @@ -258,7 +260,7 @@ struct boss_reliquary_of_souls : public BossAI void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (!_inCombat) return; events.Update(diff); @@ -268,25 +270,13 @@ struct boss_reliquary_of_souls : public BossAI while (uint32 eventId = events.ExecuteEvent()) { - switch (eventId) + if (eventId == EVENT_SUBMERGE) { - case EVENT_SUBMERGE: - DoCastSelf(SPELL_SUBMERGE_VISUAL, true); - events.ScheduleEvent(EVENT_SUMMON_ESSENCE, 3s); - break; - case EVENT_SUMMON_ESSENCE: - { - EntryCheckPredicate pred(NPC_ENSLAVED_SOUL); - summons.DoAction(ACTION_KILL_SELF, pred); - DoCastSelf(GetSummonSpell()); - break; - } - default: - break; + DoCastSelf(SPELL_SUBMERGE_VISUAL, true); + EntryCheckPredicate pred(NPC_ENSLAVED_SOUL); + summons.DoAction(ACTION_KILL_SELF, pred); + DoCastSelf(GetSummonSpell()); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } } @@ -345,7 +335,6 @@ struct boss_essence_of_suffering : public BossAI { me->SetCombatPulseDelay(5); me->setActive(true); - DoZoneInCombat(); events.ScheduleEvent(EVENT_SOUL_DRAIN, 20s); events.ScheduleEvent(EVENT_FRENZY, 45s); @@ -358,12 +347,6 @@ struct boss_essence_of_suffering : public BossAI Talk(SUFF_SAY_SLAY); } - void EnterEvadeMode(EvadeReason /*why*/) override - { - if (Creature* reliquary = instance->GetCreature(DATA_RELIQUARY_OF_SOULS)) - reliquary->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -423,7 +406,6 @@ struct boss_essence_of_desire : public BossAI me->SetCombatPulseDelay(5); me->setActive(true); - DoZoneInCombat(); Talk(DESI_SAY_FREED); } @@ -466,12 +448,6 @@ struct boss_essence_of_desire : public BossAI Talk(DESI_SAY_SLAY); } - void EnterEvadeMode(EvadeReason /*why*/) override - { - if (Creature* reliquary = instance->GetCreature(DATA_RELIQUARY_OF_SOULS)) - reliquary->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -538,7 +514,6 @@ struct boss_essence_of_anger : public BossAI me->SetCombatPulseDelay(5); me->setActive(true); - DoZoneInCombat(); } void JustDied(Unit* /*killer*/) override @@ -609,19 +584,13 @@ struct boss_essence_of_anger : public BossAI DoMeleeAttackIfReady(); } - void EnterEvadeMode(EvadeReason /*why*/) override - { - if (Creature* reliquary = instance->GetCreature(DATA_RELIQUARY_OF_SOULS)) - reliquary->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - } - private: ObjectGuid _targetGUID; }; struct npc_enslaved_soul : public ScriptedAI { - npc_enslaved_soul(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } + npc_enslaved_soul(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _dead(false) { } void Reset() override { @@ -636,12 +605,35 @@ struct npc_enslaved_soul : public ScriptedAI me->SetReactState(REACT_AGGRESSIVE); DoZoneInCombat(); }); + _dead = false; } void DoAction(int32 actionId) override { if (actionId == ACTION_KILL_SELF) - me->KillSelf(); + HandleSoulRelease(); + } + + void HandleSoulRelease() + { + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->GetMotionMaster()->Clear(); + DoCastSelf(SPELL_SOUL_RELEASE); + me->m_Events.AddEventAtOffset([this]() { me->KillSelf(); }, 500ms); + } + + void DamageTaken(Unit* /*done_by*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + { + damage = 0; + if (!_dead) + { + _dead = true; + HandleSoulRelease(); + } + } } void UpdateAI(uint32 diff) override @@ -654,14 +646,65 @@ struct npc_enslaved_soul : public ScriptedAI DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override +private: + InstanceScript* _instance; + TaskScheduler _scheduler; + bool _dead; +}; + +struct npc_reliquary_combat_trigger : public ScriptedAI +{ + npc_reliquary_combat_trigger(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) + { + SetCombatMovement(false); + creature->m_SightDistance = 70.0f; + } + + void Reset() override { - DoCastSelf(SPELL_SOUL_RELEASE, true); + me->SetReactState(REACT_PASSIVE); + if (_instance->GetBossState(DATA_RELIQUARY_OF_SOULS) == DONE) + me->DespawnOrUnsummon(); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!me->IsEngaged() && who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && CanAIAttack(who)) + { + if (Creature* reliquary = _instance->GetCreature(DATA_RELIQUARY_OF_SOULS)) + { + DoZoneInCombat(); + reliquary->AI()->DoAction(ACTION_START_COMBAT); + } + } + } + + void DamageTaken(Unit* /*done_by*/, uint32& damage) override + { + damage = 0; + } + + void EnterEvadeMode(EvadeReason why) override + { + ScriptedAI::EnterEvadeMode(why); + if (Creature* reliquary = _instance->GetCreature(DATA_RELIQUARY_OF_SOULS)) + reliquary->AI()->EnterEvadeMode(why); + } + + void DoAction(int32 actionId) override + { + if (actionId == ACTION_KILL_SELF) + me->KillSelf(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; } private: InstanceScript* _instance; - TaskScheduler _scheduler; }; // 41350 - Aura of Desire @@ -766,6 +809,7 @@ void AddSC_boss_reliquary_of_souls() RegisterBlackTempleCreatureAI(boss_essence_of_desire); RegisterBlackTempleCreatureAI(boss_essence_of_anger); RegisterBlackTempleCreatureAI(npc_enslaved_soul); + RegisterBlackTempleCreatureAI(npc_reliquary_combat_trigger); RegisterAuraScript(spell_reliquary_of_souls_aura_of_desire); RegisterAuraScript(spell_reliquary_of_souls_submerge); RegisterAuraScript(spell_reliquary_of_souls_spite); diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index 506b5db71cc..d4ba1ea2db2 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -76,6 +76,7 @@ ObjectData const creatureData[] = { NPC_BLOOD_ELF_COUNCIL_VOICE, DATA_BLOOD_ELF_COUNCIL_VOICE }, { NPC_BLACK_TEMPLE_TRIGGER, DATA_BLACK_TEMPLE_TRIGGER }, { NPC_MAIEV_SHADOWSONG, DATA_MAIEV }, + { NPC_RELIQUARY_COMBAT_TRIGGER, DATA_RELIQUARY_COMBAT_TRIGGER }, { 0, 0 } // END }; |