A more conservative way to fix crash #2892.

This commit is contained in:
megamage
2011-09-13 11:54:55 -04:00
parent 937d26e0fe
commit 76488854d8

View File

@@ -824,23 +824,24 @@ void Map::MoveAllCreaturesInMoveList()
}
else
{
//AddObjectToRemoveList(Pet*) should only be called in Pet::Remove
//This may happen when a player just logs in and a pet moves to a nearby unloaded cell
//To avoid this, we can load nearby cells when player log in
//But this check is always needed to ensure safety
if (c->isPet())
{
((Pet*)c)->Remove(PET_SAVE_NOT_IN_SLOT, true);
}
// if creature can't be move in new cell/grid (not loaded) move it to repawn cell/grid
// creature coordinates will be updated and notifiers send
else if (!CreatureRespawnRelocation(c))
if (!CreatureRespawnRelocation(c))
{
// ... or unload (if respawn grid also not loaded)
#ifdef TRINITY_DEBUG
sLog->outDebug(LOG_FILTER_MAPS, "Creature (GUID: %u Entry: %u) cannot be move to unloaded respawn grid.", c->GetGUIDLow(), c->GetEntry());
#endif
AddObjectToRemoveList(c);
//AddObjectToRemoveList(Pet*) should only be called in Pet::Remove
//This may happen when a player just logs in and a pet moves to a nearby unloaded cell
//To avoid this, we can load nearby cells when player log in
//But this check is always needed to ensure safety
//TODO: pets will disappear if this is outside CreatureRespawnRelocation
//need to check why pet is frequently relocated to an unloaded cell
if (c->isPet())
((Pet*)c)->Remove(PET_SAVE_NOT_IN_SLOT, true);
else
AddObjectToRemoveList(c);
}
}
@@ -933,8 +934,8 @@ bool Map::CreatureRespawnRelocation(Creature *c)
c->UpdateObjectVisibility(false);
return true;
}
else
return false;
return false;
}
bool Map::UnloadGrid(const uint32 x, const uint32 y, bool unloadAll)