Skip to content

Commit 6923ec7

Browse files
committed
NPCBots: Check if bot is in grid before trying to remove from one
1 parent 9688134 commit 6923ec7

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/server/game/AI/NpcBots/botmgr.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,10 +1661,7 @@ void BotMgr::_teleportBot(Creature* bot, Map* newMap, float x, float y, float z,
16611661
bot->RemoveFromWorld();
16621662
}
16631663

1664-
ASSERT(bot->GetGUID());
1665-
16661664
bot->RemoveAllGameObjects();
1667-
16681665
bot->m_Events.KillAllEvents(false);
16691666
bot->CombatStop();
16701667
bot->ClearComboPoints();

src/server/game/Maps/Map.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,40 @@ template<class T>
10321032
void Map::RemoveFromMap(T *obj, bool remove)
10331033
{
10341034
bool const inWorld = obj->IsInWorld() && obj->GetTypeId() >= TYPEID_UNIT && obj->GetTypeId() <= TYPEID_GAMEOBJECT;
1035+
1036+
//npcbot: tempfix for bots out of grid during remove from map
1037+
if constexpr (std::is_base_of_v<Creature, T>)
1038+
{
1039+
if (obj->IsNPCBot())
1040+
{
1041+
obj->RemoveFromWorld();
1042+
1043+
if (obj->isActiveObject())
1044+
RemoveFromActive(obj);
1045+
1046+
if (!inWorld) // if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
1047+
obj->DestroyForNearbyPlayers(); // previous obj->UpdateObjectVisibility(true)
1048+
1049+
if (obj->IsInGrid())
1050+
obj->RemoveFromGrid();
1051+
else
1052+
{
1053+
Player const* owner = obj->ToCreature()->GetBotOwner();
1054+
BOT_LOG_ERROR("npcbots", "Map::Remove<Bot>FromMap() bot {} id {} is in map id {} \"{}\" instanceId {} but not in grid!\nmaster: {}\nmaster map id {} \"{}\"",
1055+
obj->GetName(), obj->GetEntry(), GetId(), GetMapName(), i_InstanceId, owner ? owner->GetGUID().ToString() : std::string{ "Unknown" },
1056+
(owner && owner->IsInWorld()) ? owner->GetMap()->GetId() : 0u, (owner && owner->IsInWorld()) ? std::string(owner->GetMap()->GetMapName()) : std::string{"Unknown"});
1057+
}
1058+
1059+
obj->ResetMap();
1060+
1061+
if (remove)
1062+
DeleteFromWorld(obj);
1063+
1064+
return;
1065+
}
1066+
}
1067+
//end npcbot
1068+
10351069
obj->RemoveFromWorld();
10361070

10371071
if (obj->isActiveObject())

0 commit comments

Comments
 (0)