From 3f9cf3fdb6ab4d8c696c67df8289df016f9447ae Mon Sep 17 00:00:00 2001 From: ariel- Date: Thu, 18 Aug 2016 13:31:04 -0300 Subject: Core/Player: readd player to battleground after a login (but only after adding it to map, preventing a crash). Closes #16141 (again) --- src/server/game/Entities/Player/Player.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fa4d11683ed..5b268493ae5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17076,6 +17076,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.", @@ -17089,10 +17091,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); @@ -17112,8 +17116,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 @@ -17242,7 +17247,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); AreaTrigger const* areaTrigger = nullptr; bool check = false; @@ -17325,6 +17331,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); -- cgit v1.2.3