From a5bd0b9a41271387c7619ddd91fa48c6ef228bc2 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:26:24 +0100 Subject: [PATCH] [CRASH FIX] Crash logs fixes (#2052) https://github.com/mod-playerbots/mod-playerbots/issues/2046 https://github.com/mod-playerbots/mod-playerbots/issues/2030 --- .../Dungeon/Oculus/Action/OculusActions.cpp | 20 +++++++++----- src/Bot/PlayerbotAI.cpp | 26 ++++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp b/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp index f1aa4d29..414acc4b 100644 --- a/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp +++ b/src/Ai/Dungeon/Oculus/Action/OculusActions.cpp @@ -62,17 +62,25 @@ bool MountDrakeAction::Execute(Event event) break; } - GuidVector members = AI_VALUE(GuidVector, "group members"); - for (auto& member : members) + std::vector players = botAI->GetPlayersInGroup(); + for (Player* player : players) { - Player* player = botAI->GetPlayer(member); - if (!player->GetSession()->IsBot()) { continue; } + if (!player || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) + continue; - for (int i = 0; i < composition.size(); i++) + WorldSession* session = player->GetSession(); + if (!session || !session->IsBot()) + continue; + + int slot = botAI->GetGroupSlotIndex(player); + if (slot < 0) + continue; + + for (uint8 i = 0; i < composition.size(); ++i) { if (composition[i] > 0) { - drakeAssignments[botAI->GetGroupSlotIndex(player)] = DRAKE_ITEMS[i]; + drakeAssignments[slot] = DRAKE_ITEMS[i]; composition[i]--; break; } diff --git a/src/Bot/PlayerbotAI.cpp b/src/Bot/PlayerbotAI.cpp index 8fb3e258..49efe092 100644 --- a/src/Bot/PlayerbotAI.cpp +++ b/src/Bot/PlayerbotAI.cpp @@ -89,8 +89,10 @@ void PacketHandlingHelper::Handle(ExternalEventHelper& helper) { while (!queue.empty()) { - helper.HandlePacket(handlers, queue.top()); - queue.pop(); + WorldPacket packet = queue.top(); + queue.pop(); // remove first so handling can't modify the queue while we're using it + + helper.HandlePacket(handlers, packet); } } @@ -437,9 +439,16 @@ void PlayerbotAI::UpdateAIGroupMaster() void PlayerbotAI::UpdateAIInternal([[maybe_unused]] uint32 elapsed, bool minimal) { - if (!bot || bot->IsBeingTeleported() || !bot->IsInWorld()) + + if (!bot || !bot->GetSession()) return; + if (!bot->IsInWorld() || bot->IsBeingTeleported() || bot->IsDuringRemoveFromWorld()) + return; + + if (!bot->GetMap()) + return; // instances are created and destroyed on demand + std::string const mapString = WorldPosition(bot).isOverworld() ? std::to_string(bot->GetMapId()) : "I"; PerfMonitorOperation* pmo = sPerfMonitor->start(PERF_MON_TOTAL, "PlayerbotAI::UpdateAIInternal " + mapString); @@ -2238,10 +2247,15 @@ bool PlayerbotAI::IsMainTank(Player* player) bool PlayerbotAI::IsBotMainTank(Player* player) { - if (!player->GetSession()->IsBot() || !IsTank(player)) - { + if (!player || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) + return false; + + WorldSession* session = player->GetSession(); + if (!session || !session->IsBot()) + return false; + + if (!IsTank(player)) return false; - } if (IsMainTank(player)) {