From bd4cf4b78be49c69b34897f1e8357c714d2b52b9 Mon Sep 17 00:00:00 2001 From: megamage Date: Thu, 15 Sep 2011 15:29:52 -0400 Subject: Store pendingInstanceId instead of pointer of instance save, because pointer may become invalid. Fix #2987. --- src/server/game/Entities/Player/Player.cpp | 8 ++++++-- src/server/game/Entities/Player/Player.h | 6 +++--- src/server/game/Maps/Map.cpp | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3f6babc5a28..019e69ce5ad 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1754,7 +1754,7 @@ void Player::Update(uint32 p_time) if (_pendingBindTimer <= p_time) { // Player left the instance - if (_pendingBind->GetInstanceId() == GetInstanceId()) + if (_pendingBindId == GetInstanceId()) BindToInstance(); SetPendingBind(NULL, 0); } @@ -18021,10 +18021,14 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, b void Player::BindToInstance() { + InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId); + if (!mapSave) //it seems sometimes mapSave is NULL, but I did not check why + return; + WorldPacket data(SMSG_INSTANCE_SAVE_CREATED, 4); data << uint32(0); GetSession()->SendPacket(&data); - BindToInstance(_pendingBind, true); + BindToInstance(mapSave, true); } void Player::SendRaidInfo() diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ed3de8e8767..1e1bb283a20 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2373,8 +2373,8 @@ class Player : public Unit, public GridObject void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false); InstancePlayerBind* BindToInstance(InstanceSave* save, bool permanent, bool load = false); void BindToInstance(); - void SetPendingBind(InstanceSave* save, uint32 bindTimer) { _pendingBind = save; _pendingBindTimer = bindTimer; } - bool HasPendingBind() const { return _pendingBind != NULL; } + void SetPendingBind(uint32 instanceId, uint32 bindTimer) { _pendingBindId = instanceId; _pendingBindTimer = bindTimer; } + bool HasPendingBind() const { return _pendingBindId > 0; } void SendRaidInfo(); void SendSavedInstances(); static void ConvertInstancesToGroup(Player* player, Group* group, bool switchLeader); @@ -2802,7 +2802,7 @@ class Player : public Unit, public GridObject uint32 m_timeSyncServer; InstanceTimeMap _instanceResetTimes; - InstanceSave* _pendingBind; + uint32 _pendingBindId; uint32 _pendingBindTimer; }; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index e3bd3518559..c076450e98d 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2361,7 +2361,7 @@ bool InstanceMap::Add(Player* player) data << uint32(i_data ? i_data->GetCompletedEncounterMask() : 0); data << uint8(0); player->GetSession()->SendPacket(&data); - player->SetPendingBind(mapSave, 60000); + player->SetPendingBind(mapSave->GetInstanceId(), 60000); } } } -- cgit v1.2.3