diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2017-07-01 20:18:02 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-08-13 22:46:44 +0200 |
| commit | 8be23fcbbdf26e8169defd761e61765f301bebe0 (patch) | |
| tree | 6309b79f7dd617a8ddc801624dbbd4ed7ac22174 /src/server/scripts/Outland/TempestKeep | |
| parent | 2c99678118798279372f17d4bb5f5a88ac95c413 (diff) | |
[3.3.5] Combat/Threat rewrite - prep & refactor (#19966)
* Combat/Threat rewrite (PR #19930) prep work. Mostly refactors, and a compatibility layer on ThreatManager/HostileReference that allows scripts to be changed already.
(cherry picked from commit e2a1ccd118d129b96e09ff1a15ed0adb1d4a3897)
Diffstat (limited to 'src/server/scripts/Outland/TempestKeep')
6 files changed, 27 insertions, 40 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 59e48cb078b..9061f36d8bf 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -210,7 +210,7 @@ class boss_alar : public CreatureScript void UpdateAI(uint32 diff) override { - if (!me->IsInCombat()) // sometimes IsInCombat but !incombat, faction bug? + if (!me->IsEngaged()) return; if (Berserk_Timer <= diff) @@ -327,7 +327,7 @@ class boss_alar : public CreatureScript if (Phase1) { - if (me->getThreatManager().getThreatList().empty()) + if (!me->IsThreatened()) { EnterEvadeMode(); return; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index ab5480e8b5f..d09fa536cc3 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -410,11 +410,11 @@ struct advisorbase_ai : public ScriptedAI if (!Target) Target = me->GetVictim(); - DoResetThreat(); + ResetThreatList(); AttackStart(Target); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(Target); - me->AddThreat(Target, 0.0f); + AddThreat(Target, 0.0f); } } } @@ -560,7 +560,7 @@ class boss_kaelthas : public CreatureScript { DoAction(ACTION_START_ENCOUNTER); who->SetInCombatWith(me); - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); me->SetTarget(who->GetGUID()); } } @@ -621,7 +621,7 @@ class boss_kaelthas : public CreatureScript me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); me->RemoveAurasDueToSpell(SPELL_FULLPOWER); - if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_MAXTHREAT, 0)) AttackStart(target); DoAction(ACTION_SCHEDULE_COMBAT_EVENTS); @@ -706,7 +706,7 @@ class boss_kaelthas : public CreatureScript Talk(SAY_PHASE4_INTRO2); // Sometimes people can collect Aggro in Phase 1-3. Reset threat before releasing Kael. - DoResetThreat(); + ResetThreatList(); me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED)); @@ -906,7 +906,7 @@ class boss_thaladred_the_darkener : public CreatureScript void EnterCombat(Unit* who) override { Talk(SAY_THALADRED_AGGRO); - me->AddThreat(who, 5000000.0f); + AddThreat(who, 5000000.0f); } void JustDied(Unit* killer) override @@ -929,8 +929,8 @@ class boss_thaladred_the_darkener : public CreatureScript { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { - DoResetThreat(); - me->AddThreat(target, 5000000.0f); + ResetThreatList(); + AddThreat(target, 5000000.0f); Talk(EMOTE_THALADRED_GAZE, target); Gaze_Timer = 8500; } @@ -1089,7 +1089,7 @@ class boss_grand_astromancer_capernian : public CreatureScript if (me->Attack(who, true)) { - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); me->SetInCombatWith(who); who->SetInCombatWith(me); @@ -1137,13 +1137,11 @@ class boss_grand_astromancer_capernian : public CreatureScript if (ArcaneExplosion_Timer <= diff) { bool InMeleeRange = false; - Unit* target = NULL; - ThreatContainer::StorageType const &threatlist = me->getThreatManager().getThreatList(); - for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i!= threatlist.end(); ++i) + Unit* target = nullptr; + for (auto* ref : me->GetThreatManager().GetUnsortedThreatList()) { - Unit* unit = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()); - //if in melee range - if (unit && unit->IsWithinDistInMap(me, 5)) + Unit* unit = ref->GetVictim(); + if (unit->IsWithinMeleeRange(me)) { InMeleeRange = true; target = unit; @@ -1418,7 +1416,7 @@ class npc_phoenix_egg_tk : public CreatureScript void JustSummoned(Creature* summoned) override { - summoned->AddThreat(me->GetVictim(), 0.0f); + AddThreat(me->GetVictim(), 0.0f, summoned); summoned->CastSpell(summoned, SPELL_REBIRTH, false); } diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 3ca0d959f79..8886740ff1b 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -111,20 +111,15 @@ class boss_void_reaver : public CreatureScript break; case EVENT_ARCANE_ORB: { - Unit* target = NULL; - std::list<HostileReference*> t_list = me->getThreatManager().getThreatList(); std::vector<Unit*> target_list; - for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + for (auto* ref : me->GetThreatManager().GetUnsortedThreatList()) { - target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (!target) - continue; - // exclude pets & totems, 18 yard radius minimum + Unit* target = ref->GetVictim(); if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false)) target_list.push_back(target); - target = NULL; } + Unit* target; if (!target_list.empty()) target = *(target_list.begin() + rand32() % target_list.size()); else @@ -139,8 +134,8 @@ class boss_void_reaver : public CreatureScript case EVENT_KNOCK_AWAY: DoCastVictim(SPELL_KNOCK_AWAY); // Drop 25% aggro - if (DoGetThreat(me->GetVictim())) - DoModifyThreatPercent(me->GetVictim(), -25); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -25); events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000); break; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp index d8775fa71df..9dd6bc36fb9 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.cpp @@ -78,16 +78,11 @@ class npc_crystalcore_devastator : public CreatureScript //Knockaway_Timer if (Knockaway_Timer <= diff) { - DoCastVictim(SPELL_KNOCKAWAY, true); - - // current aggro target is knocked away pick new target - Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0); - - if (!target || target == me->GetVictim()) - target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1); - - if (target) - me->TauntApply(target); + if (Unit* victim = me->GetVictim()) + { + DoCastVictim(SPELL_KNOCKAWAY, true); + me->GetThreatManager().ResetThreat(victim); + } Knockaway_Timer = 23000; } diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 2a68ebd1ef6..a3d1fa9ee55 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -214,7 +214,6 @@ class npc_ragin_flames : public CreatureScript if (inferno_Timer <= diff) { DoCastVictim(SPELL_INFERNO); - me->TauntApply(me->GetVictim()); inferno_Timer = 10000; } else inferno_Timer -= diff; diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 3b4f22bc23c..eafd1f679f4 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -116,7 +116,7 @@ class npc_millhouse_manastorm : public CreatureScript { if (me->Attack(who, true)) { - me->AddThreat(who, 0.0f); + AddThreat(who, 0.0f); me->SetInCombatWith(who); who->SetInCombatWith(me); me->GetMotionMaster()->MoveChase(who, 25.0f); |
