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>2017-07-01 20:18:02 +0200
commite2a1ccd118d129b96e09ff1a15ed0adb1d4a3897 (patch)
treebbe6600c4066078bb7c64a117df457dce0d00b26 /src/server/scripts/Outland
parent5879eb2198fdb976b9fff136757bf8187adb6cf0 (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.
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.cpp10
-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.cpp28
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp21
-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 c97fa51a502..a6340227270 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 f0a47bd8604..5a2278ab48b 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
@@ -110,15 +110,13 @@ 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)
+ for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList())
{
- if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()))
- if (target->GetTypeId() == TYPEID_PLAYER)
- me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
+ if (Player* target = ref->GetVictim()->ToPlayer())
+ me->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
}
- DoResetThreat();
+ 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 896deca41f7..edaab7cd9cb 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
@@ -156,16 +156,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 085ea796f05..037eaa82d99 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_gurtogg_bloodboil.cpp
@@ -218,7 +218,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);
@@ -294,9 +294,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 a7bfbf317c3..1b450a352be 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 e2ec4990ccd..c84a3504f61 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:
uint32 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 4061eed85ec..67ed253f247 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;
@@ -337,16 +337,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 c9727c196ef..5d9ed583fd6 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
@@ -292,7 +292,7 @@ public:
MarkOfHydross_Count = 0;
Talk(SAY_SWITCH_TO_CLEAN);
- DoResetThreat();
+ ResetThreatList();
SummonBeams();
// spawn 4 adds
@@ -376,7 +376,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 e8259aa34dd..c82dd2e4646 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp
@@ -355,7 +355,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;
@@ -439,11 +438,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;
@@ -691,7 +689,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 ced4aeb9fd3..36963a137c2 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
@@ -132,7 +132,7 @@ public:
if (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID())
{
damage = 0;
- DoModifyThreatPercent(done_by, -100);
+ ModifyThreatByPercent(done_by, -100);
}
}
@@ -150,11 +150,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())
{
@@ -335,7 +335,7 @@ public:
Unit* victim = nullptr;
victim = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LEOTHERAS_EVENT_STARTER));
if (victim)
- me->getThreatManager().addThreat(victim, 1);
+ AddThreat(victim, 1);
StartEvent();
}
}
@@ -387,7 +387,7 @@ public:
if (unit_target && unit_target->IsAlive())
{
unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true);
- DoModifyThreatPercent(unit_target, -100);
+ ModifyThreatByPercent(unit_target, -100);
}
}
}
@@ -442,7 +442,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());
}
@@ -460,7 +460,7 @@ public:
Whirlwind_Timer = 15000;
NeedThreatReset = false;
- DoResetThreat();
+ ResetThreatList();
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveChase(me->GetVictim());
}
@@ -526,16 +526,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 e93ea5e7ec9..cbcf43c3aed 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -229,9 +229,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;
}
@@ -361,7 +361,7 @@ public:
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 4d65803a7cd..f6ad97f6328 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_gruul.cpp
@@ -206,7 +206,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 b3aafe004a6..57423f63ab0 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -249,7 +249,7 @@ public:
if (me->Attack(who, true))
{
- me->AddThreat(who, 0.0f);
+ AddThreat(who, 0.0f);
me->SetInCombatWith(who);
who->SetInCombatWith(me);
@@ -558,17 +558,14 @@ public:
//BlastWave_Timer
if (BlastWave_Timer <= diff)
{
- Unit* target = nullptr;
- 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 = nullptr;
}
+ 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 ecfecf2073e..88cf3e61bc7 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
@@ -142,7 +142,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 967e01a5cef..8d181927fb4 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
@@ -345,8 +345,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 4e891c9ba7a..9b683770be0 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp
@@ -211,7 +211,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)
@@ -328,7 +328,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 78ba67004bc..d3aa6b7e1fa 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
@@ -413,11 +413,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);
}
}
}
@@ -563,7 +563,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());
}
}
@@ -624,7 +624,7 @@ class boss_kaelthas : public CreatureScript
me->RemoveFlag(UNIT_FIELD_FLAGS, 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);
@@ -709,7 +709,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->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
@@ -909,7 +909,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
@@ -932,8 +932,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;
}
@@ -1092,7 +1092,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);
@@ -1142,12 +1142,10 @@ class boss_grand_astromancer_capernian : public CreatureScript
{
bool InMeleeRange = false;
Unit* target = nullptr;
- ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList();
- for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i!= threatlist.end(); ++i)
+ 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;
@@ -1422,7 +1420,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 962228a215a..e583463d7d4 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,13 @@ class boss_void_reaver : public CreatureScript
break;
case EVENT_ARCANE_ORB:
{
- Unit* target = nullptr;
- 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)
- {
- target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
- if (!target)
- continue;
- // exclude pets & totems, 18 yard radius minimum
- if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false))
- target_list.push_back(target);
- target = nullptr;
- }
+ for (auto* ref : me->GetThreatManager().GetUnsortedThreatList())
+ if (Player* target = ref->GetVictim()->ToPlayer())
+ if (target->IsAlive() && !target->IsWithinDist(me, 18, false))
+ target_list.push_back(target);
+ Unit* target;
if (!target_list.empty())
target = *(target_list.begin() + rand32() % target_list.size());
else
@@ -139,8 +132,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 1cbb522552c..fb2361f2837 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp
@@ -79,16 +79,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 15f70ada7a7..e5f9e43711a 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -215,7 +215,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 d571c155dbe..7954efd9a61 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -117,7 +117,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 7c80a20aba9..7b6bed80c8a 100644
--- a/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
+++ b/src/server/scripts/Outland/zone_hellfire_peninsula.cpp
@@ -99,7 +99,7 @@ public:
me->SetFaction(FACTION_FRIENDLY);
me->SetFlag(UNIT_NPC_FLAGS, 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->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
@@ -996,7 +996,7 @@ public:
case EVENT_ATTACK:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
me->SetFaction(FACTION_MONSTER_2);
- me->CombatStart(ObjectAccessor::GetPlayer(*me, _playerGUID));
+ me->EngageWithTarget(ObjectAccessor::GetPlayer(*me, _playerGUID));
_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 8f8fc39a2b3..6fcf5c37004 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 9e89c34fe72..d7f9ff9e4bd 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 1ccb7950fa0..758db799ea4 100644
--- a/src/server/scripts/Outland/zone_terokkar_forest.cpp
+++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp
@@ -97,7 +97,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;
}