aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 476d98afc66..5c908ba445f 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2369,7 +2369,7 @@ bool InstanceMap::CanEnter(Player *player)
if (player->GetMapRef().getTarget() == this)
{
sLog.outError("InstanceMap::CanEnter - player %s(%u) already in map %d,%d,%d!", player->GetName(), player->GetGUIDLow(), GetId(), GetInstanceId(), GetSpawnMode());
- assert(false);
+ //assert(false);
return false;
}
@@ -2395,6 +2395,32 @@ bool InstanceMap::CanEnter(Player *player)
return false;
}
+ // cannot enter if instance is in use by another party/soloer that have a
+ // permanent save in the same instance id
+
+ PlayerList const &playerList = GetPlayers();
+ Player *firstInsidePlayer = NULL;
+
+ if (!playerList.isEmpty())
+ for (PlayerList::const_iterator i = playerList.begin(); i != playerList.end(); ++i)
+ if (Player *iPlayer = i->getSource())
+ {
+ if (iPlayer->isGameMaster()) // bypass GMs
+ continue;
+ if (!player->GetGroup()) // player has not group and there is someone inside, deny entry
+ {
+ player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
+ return false;
+ }
+ // player inside instance has no group or his groups is different to entering player's one, deny entry
+ if (!iPlayer->GetGroup() || iPlayer->GetGroup() != player->GetGroup() )
+ {
+ player->SendTransferAborted(GetId(), TRANSFER_ABORT_MAX_PLAYERS);
+ return false;
+ }
+ break;
+ }
+
return Map::CanEnter(player);
}