From 63ac0fd5d97c45f6f0a2d1b4ce6027e036716e84 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 16 Oct 2022 21:58:00 +0200 Subject: [PATCH] fix(Scripts/Temple of AhnQiraj): Fixed Sartura's aggro reset mechanic. (#13185) * fix(Scripts/Temple of AhnQiraj): Fixed Sartura's aggro reset mechanic. Fixes #13072 * Update. * Update boss_sartura.cpp * Update boss_sartura.cpp * fix? Co-authored-by: Angelo Venturini --- .../TempleOfAhnQiraj/boss_sartura.cpp | 164 ++++-------------- 1 file changed, 38 insertions(+), 126 deletions(-) diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp index 46de14dcc..b77eb7bbb 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp @@ -34,7 +34,6 @@ enum Spells SPELL_ENRAGE = 8269, SPELL_BERSERK = 27680, SPELL_SUNDERING_CLEAVE = 25174, - // Sartura's Royal Guard SPELL_GUARD_WHIRLWIND = 26038, SPELL_GUARD_KNOCKBACK = 26027 @@ -44,20 +43,15 @@ enum events { // Battleguard Sartura EVENT_SARTURA_WHIRLWIND = 1, - EVENT_SARTURA_WHIRLWIND_RANDOM = 2, - EVENT_SARTURA_WHIRLWIND_END = 3, - EVENT_SPELL_BERSERK = 4, - EVENT_SARTURA_AGGRO_RESET = 5, - EVENT_SARTURA_AGGRO_RESET_END = 6, - EVENT_SARTURA_SUNDERING_CLEAVE = 7, - + EVENT_SARTURA_WHIRLWIND_RANDOM, + EVENT_SARTURA_WHIRLWIND_END, + EVENT_SPELL_BERSERK, + EVENT_SARTURA_SUNDERING_CLEAVE, // Sartura's Royal Guard - EVENT_GUARD_WHIRLWIND = 8, - EVENT_GUARD_WHIRLWIND_RANDOM = 9, - EVENT_GUARD_WHIRLWIND_END = 10, - EVENT_GUARD_KNOCKBACK = 11, - EVENT_GUARD_AGGRO_RESET = 12, - EVENT_GUARD_AGGRO_RESET_END = 13 + EVENT_GUARD_WHIRLWIND, + EVENT_GUARD_WHIRLWIND_RANDOM, + EVENT_GUARD_WHIRLWIND_END, + EVENT_GUARD_KNOCKBACK, }; struct boss_sartura : public BossAI @@ -74,13 +68,11 @@ struct boss_sartura : public BossAI void Reset() override { _Reset(); - whirlwind = false; enraged = false; berserked = false; - aggroReset = false; MinionReset(); - _savedTargetGUID.Clear(); - _savedTargetThreat = 0.f; + + me->SetReactState(REACT_AGGRESSIVE); } void MinionReset() @@ -98,8 +90,7 @@ struct boss_sartura : public BossAI BossAI::EnterCombat(who); Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 12s, 22s); - events.ScheduleEvent(EVENT_SARTURA_AGGRO_RESET, urand(45000, 55000)); - events.ScheduleEvent(EVENT_SPELL_BERSERK, 10 * 60000); + events.ScheduleEvent(EVENT_SPELL_BERSERK, 10min); events.ScheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, 2400ms, 3s); } @@ -125,7 +116,7 @@ struct boss_sartura : public BossAI void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (!UpdateVictimWithGaze()) return; events.Update(diff); @@ -135,61 +126,26 @@ struct boss_sartura : public BossAI switch (eventId) { case EVENT_SARTURA_WHIRLWIND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) + { + SetGazeOn(target); + } DoCastSelf(SPELL_WHIRLWIND, true); - whirlwind = true; - events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, urand(3000, 7000)); - events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_END, 15000); + events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, 2s, 7s); + events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_END, 15s); break; case EVENT_SARTURA_WHIRLWIND_RANDOM: - if (whirlwind == true) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) - { - me->AddThreat(target, 1.0f); - me->TauntApply(target); - AttackStart(target); - } - events.RepeatEvent(urand(3000, 7000)); + SetGazeOn(target); } + events.Repeat(2s, 7s); break; case EVENT_SARTURA_WHIRLWIND_END: + me->SetReactState(REACT_AGGRESSIVE); events.CancelEvent(EVENT_SARTURA_WHIRLWIND_RANDOM); - whirlwind = false; events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 5s, 11s); break; - case EVENT_SARTURA_AGGRO_RESET: - if (aggroReset == false) - { - if (Unit* originalTarget = SelectTarget(SelectTargetMethod::Random, 0)) - { - _savedTargetGUID = originalTarget->GetGUID(); - _savedTargetThreat = me->GetThreatMgr().GetThreat(originalTarget); - me->GetThreatMgr().ModifyThreatByPercent(originalTarget, -100); - } - aggroReset = true; - events.ScheduleEvent(EVENT_SARTURA_AGGRO_RESET_END, 5000); - } - else - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) - { - me->AddThreat(target, 1.0f); - me->TauntApply(target); - AttackStart(target); - } - } - events.RepeatEvent(urand(1000, 2000)); - break; - case EVENT_SARTURA_AGGRO_RESET_END: - events.CancelEvent(EVENT_SARTURA_AGGRO_RESET); - if (Unit* originalTarget = ObjectAccessor::GetUnit(*me, _savedTargetGUID)) - { - me->GetThreatMgr().AddThreat(originalTarget, _savedTargetThreat); - _savedTargetGUID.Clear(); - } - aggroReset = false; - events.RescheduleEvent(EVENT_SARTURA_AGGRO_RESET, urand(30000, 40000)); - break; case EVENT_SPELL_BERSERK: if (!berserked) { @@ -198,7 +154,7 @@ struct boss_sartura : public BossAI } break; case EVENT_SARTURA_SUNDERING_CLEAVE: - if (whirlwind) + if (me->HasReactState(REACT_PASSIVE)) { Milliseconds whirlwindTimer = events.GetTimeUntilEvent(EVENT_SARTURA_WHIRLWIND_END); events.RescheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, whirlwindTimer + 500ms); @@ -213,15 +169,13 @@ struct boss_sartura : public BossAI break; } } + DoMeleeAttackIfReady(); }; + private: - bool whirlwind; bool enraged; bool berserked; - bool aggroReset; - ObjectGuid _savedTargetGUID; - float _savedTargetThreat; }; struct npc_sartura_royal_guard : public ScriptedAI @@ -231,22 +185,19 @@ struct npc_sartura_royal_guard : public ScriptedAI void Reset() override { events.Reset(); - whirlwind = false; - aggroReset = false; - _savedTargetGUID.Clear(); - _savedTargetThreat = 0.f; + + me->SetReactState(REACT_AGGRESSIVE); } void EnterCombat(Unit* /*who*/) override { events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 6s, 10s); - events.ScheduleEvent(EVENT_GUARD_AGGRO_RESET, urand(45000, 55000)); events.ScheduleEvent(EVENT_GUARD_KNOCKBACK, 12s, 16s); } void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (!UpdateVictimWithGaze()) return; events.Update(diff); @@ -256,74 +207,35 @@ struct npc_sartura_royal_guard : public ScriptedAI switch (eventid) { case EVENT_GUARD_WHIRLWIND: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) + { + SetGazeOn(target); + } DoCastSelf(SPELL_GUARD_WHIRLWIND); - whirlwind = true; - events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, urand(3000, 7000)); + events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, 2s, 7s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_END, 8s); break; case EVENT_GUARD_WHIRLWIND_RANDOM: - if (whirlwind == true) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) - { - me->AddThreat(target, 1.0f); - me->TauntApply(target); - AttackStart(target); - } - events.RepeatEvent(urand(3000, 7000)); + SetGazeOn(target); } + events.Repeat(2s, 7s); break; case EVENT_GUARD_WHIRLWIND_END: + me->SetReactState(REACT_AGGRESSIVE); events.CancelEvent(EVENT_GUARD_WHIRLWIND_RANDOM); - whirlwind = false; events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 500ms, 9s); break; - case EVENT_GUARD_AGGRO_RESET: - if (aggroReset == true) - { - if (Unit* originalTarget = SelectTarget(SelectTargetMethod::Random, 0)) - { - _savedTargetGUID = originalTarget->GetGUID(); - _savedTargetThreat = me->GetThreatMgr().GetThreat(originalTarget); - me->GetThreatMgr().ModifyThreatByPercent(originalTarget, -100); - } - aggroReset = true; - events.ScheduleEvent(EVENT_GUARD_AGGRO_RESET_END, 5000); - } - else - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) - { - me->AddThreat(target, 1.0f); - me->TauntApply(target); - AttackStart(target); - } - } - events.RepeatEvent(urand(1000, 2000)); - break; - case EVENT_GUARD_AGGRO_RESET_END: - events.CancelEvent(EVENT_GUARD_AGGRO_RESET); - if (Unit* originalTarget = ObjectAccessor::GetUnit(*me, _savedTargetGUID)) - { - me->GetThreatMgr().AddThreat(originalTarget, _savedTargetThreat); - _savedTargetGUID.Clear(); - } - aggroReset = false; - events.RescheduleEvent(EVENT_GUARD_AGGRO_RESET, urand(30000, 40000)); - break; case EVENT_GUARD_KNOCKBACK: DoCastVictim(SPELL_GUARD_KNOCKBACK); events.Repeat(21s, 37s); break; } } + DoMeleeAttackIfReady(); } - private: - bool whirlwind; - bool aggroReset; - ObjectGuid _savedTargetGUID; - float _savedTargetThreat; }; void AddSC_boss_sartura()