diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2016-08-18 13:31:04 -0300 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-02-12 15:45:12 +0100 |
| commit | 8ea1a3776115d06d43f40be9d461402816ab6a91 (patch) | |
| tree | 0bdad5eee56b4113ccfc3b3c3a4f1e8af792a97c | |
| parent | 4d67347ec0ac9d66a37b51cb2c8631f29675b17f (diff) | |
Core/Player: readd player to battleground after a login (but only after adding it to map, preventing a crash). Closes #16141 (again)
(cherry picked from commit 3f9cf3fdb6ab4d8c696c67df8289df016f9447ae)
# Conflicts:
# src/server/game/Entities/Player/Player.cpp
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 19ce052728f..e628768cb7e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17320,6 +17320,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) GetSession()->SetPlayer(this); MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); + Map* map = nullptr; + bool player_at_bg = false; if (!mapEntry || !IsPositionValid()) { TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has invalid coordinates (MapId: %u X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.", @@ -17333,10 +17335,12 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (m_bgData.bgInstanceID) //saved in Battleground currentBg = sBattlegroundMgr->GetBattleground(m_bgData.bgInstanceID, BATTLEGROUND_TYPE_NONE); - bool player_at_bg = currentBg && currentBg->IsPlayerInBattleground(GetGUID()); + player_at_bg = currentBg && currentBg->IsPlayerInBattleground(GetGUID()); if (player_at_bg && currentBg->GetStatus() != STATUS_WAIT_LEAVE) { + map = currentBg->GetBgMap(); + BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(currentBg->GetTypeID(), currentBg->GetArenaType()); AddBattlegroundQueueId(bgQueueTypeId); @@ -17356,8 +17360,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) currentBg->RemovePlayerAtLeave(GetGUID(), false, true); // Do not look for instance if bg not found - const WorldLocation& _loc = GetBattlegroundEntryPoint(); - mapId = _loc.GetMapId(); instanceId = 0; + WorldLocation const& _loc = GetBattlegroundEntryPoint(); + mapId = _loc.GetMapId(); + instanceId = 0; // Db field type is type int16, so it can never be MAPID_INVALID //if (mapId == MAPID_INVALID) -- code kept for reference @@ -17486,7 +17491,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // NOW player must have valid map // load the player's map here if it's not already loaded - Map* map = sMapMgr->CreateMap(mapId, this, instanceId); + if (!map) + map = sMapMgr->CreateMap(mapId, this, instanceId); AreaTriggerStruct const* areaTrigger = nullptr; bool check = false; @@ -17568,6 +17574,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (!CheckInstanceValidity(true) && !IsInstanceLoginGameMasterException()) m_InstanceValid = false; + if (player_at_bg) + map->ToBattlegroundMap()->GetBG()->AddPlayer(this); + // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE] // this must help in case next save after mass player load after server startup m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2); |
