aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeader <keader.android@gmail.com>2020-04-24 13:52:28 -0300
committerShauren <shauren.trinity@gmail.com>2022-01-01 20:15:51 +0100
commita21ad2079a9d90013f85ca18f685e82fa83d1975 (patch)
treec14978984dfdcdb231bb6d5e2dd5aaf4efe9b16a
parent6bddc8ff5e2896c8a473da8a73441853cff59356 (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)
-rw-r--r--sql/updates/world/master/2022_01_01_33_world_2020_04_24_00_world.sql2
-rw-r--r--src/server/scripts/Outland/BlackTemple/black_temple.h6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp170
-rw-r--r--src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp1
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
};