diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-01-07 20:32:30 +0100 |
---|---|---|
committer | Treeston <treeston.mmoc@gmail.com> | 2018-01-07 20:32:30 +0100 |
commit | 9ad11e67fb6b410f18031ee68259866ea1354c8c (patch) | |
tree | b6eb4e3d69f01b7ac93e09694a0ba2f1cab82f04 | |
parent | 3bb33e3108c65ba8a1c35b934526562aa542b63b (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.
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 1 | ||||
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp | 30 |
2 files changed, 12 insertions, 19 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 64a25262532..7fe461772bd 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -753,6 +753,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 dc14230e065..e504de68f6e 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -280,6 +280,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); @@ -606,7 +609,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)) { @@ -623,16 +626,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 @@ -692,14 +686,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); @@ -736,9 +727,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)) |