diff options
author | ariel- <ariel-@users.noreply.github.com> | 2018-01-18 13:58:40 -0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-06-16 12:02:14 +0200 |
commit | 62c571076e5319c07c7222e139dbfc7c8bb4543f (patch) | |
tree | 234a3a61c51a3dec6517ab29f3904005f4cb66b8 | |
parent | ea79b5569809515e680d8e38dd8126f11f5fa666 (diff) |
Core/Scripts: added nullptr checks to DamageTaken hooks
Since cb9e72e521d3cc415dd15bf6912c87f89e41b92a attacker may not be in world when hook is called
(cherry picked from commit 0db5c2df3fe56f42293865e87ec781cd4d41598b)
22 files changed, 43 insertions, 35 deletions
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp index 0aad78d8cbb..ea01e96025c 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp @@ -167,7 +167,7 @@ public: void DamageTaken(Unit* done_by, uint32 &damage) override { - if (done_by->GetGUID() != malchezaar) + if (!done_by || done_by->GetGUID() != malchezaar) damage = 0; } diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index efa0cc7e5bb..83a19eb2527 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -532,7 +532,7 @@ public: void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) override { - if (m_bIsDuelInProgress && pDoneBy->IsControlledByPlayer()) + if (m_bIsDuelInProgress && pDoneBy && pDoneBy->IsControlledByPlayer()) { if (pDoneBy->GetGUID() != m_uiDuelerGUID && pDoneBy->GetOwnerGUID() != m_uiDuelerGUID) // other players cannot help uiDamage = 0; diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index c971dbf1dcb..32fbc1cf83e 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -203,7 +203,7 @@ struct boss_kalecgos : public BossAI void DamageTaken(Unit* who, uint32 &damage) override { - if (damage >= me->GetHealth() && who->GetGUID() != me->GetGUID()) + if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID())) damage = 0; } @@ -371,7 +371,7 @@ struct boss_kalecgos_human : public ScriptedAI void DamageTaken(Unit* who, uint32 &damage) override { - if (who->GetGUID() != _sathGUID) + if (!who || who->GetGUID() != _sathGUID) damage = 0; if (HealthBelowPct(75) && _events.IsInPhase(PHASE_SAY_ONE)) @@ -483,7 +483,7 @@ struct boss_sathrovarr : public BossAI void DamageTaken(Unit* who, uint32 &damage) override { - if (damage >= me->GetHealth() && who->GetGUID() != me->GetGUID()) + if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID())) damage = 0; } diff --git a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp index b5b1336a50c..c59df0ed693 100644 --- a/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/zone_redridge_mountains.cpp @@ -67,7 +67,7 @@ public: void DamageTaken(Unit* who, uint32& damage) override { - if (who->GetTypeId() == TYPEID_UNIT && me->HealthBelowPctDamaged(82, damage)) + if ((!who || who->GetTypeId() == TYPEID_UNIT) && me->HealthBelowPctDamaged(82, damage)) damage = 0; } @@ -102,7 +102,7 @@ public: void DamageTaken(Unit* who, uint32& damage) override { - if (who->GetTypeId() == TYPEID_UNIT && me->HealthBelowPctDamaged(82, damage)) + if ((!who || who->GetTypeId() == TYPEID_UNIT) && me->HealthBelowPctDamaged(82, damage)) damage = 0; } diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp index 30445f19871..72fa7dcf141 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp @@ -194,7 +194,7 @@ hyjal_trashAI::hyjal_trashAI(Creature* creature) : EscortAI(creature) void hyjal_trashAI::DamageTaken(Unit* done_by, uint32 &damage) { - if (done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet()) + if (!done_by || done_by->GetTypeId() == TYPEID_PLAYER || done_by->IsPet()) { damageTaken += damage; instance->SetData(DATA_RAIDDAMAGE, damage);//store raid's damage diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp index 6fa10647d47..c28cc669ba5 100644 --- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp +++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp @@ -119,7 +119,7 @@ class boss_viscidus : public CreatureScript ++_hitcounter; - if (attacker->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && _hitcounter >= HITCOUNTER_EXPLODE) + if (attacker && attacker->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && _hitcounter >= HITCOUNTER_EXPLODE) { Talk(EMOTE_EXPLODE); events.Reset(); diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index 6c96f6934d4..c5cf1f86109 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -126,8 +126,9 @@ public: { Damage = 0; - if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself()) - player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me); + if (pDoneBy) + if (Player* player = pDoneBy->GetCharmerOrOwnerPlayerOrPlayerItself()) + player->GroupEventHappens(QUEST_MISSING_DIPLO_PT16, me); Talk(EMOTE_SURRENDER); EnterEvadeMode(); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 30d28e2534f..8105d570cee 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -301,7 +301,7 @@ class boss_halion : public CreatureScript if (events.IsInPhase(PHASE_THREE)) { // Don't consider copied damage. - if (!me->IsInPhase(attacker)) + if (!attacker || !me->IsInPhase(attacker)) return; if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER)) @@ -482,7 +482,7 @@ class boss_twilight_halion : public CreatureScript if (events.IsInPhase(PHASE_THREE)) { // Don't consider copied damage. - if (!me->IsInPhase(attacker)) + if (!attacker || !me->IsInPhase(attacker)) return; if (Creature* controller = instance->GetCreature(DATA_HALION_CONTROLLER)) 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 731f70b21bb..c29683fa748 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -975,7 +975,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript return false; } - void DamageTaken(Unit* , uint32& damage) override + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { if (me->HealthBelowPctDamaged(65, damage) && !me->HasAura(SPELL_TASTE_OF_BLOOD)) DoCast(me, SPELL_TASTE_OF_BLOOD, true); @@ -1245,7 +1245,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript return false; } - void DamageTaken(Unit* , uint32& damage) override + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { if (me->HealthBelowPctDamaged(65, damage) && me->HasAura(SPELL_TASTE_OF_BLOOD)) DoCast(me, SPELL_TASTE_OF_BLOOD, true); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 673bc276a11..5ff54b70d8b 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -579,7 +579,7 @@ struct npc_gothik_minion_baseAI : public ScriptedAI void DamageTaken(Unit* attacker, uint32 &damage) override { // do not allow minions to take damage before the gate is opened - if (!_gateIsOpen && !isOnSameSide(attacker)) + if (!_gateIsOpen && (!attacker || !isOnSameSide(attacker))) damage = 0; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 82fde5eb24f..6c2b296d6ac 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -715,7 +715,7 @@ class boss_flame_leviathan_defense_turret : public CreatureScript bool CanAIAttack(Unit const* who) const override { - if (who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) + if (!who || who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != NPC_SEAT) return false; return true; } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp index 5c650b734b0..083c37d4763 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp @@ -838,9 +838,10 @@ class boss_elder_stonebark : public CreatureScript void DamageTaken(Unit* who, uint32& damage) override { - if (who == me) + if (!who || who == me) return; + ///HACK: should be handled by proc if (me->HasAura(SPELL_PETRIFIED_BARK)) { CastSpellExtraArgs args(TRIGGERED_FULL_MASK); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index 2e9fa68bc89..16835d41efc 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -716,7 +716,8 @@ class boss_leviathan_mk_ii : public CreatureScript { me->SetStandState(UNIT_STAND_STATE_DEAD); - if (IsEncounterFinished(who)) + Unit* ref = who ? who : me; + if (IsEncounterFinished(ref)) return; me->CastStop(); @@ -960,7 +961,8 @@ class boss_vx_001 : public CreatureScript me->SetStandState(UNIT_STAND_STATE_DEAD); me->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - if (IsEncounterFinished(who)) + Unit* ref = who ? who : me; + if (IsEncounterFinished(ref)) return; me->CastStop(); @@ -1139,7 +1141,8 @@ class boss_aerial_command_unit : public CreatureScript { me->SetStandState(UNIT_STAND_STATE_DEAD); - if (IsEncounterFinished(who)) + Unit* ref = who ? who : me; + if (IsEncounterFinished(ref)) return; me->CastStop(); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp index 187ae82ca45..ba93019b049 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_thorim.cpp @@ -893,7 +893,7 @@ class boss_thorim : public CreatureScript bool CanStartPhase2(Unit* actor) const { - if (actor->GetTypeId() != TYPEID_PLAYER || !me->IsWithinDistInMap(actor, 10.0f)) + if (!actor || actor->GetTypeId() != TYPEID_PLAYER || !me->IsWithinDistInMap(actor, 10.0f)) return false; Creature* runicColossus = instance->GetCreature(DATA_RUNIC_COLOSSUS); @@ -1152,7 +1152,7 @@ class npc_thorim_pre_phase : public CreatureScript void DamageTaken(Unit* attacker, uint32& damage) override { // nullify spell damage - if (!attacker->GetAffectingPlayer()) + if (!attacker || !attacker->GetAffectingPlayer()) damage = 0; } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 568d6e6c092..334436bb49f 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -559,7 +559,7 @@ class npc_scourge_hulk : public CreatureScript void DamageTaken(Unit* attacker, uint32 &damage) override { - if (damage >= me->GetHealth() && attacker->GetEntry() == NPC_SVALA_SORROWGRAVE) + if (damage >= me->GetHealth() && attacker && attacker->GetEntry() == NPC_SVALA_SORROWGRAVE) killedByRitualStrike = true; } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index 00852bf9c26..5493011cf03 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -74,7 +74,7 @@ public: void DamageTaken(Unit* pDoneBy, uint32& uiDamage) override { - if (uiDamage > me->GetHealth() && pDoneBy->GetTypeId() == TYPEID_PLAYER) + if (uiDamage > me->GetHealth() && pDoneBy && pDoneBy->GetTypeId() == TYPEID_PLAYER) { uiDamage = 0; pDoneBy->CastSpell(pDoneBy, SPELL_KILL_CREDIT, true); diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 0eb318acc6e..6abc09dee88 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -703,8 +703,7 @@ struct boss_illidan_stormrage : public BossAI void DamageTaken(Unit* who, uint32 &damage) override { - - if (damage >= me->GetHealth() && who->GetGUID() != me->GetGUID()) + if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID())) { damage = me->GetHealth() - 1; if (!_dead) diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp index 9594465ea83..1009106b426 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -275,7 +275,7 @@ struct IllidariCouncilBossAI : public BossAI void DamageTaken(Unit* who, uint32 &damage) override { - if (damage >= me->GetHealth() && who->GetGUID() != me->GetGUID()) + if (damage >= me->GetHealth() && (!who || who->GetGUID() != me->GetGUID())) damage = me->GetHealth() - 1; } 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 57bd9af5500..829d211fd84 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 @@ -128,7 +128,7 @@ public: void DamageTaken(Unit* done_by, uint32 &damage) override { - if (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID()) + if (!done_by || (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID())) { damage = 0; ModifyThreatByPercent(done_by, -100); diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index d6e88a17fab..7db59f845a3 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -368,7 +368,7 @@ struct advisorbase_ai : public ScriptedAI } } - void DamageTaken(Unit* killer, uint32 &damage) override + void DamageTaken(Unit* /*killer*/, uint32 &damage) override { if (damage >= me->GetHealth() && !_inFakeDeath && !_hasRessurrected) { @@ -387,7 +387,7 @@ struct advisorbase_ai : public ScriptedAI me->SetTarget(ObjectGuid::Empty); me->SetStandState(UNIT_STAND_STATE_DEAD); me->GetMotionMaster()->Clear(); - JustDied(killer); + JustDied(nullptr); } } @@ -572,7 +572,9 @@ class boss_kaelthas : public CreatureScript if (_phase == PHASE_NONE) { DoAction(ACTION_START_ENCOUNTER); - me->SetTarget(attacker->GetGUID()); + + if (attacker) + me->SetTarget(attacker->GetGUID()); } if (!_hasFullPower && me->HealthBelowPctDamaged(50, damage)) diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index 590342d4a8f..4cf8b780204 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -99,9 +99,10 @@ public: void DamageTaken(Unit* done_by, uint32 &damage) override { - Player* player = done_by->ToPlayer(); + if (!done_by || !me->HealthBelowPctDamaged(30, damage)) + return; - if (player && me->HealthBelowPctDamaged(30, damage)) + if (Player* player = done_by->ToPlayer()) { if (Group* group = player->GetGroup()) { diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 575c566da85..0e0cf7a1d85 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1776,7 +1776,8 @@ public: void DamageTaken(Unit* doneBy, uint32& damage) override { - _damageTimes[doneBy->GetGUID()] = GameTime::GetGameTime(); + if (doneBy) + _damageTimes[doneBy->GetGUID()] = GameTime::GetGameTime(); damage = 0; } |