[8725] Fixed bug with crash at forced logout in combat in instance.

In fact this old bug that just has been triggred more often after recent code changes,
so with some chance maybe some other logout related crashes fixed.

Also small cleanup in avoid double calls RemoveFromWorld and CleanupsBeforeDelete in some cases.
This commit is contained in:
VladimirMangos 2009-10-25 01:03:52 +04:00
parent 7323966738
commit b49cf2df28
3 changed files with 14 additions and 12 deletions

View file

@ -735,9 +735,10 @@ void Map::Remove(Player *player, bool remove)
{ {
if(remove) if(remove)
player->CleanupsBeforeDelete(); player->CleanupsBeforeDelete();
else
player->RemoveFromWorld();
// invalid coordinates // invalid coordinates
player->RemoveFromWorld();
player->ResetMap(); player->ResetMap();
if( remove ) if( remove )
@ -760,8 +761,9 @@ void Map::Remove(Player *player, bool remove)
if(remove) if(remove)
player->CleanupsBeforeDelete(); player->CleanupsBeforeDelete();
else
player->RemoveFromWorld();
player->RemoveFromWorld();
RemoveFromGrid(player,grid,cell); RemoveFromGrid(player,grid,cell);
SendRemoveTransports(player); SendRemoveTransports(player);
@ -830,7 +832,11 @@ Map::Remove(T *obj, bool remove)
if(obj->isActiveObject()) if(obj->isActiveObject())
RemoveFromActive(obj); RemoveFromActive(obj);
obj->RemoveFromWorld(); if(remove)
obj->CleanupsBeforeDelete();
else
obj->RemoveFromWorld();
RemoveFromGrid(obj,grid,cell); RemoveFromGrid(obj,grid,cell);
UpdateObjectVisibility(obj,cell,p); UpdateObjectVisibility(obj,cell,p);
@ -2161,9 +2167,6 @@ void Map::RemoveAllObjectsInRemoveList()
Remove((GameObject*)obj,true); Remove((GameObject*)obj,true);
break; break;
case TYPEID_UNIT: case TYPEID_UNIT:
// in case triggered sequence some spell can continue casting after prev CleanupsBeforeDelete call
// make sure that like sources auras/etc removed before destructor start
((Creature*)obj)->CleanupsBeforeDelete ();
Remove((Creature*)obj,true); Remove((Creature*)obj,true);
break; break;
default: default:
@ -3487,8 +3490,6 @@ void Map::SendObjectUpdates()
{ {
Object* obj = *i_objectsToClientUpdate.begin(); Object* obj = *i_objectsToClientUpdate.begin();
i_objectsToClientUpdate.erase(i_objectsToClientUpdate.begin()); i_objectsToClientUpdate.erase(i_objectsToClientUpdate.begin());
if (!obj)
continue;
obj->BuildUpdateData(update_players); obj->BuildUpdateData(update_players);
} }

View file

@ -1757,11 +1757,12 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
} }
GetSession()->SendPacket( &data ); GetSession()->SendPacket( &data );
SendSavedInstances(); SendSavedInstances();
// remove from old map now
if(oldmap) oldmap->Remove(this, false);
} }
// remove from old map now
if(oldmap)
oldmap->Remove(this, false);
// new final coordinates // new final coordinates
float final_x = x; float final_x = x;
float final_y = y; float final_y = y;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8724" #define REVISION_NR "8725"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__