diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-01-07 20:32:30 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-05-16 21:56:06 +0200 |
commit | c31ae7ab33c42689c45baa1f1086405656a3fdff (patch) | |
tree | c69e56176ac2152c464802ee49755ff0014629d0 | |
parent | 8b7728f82e6e7c326b7945efd719218179e9767a (diff) |
Core/Threat: Fix a potential exploit allowing players to damage a boss without them taking damage.
Scripts/Halion: General cleanup of old hacks no longer needed under new combat system.
(cherry picked from commit 9ad11e67fb6b410f18031ee68259866ea1354c8c)
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 1 | ||||
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp | 32 |
2 files changed, 14 insertions, 19 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 585dbe4a6ce..38e034c5b61 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -808,6 +808,7 @@ void Creature::Update(uint32 diff) if (diff >= m_boundaryCheckTime) { AI()->CheckInRoom(); + GetThreatManager().UpdateOnlineStates(false, true); m_boundaryCheckTime = 2500; } else m_boundaryCheckTime -= diff; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 17d3af227d1..41f797003e7 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -281,6 +281,9 @@ class boss_halion : public CreatureScript void DamageTaken(Unit* attacker, uint32& damage) override { + if (damage >= me->GetHealth() && !events.IsInPhase(PHASE_THREE)) + damage = me->GetHealth() - 1; + if (me->HealthBelowPctDamaged(75, damage) && events.IsInPhase(PHASE_ONE)) { events.SetPhase(PHASE_TWO); @@ -461,6 +464,8 @@ class boss_twilight_halion : public CreatureScript void DamageTaken(Unit* attacker, uint32& damage) override { + if (damage >= me->GetHealth() && !events.IsInPhase(PHASE_THREE)) + damage = me->GetHealth() - 1; //Needed because we already have UNIT_FLAG_IN_COMBAT, otherwise JustEngagedWith won't ever be called if (!events.IsInPhase(PHASE_TWO) && !events.IsInPhase(PHASE_THREE)) JustEngagedWith(attacker); @@ -607,7 +612,7 @@ class npc_halion_controller : public CreatureScript _events.ScheduleEvent(EVENT_EVADE_CHECK, Seconds(5)); } - void EnterEvadeMode(EvadeReason /*why*/) override + void JustExitedCombat() override { if (Creature* twilightHalion = _instance->GetCreature(DATA_TWILIGHT_HALION)) { @@ -624,16 +629,7 @@ class npc_halion_controller : public CreatureScript _instance->SetBossState(DATA_HALION, FAIL); _summons.DespawnAll(); - uint32 corpseDelay = me->GetCorpseDelay(); - uint32 respawnDelay = me->GetRespawnDelay(); - - me->SetCorpseDelay(1); - me->SetRespawnDelay(30); - - me->DespawnOrUnsummon(); - - me->SetCorpseDelay(corpseDelay); - me->SetRespawnDelay(respawnDelay); + me->DespawnOrUnsummon(0, 30s); } void DoAction(int32 action) override @@ -693,14 +689,11 @@ class npc_halion_controller : public CreatureScript void UpdateAI(uint32 diff) override { - // The IsInCombat() check is needed because that check should be false when Halion is + // The IsEngaged() check is needed because that check should be false when Halion is // not engaged, while it would return true without as UpdateVictim() checks for // combat state. - if (!_events.IsInPhase(PHASE_INTRO) && me->IsInCombat() && !UpdateVictim()) - { - EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + if (me->IsEngaged() && !UpdateVictim()) return; - } _events.Update(diff); @@ -737,9 +730,10 @@ class npc_halion_controller : public CreatureScript twilightHalion->CastSpell(nullptr, SPELL_TWILIGHT_MENDING, true); break; case EVENT_TRIGGER_BERSERK: - for (uint8 i = DATA_HALION; i <= DATA_TWILIGHT_HALION; i++) - if (Creature* halion = _instance->GetCreature(i)) - halion->CastSpell(halion, SPELL_BERSERK, true); + if (Creature* halion = _instance->GetCreature(DATA_HALION)) + halion->CastSpell(halion, SPELL_BERSERK, true); + if (Creature* halion = _instance->GetCreature(DATA_TWILIGHT_HALION)) + halion->CastSpell(halion, SPELL_BERSERK, true); break; case EVENT_SHADOW_PULSARS_SHOOT: if (Creature* orbCarrier = _instance->GetCreature(DATA_ORB_CARRIER)) |