aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2016-08-18 13:31:04 -0300
committerjoschiwald <joschiwald.trinity@gmail.com>2017-02-12 15:45:12 +0100
commit8ea1a3776115d06d43f40be9d461402816ab6a91 (patch)
tree0bdad5eee56b4113ccfc3b3c3a4f1e8af792a97c
parent4d67347ec0ac9d66a37b51cb2c8631f29675b17f (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.cpp17
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);