From 3b8ac391d9d90c4ad1e3784510d0cf2d1db2ed0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francesco=20Borz=C3=AC?= Date: Sat, 7 Feb 2026 21:22:58 +0100 Subject: [PATCH] fix(Core/Scripts): apply safety improvements (#24635) --- src/server/game/Maps/Map.cpp | 2 +- .../Northrend/Naxxramas/boss_four_horsemen.cpp | 12 ++++++++---- .../scripts/Northrend/Naxxramas/boss_thaddius.cpp | 3 ++- src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp | 3 ++- .../scripts/Outland/BlackTemple/boss_illidan.cpp | 3 ++- src/server/scripts/World/scourge_invasion.cpp | 3 ++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 0ea47ff8a..13b3ee3b5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -568,7 +568,7 @@ void Map::AddObjectToPendingUpdateList(WorldObject* obj) return; UpdatableMapObject* mapUpdatableObject = dynamic_cast(obj); - if (mapUpdatableObject->GetUpdateState() != UpdatableMapObject::UpdateState::NotUpdating) + if (!mapUpdatableObject || mapUpdatableObject->GetUpdateState() != UpdatableMapObject::UpdateState::NotUpdating) return; _pendingAddUpdatableObjectList.insert(obj); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp index d73579c25..ba777b91e 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_four_horsemen.cpp @@ -169,10 +169,14 @@ public: { if (why == EVADE_REASON_BOUNDARY) { - instance->GetCreature(DATA_BARON_RIVENDARE_BOSS)->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - instance->GetCreature(DATA_LADY_BLAUMEUX_BOSS)->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - instance->GetCreature(DATA_SIR_ZELIEK_BOSS)->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - instance->GetCreature(DATA_THANE_KORTHAZZ_BOSS)->AI()->EnterEvadeMode(EVADE_REASON_OTHER); + if (Creature* cr = instance->GetCreature(DATA_BARON_RIVENDARE_BOSS)) + cr->AI()->EnterEvadeMode(EVADE_REASON_OTHER); + if (Creature* cr = instance->GetCreature(DATA_LADY_BLAUMEUX_BOSS)) + cr->AI()->EnterEvadeMode(EVADE_REASON_OTHER); + if (Creature* cr = instance->GetCreature(DATA_SIR_ZELIEK_BOSS)) + cr->AI()->EnterEvadeMode(EVADE_REASON_OTHER); + if (Creature* cr = instance->GetCreature(DATA_THANE_KORTHAZZ_BOSS)) + cr->AI()->EnterEvadeMode(EVADE_REASON_OTHER); } BossAI::EnterEvadeMode(); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp index f0831da05..d2e7dd1da 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp @@ -391,7 +391,8 @@ public: me->SetControlled(false, UNIT_STATE_STUNNED); if (why == EVADE_REASON_BOUNDARY) - instance->GetCreature(DATA_THADDIUS_BOSS)->AI()->EnterEvadeMode(EVADE_REASON_BOUNDARY); + if (Creature* thaddius = instance->GetCreature(DATA_THADDIUS_BOSS)) + thaddius->AI()->EnterEvadeMode(EVADE_REASON_BOUNDARY); ScriptedAI::EnterEvadeMode(why); } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp index 57bdb8d5d..77bf4b4fa 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.cpp @@ -142,7 +142,8 @@ void OutdoorPvPTF::ResetZoneToTeamControlled(TeamId team) for (auto& [guid, tower] : _capturePoints) { - dynamic_cast(tower)->ResetToTeamControlled(team); + if (auto* capturePoint = dynamic_cast(tower)) + capturePoint->ResetToTeamControlled(team); } SendUpdateWorldState(WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H, m_HordeTowersControlled); diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index 5e6dfac6e..4fe7fc412 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1000,7 +1000,8 @@ struct npc_akama_illidan : public ScriptedAI void JustReachedHome() override { // Minions Event - if (instance->GetBossState(DATA_ILLIDAN_STORMRAGE) == IN_PROGRESS && !instance->GetCreature(DATA_ILLIDAN_STORMRAGE)->HasAura(SPELL_DEATH)) + Creature* illidan = instance->GetCreature(DATA_ILLIDAN_STORMRAGE); + if (illidan && instance->GetBossState(DATA_ILLIDAN_STORMRAGE) == IN_PROGRESS && !illidan->HasAura(SPELL_DEATH)) { me->SetReactState(REACT_PASSIVE); me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); diff --git a/src/server/scripts/World/scourge_invasion.cpp b/src/server/scripts/World/scourge_invasion.cpp index 4eafd5306..eb7565780 100644 --- a/src/server/scripts/World/scourge_invasion.cpp +++ b/src/server/scripts/World/scourge_invasion.cpp @@ -238,7 +238,8 @@ struct npc_necropolis_health : public ScriptedAI if (spellInfo->Id == SPELL_DESPAWNER_OTHER && target->GetEntry() == NPC_NECROPOLIS) { DespawnNecropolis(); - dynamic_cast(target)->DespawnOrUnsummon(); + if (Creature* creature = target->ToCreature()) + creature->DespawnOrUnsummon(); me->DespawnOrUnsummon(); } }