From b49cf2df28d59174ad9d033d77cfff39fb7632c1 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 25 Oct 2009 01:03:52 +0400 Subject: [PATCH] [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. --- src/game/Map.cpp | 17 +++++++++-------- src/game/Player.cpp | 7 ++++--- src/shared/revision_nr.h | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index c8ecdcf0c..b2d000aa4 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -735,9 +735,10 @@ void Map::Remove(Player *player, bool remove) { if(remove) player->CleanupsBeforeDelete(); + else + player->RemoveFromWorld(); // invalid coordinates - player->RemoveFromWorld(); player->ResetMap(); if( remove ) @@ -760,8 +761,9 @@ void Map::Remove(Player *player, bool remove) if(remove) player->CleanupsBeforeDelete(); + else + player->RemoveFromWorld(); - player->RemoveFromWorld(); RemoveFromGrid(player,grid,cell); SendRemoveTransports(player); @@ -830,7 +832,11 @@ Map::Remove(T *obj, bool remove) if(obj->isActiveObject()) RemoveFromActive(obj); - obj->RemoveFromWorld(); + if(remove) + obj->CleanupsBeforeDelete(); + else + obj->RemoveFromWorld(); + RemoveFromGrid(obj,grid,cell); UpdateObjectVisibility(obj,cell,p); @@ -2161,9 +2167,6 @@ void Map::RemoveAllObjectsInRemoveList() Remove((GameObject*)obj,true); break; 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); break; default: @@ -3487,8 +3490,6 @@ void Map::SendObjectUpdates() { Object* obj = *i_objectsToClientUpdate.begin(); i_objectsToClientUpdate.erase(i_objectsToClientUpdate.begin()); - if (!obj) - continue; obj->BuildUpdateData(update_players); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5b3dd8f9f..c8e9ca2e5 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1757,11 +1757,12 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati } GetSession()->SendPacket( &data ); 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 float final_x = x; float final_y = y; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 521628138..fb008bb78 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8724" + #define REVISION_NR "8725" #endif // __REVISION_NR_H__