aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2013-06-27 12:48:34 +0200
committerShauren <shauren.trinity@gmail.com>2013-06-27 12:48:34 +0200
commit36c866f9ffbcc29e3e11e679e899b24fab9c39f8 (patch)
tree309e33a360996101c7bc0c5e3cc256c1f0709b6a /src
parent0d9cc47cbbe6256dd67b232996df7f7a4579f3d7 (diff)
Core/PacketIO: Updated and enabled more LFG opcodes
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFG.h26
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp74
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h47
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.h2
-rw-r--r--src/server/game/Handlers/LFGHandler.cpp297
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h3
9 files changed, 264 insertions, 199 deletions
diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h
index 541e4d6bd43..0bd82bcd7c1 100644
--- a/src/server/game/DungeonFinding/LFG.h
+++ b/src/server/game/DungeonFinding/LFG.h
@@ -44,17 +44,21 @@ enum LfgUpdateType
LFG_UPDATETYPE_DEFAULT = 0, // Internal Use
LFG_UPDATETYPE_LEADER_UNK1 = 1, // FIXME: At group leave
LFG_UPDATETYPE_ROLECHECK_ABORTED = 4,
- LFG_UPDATETYPE_JOIN_QUEUE = 5,
- LFG_UPDATETYPE_ROLECHECK_FAILED = 6,
- LFG_UPDATETYPE_REMOVED_FROM_QUEUE = 7,
- LFG_UPDATETYPE_PROPOSAL_FAILED = 8,
- LFG_UPDATETYPE_PROPOSAL_DECLINED = 9,
- LFG_UPDATETYPE_GROUP_FOUND = 10,
- LFG_UPDATETYPE_ADDED_TO_QUEUE = 12,
- LFG_UPDATETYPE_PROPOSAL_BEGIN = 13,
- LFG_UPDATETYPE_UPDATE_STATUS = 14,
- LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE = 15,
- LFG_UPDATETYPE_GROUP_DISBAND_UNK16 = 16, // FIXME: Sometimes at group disband
+ LFG_UPDATETYPE_JOIN_QUEUE = 6,
+ LFG_UPDATETYPE_ROLECHECK_FAILED = 7,
+ LFG_UPDATETYPE_REMOVED_FROM_QUEUE = 8,
+ LFG_UPDATETYPE_PROPOSAL_FAILED = 9,
+ LFG_UPDATETYPE_PROPOSAL_DECLINED = 10,
+ LFG_UPDATETYPE_GROUP_FOUND = 11,
+ LFG_UPDATETYPE_ADDED_TO_QUEUE = 13,
+ LFG_UPDATETYPE_PROPOSAL_BEGIN = 14,
+ LFG_UPDATETYPE_UPDATE_STATUS = 15,
+ LFG_UPDATETYPE_GROUP_MEMBER_OFFLINE = 16,
+ LFG_UPDATETYPE_GROUP_DISBAND_UNK16 = 17, // FIXME: Sometimes at group disband
+ LFG_UPDATETYPE_JOIN_QUEUE_INITIAL = 24,
+ LFG_UPDATETYPE_DUNGEON_FINISHED = 25,
+ LFG_UPDATETYPE_PARTY_ROLE_NOT_AVAILABLE = 43,
+ LFG_UPDATETYPE_JOIN_LFG_OBJECT_FAILED = 45,
};
enum LfgState
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 1aef979c51f..3bf2eb25b95 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -286,7 +286,7 @@ void LFGMgr::Update(uint32 diff)
RestoreState(guid, "Remove Obsolete RoleCheck");
SendLfgRoleCheckUpdate(guid, roleCheck);
if (guid == roleCheck.leader)
- SendLfgJoinResult(guid, LfgJoinResultData(LFG_JOIN_FAILED, LFG_ROLECHECK_MISSING_ROLE));
+ SendLfgJoinResult(guid, LfgJoinResultData(LFG_JOIN_ROLE_CHECK_FAILED, LFG_ROLECHECK_MISSING_ROLE));
}
RestoreState(itRoleCheck->first, "Remove Obsolete RoleCheck");
@@ -343,10 +343,10 @@ void LFGMgr::Update(uint32 diff)
if (uint64 gguid = GetGroup(guid))
{
SetState(gguid, LFG_STATE_PROPOSAL);
- SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)), true);
}
else
- SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_PROPOSAL_BEGIN, GetSelectedDungeons(guid), GetComment(guid)), false);
SendLfgUpdateProposal(guid, proposal);
}
@@ -495,7 +495,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const
if (Player* plrg = itr->GetSource())
{
if (!plrg->GetSession()->HasPermission(RBAC_PERM_JOIN_DUNGEON_FINDER))
- joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS;
+ joinData.result = LFG_JOIN_INTERNAL_ERROR;
if (plrg->HasAura(LFG_SPELL_DUNGEON_DESERTER))
joinData.result = LFG_JOIN_PARTY_DESERTER;
else if (plrg->HasAura(LFG_SPELL_DUNGEON_COOLDOWN))
@@ -558,7 +558,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const
// if we have lockmap then there are no compatible dungeons
GetCompatibleDungeons(dungeons, players, joinData.lockmap);
if (dungeons.empty())
- joinData.result = grp ? LFG_JOIN_PARTY_NOT_MEET_REQS : LFG_JOIN_NOT_MEET_REQS;
+ joinData.result = grp ? LFG_JOIN_INTERNAL_ERROR : LFG_JOIN_NOT_MEET_REQS;
}
}
@@ -605,7 +605,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const
if (Player* plrg = itr->GetSource())
{
uint64 pguid = plrg->GetGUID();
- plrg->GetSession()->SendLfgUpdateParty(updateData);
+ plrg->GetSession()->SendLfgUpdateStatus(updateData, true);
SetState(pguid, LFG_STATE_ROLECHECK);
if (!isContinue)
SetSelectedDungeons(pguid, dungeons);
@@ -636,7 +636,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const
}
// Send update to player
player->GetSession()->SendLfgJoinResult(joinData);
- player->GetSession()->SendLfgUpdatePlayer(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment));
+ player->GetSession()->SendLfgUpdateStatus(LfgUpdateData(LFG_UPDATETYPE_JOIN_QUEUE, dungeons, comment), false);
SetState(gguid, LFG_STATE_QUEUED);
SetRoles(guid, roles);
debugNames.append(player->GetName());
@@ -675,14 +675,14 @@ void LFGMgr::LeaveLfg(uint64 guid)
for (LfgGuidSet::const_iterator it = players.begin(); it != players.end(); ++it)
{
SetState(*it, LFG_STATE_NONE);
- SendLfgUpdateParty(*it, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
+ SendLfgUpdateStatus(*it, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), true);
}
}
else
{
LFGQueue& queue = GetQueue(guid);
queue.RemoveFromQueue(guid);
- SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), false);
SetState(guid, LFG_STATE_NONE);
}
break;
@@ -771,6 +771,10 @@ void LFGMgr::UpdateRoleCheck(uint64 gguid, uint64 guid /* = 0 */, uint8 roles /*
else
dungeons = roleCheck.dungeons;
+ LfgJoinResult joinResult = LFG_JOIN_FAILED;
+ if (roleCheck.state == LFG_ROLECHECK_MISSING_ROLE || roleCheck.state == LFG_ROLECHECK_WRONG_ROLES)
+ joinResult = LFG_JOIN_ROLE_CHECK_FAILED;
+
LfgJoinResultData joinData = LfgJoinResultData(LFG_JOIN_FAILED, roleCheck.state);
for (LfgRolesMap::const_iterator it = roleCheck.roles.begin(); it != roleCheck.roles.end(); ++it)
{
@@ -787,12 +791,12 @@ void LFGMgr::UpdateRoleCheck(uint64 gguid, uint64 guid /* = 0 */, uint8 roles /*
case LFG_ROLECHECK_FINISHED:
SetState(pguid, LFG_STATE_QUEUED);
SetRoles(pguid, it->second);
- SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)));
+ SendLfgUpdateStatus(pguid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, dungeons, GetComment(pguid)), true);
break;
default:
if (roleCheck.leader == pguid)
SendLfgJoinResult(pguid, joinData);
- SendLfgUpdateParty(pguid, LfgUpdateData(LFG_UPDATETYPE_ROLECHECK_FAILED));
+ SendLfgUpdateStatus(pguid, LfgUpdateData(LFG_UPDATETYPE_ROLECHECK_FAILED), true);
RestoreState(pguid, "Rolecheck Failed");
break;
}
@@ -1056,16 +1060,16 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint64 guid, bool accept)
if (gguid)
{
waitTime = int32((joinTime - queue.GetJoinTime(gguid)) / IN_MILLISECONDS);
- SendLfgUpdateParty(pguid, updateData);
+ SendLfgUpdateStatus(pguid, updateData, false);
}
else
{
waitTime = int32((joinTime - queue.GetJoinTime(pguid)) / IN_MILLISECONDS);
- SendLfgUpdatePlayer(pguid, updateData);
+ SendLfgUpdateStatus(pguid, updateData, false);
}
updateData.updateType = LFG_UPDATETYPE_REMOVED_FROM_QUEUE;
- SendLfgUpdatePlayer(pguid, updateData);
- SendLfgUpdateParty(pguid, updateData);
+ SendLfgUpdateStatus(pguid, updateData, true);
+ SendLfgUpdateStatus(pguid, updateData, false);
// Update timers
uint8 role = GetRoles(pguid);
@@ -1157,10 +1161,10 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate
if (gguid != guid)
{
RestoreState(it->second.group, "Proposal Fail (someone in group didn't accepted)");
- SendLfgUpdateParty(guid, updateData);
+ SendLfgUpdateStatus(guid, updateData, true);
}
else
- SendLfgUpdatePlayer(guid, updateData);
+ SendLfgUpdateStatus(guid, updateData, false);
}
else
{
@@ -1169,10 +1173,10 @@ void LFGMgr::RemoveProposal(LfgProposalContainer::iterator itProposal, LfgUpdate
if (gguid != guid)
{
SetState(gguid, LFG_STATE_QUEUED);
- SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)), true);
}
else
- SendLfgUpdatePlayer(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_ADDED_TO_QUEUE, GetSelectedDungeons(guid), GetComment(guid)), false);
}
}
@@ -1733,7 +1737,7 @@ void LFGMgr::RemoveGroupData(uint64 guid)
if (state != LFG_STATE_PROPOSAL)
{
SetState(*it, LFG_STATE_NONE);
- SendLfgUpdateParty(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE));
+ SendLfgUpdateStatus(guid, LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE), true);
}
}
GroupsStore.erase(it);
@@ -1813,16 +1817,10 @@ void LFGMgr::SendLfgRoleCheckUpdate(uint64 guid, LfgRoleCheck const& roleCheck)
player->GetSession()->SendLfgRoleCheckUpdate(roleCheck);
}
-void LFGMgr::SendLfgUpdatePlayer(uint64 guid, LfgUpdateData const& data)
-{
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- player->GetSession()->SendLfgUpdatePlayer(data);
-}
-
-void LFGMgr::SendLfgUpdateParty(uint64 guid, LfgUpdateData const& data)
+void LFGMgr::SendLfgUpdateStatus(uint64 guid, LfgUpdateData const& data, bool party)
{
if (Player* player = ObjectAccessor::FindPlayer(guid))
- player->GetSession()->SendLfgUpdateParty(data);
+ player->GetSession()->SendLfgUpdateStatus(data, party);
}
void LFGMgr::SendLfgJoinResult(uint64 guid, LfgJoinResultData const& data)
@@ -1854,18 +1852,22 @@ bool LFGMgr::IsLfgGroup(uint64 guid)
return guid && IS_GROUP_GUID(guid) && GroupsStore[guid].IsLfgGroup();
}
-LFGQueue& LFGMgr::GetQueue(uint64 guid)
+uint8 LFGMgr::GetQueueId(uint64 guid)
{
- uint8 queueId = 0;
if (IS_GROUP_GUID(guid))
{
LfgGuidSet const& players = GetPlayers(guid);
uint64 pguid = players.empty() ? 0 : (*players.begin());
if (pguid)
- queueId = GetTeam(pguid);
+ return GetTeam(pguid);
}
- else
- queueId = GetTeam(guid);
+
+ return GetTeam(guid);
+}
+
+LFGQueue& LFGMgr::GetQueue(uint64 guid)
+{
+ uint8 queueId = GetQueueId(guid);
return QueuesStore[queueId];
}
@@ -1880,6 +1882,12 @@ bool LFGMgr::AllQueued(LfgGuidList const& check)
return true;
}
+time_t LFGMgr::GetQueueJoinTime(uint64 guid)
+{
+ LFGQueue& queue = GetQueue(guid);
+ return queue.GetJoinTime(guid);
+}
+
// Only for debugging purposes
void LFGMgr::Clean()
{
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 2d24253ed49..a55ff135110 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -94,23 +94,24 @@ enum LfgTeleportError
enum LfgJoinResult
{
// 3 = No client reaction | 18 = "Rolecheck failed"
- LFG_JOIN_OK = 0, // Joined (no client msg)
- LFG_JOIN_FAILED = 1, // RoleCheck Failed
- LFG_JOIN_GROUPFULL = 2, // Your group is full
- LFG_JOIN_INTERNAL_ERROR = 4, // Internal LFG Error
- LFG_JOIN_NOT_MEET_REQS = 5, // You do not meet the requirements for the chosen dungeons
- LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons
- LFG_JOIN_MIXED_RAID_DUNGEON = 7, // You cannot mix dungeons, raids, and random when picking dungeons
- LFG_JOIN_MULTI_REALM = 8, // The dungeon you chose does not support players from multiple realms
- LFG_JOIN_DISCONNECTED = 9, // One or more party members are pending invites or disconnected
- LFG_JOIN_PARTY_INFO_FAILED = 10, // Could not retrieve information about some party members
- LFG_JOIN_DUNGEON_INVALID = 11, // One or more dungeons was not valid
- LFG_JOIN_DESERTER = 12, // You can not queue for dungeons until your deserter debuff wears off
- LFG_JOIN_PARTY_DESERTER = 13, // One or more party members has a deserter debuff
- LFG_JOIN_RANDOM_COOLDOWN = 14, // You can not queue for random dungeons while on random dungeon cooldown
- LFG_JOIN_PARTY_RANDOM_COOLDOWN = 15, // One or more party members are on random dungeon cooldown
- LFG_JOIN_TOO_MUCH_MEMBERS = 16, // You can not enter dungeons with more that 5 party members
- LFG_JOIN_USING_BG_SYSTEM = 17 // You can not use the dungeon system while in BG or arenas
+ LFG_JOIN_OK = 0x00, // Joined (no client msg)
+ LFG_JOIN_FAILED = 0x1B, // RoleCheck Failed
+ LFG_JOIN_GROUPFULL = 0x1C, // Your group is full
+ LFG_JOIN_INTERNAL_ERROR = 0x1E, // Internal LFG Error
+ LFG_JOIN_NOT_MEET_REQS = 0x1F, // You do not meet the requirements for the chosen dungeons
+ //LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons
+ LFG_JOIN_MIXED_RAID_DUNGEON = 0x20, // You cannot mix dungeons, raids, and random when picking dungeons
+ LFG_JOIN_MULTI_REALM = 0x21, // The dungeon you chose does not support players from multiple realms
+ LFG_JOIN_DISCONNECTED = 0x22, // One or more party members are pending invites or disconnected
+ LFG_JOIN_PARTY_INFO_FAILED = 0x23, // Could not retrieve information about some party members
+ LFG_JOIN_DUNGEON_INVALID = 0x24, // One or more dungeons was not valid
+ LFG_JOIN_DESERTER = 0x25, // You can not queue for dungeons until your deserter debuff wears off
+ LFG_JOIN_PARTY_DESERTER = 0x26, // One or more party members has a deserter debuff
+ LFG_JOIN_RANDOM_COOLDOWN = 0x27, // You can not queue for random dungeons while on random dungeon cooldown
+ LFG_JOIN_PARTY_RANDOM_COOLDOWN = 0x28, // One or more party members are on random dungeon cooldown
+ LFG_JOIN_TOO_MUCH_MEMBERS = 0x29, // You can not enter dungeons with more that 5 party members
+ LFG_JOIN_USING_BG_SYSTEM = 0x2A, // You can not use the dungeon system while in BG or arenas
+ LFG_JOIN_ROLE_CHECK_FAILED = 0x2B // Role check failed, client shows special error
};
/// Role check states
@@ -157,7 +158,7 @@ struct LfgJoinResultData
LfgLockPartyMap lockmap;
};
-// Data needed by SMSG_LFG_UPDATE_PARTY and SMSG_LFG_UPDATE_PLAYER
+// Data needed by SMSG_LFG_UPDATE_STATUS
struct LfgUpdateData
{
LfgUpdateData(LfgUpdateType _type = LFG_UPDATETYPE_DEFAULT): updateType(_type), state(LFG_STATE_NONE), comment("") { }
@@ -409,8 +410,12 @@ class LFGMgr
uint8 GetPlayerCount(uint64 guid);
/// Add a new Proposal
uint32 AddProposal(LfgProposal& proposal);
+ /// Returns queue id
+ uint8 GetQueueId(uint64 guid);
/// Checks if all players are queued
bool AllQueued(LfgGuidList const& check);
+ /// Gets queue join time
+ time_t GetQueueJoinTime(uint64 guid);
/// Checks if given roles match, modifies given roles map with new roles
static bool CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag = true);
/// Checks if given players are ignoring each other
@@ -437,7 +442,8 @@ class LFGMgr
void MakeNewGroup(LfgProposal const& proposal);
// Generic
- LFGQueue &GetQueue(uint64 guid);
+ LFGQueue& GetQueue(uint64 guid);
+
LfgDungeonSet const& GetDungeonsByRandom(uint32 randomdungeon);
LfgType GetDungeonType(uint32 dungeon);
@@ -445,8 +451,7 @@ class LFGMgr
void SendLfgJoinResult(uint64 guid, LfgJoinResultData const& data);
void SendLfgRoleChosen(uint64 guid, uint64 pguid, uint8 roles);
void SendLfgRoleCheckUpdate(uint64 guid, LfgRoleCheck const& roleCheck);
- void SendLfgUpdateParty(uint64 guid, LfgUpdateData const& data);
- void SendLfgUpdatePlayer(uint64 guid, LfgUpdateData const& data);
+ void SendLfgUpdateStatus(uint64 guid, LfgUpdateData const& data, bool party);
void SendLfgUpdateProposal(uint64 guid, LfgProposal const& proposal);
LfgGuidSet const& GetPlayers(uint64 guid);
diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp
index 9dfbb0e9fb3..dca76bd5417 100644
--- a/src/server/game/DungeonFinding/LFGScripts.cpp
+++ b/src/server/game/DungeonFinding/LFGScripts.cpp
@@ -197,7 +197,7 @@ void LFGGroupScript::OnRemoveMember(Group* group, uint64 guid, RemoveMethod meth
//else if (state == LFG_STATE_BOOT)
// Update internal kick cooldown of kicked
- player->GetSession()->SendLfgUpdateParty(LfgUpdateData(LFG_UPDATETYPE_LEADER_UNK1));
+ player->GetSession()->SendLfgUpdateStatus(LfgUpdateData(LFG_UPDATETYPE_LEADER_UNK1), true);
if (isLFG && player->GetMap()->IsDungeon()) // Teleport player out the dungeon
sLFGMgr->TeleportPlayer(player, true);
}
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 08bc0ae88ae..5a95c051968 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -123,7 +123,7 @@ typedef UNORDERED_MAP<Player*, UpdateData> UpdateDataMapType;
struct ObjectGuid
{
public:
- ObjectGuid() { _data.u64 = 0LL; }
+ ObjectGuid() { _data.u64 = UI64LIT(0); }
ObjectGuid(uint64 guid) { _data.u64 = guid; }
ObjectGuid(ObjectGuid const& other) { _data.u64 = other._data.u64; }
diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp
index a5b73520dea..98e0faea4c5 100644
--- a/src/server/game/Handlers/LFGHandler.cpp
+++ b/src/server/game/Handlers/LFGHandler.cpp
@@ -89,12 +89,15 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData)
return;
}
- uint8 numDungeons;
uint32 roles;
recvData >> roles;
- recvData.read_skip<uint16>(); // uint8 (always 0) - uint8 (always 0)
- recvData >> numDungeons;
+ for (int32 i = 0; i < 3; ++i)
+ recvData.read_skip<uint32>();
+
+ uint32 commentLen = recvData.ReadBits(9);
+ uint32 numDungeons = recvData.ReadBits(24);
+
if (!numDungeons)
{
TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_JOIN %s no dungeons selected", GetPlayerInfo().c_str());
@@ -102,41 +105,63 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData)
return;
}
+ std::string comment = recvData.ReadString(commentLen);
+
lfg::LfgDungeonSet newDungeons;
- for (int8 i = 0; i < numDungeons; ++i)
+ for (uint32 i = 0; i < numDungeons; ++i)
{
uint32 dungeon;
recvData >> dungeon;
newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry
}
- recvData.read_skip<uint32>(); // for 0..uint8 (always 3) { uint8 (always 0) }
-
- std::string comment;
- recvData >> comment;
TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_JOIN %s roles: %u, Dungeons: %u, Comment: %s",
GetPlayerInfo().c_str(), roles, uint8(newDungeons.size()), comment.c_str());
sLFGMgr->JoinLfg(GetPlayer(), uint8(roles), newDungeons, comment);
}
-void WorldSession::HandleLfgLeaveOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData)
{
+ ObjectGuid leaveGuid;
Group* group = GetPlayer()->GetGroup();
uint64 guid = GetPlayer()->GetGUID();
uint64 gguid = group ? group->GetGUID() : guid;
- TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_LEAVE %s in group: %u",
- GetPlayerInfo().c_str(), group ? 1 : 0);
+ recvData.read_skip<uint32>(); // Always 8
+ recvData.read_skip<uint32>(); // Join date
+ recvData.read_skip<uint32>(); // Always 3
+ recvData.read_skip<uint32>(); // Queue Id
+
+ leaveGuid[4] = recvData.ReadBit();
+ leaveGuid[5] = recvData.ReadBit();
+ leaveGuid[0] = recvData.ReadBit();
+ leaveGuid[6] = recvData.ReadBit();
+ leaveGuid[2] = recvData.ReadBit();
+ leaveGuid[7] = recvData.ReadBit();
+ leaveGuid[1] = recvData.ReadBit();
+ leaveGuid[3] = recvData.ReadBit();
+
+ recvData.ReadByteSeq(leaveGuid[7]);
+ recvData.ReadByteSeq(leaveGuid[4]);
+ recvData.ReadByteSeq(leaveGuid[3]);
+ recvData.ReadByteSeq(leaveGuid[2]);
+ recvData.ReadByteSeq(leaveGuid[6]);
+ recvData.ReadByteSeq(leaveGuid[0]);
+ recvData.ReadByteSeq(leaveGuid[1]);
+ recvData.ReadByteSeq(leaveGuid[5]);
+
+ TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_LEAVE %s in group: %u sent guid " UI64FMTD ".",
+ GetPlayerInfo().c_str(), group ? 1 : 0, uint64(leaveGuid));
// Check cheating - only leader can leave the queue
- if (!group || group->GetLeaderGUID() == GetPlayer()->GetGUID())
+ if (!group || group->GetLeaderGUID() == guid)
sLFGMgr->LeaveLfg(gguid);
}
void WorldSession::HandleLfgProposalResultOpcode(WorldPacket& recvData)
{
- uint32 lfgGroupID; // Internal lfgGroupID
+ uint32 lfgGroupID; // Internal lfgGroupID
bool accept; // Accept to join?
recvData >> lfgGroupID;
recvData >> accept;
@@ -242,57 +267,36 @@ void WorldSession::SendLfgPlayerLockInfo()
}
}
- if (quest)
+ data << uint8(done);
+ data << uint32(0); // currencyQuantity
+ data << uint32(0); // some sort of overall cap/weekly cap
+ data << uint32(0); // currencyID
+ data << uint32(0); // tier1Quantity
+ data << uint32(0); // tier1Limit
+ data << uint32(0); // overallQuantity
+ data << uint32(0); // overallLimit
+ data << uint32(0); // periodPurseQuantity
+ data << uint32(0); // periodPurseLimit
+ data << uint32(0); // purseQuantity
+ data << uint32(0); // purseLimit
+ data << uint32(0); // some sort of reward for completion
+ data << uint32(0); // completedEncounters
+ data << uint8(0); // Call to Arms eligible
+
+ for (uint32 i = 0; i < 3; ++i)
{
- uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount();
-
- data << uint8(done);
- data << uint32(0); // currencyQuantity
- data << uint32(0); // some sort of overall cap/weekly cap
- data << uint32(0); // currencyID
- data << uint32(0); // tier1Quantity
- data << uint32(0); // tier1Limit
- data << uint32(0); // overallQuantity
- data << uint32(0); // overallLimit
- data << uint32(0); // periodPurseQuantity
- data << uint32(0); // periodPurseLimit
- data << uint32(0); // purseQuantity
- data << uint32(0); // purseLimit
- data << uint32(0); // some sort of reward for completion
- data << uint32(0); // completedEncounters
- data << uint8(0); // Call to Arms eligible
-
- for (uint32 i = 0; i < 3; ++i)
- {
- data << uint32(0); // Call to Arms Role
- //if (role)
- // BuildQuestReward(data, ctaRoleQuest, GetPlayer());
- }
+ data << uint32(0); // Call to Arms Role
+ //if (role)
+ // BuildQuestReward(data, ctaRoleQuest, GetPlayer());
+ }
+ if (quest)
BuildQuestReward(data, quest, GetPlayer());
- }
else
{
- data << uint32(0); // currencyQuantity
- data << uint32(0); // some sort of overall cap/weekly cap
- data << uint32(0); // currencyID
- data << uint32(0); // tier1Quantity
- data << uint32(0); // tier1Limit
- data << uint32(0); // overallQuantity
- data << uint32(0); // overallLimit
- data << uint32(0); // periodPurseQuantity
- data << uint32(0); // periodPurseLimit
- data << uint32(0); // purseQuantity
- data << uint32(0); // purseLimit
- data << uint32(0); // some sort of reward for completion
- data << uint32(0); // completedEncounters
- data << uint8(0); // Call to Arms eligible
- data << uint32(0); // Call to Arms Role
- data << uint32(0); // Call to Arms Role
- data << uint32(0); // Call to Arms Role
- data << uint32(0);
- data << uint32(0);
- data << uint8(0);
+ data << uint32(0); // Money
+ data << uint32(0); // XP
+ data << uint8(0); // Reward count
}
}
@@ -354,71 +358,45 @@ void WorldSession::HandleLfgGetStatus(WorldPacket& /*recvData*/)
{
TC_LOG_DEBUG(LOG_FILTER_LFG, "CMSG_LFG_GET_STATUS %s", GetPlayerInfo().c_str());
+ if (!GetPlayer()->isUsingLfg())
+ return;
+
uint64 guid = GetPlayer()->GetGUID();
lfg::LfgUpdateData updateData = sLFGMgr->GetLfgStatus(guid);
if (GetPlayer()->GetGroup())
{
- SendLfgUpdateParty(updateData);
+ SendLfgUpdateStatus(updateData, true);
updateData.dungeons.clear();
- SendLfgUpdatePlayer(updateData);
+ SendLfgUpdateStatus(updateData, false);
}
else
{
- SendLfgUpdatePlayer(updateData);
+ SendLfgUpdateStatus(updateData, false);
updateData.dungeons.clear();
- SendLfgUpdateParty(updateData);
+ SendLfgUpdateStatus(updateData, true);
}
}
-void WorldSession::SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData)
-{
- bool queued = false;
- uint8 size = uint8(updateData.dungeons.size());
-
- switch (updateData.updateType)
- {
- case lfg::LFG_UPDATETYPE_JOIN_QUEUE:
- case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE:
- queued = true;
- break;
- case lfg::LFG_UPDATETYPE_UPDATE_STATUS:
- queued = updateData.state == lfg::LFG_STATE_QUEUED;
- break;
- default:
- break;
- }
-
- TC_LOG_DEBUG(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_PLAYER %s updatetype: %u",
- GetPlayerInfo().c_str(), updateData.updateType);
- WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
- data << uint8(updateData.updateType); // Lfg Update type
- data << uint8(size > 0); // Extra info
- if (size)
- {
- data << uint8(queued); // Join the queue
- data << uint8(0); // unk - Always 0
- data << uint8(0); // unk - Always 0
-
- data << uint8(size);
- for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
- data << uint32(*it);
- data << updateData.comment;
- }
- SendPacket(&data);
-}
-
-void WorldSession::SendLfgUpdateParty(const lfg::LfgUpdateData& updateData)
+void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party)
{
bool join = false;
bool queued = false;
uint8 size = uint8(updateData.dungeons.size());
+ ObjectGuid guid = _player->GetGUID();
+ time_t joinTime = sLFGMgr->GetQueueJoinTime(_player->GetGUID());
+ uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID());
switch (updateData.updateType)
{
+ case lfg::LFG_UPDATETYPE_JOIN_QUEUE_INITIAL: // Joined queue outside the dungeon
+ join = true;
+ break;
+ case lfg::LFG_UPDATETYPE_JOIN_QUEUE:
case lfg::LFG_UPDATETYPE_ADDED_TO_QUEUE: // Rolecheck Success
+ join = true;
queued = true;
- // no break on purpose
+ break;
case lfg::LFG_UPDATETYPE_PROPOSAL_BEGIN:
join = true;
break;
@@ -430,25 +408,44 @@ void WorldSession::SendLfgUpdateParty(const lfg::LfgUpdateData& updateData)
break;
}
- TC_LOG_DEBUG(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_PARTY %s updatetype: %u",
- GetPlayerInfo().c_str(), updateData.updateType);
- WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (size > 0 ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + size * 4 + updateData.comment.length()));
+ TC_LOG_DEBUG(LOG_FILTER_LFG, "SMSG_LFG_UPDATE_STATUS %s updatetype: %u, party %s",
+ GetPlayerInfo().c_str(), updateData.updateType, party ? "true" : "false");
+
+ WorldPacket data(SMSG_LFG_UPDATE_STATUS, 1 + 8 + 3 + 2 + 1 + updateData.comment.length() + 4 + 4 + 1 + 1 + 1 + 4 + size);
+ data.WriteBit(guid[1]);
+ data.WriteBit(party);
+ data.WriteBits(size, 24);
+ data.WriteBit(guid[6]);
+ data.WriteBit(size > 0); // Extra info
+ data.WriteBits(updateData.comment.length(), 9);
+ data.WriteBit(guid[4]);
+ data.WriteBit(guid[7]);
+ data.WriteBit(guid[2]);
+ data.WriteBit(join); // LFG Join
+ data.WriteBit(guid[0]);
+ data.WriteBit(guid[3]);
+ data.WriteBit(guid[5]);
+ data.WriteBit(queued); // Join the queue
+
data << uint8(updateData.updateType); // Lfg Update type
- data << uint8(size > 0); // Extra info
- if (size)
- {
- data << uint8(join); // LFG Join
- data << uint8(queued); // Join the queue
- data << uint8(0); // unk - Always 0
+ data.WriteString(updateData.comment);
+ data << uint32(queueId); // Queue Id
+ data << uint32(joinTime); // Join date
+ data.WriteByteSeq(guid[6]);
+ for (uint8 i = 0; i < 3; ++i)
data << uint8(0); // unk - Always 0
- for (uint8 i = 0; i < 3; ++i)
- data << uint8(0); // unk - Always 0
- data << uint8(size);
- for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
- data << uint32(*it);
- data << updateData.comment;
- }
+ data.WriteByteSeq(guid[1]);
+ data.WriteByteSeq(guid[2]);
+ data.WriteByteSeq(guid[4]);
+ data.WriteByteSeq(guid[3]);
+ data.WriteByteSeq(guid[5]);
+ data.WriteByteSeq(guid[0]);
+ data << uint32(3);
+ data.WriteByteSeq(guid[7]);
+ for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
+ data << uint32(*it);
+
SendPacket(&data);
}
@@ -514,6 +511,8 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck)
void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData)
{
uint32 size = 0;
+ ObjectGuid guid = GetPlayer()->GetGUID();
+ uint32 queueId = sLFGMgr->GetQueueId(_player->GetGUID());
for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
size += 8 + 4 + uint32(it->second.size()) * (4 + 4 + 4 + 4);
@@ -521,10 +520,64 @@ void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData)
GetPlayerInfo().c_str(), joinData.result, joinData.state);
WorldPacket data(SMSG_LFG_JOIN_RESULT, 4 + 4 + size);
- data << uint32(joinData.result); // Check Result
- data << uint32(joinData.state); // Check Value
- if (!joinData.lockmap.empty())
- BuildPartyLockDungeonBlock(data, joinData.lockmap);
+ data << uint32(3);
+ data << uint8(joinData.result); // Check Result
+ data << uint32(queueId); // Queue Id
+ data << uint8(joinData.state); // Check Value
+ data << uint32(time(NULL)); // Join date
+ data.WriteBit(guid[2]);
+ data.WriteBit(guid[7]);
+ data.WriteBit(guid[3]);
+ data.WriteBit(guid[0]);
+ data.WriteBits(joinData.lockmap.size(), 24);
+ for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
+ {
+ ObjectGuid playerGuid = it->first;
+ data.WriteBit(playerGuid[7]);
+ data.WriteBit(playerGuid[5]);
+ data.WriteBit(playerGuid[3]);
+ data.WriteBit(playerGuid[6]);
+ data.WriteBit(playerGuid[0]);
+ data.WriteBit(playerGuid[2]);
+ data.WriteBit(playerGuid[4]);
+ data.WriteBit(playerGuid[1]);
+ data.WriteBits(it->second.size(), 22);
+ }
+
+ data.WriteBit(guid[4]);
+ data.WriteBit(guid[5]);
+ data.WriteBit(guid[1]);
+ data.WriteBit(guid[6]);
+ for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
+ {
+ ObjectGuid playerGuid = it->first;
+ for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr)
+ {
+ data << uint32(itr->second); // Lock status
+ data << uint32(0); // Current itemLevel
+ data << uint32(0); // Required itemLevel
+ data << uint32(itr->first); // Dungeon entry (id + type)
+ }
+
+ data.WriteByteSeq(playerGuid[2]);
+ data.WriteByteSeq(playerGuid[5]);
+ data.WriteByteSeq(playerGuid[1]);
+ data.WriteByteSeq(playerGuid[0]);
+ data.WriteByteSeq(playerGuid[4]);
+ data.WriteByteSeq(playerGuid[3]);
+ data.WriteByteSeq(playerGuid[6]);
+ data.WriteByteSeq(playerGuid[7]);
+ }
+
+ data.WriteByteSeq(guid[1]);
+ data.WriteByteSeq(guid[4]);
+ data.WriteByteSeq(guid[3]);
+ data.WriteByteSeq(guid[5]);
+ data.WriteByteSeq(guid[0]);
+ data.WriteByteSeq(guid[7]);
+ data.WriteByteSeq(guid[2]);
+ data.WriteByteSeq(guid[6]);
+
SendPacket(&data);
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 3948b036a56..cf90f5b0b0e 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -298,8 +298,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLearnTalentOpcode );
DEFINE_OPCODE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannel );
DEFINE_OPCODE_HANDLER(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus );
- DEFINE_OPCODE_HANDLER(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode );
- DEFINE_OPCODE_HANDLER(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode );
+ DEFINE_OPCODE_HANDLER(CMSG_LFG_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode );
+ DEFINE_OPCODE_HANDLER(CMSG_LFG_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode );
DEFINE_OPCODE_HANDLER(CMSG_LFG_LFR_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(CMSG_LFG_LFR_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER(CMSG_LFG_LOCK_INFO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetLockInfoOpcode );
@@ -922,7 +922,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- DEFINE_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -934,7 +934,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS_NONE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
@@ -1616,8 +1616,6 @@ void OpcodeTable::Initialize()
//DEFINE_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_LFG_OPEN_FROM_GOSSIP, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_LIST, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_PARTY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_LFG_UPDATE_PLAYER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_LF_GUILD_SEARCH_RESULT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_LOTTERY_QUERY_RESULT_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_LOTTERY_RESULT_OBSOLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 64d08ef45de..c67afc5dbdb 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -995,8 +995,6 @@ enum Opcodes
SMSG_LFG_SLOT_INVALID = 0x54B5,
SMSG_LFG_TELEPORT_DENIED = 0x0E14,
SMSG_LFG_UPDATE_LIST = 0x0000,
- SMSG_LFG_UPDATE_PARTY = 0x0000,
- SMSG_LFG_UPDATE_PLAYER = 0x0000,
SMSG_LFG_UPDATE_SEARCH = 0x54A1,
SMSG_LFG_UPDATE_STATUS = 0x31A4,
SMSG_LFG_UPDATE_STATUS_NONE = 0x7CA1,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 310470aabd8..646007a34e2 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -820,8 +820,7 @@ class WorldSession
void HandleLfrLeaveOpcode(WorldPacket& recvData);
void HandleLfgGetStatus(WorldPacket& recvData);
- void SendLfgUpdatePlayer(lfg::LfgUpdateData const& updateData);
- void SendLfgUpdateParty(lfg::LfgUpdateData const& updateData);
+ void SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party);
void SendLfgRoleChosen(uint64 guid, uint8 roles);
void SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& pRoleCheck);
void SendLfgLfrList(bool update);