aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp37
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h2
-rw-r--r--src/server/game/Server/Protocol/Handlers/LFGHandler.cpp44
3 files changed, 72 insertions, 11 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index d2b7b05398f..ba43c4b70bf 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -271,7 +271,6 @@ void LFGMgr::Join(Player *plr)
uint64 guid = grp ? grp->GetGUID() : plr->GetGUID();
-
LfgJoinResult result = LFG_JOIN_OK;
// Previous checks before joining
if (m_QueueInfoMap[guid])
@@ -700,6 +699,7 @@ void LFGMgr::UpdateRoleCheck(Group *grp, Player *plr /* = NULL*/)
LfgRoleCheck *pRoleCheck = NULL;
LfgRolesMap check_roles;
LfgRoleCheckMap::iterator itRoleCheck = m_RoleChecks.find(rolecheckId);
+ LfgDungeonSet *dungeons = plr->GetLfgDungeons();
bool newRoleCheck = itRoleCheck == m_RoleChecks.end();
if (newRoleCheck)
{
@@ -715,8 +715,33 @@ void LFGMgr::UpdateRoleCheck(Group *grp, Player *plr /* = NULL*/)
if (Player *plrg = itr->getSource())
pRoleCheck->roles[plrg->GetGUIDLow()] = 0;
- for (LfgDungeonSet::const_iterator itDungeon = plr->GetLfgDungeons()->begin(); itDungeon != plr->GetLfgDungeons()->end(); ++itDungeon)
- pRoleCheck->dungeons.insert(*itDungeon);
+ // Check if it's offer continue (random + current one)
+ if (grp->isLFGGroup() && dungeons->size() == 2)
+ {
+ LfgDungeonSet::const_iterator itDungeon = dungeons->begin();
+ uint32 aDungeon = *itDungeon;
+ uint32 rDungeon = *(++itDungeon);
+
+ // it's a Offer to continue (Actual dungeon + random dungeon in the list)
+ // Rolecheck will be using the actual dungeon - Players random
+ if (aDungeon == grp->GetLfgDungeonEntry() && isRandomDungeon(rDungeon))
+ {
+ for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ if (Player *plrg = itr->getSource())
+ {
+ plrg->GetLfgDungeons()->clear();
+ plrg->GetLfgDungeons()->insert(rDungeon);
+ }
+ }
+ pRoleCheck->dungeons.insert(aDungeon);
+ }
+
+ }
+
+ if (pRoleCheck->dungeons.empty())
+ for (LfgDungeonSet::const_iterator itDungeon = plr->GetLfgDungeons()->begin(); itDungeon != plr->GetLfgDungeons()->end(); ++itDungeon)
+ pRoleCheck->dungeons.insert(*itDungeon);
}
else
pRoleCheck = itRoleCheck->second;
@@ -1178,9 +1203,9 @@ void LFGMgr::SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pPr
sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE");
WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
- if (plr->GetLfgDungeons()->size() == 1 && *plr->GetLfgDungeons()->begin() != pProp->dungeonId)
- dungeonId = *plr->GetLfgDungeons()->begin(); // Random dungeon
- if (LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(*plr->GetLfgDungeons()->begin()))
+ if (!dLowGuid && plr->GetLfgDungeons()->size() == 1) // New group - select the dungeon the player selected
+ dungeonId = *plr->GetLfgDungeons()->begin();
+ if (LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
dungeonId = dungeon->Entry();
data << uint32(dungeonId); // Dungeon
data << uint8(pProp->state); // Result state
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 84229166a79..683fc83414c 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -302,6 +302,7 @@ class LFGMgr
void SendLfgPlayerInfo(Player *plr);
void SendLfgPartyInfo(Player *plr);
+ bool isRandomDungeon(uint32 dungeonId);
private:
void SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pProp);
@@ -314,7 +315,6 @@ class LFGMgr
void AddToQueue(uint64 guid, LfgRolesMap *roles, LfgDungeonSet *dungeons);
bool RemoveFromQueue(uint64 guid);
- bool isRandomDungeon(uint32 dungeonId);
void FindNewGroups(LfgGuidList &check, LfgGuidList all, LfgProposalList *proposals);
bool CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag = true);
void RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType type);
diff --git a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
index 0e79e9a15ce..b2a91b010fc 100644
--- a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
@@ -43,11 +43,47 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data)
}
GetPlayer()->SetLfgRoles(uint8(roles));
- for (int8 i = 0 ; i < numDungeons; ++i)
+
+ // Check if it's offer continue
+ Group *grp = GetPlayer()->GetGroup();
+ if (grp && grp->isLFGGroup())
+ {
+ LfgDungeonSet *dungeons = GetPlayer()->GetLfgDungeons();
+ if (grp->GetLfgStatus() == LFG_STATUS_COMPLETE) // Dungeon complete add all dungeons
+ {
+ dungeons->clear();
+ for (int8 i = 0 ; i < numDungeons; ++i)
+ {
+ recv_data >> dungeon;
+ dungeons->insert((dungeon & 0x00FFFFFF));
+ }
+ }
+ else if (dungeons->size() > 1 || dungeons->size() ==1 && !sLFGMgr.isRandomDungeon(*dungeons->begin()))
+ {
+ dungeons->clear();
+ // ignore the list and select the current dungeon
+ for (int8 i = 0 ; i < numDungeons; ++i)
+ recv_data.read_skip<uint32>();
+ dungeons->insert(grp->GetLfgDungeonEntry());
+ }
+ else // currently added to random Dungeon
+ {
+ for (int8 i = 0 ; i < numDungeons; ++i)
+ {
+ recv_data >> dungeon;
+ // remove the type from the dungeon entry
+ GetPlayer()->GetLfgDungeons()->insert((dungeon & 0x00FFFFFF));
+ }
+ }
+ }
+ else
{
- recv_data >> dungeon;
- // remove the type from the dungeon entry
- GetPlayer()->GetLfgDungeons()->insert((dungeon & 0x00FFFFFF));
+ for (int8 i = 0 ; i < numDungeons; ++i)
+ {
+ recv_data >> dungeon;
+ // remove the type from the dungeon entry
+ GetPlayer()->GetLfgDungeons()->insert((dungeon & 0x00FFFFFF));
+ }
}
recv_data >> numDungeons; // unk - always 3