diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2017-07-01 20:18:02 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-07-01 20:18:02 +0200 |
| commit | e2a1ccd118d129b96e09ff1a15ed0adb1d4a3897 (patch) | |
| tree | bbe6600c4066078bb7c64a117df457dce0d00b26 /src/server/scripts/Northrend | |
| parent | 5879eb2198fdb976b9fff136757bf8187adb6cf0 (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/Northrend')
58 files changed, 217 insertions, 272 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp index 30ba1180663..882b3c22410 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp @@ -191,7 +191,7 @@ public: else { who->SetInCombatWith(me); - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); } } } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index faaa22cf9ac..89b5268684d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -162,7 +162,7 @@ public: bool IsInCombatWithPlayer() const { - std::list<HostileReference*> const& refs = me->getThreatManager().getThreatList(); + std::list<HostileReference*> const& refs = me->GetThreatManager().getThreatList(); for (HostileReference const* hostileRef : refs) { if (Unit const* target = hostileRef->getTarget()) diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp index 22eb9cdb04a..c74dd3dec6b 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp @@ -220,7 +220,7 @@ struct dummy_dragonAI : public ScriptedAI me->SetInCombatWithZone(); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) { - me->AddThreat(target, 1.0f); + me->GetThreatManager().AddThreat(target, 1.0f); me->Attack(target, true); me->GetMotionMaster()->MoveChase(target); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 1256e5745b3..472dc16191f 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -345,7 +345,7 @@ class boss_halion : public CreatureScript break; case EVENT_METEOR_STRIKE: { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_TWILIGHT_REALM)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, true, -SPELL_TWILIGHT_REALM)) { _meteorStrikePos = target->GetPosition(); me->CastSpell(_meteorStrikePos.GetPositionX(), _meteorStrikePos.GetPositionY(), _meteorStrikePos.GetPositionZ(), SPELL_METEOR_STRIKE, true, nullptr, nullptr, me->GetGUID()); @@ -356,7 +356,7 @@ class boss_halion : public CreatureScript } case EVENT_FIERY_COMBUSTION: { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_TWILIGHT_REALM)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_TWILIGHT_REALM)) me->CastSpell(target, SPELL_FIERY_COMBUSTION, TRIGGERED_IGNORE_SET_FACING); events.ScheduleEvent(EVENT_FIERY_COMBUSTION, Seconds(25)); break; @@ -527,7 +527,7 @@ class boss_twilight_halion : public CreatureScript events.ScheduleEvent(EVENT_BREATH, randtime(Seconds(10), Seconds(14))); break; case EVENT_SOUL_CONSUMPTION: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, SPELL_TWILIGHT_REALM)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, SPELL_TWILIGHT_REALM)) me->CastSpell(target, SPELL_SOUL_CONSUMPTION, TRIGGERED_IGNORE_SET_FACING); events.ScheduleEvent(EVENT_SOUL_CONSUMPTION, Seconds(20)); break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp index 5181b125fdf..4bb64f22dfc 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp @@ -115,7 +115,7 @@ void AggroAllPlayers(Creature* temp) temp->SetReactState(REACT_AGGRESSIVE); temp->SetInCombatWith(player); player->SetInCombatWith(temp); - temp->AddThreat(player, 0.0f); + temp->GetThreatManager().AddThreat(player, 0.0f); } } } @@ -263,8 +263,8 @@ public: Player* player = itr->GetSource(); if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false)) { - DoResetThreat(); - me->AddThreat(player, 1.0f); + ResetThreatList(); + me->GetThreatManager().AddThreat(player, 1.0f); DoCast(player, SPELL_CHARGE); break; } @@ -409,8 +409,8 @@ public: Player* player = itr->GetSource(); if (player && !player->IsGameMaster() && me->IsInRange(player, 8.0f, 25.0f, false)) { - DoResetThreat(); - me->AddThreat(player, 5.0f); + ResetThreatList(); + me->GetThreatManager().AddThreat(player, 5.0f); DoCast(player, SPELL_INTERCEPT); break; } @@ -847,7 +847,7 @@ public: if (uiShootTimer <= uiDiff) { - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f)) + if (Unit* target = SelectTarget(SELECT_TARGET_MAXDISTANCE, 0, 30.0f)) { uiTargetGUID = target->GetGUID(); DoCast(target, SPELL_SHOOT); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp index 4dc43888726..efedf67069f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp @@ -384,9 +384,7 @@ public: temp->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); temp->SetReactState(REACT_AGGRESSIVE); - temp->SetInCombatWith(player); - player->SetInCombatWith(temp); - temp->AddThreat(player, 0.0f); + AddThreat(player, 0.0f, temp); } } } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp index 60479c6be30..72ac4f0e499 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp @@ -261,7 +261,7 @@ class boss_anubarak_trial : public CreatureScript summoned->SetDisplayId(summoned->GetCreatureTemplate()->Modelid1); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - summoned->CombatStart(target); + summoned->EngageWithTarget(target); Talk(EMOTE_SPIKE, target); } break; @@ -814,12 +814,11 @@ class npc_anubarak_spike : public CreatureScript DoCast(who, SPELL_MARK); me->SetSpeedRate(MOVE_RUN, 0.5f); // make sure the Spine will really follow the one he should - me->getThreatManager().clearReferences(); + ResetThreatList(); me->SetInCombatWithZone(); - me->getThreatManager().addThreat(who, std::numeric_limits<float>::max()); + AddThreat(who, 1000000.0f); me->GetMotionMaster()->Clear(true); me->GetMotionMaster()->MoveChase(who); - me->TauntApply(who); } private: diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index ef37afffc04..d4fade43ba4 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -611,20 +611,9 @@ struct boss_faction_championsAI : public BossAI void UpdateThreat() { - std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList(); - for (std::list<HostileReference*>::const_iterator itr = tList.begin(); itr != tList.end(); ++itr) - { - Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (unit && me->getThreatManager().getThreat(unit)) - { - if (unit->GetTypeId() == TYPEID_PLAYER) - { - float threat = CalculateThreat(me->GetDistance2d(unit), (float)unit->GetArmor(), unit->GetHealth()); - me->getThreatManager().modifyThreatPercent(unit, -100); - me->AddThreat(unit, 1000000.0f * threat); - } - } - } + for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList()) + if (Player* victim = ref->GetVictim()->ToPlayer()) + ref->SetThreat(1000000.0f * CalculateThreat(me->GetDistance2d(victim), victim->GetArmor(), victim->GetHealth())); } void UpdatePower() @@ -693,7 +682,7 @@ struct boss_faction_championsAI : public BossAI Unit* SelectEnemyCaster(bool /*casting*/) { - std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList(); + std::list<HostileReference*> const& tList = me->GetThreatManager().getThreatList(); std::list<HostileReference*>::const_iterator iter; for (iter = tList.begin(); iter!=tList.end(); ++iter) { @@ -706,15 +695,10 @@ struct boss_faction_championsAI : public BossAI uint32 EnemiesInRange(float distance) { - std::list<HostileReference*> const& tList = me->getThreatManager().getThreatList(); - std::list<HostileReference*>::const_iterator iter; uint32 count = 0; - for (iter = tList.begin(); iter != tList.end(); ++iter) - { - Unit* target = ObjectAccessor::GetUnit(*me, (*iter)->getUnitGuid()); - if (target && me->GetDistance2d(target) < distance) - ++count; - } + for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList()) + if (me->GetDistance2d(ref->GetVictim()) < distance) + ++count; return count; } @@ -725,9 +709,7 @@ struct boss_faction_championsAI : public BossAI if (me->Attack(who, true)) { - me->AddThreat(who, 10.0f); - me->SetInCombatWith(who); - who->SetInCombatWith(me); + AddThreat(who, 10.0f); if (_aiType == AI_MELEE || _aiType == AI_PET) DoStartMovement(who); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp index 7b6a20c1dd7..767f46756ea 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp @@ -161,12 +161,12 @@ class boss_jaraxxus : public CreatureScript events.ScheduleEvent(EVENT_FEL_FIREBALL, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS)); return; case EVENT_FEL_LIGHTNING: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LORD_HITTIN)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, true, -SPELL_LORD_HITTIN)) DoCast(target, SPELL_FEL_LIGHTING); events.ScheduleEvent(EVENT_FEL_LIGHTNING, urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS)); return; case EVENT_INCINERATE_FLESH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_LORD_HITTIN)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_LORD_HITTIN)) { Talk(EMOTE_INCINERATE, target); Talk(SAY_INCINERATE); @@ -179,7 +179,7 @@ class boss_jaraxxus : public CreatureScript events.ScheduleEvent(EVENT_NETHER_POWER, 40*IN_MILLISECONDS); return; case EVENT_LEGION_FLAME: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_LORD_HITTIN)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_LORD_HITTIN)) { Talk(EMOTE_LEGION_FLAME, target); DoCast(target, SPELL_LEGION_FLAME); diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index ba4c19b316d..73dd987171e 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -319,7 +319,7 @@ struct boss_twin_baseAI : public BossAI events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS); break; case EVENT_TOUCH: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, OtherEssenceSpellId)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, true, OtherEssenceSpellId)) me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); break; diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp index c966f74cd89..8a404f66cc5 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp @@ -555,8 +555,7 @@ class npc_fizzlebang_toc : public CreatureScript { //1-shot Fizzlebang jaraxxus->CastSpell(me, 67888, false); // 67888 - Fel Lightning - me->SetInCombatWith(jaraxxus); - jaraxxus->AddThreat(me, 1000.0f); + AddThreat(me, 1000.0f, jaraxxus); jaraxxus->AI()->AttackStart(me); } _instance->SetData(TYPE_EVENT, 1160); @@ -683,7 +682,7 @@ class npc_tirion_toc : public CreatureScript break; case 400: Talk(SAY_STAGE_0_06); - me->getThreatManager().clearReferences(); + me->GetThreatManager().ClearAllThreat(); _updateTimer = 5*IN_MILLISECONDS; _instance->SetData(TYPE_EVENT, 0); break; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index ab35de44aeb..1bedf9f7961 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -960,14 +960,12 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript void DeleteAllFromThreatList(Unit* target, ObjectGuid except) { - ThreatContainer::StorageType threatlist = target->getThreatManager().getThreatList(); - for (auto i : threatlist) - { - if (i->getUnitGuid() == except) - continue; - - i->removeReference(); - } + std::vector<ThreatReference*> toClear; + for (ThreatReference* ref : target->GetThreatManager().GetUnsortedThreatList()) + if (ref->GetVictim()->GetGUID() != except) + toClear.push_back(ref); + for (ThreatReference* ref : toClear) + ref->ClearThreat(); } void UpdateAI(uint32 diff) override @@ -1346,7 +1344,7 @@ class npc_the_lich_king_escape_hor : public CreatureScript AttackStart(victim); return me->GetVictim() != nullptr; } - else if (me->getThreatManager().getThreatList().size() < 2 && me->HasAura(SPELL_REMORSELESS_WINTER)) + else if (me->GetThreatManager().GetThreatListSize() < 2 && me->HasAura(SPELL_REMORSELESS_WINTER)) { EnterEvadeMode(EVADE_REASON_OTHER); return false; @@ -1929,7 +1927,7 @@ class npc_frostsworn_general : public CreatureScript void SummonClones() { std::list<Unit*> playerList; - SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0.0f, true); + SelectTargetList(playerList, 5, SELECT_TARGET_MAXTHREAT, 0, 0.0f, true); for (Unit* target : playerList) { if (Creature* reflection = me->SummonCreature(NPC_REFLECTION, *target, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 3000)) @@ -2172,7 +2170,7 @@ struct npc_escape_event_trash : public ScriptedAI me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->SetInCombatWith(leader); leader->SetInCombatWith(me); - me->AddThreat(leader, 0.0f); + AddThreat(leader, 0.0f); } } @@ -2292,7 +2290,7 @@ class npc_risen_witch_doctor : public CreatureScript _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_CURSE, urand(10000, 15000)); break; case EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT: - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0, 20.0f, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 0, 20.0f, true)) DoCast(target, SPELL_SHADOW_BOLT); _events.ScheduleEvent(EVENT_RISEN_WITCH_DOCTOR_SHADOW_BOLT, urand(2000, 3000)); break; diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 05bf39cb5fb..f21d4fa007c 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -197,16 +197,16 @@ class boss_ick : public CreatureScript void _ResetThreat(Unit* target) { - DoModifyThreatPercent(target, -100); - me->AddThreat(target, _tempThreat); + ModifyThreatByPercent(target, -100); + AddThreat(target, _tempThreat); } void UpdateAI(uint32 diff) override { - if (!me->IsInCombat()) + if (!me->IsEngaged()) return; - if (!me->GetVictim() && me->getThreatManager().isThreatListEmpty()) + if (!me->GetVictim() && me->GetThreatManager().IsThreatListEmpty()) { EnterEvadeMode(EVADE_REASON_NO_HOSTILES); return; @@ -638,9 +638,9 @@ class spell_krick_pursuit : public SpellScriptLoader { ick->AI()->Talk(SAY_ICK_CHASE_1, target); ick->AddAura(GetSpellInfo()->Id, target); - ENSURE_AI(boss_ick::boss_ickAI, ick->AI())->SetTempThreat(ick->getThreatManager().getThreat(target)); - ick->AddThreat(target, float(GetEffectValue())); - target->AddThreat(ick, float(GetEffectValue())); + ENSURE_AI(boss_ick::boss_ickAI, ick->AI())->SetTempThreat(ick->GetThreatManager().GetThreat(target)); + ick->GetThreatManager().AddThreat(target, float(GetEffectValue()), GetSpellInfo(), true, true); + target->GetThreatManager().AddThreat(ick, float(GetEffectValue()), GetSpellInfo(), true, true); } } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 5b2248d5341..28be5f8ccc0 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -505,7 +505,7 @@ struct BloodPrincesBossAI : public BossAI { if (!_isEmpowered) { - me->AddThreat(attacker, float(damage)); + AddThreat(attacker, float(damage)); damage = 0; } } @@ -1151,8 +1151,8 @@ class npc_dark_nucleus : public CreatureScript if (attacker == me) return; - me->DeleteThreatList(); - me->AddThreat(attacker, 500000000.0f); + me->GetThreatManager().ClearAllThreat(); + AddThreat(attacker, 500000000.0f); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index b908e1a9c35..30d57d99a75 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -484,15 +484,14 @@ class boss_blood_queen_lana_thel : public CreatureScript // offtank for this encounter is the player standing closest to main tank Player* SelectRandomTarget(bool includeOfftank, std::list<Player*>* targetList = nullptr) { - std::list<HostileReference*> const& threatlist = me->getThreatManager().getThreatList(); - std::list<Player*> tempTargets; - - if (threatlist.empty()) + if (me->GetThreatManager().IsThreatListEmpty(true)) return nullptr; - for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) - if (Unit* refTarget = (*itr)->getTarget()) - if (refTarget != me->GetVictim() && refTarget->GetTypeId() == TYPEID_PLAYER && (includeOfftank || (refTarget->GetGUID() != _offtankGUID))) + std::list<Player*> tempTargets; + Unit* maintank = me->GetThreatManager().GetCurrentVictim(); + for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList()) + if (Player* refTarget = ref->GetVictim()->ToPlayer()) + if (refTarget != maintank && (includeOfftank || (refTarget->GetGUID() != _offtankGUID))) tempTargets.push_back(refTarget->ToPlayer()); if (tempTargets.empty()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 172c54fd7e0..f5568b4c298 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -580,7 +580,7 @@ class boss_deathbringer_saurfang : public CreatureScript } case ACTION_MARK_OF_THE_FALLEN_CHAMPION: { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_MARK_OF_THE_FALLEN_CHAMPION)) { ++_fallenChampionCastCount; DoCast(target, SPELL_MARK_OF_THE_FALLEN_CHAMPION); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 5b0ea090802..dbf8aa32697 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -211,8 +211,8 @@ class boss_festergut : public CreatureScript { std::list<Unit*> ranged, melee; uint32 minTargets = RAID_MODE<uint32>(3, 8, 3, 8); - SelectTargetList(ranged, 25, SELECT_TARGET_RANDOM, -5.0f, true); - SelectTargetList(melee, 25, SELECT_TARGET_RANDOM, 5.0f, true); + SelectTargetList(ranged, 25, SELECT_TARGET_RANDOM, 0, -5.0f, true); + SelectTargetList(melee, 25, SELECT_TARGET_RANDOM, 0, 5.0f, true); while (ranged.size() < minTargets) { if (melee.empty()) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index aa0ce037619..41b836922e1 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -583,7 +583,7 @@ struct gunship_npc_AI : public ScriptedAI if (!me->IsAlive() || !me->IsInCombat()) return; - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); me->GetMotionMaster()->MoveTargetedHome(); } @@ -639,7 +639,7 @@ protected: return me->GetVictim() != nullptr; } - else if (me->getThreatManager().isThreatListEmpty()) + else if (me->GetThreatManager().IsThreatListEmpty()) { EnterEvadeMode(EVADE_REASON_OTHER); return false; @@ -728,7 +728,7 @@ class npc_gunship : public CreatureScript { Creature* stalker = *itr; stalker->RemoveAllAuras(); - stalker->DeleteThreatList(); + stalker->GetThreatManager().ClearAllThreat(); stalker->CombatStop(true); } @@ -887,7 +887,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript if (!me->IsAlive()) return; - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); me->GetMotionMaster()->MoveTargetedHome(); @@ -1156,7 +1156,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript if (!me->IsAlive()) return; - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); me->CombatStop(true); me->GetMotionMaster()->MoveTargetedHome(); @@ -1492,7 +1492,7 @@ struct npc_gunship_boarding_addAI : public gunship_npc_AI { players.sort(Trinity::ObjectDistanceOrderPred(me)); for (std::list<Player*>::iterator itr = players.begin(); itr != players.end(); ++itr) - me->AddThreat(*itr, 1.0f); + AddThreat(*itr, 1.0f); AttackStart(players.front()); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 602c191cfab..8a444b3d933 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -316,9 +316,10 @@ class boss_lady_deathwhisper : public CreatureScript scheduler.Schedule(Seconds(27), [this](TaskContext dominate_mind) { Talk(SAY_DOMINATE_MIND); - for (uint8 i = 0; i < _dominateMindCount; i++) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_DOMINATE_MIND)) - DoCast(target, SPELL_DOMINATE_MIND); + std::list<Unit*> targets; + SelectTargetList(targets, _dominateMindCount, SELECT_TARGET_RANDOM, 0, 0.0f, true, false, -SPELL_DOMINATE_MIND); + for (Unit* target : targets) + DoCast(target, SPELL_DOMINATE_MIND); dominate_mind.Repeat(Seconds(40), Seconds(45)); }); // phase one only @@ -414,7 +415,7 @@ class boss_lady_deathwhisper : public CreatureScript Talk(SAY_PHASE_2); Talk(EMOTE_PHASE_2); DoStartMovement(me->GetVictim()); - DoResetThreat(); + ResetThreatList(); damage -= me->GetPower(POWER_MANA); me->SetPower(POWER_MANA, 0); me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index c13ce2ed638..ca8a9356db6 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -518,8 +518,8 @@ class spell_marrowgar_coldflame : public SpellScriptLoader void SelectTarget(std::list<WorldObject*>& targets) { targets.clear(); - // select any unit but not the tank (by owners threatlist) - Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 1, -GetCaster()->GetCombatReach(), true, -SPELL_IMPALED); + // select any unit but not the tank + Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, -GetCaster()->GetCombatReach(), true, false, -SPELL_IMPALED); if (!target) target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); // or the tank if its solo if (!target) @@ -645,7 +645,7 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1); std::list<Unit*> targets; - marrowgarAI->SelectTargetList(targets, BoneSpikeTargetSelector(marrowgarAI), boneSpikeCount, SELECT_TARGET_RANDOM); + marrowgarAI->SelectTargetList(targets, boneSpikeCount, SELECT_TARGET_RANDOM, 1, BoneSpikeTargetSelector(marrowgarAI)); if (targets.empty()) return; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index ca10713b47a..63d3af3931a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -503,10 +503,9 @@ class boss_professor_putricide : public CreatureScript { std::list<Unit*> targetList; { - const std::list<HostileReference*>& threatlist = me->getThreatManager().getThreatList(); - for (std::list<HostileReference*>::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) - if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER) - targetList.push_back((*itr)->getTarget()); + for (ThreatReference* ref : me->GetThreatManager().GetUnsortedThreatList()) + if (Player* target = ref->GetVictim()->ToPlayer()) + targetList.push_back(target); } size_t half = targetList.size()/2; @@ -605,7 +604,7 @@ class boss_professor_putricide : public CreatureScript case EVENT_SLIME_PUDDLE: { std::list<Unit*> targets; - SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, 0.0f, true); + SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, 0, 0.0f, true); if (!targets.empty()) for (std::list<Unit*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) DoCast(*itr, SPELL_SLIME_PUDDLE_TRIGGER); @@ -635,7 +634,7 @@ class boss_professor_putricide : public CreatureScript if (Is25ManRaid()) { std::list<Unit*> targets; - SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, -7.0f, true); + SelectTargetList(targets, 2, SELECT_TARGET_RANDOM, 0, -7.0f, true); if (!targets.empty()) { Talk(EMOTE_MALLEABLE_GOO); @@ -925,9 +924,9 @@ class spell_putricide_ooze_channel : public SpellScriptLoader void StartAttack() { GetCaster()->ClearUnitState(UNIT_STATE_CASTING); - GetCaster()->DeleteThreatList(); + GetCaster()->GetThreatManager().ClearAllThreat(); GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), 500000000.0f); // value seen in sniff + GetCaster()->GetThreatManager().AddThreat(GetHitUnit(), 500000000.0f, nullptr, true, true); // value seen in sniff } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 337bdc560b4..e8bea735d40 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -258,7 +258,7 @@ class npc_little_ooze : public CreatureScript DoCast(me, SPELL_WEAK_RADIATING_OOZE, true); DoCast(me, SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC, true); events.ScheduleEvent(EVENT_STICKY_OOZE, 5000); - me->AddThreat(summoner, 500000.0f); + AddThreat(summoner, 500000.0f); } void JustDied(Unit* /*killer*/) override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 36574c9e812..4bf8f97f623 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -1540,7 +1540,7 @@ class spell_frostwarden_handler_focus_fire : public SpellScriptLoader void HandleScript(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); - GetCaster()->AddThreat(GetHitUnit(), float(GetEffectValue())); + GetCaster()->GetThreatManager().AddThreat(GetHitUnit(), float(GetEffectValue())); GetCaster()->GetAI()->SetData(DATA_WHELP_MARKER, 1); } @@ -1559,7 +1559,7 @@ class spell_frostwarden_handler_focus_fire : public SpellScriptLoader PreventDefaultAction(); if (Unit* caster = GetCaster()) { - caster->AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); + caster->GetThreatManager().AddThreat(GetTarget(), -float(GetSpellInfo()->Effects[EFFECT_1].CalcValue())); caster->GetAI()->SetData(DATA_WHELP_MARKER, 0); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index b219ded2afd..97b3261f51e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -972,7 +972,7 @@ class boss_the_lich_king : public CreatureScript events.ScheduleEvent(EVENT_SOUL_REAPER, urand(33000, 35000), 0, PHASE_TWO_THREE); break; case EVENT_DEFILE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_HARVEST_SOUL_VALKYR)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_HARVEST_SOUL_VALKYR)) { Talk(EMOTE_DEFILE_WARNING); DoCast(target, SPELL_DEFILE); @@ -1789,7 +1789,7 @@ class npc_terenas_menethil : public CreatureScript if (!me->IsAlive()) return; - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); me->CombatStop(false); } @@ -2781,7 +2781,7 @@ class spell_the_lich_king_vile_spirit_move_target_search : public SpellScriptLoa return; GetCaster()->ToCreature()->AI()->AttackStart(GetHitUnit()); - GetCaster()->AddThreat(GetHitUnit(), 100000.0f); + GetCaster()->GetThreatManager().AddThreat(GetHitUnit(), 100000.0f); } void Register() override diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index c558aa47d52..493b759e0f7 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -562,7 +562,7 @@ class npc_green_dragon_combat_trigger : public CreatureScript // @TODO check out of bounds on all encounter creatures, evade if matched - std::list<HostileReference*> const& threatList = me->getThreatManager().getThreatList(); + std::list<HostileReference*> const& threatList = me->GetThreatManager().getThreatList(); if (threatList.empty()) { EnterEvadeMode(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 789370d8762..2ddfa86f5fa 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -922,7 +922,7 @@ class boss_sister_svalna : public CreatureScript Talk(SAY_SVALNA_AGGRO); break; case EVENT_IMPALING_SPEAR: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_IMPALING_SPEAR)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_IMPALING_SPEAR)) { DoCast(me, SPELL_AETHER_SHIELD); DoCast(target, SPELL_IMPALING_SPEAR); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 37baf7afe8d..ffc899b4d0d 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -1460,7 +1460,7 @@ class instance_icecrown_citadel : public InstanceMapScript if (Creature* warden = instance->SummonCreature(NPC_SPIRIT_WARDEN, SpiritWardenSpawn, nullptr, 63000)) { terenas->AI()->AttackStart(warden); - warden->AddThreat(terenas, 300000.0f); + warden->GetThreatManager().AddThreat(terenas, 300000.0f, nullptr, true, true); } } break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index 597471597dd..0fb00d18fd3 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -240,11 +240,7 @@ struct boss_four_horsemen_baseAI : public BossAI continue; if (player->IsAlive()) - { - cBoss->AddThreat(player, 0.0f); - cBoss->SetInCombatWith(player); - player->SetInCombatWith(cBoss); - } + AddThreat(player, 0.0f, cBoss); } } @@ -403,19 +399,19 @@ class boss_four_horsemen_baron : public CreatureScript { SetCombatMovement(true); me->SetReactState(REACT_AGGRESSIVE); - ThreatManager& threat = me->getThreatManager(); - if (threat.isThreatListEmpty()) + ThreatManager& threat = me->GetThreatManager(); + if (threat.IsThreatListEmpty()) { if (Unit* nearest = me->SelectNearestPlayer(5000.0f)) { - me->AddThreat(nearest, 1.0f); + AddThreat(nearest, 1.0f); AttackStart(nearest); } else ResetEncounter(); } else - AttackStart(threat.getHostilTarget()); + AttackStart(threat.GetCurrentVictim()); events.ScheduleEvent(EVENT_BERSERK, Minutes(10)); events.ScheduleEvent(EVENT_MARK, Seconds(24)); @@ -476,19 +472,19 @@ class boss_four_horsemen_thane : public CreatureScript { SetCombatMovement(true); me->SetReactState(REACT_AGGRESSIVE); - ThreatManager& threat = me->getThreatManager(); - if (threat.isThreatListEmpty()) + ThreatManager& threat = me->GetThreatManager(); + if (threat.IsThreatListEmpty()) { if (Unit* nearest = me->SelectNearestPlayer(5000.0f)) { - me->AddThreat(nearest, 1.0f); + AddThreat(nearest, 1.0f); AttackStart(nearest); } else ResetEncounter(); } else - AttackStart(threat.getHostilTarget()); + AttackStart(threat.GetCurrentVictim()); events.ScheduleEvent(EVENT_BERSERK, Minutes(10)); events.ScheduleEvent(EVENT_MARK, Seconds(24)); @@ -567,7 +563,7 @@ class boss_four_horsemen_lady : public CreatureScript return; if (!_ourMovementFinished) return; - if (me->getThreatManager().isThreatListEmpty()) + if (me->GetThreatManager().IsThreatListEmpty()) { EnterEvadeMode(EVADE_REASON_NO_HOSTILES); return; @@ -600,7 +596,7 @@ class boss_four_horsemen_lady : public CreatureScript if (me->HasUnitState(UNIT_STATE_CASTING)) return; - if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 45.0f, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 45.0f, true)) DoCast(target, SPELL_SHADOW_BOLT); else { @@ -637,7 +633,7 @@ class boss_four_horsemen_sir : public CreatureScript return; if (!_ourMovementFinished) return; - if (me->getThreatManager().isThreatListEmpty()) + if (me->GetThreatManager().IsThreatListEmpty()) { EnterEvadeMode(EVADE_REASON_NO_HOSTILES); return; @@ -657,7 +653,7 @@ class boss_four_horsemen_sir : public CreatureScript events.Repeat(Seconds(15)); break; case EVENT_HOLYWRATH: - if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 45.0f, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 45.0f, true)) { DoCast(target, SPELL_HOLY_WRATH, true); _shouldSay = true; @@ -670,7 +666,7 @@ class boss_four_horsemen_sir : public CreatureScript if (me->HasUnitState(UNIT_STATE_CASTING)) return; - if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 45.0f, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 45.0f, true)) DoCast(target, SPELL_HOLY_BOLT); else { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index c09de96f7b6..3a6e67538c2 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -398,7 +398,7 @@ class boss_gothik : public CreatureScript switch (action) { case ACTION_MINION_EVADE: - if (_gateIsOpen || me->getThreatManager().isThreatListEmpty()) + if (_gateIsOpen || me->GetThreatManager().IsThreatListEmpty()) return EnterEvadeMode(EVADE_REASON_NO_HOSTILES); if (_gateCanOpen) OpenGate(); @@ -424,8 +424,8 @@ class boss_gothik : public CreatureScript // thus we only do a cursory check to make sure (edge cases?) if (Player* newTarget = FindEligibleTarget(me, _gateIsOpen)) { - me->getThreatManager().resetAllAggro(); - me->AddThreat(newTarget, 1.0f); + ResetThreatList(); + AddThreat(newTarget, 1.0f); AttackStart(newTarget); } else @@ -507,7 +507,7 @@ class boss_gothik : public CreatureScript Talk(SAY_PHASE_TWO); Talk(EMOTE_PHASE_TWO); me->SetReactState(REACT_PASSIVE); - me->getThreatManager().resetAllAggro(); + ResetThreatList(); DoCastAOE(SPELL_TELEPORT_LIVE); break; case EVENT_TELEPORT: @@ -517,7 +517,7 @@ class boss_gothik : public CreatureScript me->AttackStop(); me->StopMoving(); me->SetReactState(REACT_PASSIVE); - me->getThreatManager().resetAllAggro(); + ResetThreatList(); DoCastAOE(_lastTeleportDead ? SPELL_TELEPORT_LIVE : SPELL_TELEPORT_DEAD); _lastTeleportDead = !_lastTeleportDead; @@ -598,7 +598,7 @@ struct npc_gothik_minion_baseAI : public ScriptedAI case ACTION_ACQUIRE_TARGET: if (Player* target = FindEligibleTarget(me, _gateIsOpen)) { - me->AddThreat(target, 1.0f); + AddThreat(target, 1.0f); AttackStart(target); } else @@ -626,8 +626,8 @@ struct npc_gothik_minion_baseAI : public ScriptedAI if (Player* newTarget = FindEligibleTarget(me, _gateIsOpen)) { me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT); - me->getThreatManager().resetAllAggro(); - me->AddThreat(newTarget, 1.0f); + ResetThreatList(); + AddThreat(newTarget, 1.0f); AttackStart(newTarget); } else diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp index 626a7c023af..863637ca90b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp @@ -92,7 +92,7 @@ class boss_grobbulus : public CreatureScript events.Repeat(randtime(Seconds(15), Seconds(30))); return; case EVENT_INJECT: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -SPELL_MUTATING_INJECTION)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, true, -SPELL_MUTATING_INJECTION)) DoCast(target, SPELL_MUTATING_INJECTION); events.Repeat(Seconds(8) + Milliseconds(uint32(std::round(120 * me->GetHealthPct())))); return; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index 93b91bec9f3..faaafac710a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -189,7 +189,7 @@ class KelThuzadCharmedPlayerAI : public SimpleCharmedPlayerAI { if (Unit* target = charmer->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, CharmedPlayerTargetSelectPred())) return target; - if (Unit* target = charmer->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_CHAINS)) + if (Unit* target = charmer->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, true, -SPELL_CHAINS)) return target; } return nullptr; @@ -283,10 +283,9 @@ public: { Talk(SAY_CHAINS); std::list<Unit*> targets; - SelectTargetList(targets, 3, SELECT_TARGET_RANDOM, 0.0f, true); + SelectTargetList(targets, 3, SELECT_TARGET_RANDOM, 0, 0.0f, true, false); for (Unit* target : targets) - if (me->GetVictim() != target) // skip MT - DoCast(target, SPELL_CHAINS); + DoCast(target, SPELL_CHAINS); } } @@ -426,7 +425,7 @@ public: me->CastStop(); events.SetPhase(PHASE_TWO); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_IMMUNE_TO_PC); - me->getThreatManager().resetAllAggro(); + ResetThreatList(); me->SetReactState(REACT_AGGRESSIVE); Talk(EMOTE_PHASE_TWO); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp index 1627cba08b9..1a6bbccdb30 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp @@ -139,7 +139,7 @@ public: case EVENT_WRAP: { std::list<Unit*> targets; - SelectTargetList(targets, WebTargetSelector(me), RAID_MODE(1, 2), SELECT_TARGET_RANDOM); + SelectTargetList(targets, RAID_MODE(1, 2), SELECT_TARGET_RANDOM, 1, WebTargetSelector(me)); if (!targets.empty()) { Talk(EMOTE_WEB_WRAP); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index 9394ececc08..b7333e90e2e 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -128,7 +128,7 @@ public: DoZoneInCombat(); - if (me->getThreatManager().isThreatListEmpty()) + if (!me->IsThreatened()) Reset(); else { @@ -235,7 +235,7 @@ public: case EVENT_BLINK: DoCastAOE(SPELL_CRIPPLE, true); DoCastAOE(SPELL_BLINK); - DoResetThreat(); + ResetThreatList(); justBlinked = true; events.Repeat(Seconds(40)); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp index 92dcdf95da4..c1fdc5b950e 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_patchwerk.cpp @@ -119,41 +119,31 @@ public: { // Hateful Strike targets the highest non-MT threat in melee range on 10man // and the higher HP target out of the two highest non-MT threats in melee range on 25man - float MostThreat = 0.0f; - Unit* secondThreatTarget = nullptr; - Unit* thirdThreatTarget = nullptr; - - std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin(); - for (; i != me->getThreatManager().getThreatList().end(); ++i) - { // find second highest - Unit* target = (*i)->getTarget(); - if (target->IsAlive() && target != me->GetVictim() && (*i)->getThreat() >= MostThreat && me->IsWithinMeleeRange(target)) - { - MostThreat = (*i)->getThreat(); - secondThreatTarget = target; - } - } - - if (secondThreatTarget && Is25ManRaid()) - { // find third highest - MostThreat = 0.0f; - i = me->getThreatManager().getThreatList().begin(); - for (; i != me->getThreatManager().getThreatList().end(); ++i) - { - Unit* target = (*i)->getTarget(); - if (target->IsAlive() && target != me->GetVictim() && target != secondThreatTarget && (*i)->getThreat() >= MostThreat && me->IsWithinMeleeRange(target)) - { - MostThreat = (*i)->getThreat(); - thirdThreatTarget = target; - } - } + ThreatReference* secondThreat = nullptr; + ThreatReference* thirdThreat = nullptr; + + ThreatManager const& mgr = me->GetThreatManager(); + Unit* currentVictim = mgr.GetCurrentVictim(); + auto const& pair = mgr.GetSortedThreatList(); + auto it = pair.begin(), end = pair.end(); + if (it == end) + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + + if ((*it)->GetVictim() != currentVictim) + secondThreat = *it; + if ((!secondThreat || Is25ManRaid()) && (++it != end)) + { + if ((*it)->GetVictim() != currentVictim) + (secondThreat ? thirdThreat : secondThreat) = *it; + if (!thirdThreat && Is25ManRaid() && (++it != end)) + thirdThreat = *it; } Unit* pHatefulTarget = nullptr; - if (!thirdThreatTarget) - pHatefulTarget = secondThreatTarget; - else if (secondThreatTarget) - pHatefulTarget = (secondThreatTarget->GetHealth() < thirdThreatTarget->GetHealth()) ? thirdThreatTarget : secondThreatTarget; + if (!thirdThreat) + pHatefulTarget = secondThreat->GetVictim(); + else if (secondThreat) + pHatefulTarget = (secondThreat->GetVictim()->GetHealth() < thirdThreat->GetVictim()->GetHealth()) ? thirdThreat->GetVictim() : secondThreat->GetVictim(); if (!pHatefulTarget) pHatefulTarget = me->GetVictim(); @@ -162,11 +152,11 @@ public: // add threat to highest threat targets if (me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim())) - me->getThreatManager().addThreat(me->GetVictim(), HATEFUL_THREAT_AMT); - if (secondThreatTarget) - me->getThreatManager().addThreat(secondThreatTarget, HATEFUL_THREAT_AMT); - if (thirdThreatTarget) - me->getThreatManager().addThreat(thirdThreatTarget, HATEFUL_THREAT_AMT); // this will only ever be used in 25m + AddThreat(me->GetVictim(), HATEFUL_THREAT_AMT); + if (secondThreat) + secondThreat->AddThreat(HATEFUL_THREAT_AMT); + if (thirdThreat) + thirdThreat->AddThreat(HATEFUL_THREAT_AMT); events.Repeat(Seconds(1)); break; diff --git a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp index 4679fb17358..58da5a92295 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_razuvious.cpp @@ -231,7 +231,7 @@ class npc_dk_understudy : public CreatureScript { me->SetReactState(REACT_AGGRESSIVE); if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmer)) - me->AddThreat(charmer, 100000.0f); + AddThreat(charmer, 100000.0f); DoZoneInCombat(nullptr, 250.0f); } } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp index 205a098d077..8e2f093863b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_sapphiron.cpp @@ -310,7 +310,7 @@ class boss_sapphiron : public CreatureScript _iceboltTargets.clear(); std::list<Unit*> targets; - SelectTargetList(targets, RAID_MODE(2, 3), SELECT_TARGET_RANDOM, 200.0f, true); + SelectTargetList(targets, RAID_MODE(2, 3), SELECT_TARGET_RANDOM, 0, 200.0f, true); for (Unit* target : targets) if (target) _iceboltTargets.push_back(target->GetGUID()); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index a74dd052695..d6a36680c33 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -399,7 +399,7 @@ public: me->SetReactState(REACT_AGGRESSIVE); DoZoneInCombat(); - if (Unit* closest = SelectTarget(SELECT_TARGET_NEAREST, 0, 500.0f)) + if (Unit* closest = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 500.0f)) AttackStart(closest); else // if there is no nearest target, then there is no target, meaning we should reset { @@ -564,7 +564,7 @@ public: if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN))) if (feugen->GetVictim()) { - me->AddThreat(feugen->EnsureVictim(), 0.0f); + AddThreat(feugen->EnsureVictim(), 0.0f); me->SetInCombatWith(feugen->EnsureVictim()); } break; @@ -606,11 +606,8 @@ public: thaddius->AI()->DoAction(ACTION_STALAGG_AGGRO); if (Creature* feugen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FEUGEN))) - if (!feugen->IsInCombat()) - { - feugen->AddThreat(who, 0.0f); - feugen->SetInCombatWith(who); - } + if (!feugen->IsEngaged()) + AddThreat(who, 0.0f, feugen); } void DamageTaken(Unit* /*who*/, uint32& damage) override @@ -833,7 +830,7 @@ public: if (Creature* stalagg = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_STALAGG))) if (stalagg->GetVictim()) { - me->AddThreat(stalagg->EnsureVictim(), 0.0f); + AddThreat(stalagg->EnsureVictim(), 0.0f); me->SetInCombatWith(stalagg->EnsureVictim()); } staticFieldTimer = 6 * IN_MILLISECONDS; @@ -877,10 +874,7 @@ public: if (Creature* stalagg = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_STALAGG))) if (!stalagg->IsInCombat()) - { - stalagg->AddThreat(who, 0.0f); - stalagg->SetInCombatWith(who); - } + AddThreat(who, 0.0f, stalagg); } void DamageTaken(Unit* /*who*/, uint32& damage) override @@ -1213,39 +1207,39 @@ class spell_thaddius_magnetic_pull : public SpellScriptLoader if (!stalagg) return; - Unit* feugenTank = feugen->GetVictim(); - Unit* stalaggTank = stalagg->GetVictim(); + ThreatManager& feugenThreat = feugen->GetThreatManager(); + ThreatManager& stalaggThreat = stalagg->GetThreatManager(); + + Unit* feugenTank = feugenThreat.GetCurrentVictim(); + Unit* stalaggTank = stalaggThreat.GetCurrentVictim(); if (!feugenTank || !stalaggTank) return; - ThreatManager& feugenThreat = feugen->getThreatManager(); - ThreatManager& stalaggThreat = stalagg->getThreatManager(); - if (feugenTank == stalaggTank) // special behavior if the tanks are the same (taken from retail) { - float feugenTankThreat = feugenThreat.getThreat(feugenTank); - float stalaggTankThreat = stalaggThreat.getThreat(stalaggTank); + float feugenTankThreat = feugenThreat.GetThreat(feugenTank); + float stalaggTankThreat = stalaggThreat.GetThreat(stalaggTank); - feugenThreat.addThreat(feugenTank, stalaggTankThreat - feugenTankThreat); - stalaggThreat.addThreat(stalaggTank, feugenTankThreat - stalaggTankThreat); + feugen->GetThreatManager().AddThreat(feugenTank, stalaggTankThreat - feugenTankThreat, nullptr, true, true); + stalagg->GetThreatManager().AddThreat(stalaggTank, feugenTankThreat - stalaggTankThreat, nullptr, true, true); feugen->CastSpell(stalaggTank, SPELL_MAGNETIC_PULL_EFFECT, true); } else // normal case, two tanks { - float feugenTankThreat = feugenThreat.getThreat(feugenTank); - float feugenOtherThreat = feugenThreat.getThreat(stalaggTank); - float stalaggTankThreat = stalaggThreat.getThreat(stalaggTank); - float stalaggOtherThreat = stalaggThreat.getThreat(feugenTank); + float feugenTankThreat = feugenThreat.GetThreat(feugenTank); + float feugenOtherThreat = feugenThreat.GetThreat(stalaggTank); + float stalaggTankThreat = stalaggThreat.GetThreat(stalaggTank); + float stalaggOtherThreat = stalaggThreat.GetThreat(feugenTank); // set the two entries in feugen's threat table to be equal to the ones in stalagg's - feugenThreat.addThreat(stalaggTank, stalaggTankThreat - feugenOtherThreat); - feugenThreat.addThreat(feugenTank, stalaggOtherThreat - feugenTankThreat); + stalagg->GetThreatManager().AddThreat(stalaggTank, stalaggTankThreat - feugenOtherThreat, nullptr, true, true); + stalagg->GetThreatManager().AddThreat(feugenTank, stalaggOtherThreat - feugenTankThreat, nullptr, true, true); // set the two entries in stalagg's threat table to be equal to the ones in feugen's - stalaggThreat.addThreat(feugenTank, feugenTankThreat - stalaggOtherThreat); - stalaggThreat.addThreat(stalaggTank, feugenOtherThreat - stalaggTankThreat); + stalagg->GetThreatManager().AddThreat(feugenTank, feugenTankThreat - stalaggOtherThreat, nullptr, true, true); + stalagg->GetThreatManager().AddThreat(stalaggTank, feugenOtherThreat - stalaggTankThreat, nullptr, true, true); // pull the two tanks across feugenTank->CastSpell(stalaggTank, SPELL_MAGNETIC_PULL_EFFECT, true); diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index dcf26afa14b..b6dd3924c06 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -955,7 +955,7 @@ public: case EVENT_SURGE_OF_POWER_P_THREE: if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) { - if (Unit* tempSurgeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, SPELL_RIDE_RED_DRAGON_BUDDY)) + if (Unit* tempSurgeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, false, true, SPELL_RIDE_RED_DRAGON_BUDDY)) { if (Vehicle* drakeVehicle = tempSurgeTarget->GetVehicleKit()) { @@ -979,7 +979,7 @@ public: events.ScheduleEvent(EVENT_SURGE_OF_POWER_P_THREE, urand(9, 18)*IN_MILLISECONDS, 0, PHASE_THREE); break; case EVENT_STATIC_FIELD: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, false, SPELL_RIDE_RED_DRAGON_BUDDY)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, false, true, SPELL_RIDE_RED_DRAGON_BUDDY)) DoCast(target, SPELL_STATIC_FIELD_MISSLE, true); events.ScheduleEvent(EVENT_STATIC_FIELD, urand(15, 30)*IN_MILLISECONDS, 0, PHASE_THREE); @@ -1827,13 +1827,11 @@ class spell_malygos_vortex_visual : public SpellScriptLoader { if (Creature* caster = GetCaster()->ToCreature()) { - ThreatContainer::StorageType const& m_threatlist = caster->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) + for (ThreatReference* ref : caster->GetThreatManager().GetUnsortedThreatList()) { - if (Unit* target = (*itr)->getTarget()) + if (Player* targetPlayer = ref->GetVictim()->ToPlayer()) { - Player* targetPlayer = target->ToPlayer(); - if (!targetPlayer || targetPlayer->IsGameMaster()) + if (targetPlayer->IsGameMaster()) continue; if (InstanceScript* instance = caster->GetInstanceScript()) diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index ef10057f180..f1ab2dfb0cb 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -181,26 +181,20 @@ public: { if (Creature* malygos = instance->GetCreature(malygosGUID)) { - ThreatContainer::StorageType const& threatList = malygos->getThreatManager().getThreatList(); for (GuidList::const_iterator itr_vortex = vortexTriggers.begin(); itr_vortex != vortexTriggers.end(); ++itr_vortex) { - if (threatList.empty()) - return; - uint8 counter = 0; if (Creature* trigger = instance->GetCreature(*itr_vortex)) { // each trigger have to cast the spell to 5 players. - for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) + for (auto* ref : malygos->GetThreatManager().GetUnsortedThreatList()) { if (counter >= 5) break; - if (Unit* target = (*itr)->getTarget()) + if (Player* player = ref->GetVictim()->ToPlayer()) { - Player* player = target->ToPlayer(); - - if (!player || player->IsGameMaster() || player->HasAura(SPELL_VORTEX_4)) + if (player->IsGameMaster() || player->HasAura(SPELL_VORTEX_4)) continue; player->CastSpell(trigger, SPELL_VORTEX_4, true); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp index 459b9cb188d..a7c8a2536db 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp @@ -290,7 +290,7 @@ class boss_urom : public CreatureScript { me->RemoveAllAuras(); me->CombatStop(false); - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); } void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp index 604fdeb6123..e22448a54ef 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp @@ -135,7 +135,7 @@ public: { if (me->Attack(who, true)) { - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); me->SetInCombatWith(who); who->SetInCombatWith(me); @@ -328,7 +328,7 @@ public: // 4 - Wait for delay to expire if (m_uiDelay_Timer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 0)) { me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWith(target); @@ -410,7 +410,7 @@ public: { if (me->Attack(who, true)) { - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); me->SetInCombatWith(who); who->SetInCombatWith(me); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 6463c0c1aef..5c3b98f3984 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -115,7 +115,7 @@ class boss_maiden_of_grief : public CreatureScript events.ScheduleEvent(EVENT_STORM_OF_GRIEF, urand(15000, 20000)); break; case EVENT_SHOCK_OF_SORROW: - DoResetThreat(); + ResetThreatList(); Talk(SAY_STUN); DoCastAOE(SPELL_SHOCK_OF_SORROW); events.ScheduleEvent(EVENT_SHOCK_OF_SORROW, urand(20000, 30000)); diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 2e926b17710..fc54e6fec54 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -384,7 +384,7 @@ public: void JustSummoned(Creature* summoned) override { lDwarfGUIDList.push_back(summoned->GetGUID()); - summoned->AddThreat(me, 0.0f); + AddThreat(me, 0.0f, summoned); summoned->AI()->AttackStart(me); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index aacf9332a75..72a911d398e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -593,8 +593,8 @@ class boss_algalon_the_observer : public CreatureScript //! Workaround for Creature::_IsTargetAcceptable returning false //! for creatures that start combat in REACT_PASSIVE and UNIT_FLAG_NOT_SELECTABLE //! causing them to immediately evade - if (!me->getThreatManager().isThreatListEmpty()) - AttackStart(me->getThreatManager().getHostilTarget()); + if (!me->GetThreatManager().IsThreatListEmpty()) + AttackStart(me->GetThreatManager().SelectVictim()); for (uint32 i = 0; i < LIVING_CONSTELLATION_COUNT; ++i) if (Creature* summon = DoSummon(NPC_LIVING_CONSTELLATION, ConstellationPos[i], 0, TEMPSUMMON_DEAD_DESPAWN)) summon->SetReactState(REACT_PASSIVE); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp index 0a22fafb95e..4e69e9c2bc6 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp @@ -630,7 +630,7 @@ class boss_stormcaller_brundir : public CreatureScript me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_VISUAL); DoStartMovement(me->GetVictim()); events.CancelEvent(EVENT_GROUND); - me->getThreatManager().resetAllAggro(); + ResetThreatList(); break; case EVENT_MOVE_POSITION: if (me->IsWithinMeleeRange(me->GetVictim())) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp index b9983785a18..aa6e8e955b4 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_auriaya.cpp @@ -152,7 +152,7 @@ class boss_auriaya : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { summoned->AI()->AttackStart(target); - summoned->AddThreat(target, 250.0f); + AddThreat(target, 250.0f, summoned); DoZoneInCombat(summoned); } @@ -374,7 +374,7 @@ class npc_sanctum_sentry : public CreatureScript case EVENT_POUNCE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - me->AddThreat(target, 100.0f); + AddThreat(target, 100.0f); AttackStart(target); DoCast(target, SPELL_SAVAGE_POUNCE); } @@ -443,7 +443,7 @@ class npc_feral_defender : public CreatureScript case EVENT_FERAL_POUNCE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - me->AddThreat(target, 100.0f); + AddThreat(target, 100.0f); AttackStart(target); DoCast(target, SPELL_FERAL_POUNCE); } @@ -452,7 +452,7 @@ class npc_feral_defender : public CreatureScript case EVENT_RUSH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { - me->AddThreat(target, 100.0f); + AddThreat(target, 100.0f); AttackStart(target); DoCast(target, SPELL_FERAL_RUSH); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index b8846cace28..b436f196b40 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -351,8 +351,7 @@ class boss_freya : public CreatureScript Elder[n]->CastSpell(me, SPELL_IRONBRANCH_ESSENCE, true); Elder[n]->RemoveLootMode(LOOT_MODE_DEFAULT); //! Why? Elder[n]->AI()->AttackStart(who); - Elder[n]->AddThreat(who, 250.0f); - Elder[n]->SetInCombatWith(who); + AddThreat(who, 250.0f, Elder[n]); ++elderCount; } } @@ -447,7 +446,7 @@ class boss_freya : public CreatureScript break; case EVENT_STRENGTHENED_IRON_ROOTS: Talk(EMOTE_IRON_ROOTS); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_ROOTS_FREYA)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_ROOTS_FREYA)) target->CastSpell(target, SPELL_ROOTS_FREYA, true); // This must be cast by Target self events.ScheduleEvent(EVENT_STRENGTHENED_IRON_ROOTS, urand(12000, 20000)); break; @@ -632,7 +631,7 @@ class boss_freya : public CreatureScript Elder->RemoveAllAuras(); Elder->AttackStop(); Elder->CombatStop(true); - Elder->DeleteThreatList(); + Elder->GetThreatManager().ClearAllThreat(); Elder->AI()->DoAction(ACTION_ELDER_FREYA_KILLED); } } @@ -662,7 +661,7 @@ class boss_freya : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true)) { summoned->AI()->AttackStart(target); - summoned->AddThreat(target, 250.0f); + AddThreat(target, 250.0f, summoned); DoZoneInCombat(summoned); } } @@ -959,7 +958,7 @@ class boss_elder_ironbranch : public CreatureScript events.ScheduleEvent(EVENT_IMPALE, urand(15000, 25000)); break; case EVENT_IRON_ROOTS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_ROOTS_IRONBRANCH)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_ROOTS_IRONBRANCH)) target->CastSpell(target, SPELL_ROOTS_IRONBRANCH, true); events.ScheduleEvent(EVENT_IRON_ROOTS, urand(10000, 20000)); break; @@ -1036,7 +1035,7 @@ class npc_detonating_lasher : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { // Switching to other target - modify aggro of new target by 20% from current target's aggro - me->AddThreat(target, me->getThreatManager().getThreat(me->GetVictim(), false) * 1.2f); + AddThreat(target, me->GetThreatManager().GetThreat(me->GetVictim()) * 1.2f); AttackStart(target); } changeTargetTimer = urand(5000, 10000); @@ -1303,7 +1302,7 @@ class npc_ancient_conservator : public CreatureScript if (natureFuryTimer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_NATURE_FURY)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_NATURE_FURY)) DoCast(target, SPELL_NATURE_FURY); me->AddAura(SPELL_CONSERVATOR_GRIP, me); natureFuryTimer = 5000; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index a7a90595ffe..5e24c699f78 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -233,7 +233,7 @@ class npc_flash_freeze : public CreatureScript { targetGUID = summoner->GetGUID(); me->SetInCombatWith(summoner); - me->AddThreat(summoner, 250.0f); + AddThreat(summoner, 250.0f); if (Unit* target = ObjectAccessor::GetUnit(*me, targetGUID)) { DoCast(target, SPELL_BLOCK_OF_ICE, true); @@ -277,8 +277,8 @@ class npc_ice_block : public CreatureScript summoner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED | UNIT_FLAG_PACIFIED); summoner->SetControlled(true, UNIT_STATE_ROOT); me->SetInCombatWith(summoner); - me->AddThreat(summoner, 250.0f); - summoner->AddThreat(me, 250.0f); + AddThreat(summoner, 250.0f); + AddThreat(me, 250.0f, summoner); if (Creature* target = ObjectAccessor::GetCreature(*me, targetGUID)) { DoCast(target, SPELL_FLASH_FREEZE_HELPER, true); @@ -487,7 +487,7 @@ class boss_hodir : public CreatureScript if (gettingColdInHereTimer <= diff && gettingColdInHere) { - std::list<HostileReference*> ThreatList = me->getThreatManager().getThreatList(); + std::list<HostileReference*> ThreatList = me->GetThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) if (Aura* BitingColdAura = target->GetAura(SPELL_BITING_COLD_TRIGGERED)) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp index 57ace8ec195..b17a5343f71 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_kologarn.cpp @@ -303,7 +303,7 @@ class boss_kologarn : public CreatureScript break; } case EVENT_FOCUSED_EYEBEAM: - if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_FARTHEST, 0, 0, true)) + if (Unit* eyebeamTargetUnit = SelectTarget(SELECT_TARGET_MAXDISTANCE, 0, 0, true)) { eyebeamTarget = eyebeamTargetUnit->GetGUID(); DoCast(me, SPELL_SUMMON_FOCUSED_EYEBEAM, true); @@ -367,7 +367,7 @@ class StoneGripTargetSelector : public std::unary_function<Unit*, bool> bool operator()(WorldObject* target) { - if (target == _victim && _me->getThreatManager().getThreatList().size() > 1) + if (target == _victim && _me->GetThreatManager().GetThreatListSize() > 1) return true; if (target->GetTypeId() != TYPEID_PLAYER) @@ -399,7 +399,7 @@ class spell_ulduar_stone_grip_cast_target : public SpellScriptLoader void FilterTargetsInitial(std::list<WorldObject*>& unitList) { // Remove "main tank" and non-player targets - unitList.remove_if(StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); + unitList.remove_if(StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetThreatManager().GetCurrentVictim())); // Maximum affected targets per difficulty mode uint32 maxTargets = 1; if (GetSpellInfo()->Id == 63981) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 9ed4f098ed6..4859e376779 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -1291,9 +1291,9 @@ class npc_mimiron_assault_bot : public CreatureScript if (me->HasUnitState(UNIT_STATE_ROOT)) { - if (Unit* newTarget = SelectTarget(SELECT_TARGET_NEAREST, 0, 30.0f, true)) + if (Unit* newTarget = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 30.0f, true)) { - me->DeleteThreatList(); + me->GetThreatManager().ClearAllThreat(); AttackStart(newTarget); } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index cfa977166ad..118c293755a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -607,7 +607,7 @@ class boss_thorim : public CreatureScript if (type != EFFECT_MOTION_TYPE || id != EVENT_JUMP) return; - me->getThreatManager().resetAllAggro(); + ResetThreatList(); SetBoundary(&ArenaBoundaries); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 66970ee996f..7f3a2120e88 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -3026,7 +3026,7 @@ class spell_yogg_saron_hate_to_zero : public SpellScriptLoader // 63984 { if (Unit* target = GetHitUnit()) if (target->CanHaveThreatList()) - target->getThreatManager().modifyThreatPercent(GetCaster(), -100); + target->GetThreatManager().ModifyThreatByPercent(GetCaster(), -100); } void Register() override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp index 6300fa0e9c1..3d2fa75ecac 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp @@ -228,7 +228,7 @@ class boss_ingvar_the_plunderer : public CreatureScript case EVENT_JUST_TRANSFORMED: ScheduleSecondPhase(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); - if (Unit* target = me->getThreatManager().getHostilTarget()) + if (Unit* target = me->GetThreatManager().SelectVictim()) AttackStart(target); else { diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index b10a6a97e04..bb4b78e55f5 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -202,7 +202,7 @@ class boss_keleseth : public CreatureScript events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3) * IN_MILLISECONDS); break; case EVENT_FROST_TOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_FROST_TOMB)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, true, -SPELL_FROST_TOMB)) { Talk(SAY_FROST_TOMB); Talk(SAY_FROST_TOMB_EMOTE, target); @@ -294,7 +294,7 @@ class npc_vrykul_skeleton : public CreatureScript switch (eventId) { case EVENT_DECREPIFY: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, true, -SPELL_DECREPIFY)) DoCast(target, SPELL_DECREPIFY); events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS); break; diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 4ba41149c45..effd1741bf1 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -603,7 +603,7 @@ public: _scheduler .Schedule(Seconds(13), [this](TaskContext net) { - if (Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30, true)) + if (Unit* target = SelectTarget(SELECT_TARGET_MAXDISTANCE, 0, 30, true)) DoCast(target, SPELL_NET); net.Repeat(); }) diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp index 83b25986222..d4cd2a1637f 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp @@ -193,7 +193,7 @@ public: case NPC_AVENGING_SPIRIT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - summon->AddThreat(target, 0.0f); + AddThreat(target, 0.0f, summon); summon->AI()->AttackStart(target); } break; diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 7f8d987ef31..e06087a738b 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -1122,7 +1122,7 @@ class npc_azure_stalker : public CreatureScript task.Schedule(Milliseconds(1300), [this](TaskContext /*task*/) { - if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 5.0f)) + if (Unit* target = SelectTarget(SELECT_TARGET_MINDISTANCE, 0, 5.0f)) DoCast(target, SPELL_BACKSTAB); }); diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp index 2e62c09bc17..50818339887 100644 --- a/src/server/scripts/Northrend/zone_borean_tundra.cpp +++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp @@ -721,7 +721,7 @@ public: Creature* owner = GetOwner()->ToCreature(); owner->RemoveAllAurasExceptType(SPELL_AURA_DUMMY); owner->CombatStop(true); - owner->DeleteThreatList(); + owner->GetThreatManager().ClearAllThreat(); owner->GetMotionMaster()->Clear(false); owner->GetMotionMaster()->MoveFollow(GetCaster(), 4.0f, 0.0f); owner->CastSpell(owner, SPELL_SUBDUED, true); |
