diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 2 |
3 files changed, 9 insertions, 11 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 26f2e912725..6730d1545f4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -17453,7 +17453,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } else if (map->IsDungeon()) // if map is dungeon... { - if (!((InstanceMap*)map)->CanEnter(this)) // ... and can't enter map, then look for entry point. + if (!((InstanceMap*)map)->CanEnter(this) || !CheckInstanceLoginValid(map)) // ... and can't enter map, then look for entry point. { areaTrigger = sObjectMgr->GetGoBackTrigger(mapId); check = true; @@ -17480,6 +17480,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { TC_LOG_ERROR("entities.player", "Player %s %s Map: %u, X: %f, Y: %f, Z: %f, O: %f. Areatrigger not found.", m_name.c_str(), guid.ToString().c_str(), mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); + RelocateToHomebind(); map = NULL; } } @@ -19010,15 +19011,12 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report return true; } -bool Player::CheckInstanceLoginValid() +bool Player::CheckInstanceLoginValid(Map* map) { - if (!FindMap()) - return false; - - if (!GetMap()->IsDungeon() || IsGameMaster()) + if (!map->IsDungeon() || IsGameMaster()) return true; - if (GetMap()->IsRaid()) + if (map->IsRaid()) { // cannot be in raid instance without a group if (!GetGroup()) @@ -19027,12 +19025,12 @@ bool Player::CheckInstanceLoginValid() else { // cannot be in normal instance without a group and more players than 1 in instance - if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1) + if (!GetGroup() && map->GetPlayersCountExceptGMs() > 1) return false; } // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player - return sMapMgr->CanPlayerEnter(GetMap()->GetId(), this, true); + return sMapMgr->CanPlayerEnter(map->GetId(), this, true); } bool Player::CheckInstanceCount(uint32 instanceId) const diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 4cfe6a3697e..0fc8e716ad8 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2198,7 +2198,7 @@ class Player : public Unit, public GridObject<Player> void SendSavedInstances(); static void ConvertInstancesToGroup(Player* player, Group* group, bool switchLeader); bool Satisfy(AccessRequirement const* ar, uint32 target_map, bool report = false); - bool CheckInstanceLoginValid(); + bool CheckInstanceLoginValid(Map* map); bool CheckInstanceCount(uint32 instanceId) const; void AddInstanceEnterTime(uint32 instanceId, time_t enterTime); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 29761ead707..cea45039e88 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -887,7 +887,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) } } - if (!pCurrChar->GetMap()->AddPlayerToMap(pCurrChar) || !pCurrChar->CheckInstanceLoginValid()) + if (!pCurrChar->GetMap()->AddPlayerToMap(pCurrChar)) { AreaTrigger const* at = sObjectMgr->GetGoBackTrigger(pCurrChar->GetMapId()); if (at) |