summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp46
1 files changed, 34 insertions, 12 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 9e28314073..4bf81bf707 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -1530,7 +1530,7 @@ namespace lfg
void LFGMgr::MakeNewGroup(LfgProposal const& proposal)
{
LfgGuidList players;
- LfgGuidList playersToTeleport;
+ GuidUnorderedSet playersToTeleport;
for (LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
{
@@ -1541,7 +1541,7 @@ namespace lfg
players.push_back(guid);
if (proposal.isNew || GetGroup(guid) != proposal.group)
- playersToTeleport.push_back(guid);
+ playersToTeleport.insert(guid);
}
// Set the dungeon difficulty
@@ -1613,30 +1613,33 @@ namespace lfg
// Select a player inside to be teleported to
WorldLocation const* teleportLocation = nullptr;
+ bool leaderTeleportIncluded = false;
for (GroupReference* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
{
Player* plr = itr->GetSource();
- if (plr && plr->GetMapId() == uint32(dungeon->map) && !proposal.isNew)
+ if (plr)
{
- teleportLocation = plr;
- break;
+ if (grp->IsLeader(plr->GetGUID()) && playersToTeleport.find(plr->GetGUID()) != playersToTeleport.end())
+ {
+ leaderTeleportIncluded = true;
+ }
+
+ if (plr->GetMapId() == uint32(dungeon->map) && !proposal.isNew)
+ {
+ teleportLocation = plr;
+ break;
+ }
}
}
bool randomDungeon = false;
// Teleport Player
- for (LfgGuidList::const_iterator it = playersToTeleport.begin(); it != playersToTeleport.end(); ++it)
+ for (GuidUnorderedSet::const_iterator it = playersToTeleport.begin(); it != playersToTeleport.end(); ++it)
if (Player* player = ObjectAccessor::FindPlayer(*it))
{
if (player->GetGroup() != grp) // pussywizard: could not add because group was full (some shitness happened)
continue;
- if (player->GetMapId() == uint32(dungeon->map))
- {
- // Remove bind to that map
- sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
- }
-
// Add the cooldown spell if queued for a random dungeon
// xinef: add aura
if ((randomDungeon || selectedRandomLfgDungeon(player->GetGUID())) && !player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN))
@@ -1645,6 +1648,25 @@ namespace lfg
player->AddAura(LFG_SPELL_DUNGEON_COOLDOWN, player);
}
+ if (player->GetMapId() == uint32(dungeon->map))
+ {
+ // check instance id with leader
+ if (!leaderTeleportIncluded)
+ {
+ if (InstancePlayerBind* ilb = sInstanceSaveMgr->PlayerGetBoundInstance(grp->GetLeaderGUID(), dungeon->map, player->GetDungeonDifficulty()))
+ {
+ if (player->GetInstanceId() == ilb->save->GetInstanceId())
+ {
+ // Do not teleport if in the same map and instance as leader
+ continue;
+ }
+ }
+ }
+
+ // Remove bind to that map
+ sInstanceSaveMgr->PlayerUnbindInstance(player->GetGUID(), dungeon->map, player->GetDungeonDifficulty(), true);
+ }
+
TeleportPlayer(player, false, teleportLocation);
}