aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Outland
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-07-01 20:18:02 +0200
committerShauren <shauren.trinity@gmail.com>2020-08-13 22:46:44 +0200
commit8be23fcbbdf26e8169defd761e61765f301bebe0 (patch)
tree6309b79f7dd617a8ddc801624dbbd4ed7ac22174 /src/server/scripts/Outland
parent2c99678118798279372f17d4bb5f5a88ac95c413 (diff)
[3.3.5] Combat/Threat rewrite - prep & refactor (#19966)
* Combat/Threat rewrite (PR #19930) prep work. Mostly refactors, and a compatibility layer on ThreatManager/HostileReference that allows scripts to be changed already. (cherry picked from commit e2a1ccd118d129b96e09ff1a15ed0adb1d4a3897)
Diffstat (limited to 'src/server/scripts/Outland')
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp2
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp14
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp11
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp6
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp9
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp13
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp8
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp4
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp10
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp29
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp6
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_gruul.cpp2
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp13
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp30
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp15
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp15
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp1
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp2
-rw-r--r--src/server/scripts/Outland/zone_hellfire_peninsula.cpp6
-rw-r--r--src/server/scripts/Outland/zone_netherstorm.cpp15
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp8
-rw-r--r--src/server/scripts/Outland/zone_terokkar_forest.cpp2
25 files changed, 94 insertions, 137 deletions
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
index 57d6bfcbad3..29e68fa8751 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
@@ -101,7 +101,7 @@ public:
if (IsHeroic())
DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_POLYMORPH);
else
- DoCast(SelectTarget(SELECT_TARGET_TOPAGGRO, 1), SPELL_POLYMORPH);
+ DoCast(SelectTarget(SELECT_TARGET_MAXTHREAT, 1), SPELL_POLYMORPH);
events.ScheduleEvent(EVENT_POLYMORPH, urand(15000, 17500));
break;
case EVENT_ARCANE_VOLLEY:
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
index 52e81448d42..c5e8f9fbba8 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp
@@ -109,15 +109,11 @@ class boss_blackheart_the_inciter : public CreatureScript
{
DoCast(me, SPELL_INCITE_CHAOS);
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
- {
- if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
- if (target->GetTypeId() == TYPEID_PLAYER)
- me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
- }
-
- DoResetThreat();
+ for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList())
+ if (ref->GetVictim()->GetTypeId() == TYPEID_PLAYER)
+ me->CastSpell(ref->GetVictim(), SPELL_INCITE_CHAOS_B, true);
+
+ ResetThreatList();
events.ScheduleEvent(EVENT_INCITE_CHAOS, 40000);
break;
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
index 99abd0be016..cca3a86ddb7 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
@@ -155,16 +155,7 @@ class boss_murmur : public CreatureScript
return;
if (!me->IsWithinMeleeRange(me->GetVictim()))
- {
- ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
- if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()))
- if (me->IsWithinMeleeRange(target))
- {
- me->TauntApply(target);
- break;
- }
- }
+ me->GetThreatManager().ResetThreat(me->GetVictim());
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp
index 6f23709103a..ba8ded29f51 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp
@@ -219,7 +219,7 @@ public:
if (Unit* oldTarget = me->GetVictim())
{
_oldTargetGUID = oldTarget->GetGUID();
- _oldThreat = DoGetThreat(oldTarget);
+ _oldThreat = GetThreat(oldTarget);
}
_targetGUID = target->GetGUID();
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
@@ -295,9 +295,9 @@ public:
if (Unit* oldTarget = ObjectAccessor::GetUnit(*me, _oldTargetGUID))
if (Unit* currentTarget = ObjectAccessor::GetUnit(*me, _targetGUID))
{
- DoModifyThreatPercent(currentTarget, -100);
+ ModifyThreatByPercent(currentTarget, -100);
AttackStart(oldTarget);
- me->AddThreat(oldTarget, _oldThreat);
+ AddThreat(oldTarget, _oldThreat);
Initialize();
}
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 1080e6c1ca9..f638bf8149d 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -539,10 +539,7 @@ public:
BossAI::JustSummoned(summon);
if (summon->GetEntry() == NPC_ILLIDARI_ELITE)
if (Creature* akama = instance->GetCreature(DATA_AKAMA))
- {
- summon->CombatStart(akama);
- summon->AddThreat(akama, 1000.0f);
- }
+ AddThreat(akama, 1000.0f, summon);
}
void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
@@ -939,7 +936,7 @@ public:
events.ScheduleEvent(EVENT_SCHEDULE_DEMON_SPELLS, Seconds(15));
break;
case EVENT_SCHEDULE_DEMON_SPELLS:
- DoResetThreat();
+ ResetThreatList();
ScheduleEvents(GROUP_PHASE_DEMON, GROUP_PHASE_DEMON);
break;
case EVENT_DEMON_TEXT:
@@ -948,7 +945,7 @@ public:
case EVENT_RESUME_COMBAT_DEMON:
{
uint8 group = _phase == PHASE_3 ? GROUP_PHASE_3 : GROUP_PHASE_4;
- DoResetThreat();
+ ResetThreatList();
ScheduleEvents(group, group);
me->LoadEquipment(1, true);
break;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index 8a7b782baf2..789ba19fa5b 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
@@ -116,7 +116,7 @@ public:
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true);
DoCast(SPELL_SNARE_SELF);
}
- DoResetThreat();
+ ResetThreatList();
DoZoneInCombat();
events.ScheduleEvent(EVENT_SWITCH_PHASE, Seconds(60));
}
@@ -126,11 +126,10 @@ public:
uint64 health = 0;
Unit* target = nullptr;
- ThreatContainer::StorageType threatList = me->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- if (unit && me->IsWithinMeleeRange(unit))
+ Unit* unit = ref->GetVictim();
+ if (me->IsWithinMeleeRange(unit))
{
if (unit->GetHealth() > health)
{
@@ -162,8 +161,8 @@ public:
case EVENT_SWITCH_TARGET:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
{
- DoResetThreat();
- me->AddThreat(target, 1000000.0f);
+ ResetThreatList();
+ AddThreat(target, 1000000.0f);
DoCast(target, SPELL_CHARGE);
Talk(EMOTE_NEW_TARGET);
}
diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
index acacdfddc38..bdbc067ae92 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
@@ -193,7 +193,7 @@ public:
events.Repeat(Seconds(30), Seconds(40));
break;
case EVENT_SHADOW_DEATH:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, -SPELL_SPIRITUAL_VENGEANCE))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE))
DoCast(target, SPELL_SHADOW_OF_DEATH);
events.Repeat(Seconds(30), Seconds(35));
break;
@@ -338,16 +338,16 @@ public:
{
if (Creature* teron = _instance->GetCreature(DATA_TERON_GOREFIEND))
{
- Unit* target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_SPIRITUAL_VENGEANCE);
+ Unit* target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_SPIRITUAL_VENGEANCE);
// He should target Vengeful Spirits only if has no other player available
if (!target)
target = teron->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0);
if (target)
{
- DoResetThreat();
+ ResetThreatList();
AttackStart(target);
- me->AddThreat(target, 1000000.0f);
+ AddThreat(target, 1000000.0f);
targetGUID = target->GetGUID();
}
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index 7ac9ad71a8e..d5ef10dda82 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -293,7 +293,7 @@ public:
MarkOfHydross_Count = 0;
Talk(SAY_SWITCH_TO_CLEAN);
- DoResetThreat();
+ ResetThreatList();
SummonBeams();
// spawn 4 adds
@@ -377,7 +377,7 @@ public:
CorruptedForm = true;
Talk(SAY_SWITCH_TO_CORRUPT);
- DoResetThreat();
+ ResetThreatList();
DeSummonBeams();
// spawn 4 adds
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
index ba563eb252f..f90d9e27604 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -348,7 +348,6 @@ public:
// Shock Burst
// Randomly used in Phases 1 and 3 on Vashj's target, it's a Shock spell doing 8325-9675 nature damage and stunning the target for 5 seconds, during which she will not attack her target but switch to the next person on the aggro list.
DoCastVictim(SPELL_SHOCK_BLAST);
- me->TauntApply(me->GetVictim());
ShockBlastTimer = 1000 + rand32() % 14000; // random cooldown
} else ShockBlastTimer -= diff;
@@ -432,11 +431,10 @@ public:
if (CheckTimer <= diff)
{
bool inMeleeRange = false;
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- if (target && target->IsWithinDistInMap(me, 5)) // if in melee range
+ Unit* target = ref->GetVictim();
+ if (target->IsWithinMeleeRange(me)) // if in melee range
{
inMeleeRange = true;
break;
@@ -684,7 +682,7 @@ public:
void EnterCombat(Unit* who) override
{
- me->AddThreat(who, 0.1f);
+ AddThreat(who, 0.1f);
}
void UpdateAI(uint32 diff) override
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
index d9759343bc7..fabc91da4c7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp
@@ -131,7 +131,7 @@ public:
if (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID())
{
damage = 0;
- DoModifyThreatPercent(done_by, -100);
+ ModifyThreatByPercent(done_by, -100);
}
}
@@ -149,11 +149,11 @@ public:
if (me->EnsureVictim()->GetGUID() != victimGUID)
{
- DoModifyThreatPercent(me->GetVictim(), -100);
+ ModifyThreatByPercent(me->GetVictim(), -100);
Unit* owner = ObjectAccessor::GetUnit(*me, victimGUID);
if (owner && owner->IsAlive())
{
- me->AddThreat(owner, 999999);
+ AddThreat(owner, 999999);
AttackStart(owner);
} else if (owner && owner->isDead())
{
@@ -334,7 +334,7 @@ public:
Unit* victim = NULL;
victim = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LEOTHERAS_EVENT_STARTER));
if (victim)
- me->getThreatManager().addThreat(victim, 1);
+ AddThreat(victim, 1);
StartEvent();
}
}
@@ -386,7 +386,7 @@ public:
if (unit_target && unit_target->IsAlive())
{
unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true);
- DoModifyThreatPercent(unit_target, -100);
+ ModifyThreatByPercent(unit_target, -100);
}
}
}
@@ -440,7 +440,7 @@ public:
Unit* newTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
if (newTarget)
{
- DoResetThreat();
+ ResetThreatList();
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MovePoint(0, newTarget->GetPositionX(), newTarget->GetPositionY(), newTarget->GetPositionZ());
}
@@ -458,7 +458,7 @@ public:
Whirlwind_Timer = 15000;
NeedThreatReset = false;
- DoResetThreat();
+ ResetThreatList();
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveChase(me->GetVictim());
}
@@ -524,16 +524,17 @@ public:
//Summon Inner Demon
if (InnerDemons_Timer <= diff)
{
- ThreatContainer::StorageType const & ThreatList = me->getThreatManager().getThreatList();
- std::vector<Unit*> TargetList;
- for (ThreatContainer::StorageType::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr)
+ ThreatManager const& mgr = me->GetThreatManager();
+ std::list<Unit*> TargetList;
+ Unit* currentVictim = mgr.GetCurrentVictim();
+ for (ThreatReference* ref : mgr.GetSortedThreatList())
{
- Unit* tempTarget = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- if (tempTarget && tempTarget->GetTypeId() == TYPEID_PLAYER && tempTarget->GetGUID() != me->EnsureVictim()->GetGUID() && TargetList.size()<5)
- TargetList.push_back(tempTarget);
+ if (Player* tempTarget = ref->GetVictim()->ToPlayer())
+ if (tempTarget != currentVictim && TargetList.size()<5)
+ TargetList.push_back(tempTarget);
}
//SpellInfo* spell = GET_SPELL(SPELL_INSIDIOUS_WHISPER);
- for (std::vector<Unit*>::const_iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
+ for (auto itr = TargetList.begin(), end = TargetList.end(); itr != end; ++itr)
{
if ((*itr) && (*itr)->IsAlive())
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 75713f960a3..ead7069e962 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -228,9 +228,9 @@ public:
return;
}
- if (me->getThreatManager().getThreatList().empty()) // check if should evade
+ if (!me->IsThreatened()) // check if should evade
{
- if (me->IsInCombat())
+ if (me->IsEngaged())
EnterEvadeMode();
return;
}
@@ -344,7 +344,7 @@ public:
return;
} else PhaseTimer-=diff;
- if (me->getThreatManager().getThreatList().empty()) // check if should evade
+ if (!me->IsThreatened()) // check if should evade
{
EnterEvadeMode();
return;
diff --git a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
index 980cdce1bc8..87401815f53 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
@@ -205,7 +205,7 @@ class boss_gruul : public CreatureScript
// Hurtful Strike
if (m_uiHurtfulStrike_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
+ Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 1);
if (target && me->IsWithinMeleeRange(me->GetVictim()))
DoCast(target, SPELL_HURTFUL_STRIKE);
diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index a6c70e6b0f1..704350ce89d 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -248,7 +248,7 @@ public:
if (me->Attack(who, true))
{
- me->AddThreat(who, 0.0f);
+ AddThreat(who, 0.0f);
me->SetInCombatWith(who);
who->SetInCombatWith(me);
@@ -557,17 +557,14 @@ public:
//BlastWave_Timer
if (BlastWave_Timer <= diff)
{
- Unit* target = NULL;
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
std::vector<Unit*> target_list;
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- //15 yard radius minimum
- if (target && target->IsWithinDist(me, 15, false))
+ Unit* target = ref->GetVictim();
+ if (target && target->IsWithinDist(me, 15, false)) // 15 yard radius minimum
target_list.push_back(target);
- target = NULL;
}
+ Unit* target = nullptr;
if (!target_list.empty())
target = *(target_list.begin() + rand32() % target_list.size());
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 858705111b0..5b2c6d1f6f8 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -141,7 +141,7 @@ class boss_nazan : public CreatureScript
me->SetDisableGravity(false);
me->SetWalk(true);
me->GetMotionMaster()->Clear();
- if (Unit* victim = SelectTarget(SELECT_TARGET_NEAREST, 0))
+ if (Unit* victim = SelectTarget(SELECT_TARGET_MINDISTANCE, 0))
AttackStart(victim);
DoStartMovement(me->GetVictim());
Talk(EMOTE);
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
index eea4b8d15f3..70aecff5f91 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
@@ -344,8 +344,8 @@ class boss_warbringer_omrogg : public CreatureScript
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
DoYellForThreat();
- DoResetThreat();
- me->AddThreat(target, 0.0f);
+ ResetThreatList();
+ AddThreat(target, 0.0f);
}
ResetThreat_Timer = 25000 + rand32() % 15000;
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
index 59e48cb078b..9061f36d8bf 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -210,7 +210,7 @@ class boss_alar : public CreatureScript
void UpdateAI(uint32 diff) override
{
- if (!me->IsInCombat()) // sometimes IsInCombat but !incombat, faction bug?
+ if (!me->IsEngaged())
return;
if (Berserk_Timer <= diff)
@@ -327,7 +327,7 @@ class boss_alar : public CreatureScript
if (Phase1)
{
- if (me->getThreatManager().getThreatList().empty())
+ if (!me->IsThreatened())
{
EnterEvadeMode();
return;
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
index ab5480e8b5f..d09fa536cc3 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
@@ -410,11 +410,11 @@ struct advisorbase_ai : public ScriptedAI
if (!Target)
Target = me->GetVictim();
- DoResetThreat();
+ ResetThreatList();
AttackStart(Target);
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveChase(Target);
- me->AddThreat(Target, 0.0f);
+ AddThreat(Target, 0.0f);
}
}
}
@@ -560,7 +560,7 @@ class boss_kaelthas : public CreatureScript
{
DoAction(ACTION_START_ENCOUNTER);
who->SetInCombatWith(me);
- me->AddThreat(who, 0.0f);
+ AddThreat(who, 0.0f);
me->SetTarget(who->GetGUID());
}
}
@@ -621,7 +621,7 @@ class boss_kaelthas : public CreatureScript
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAurasDueToSpell(SPELL_FULLPOWER);
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 0))
AttackStart(target);
DoAction(ACTION_SCHEDULE_COMBAT_EVENTS);
@@ -706,7 +706,7 @@ class boss_kaelthas : public CreatureScript
Talk(SAY_PHASE4_INTRO2);
// Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael.
- DoResetThreat();
+ ResetThreatList();
me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED));
@@ -906,7 +906,7 @@ class boss_thaladred_the_darkener : public CreatureScript
void EnterCombat(Unit* who) override
{
Talk(SAY_THALADRED_AGGRO);
- me->AddThreat(who, 5000000.0f);
+ AddThreat(who, 5000000.0f);
}
void JustDied(Unit* killer) override
@@ -929,8 +929,8 @@ class boss_thaladred_the_darkener : public CreatureScript
{
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
- DoResetThreat();
- me->AddThreat(target, 5000000.0f);
+ ResetThreatList();
+ AddThreat(target, 5000000.0f);
Talk(EMOTE_THALADRED_GAZE, target);
Gaze_Timer = 8500;
}
@@ -1089,7 +1089,7 @@ class boss_grand_astromancer_capernian : public CreatureScript
if (me->Attack(who, true))
{
- me->AddThreat(who, 0.0f);
+ AddThreat(who, 0.0f);
me->SetInCombatWith(who);
who->SetInCombatWith(me);
@@ -1137,13 +1137,11 @@ class boss_grand_astromancer_capernian : public CreatureScript
if (ArcaneExplosion_Timer <= diff)
{
bool InMeleeRange = false;
- Unit* target = NULL;
- ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i!= threatlist.end(); ++i)
+ Unit* target = nullptr;
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid());
- //if in melee range
- if (unit && unit->IsWithinDistInMap(me, 5))
+ Unit* unit = ref->GetVictim();
+ if (unit->IsWithinMeleeRange(me))
{
InMeleeRange = true;
target = unit;
@@ -1418,7 +1416,7 @@ class npc_phoenix_egg_tk : public CreatureScript
void JustSummoned(Creature* summoned) override
{
- summoned->AddThreat(me->GetVictim(), 0.0f);
+ AddThreat(me->GetVictim(), 0.0f, summoned);
summoned->CastSpell(summoned, SPELL_REBIRTH, false);
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index 3ca0d959f79..8886740ff1b 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -111,20 +111,15 @@ class boss_void_reaver : public CreatureScript
break;
case EVENT_ARCANE_ORB:
{
- Unit* target = NULL;
- std::list<HostileReference*> t_list = me->getThreatManager().getThreatList();
std::vector<Unit*> target_list;
- for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- if (!target)
- continue;
- // exclude pets & totems, 18 yard radius minimum
+ Unit* target = ref->GetVictim();
if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false))
target_list.push_back(target);
- target = NULL;
}
+ Unit* target;
if (!target_list.empty())
target = *(target_list.begin() + rand32() % target_list.size());
else
@@ -139,8 +134,8 @@ class boss_void_reaver : public CreatureScript
case EVENT_KNOCK_AWAY:
DoCastVictim(SPELL_KNOCK_AWAY);
// Drop 25% aggro
- if (DoGetThreat(me->GetVictim()))
- DoModifyThreatPercent(me->GetVictim(), -25);
+ if (GetThreat(me->GetVictim()))
+ ModifyThreatByPercent(me->GetVictim(), -25);
events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000);
break;
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
index d8775fa71df..9dd6bc36fb9 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
@@ -78,16 +78,11 @@ class npc_crystalcore_devastator : public CreatureScript
//Knockaway_Timer
if (Knockaway_Timer <= diff)
{
- DoCastVictim(SPELL_KNOCKAWAY, true);
-
- // current aggro target is knocked away pick new target
- Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0);
-
- if (!target || target == me->GetVictim())
- target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1);
-
- if (target)
- me->TauntApply(target);
+ if (Unit* victim = me->GetVictim())
+ {
+ DoCastVictim(SPELL_KNOCKAWAY, true);
+ me->GetThreatManager().ResetThreat(victim);
+ }
Knockaway_Timer = 23000;
}
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
index 2a68ebd1ef6..a3d1fa9ee55 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -214,7 +214,6 @@ class npc_ragin_flames : public CreatureScript
if (inferno_Timer <= diff)
{
DoCastVictim(SPELL_INFERNO);
- me->TauntApply(me->GetVictim());
inferno_Timer = 10000;
} else inferno_Timer -= diff;
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index 3b4f22bc23c..eafd1f679f4 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -116,7 +116,7 @@ class npc_millhouse_manastorm : public CreatureScript
{
if (me->Attack(who, true))
{
- me->AddThreat(who, 0.0f);
+ AddThreat(who, 0.0f);
me->SetInCombatWith(who);
who->SetInCombatWith(me);
me->GetMotionMaster()->MoveChase(who, 25.0f);
diff --git a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
index ab8b16468ae..6c499d8a280 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -98,7 +98,7 @@ public:
me->SetFaction(FACTION_FRIENDLY);
me->AddNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
me->RemoveAllAuras();
- me->DeleteThreatList();
+ me->GetThreatManager().ClearAllThreat();
me->CombatStop(true);
Talk(SAY_FREE);
return;
@@ -971,7 +971,7 @@ public:
_events.Reset();
me->RestoreFaction();
me->RemoveAllAuras();
- me->DeleteThreatList();
+ me->GetThreatManager().ClearAllThreat();
me->CombatStop(true);
me->AddNpcFlag(UNIT_NPC_FLAG_QUESTGIVER);
me->AddUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
@@ -997,7 +997,7 @@ public:
me->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
me->SetFaction(FACTION_MONSTER_2);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
- me->CombatStart(player);
+ me->EngageWithTarget(player);
_events.ScheduleEvent(EVENT_FIREBALL, 1);
_events.ScheduleEvent(EVENT_FROSTNOVA, Seconds(5));
break;
diff --git a/src/server/scripts/Outland/zone_netherstorm.cpp b/src/server/scripts/Outland/zone_netherstorm.cpp
index 6b74490e9dd..462178d2bb0 100644
--- a/src/server/scripts/Outland/zone_netherstorm.cpp
+++ b/src/server/scripts/Outland/zone_netherstorm.cpp
@@ -431,21 +431,14 @@ public:
// some code to cast spell Mana Burn on random target which has mana
if (ManaBurnTimer <= diff)
{
- std::list<HostileReference*> AggroList = me->getThreatManager().getThreatList();
std::list<Unit*> UnitsWithMana;
-
- for (std::list<HostileReference*>::const_iterator itr = AggroList.begin(); itr != AggroList.end(); ++itr)
- {
- if (Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
- {
- if (unit->GetCreateMana() > 0)
- UnitsWithMana.push_back(unit);
- }
- }
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
+ if (ref->GetVictim()->GetPower(POWER_MANA))
+ UnitsWithMana.push_back(ref->GetVictim());
if (!UnitsWithMana.empty())
{
DoCast(Trinity::Containers::SelectRandomContainerElement(UnitsWithMana), SPELL_MANA_BURN);
- ManaBurnTimer = 8000 + (rand32() % 10 * 1000); // 8-18 sec cd
+ ManaBurnTimer = urand(8000, 18000); // 8-18 sec cd
}
else
ManaBurnTimer = 3500;
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index a44dedb56ca..8520b43e8b4 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -398,13 +398,11 @@ public:
Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 50);
if (Dragonmaw)
{
- me->AddThreat(Dragonmaw, 100000.0f);
+ AddThreat(Dragonmaw, 100000.0f);
AttackStart(Dragonmaw);
}
- HostileReference* ref = me->getThreatManager().getOnlineContainer().getReferenceByTarget(caster);
- if (ref)
- ref->removeReference();
+ me->GetThreatManager().ClearThreat(caster);
}
}
@@ -908,7 +906,7 @@ public:
if (Player* AggroTarget = ObjectAccessor::GetPlayer(*me, AggroTargetGUID))
{
me->SetTarget(AggroTarget->GetGUID());
- me->AddThreat(AggroTarget, 1);
+ AddThreat(AggroTarget, 1);
me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
}
break;
diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp
index cb3666e6261..5772c5c1a0e 100644
--- a/src/server/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
@@ -96,7 +96,7 @@ public:
me->SetFaction(FACTION_FRIENDLY);
me->SetStandState(UNIT_STAND_STATE_SIT);
me->RemoveAllAuras();
- me->DeleteThreatList();
+ me->GetThreatManager().ClearAllThreat();
me->CombatStop(true);
UnkorUnfriendly_Timer = 60000;
}