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 <nefertum.dev@protonmail.com>
This commit is contained in:
UltraNix
2022-10-16 21:58:00 +02:00
committed by GitHub
parent 33cba08f50
commit 63ac0fd5d9

View File

@@ -34,7 +34,6 @@ enum Spells
SPELL_ENRAGE = 8269, SPELL_ENRAGE = 8269,
SPELL_BERSERK = 27680, SPELL_BERSERK = 27680,
SPELL_SUNDERING_CLEAVE = 25174, SPELL_SUNDERING_CLEAVE = 25174,
// Sartura's Royal Guard // Sartura's Royal Guard
SPELL_GUARD_WHIRLWIND = 26038, SPELL_GUARD_WHIRLWIND = 26038,
SPELL_GUARD_KNOCKBACK = 26027 SPELL_GUARD_KNOCKBACK = 26027
@@ -44,20 +43,15 @@ enum events
{ {
// Battleguard Sartura // Battleguard Sartura
EVENT_SARTURA_WHIRLWIND = 1, EVENT_SARTURA_WHIRLWIND = 1,
EVENT_SARTURA_WHIRLWIND_RANDOM = 2, EVENT_SARTURA_WHIRLWIND_RANDOM,
EVENT_SARTURA_WHIRLWIND_END = 3, EVENT_SARTURA_WHIRLWIND_END,
EVENT_SPELL_BERSERK = 4, EVENT_SPELL_BERSERK,
EVENT_SARTURA_AGGRO_RESET = 5, EVENT_SARTURA_SUNDERING_CLEAVE,
EVENT_SARTURA_AGGRO_RESET_END = 6,
EVENT_SARTURA_SUNDERING_CLEAVE = 7,
// Sartura's Royal Guard // Sartura's Royal Guard
EVENT_GUARD_WHIRLWIND = 8, EVENT_GUARD_WHIRLWIND,
EVENT_GUARD_WHIRLWIND_RANDOM = 9, EVENT_GUARD_WHIRLWIND_RANDOM,
EVENT_GUARD_WHIRLWIND_END = 10, EVENT_GUARD_WHIRLWIND_END,
EVENT_GUARD_KNOCKBACK = 11, EVENT_GUARD_KNOCKBACK,
EVENT_GUARD_AGGRO_RESET = 12,
EVENT_GUARD_AGGRO_RESET_END = 13
}; };
struct boss_sartura : public BossAI struct boss_sartura : public BossAI
@@ -74,13 +68,11 @@ struct boss_sartura : public BossAI
void Reset() override void Reset() override
{ {
_Reset(); _Reset();
whirlwind = false;
enraged = false; enraged = false;
berserked = false; berserked = false;
aggroReset = false;
MinionReset(); MinionReset();
_savedTargetGUID.Clear();
_savedTargetThreat = 0.f; me->SetReactState(REACT_AGGRESSIVE);
} }
void MinionReset() void MinionReset()
@@ -98,8 +90,7 @@ struct boss_sartura : public BossAI
BossAI::EnterCombat(who); BossAI::EnterCombat(who);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 12s, 22s); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 12s, 22s);
events.ScheduleEvent(EVENT_SARTURA_AGGRO_RESET, urand(45000, 55000)); events.ScheduleEvent(EVENT_SPELL_BERSERK, 10min);
events.ScheduleEvent(EVENT_SPELL_BERSERK, 10 * 60000);
events.ScheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, 2400ms, 3s); events.ScheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, 2400ms, 3s);
} }
@@ -125,7 +116,7 @@ struct boss_sartura : public BossAI
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (!UpdateVictimWithGaze())
return; return;
events.Update(diff); events.Update(diff);
@@ -135,61 +126,26 @@ struct boss_sartura : public BossAI
switch (eventId) switch (eventId)
{ {
case EVENT_SARTURA_WHIRLWIND: case EVENT_SARTURA_WHIRLWIND:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true))
{
SetGazeOn(target);
}
DoCastSelf(SPELL_WHIRLWIND, true); DoCastSelf(SPELL_WHIRLWIND, true);
whirlwind = true; events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, 2s, 7s);
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, urand(3000, 7000)); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_END, 15s);
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_END, 15000);
break; break;
case EVENT_SARTURA_WHIRLWIND_RANDOM: 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)) SetGazeOn(target);
{
me->AddThreat(target, 1.0f);
me->TauntApply(target);
AttackStart(target);
}
events.RepeatEvent(urand(3000, 7000));
} }
events.Repeat(2s, 7s);
break; break;
case EVENT_SARTURA_WHIRLWIND_END: case EVENT_SARTURA_WHIRLWIND_END:
me->SetReactState(REACT_AGGRESSIVE);
events.CancelEvent(EVENT_SARTURA_WHIRLWIND_RANDOM); events.CancelEvent(EVENT_SARTURA_WHIRLWIND_RANDOM);
whirlwind = false;
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 5s, 11s); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 5s, 11s);
break; 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: case EVENT_SPELL_BERSERK:
if (!berserked) if (!berserked)
{ {
@@ -198,7 +154,7 @@ struct boss_sartura : public BossAI
} }
break; break;
case EVENT_SARTURA_SUNDERING_CLEAVE: case EVENT_SARTURA_SUNDERING_CLEAVE:
if (whirlwind) if (me->HasReactState(REACT_PASSIVE))
{ {
Milliseconds whirlwindTimer = events.GetTimeUntilEvent(EVENT_SARTURA_WHIRLWIND_END); Milliseconds whirlwindTimer = events.GetTimeUntilEvent(EVENT_SARTURA_WHIRLWIND_END);
events.RescheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, whirlwindTimer + 500ms); events.RescheduleEvent(EVENT_SARTURA_SUNDERING_CLEAVE, whirlwindTimer + 500ms);
@@ -213,15 +169,13 @@ struct boss_sartura : public BossAI
break; break;
} }
} }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
}; };
private: private:
bool whirlwind;
bool enraged; bool enraged;
bool berserked; bool berserked;
bool aggroReset;
ObjectGuid _savedTargetGUID;
float _savedTargetThreat;
}; };
struct npc_sartura_royal_guard : public ScriptedAI struct npc_sartura_royal_guard : public ScriptedAI
@@ -231,22 +185,19 @@ struct npc_sartura_royal_guard : public ScriptedAI
void Reset() override void Reset() override
{ {
events.Reset(); events.Reset();
whirlwind = false;
aggroReset = false; me->SetReactState(REACT_AGGRESSIVE);
_savedTargetGUID.Clear();
_savedTargetThreat = 0.f;
} }
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* /*who*/) override
{ {
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 6s, 10s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 6s, 10s);
events.ScheduleEvent(EVENT_GUARD_AGGRO_RESET, urand(45000, 55000));
events.ScheduleEvent(EVENT_GUARD_KNOCKBACK, 12s, 16s); events.ScheduleEvent(EVENT_GUARD_KNOCKBACK, 12s, 16s);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictim()) if (!UpdateVictimWithGaze())
return; return;
events.Update(diff); events.Update(diff);
@@ -256,74 +207,35 @@ struct npc_sartura_royal_guard : public ScriptedAI
switch (eventid) switch (eventid)
{ {
case EVENT_GUARD_WHIRLWIND: case EVENT_GUARD_WHIRLWIND:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true))
{
SetGazeOn(target);
}
DoCastSelf(SPELL_GUARD_WHIRLWIND); DoCastSelf(SPELL_GUARD_WHIRLWIND);
whirlwind = true; events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, 2s, 7s);
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, urand(3000, 7000));
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_END, 8s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_END, 8s);
break; break;
case EVENT_GUARD_WHIRLWIND_RANDOM: 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)) SetGazeOn(target);
{
me->AddThreat(target, 1.0f);
me->TauntApply(target);
AttackStart(target);
}
events.RepeatEvent(urand(3000, 7000));
} }
events.Repeat(2s, 7s);
break; break;
case EVENT_GUARD_WHIRLWIND_END: case EVENT_GUARD_WHIRLWIND_END:
me->SetReactState(REACT_AGGRESSIVE);
events.CancelEvent(EVENT_GUARD_WHIRLWIND_RANDOM); events.CancelEvent(EVENT_GUARD_WHIRLWIND_RANDOM);
whirlwind = false;
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 500ms, 9s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 500ms, 9s);
break; 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: case EVENT_GUARD_KNOCKBACK:
DoCastVictim(SPELL_GUARD_KNOCKBACK); DoCastVictim(SPELL_GUARD_KNOCKBACK);
events.Repeat(21s, 37s); events.Repeat(21s, 37s);
break; break;
} }
} }
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
private:
bool whirlwind;
bool aggroReset;
ObjectGuid _savedTargetGUID;
float _savedTargetThreat;
}; };
void AddSC_boss_sartura() void AddSC_boss_sartura()