mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-08 15:58:04 +00:00
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:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user