diff options
author | Shauren <shauren.trinity@gmail.com> | 2013-06-27 12:48:34 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2013-06-27 12:48:34 +0200 |
commit | 36c866f9ffbcc29e3e11e679e899b24fab9c39f8 (patch) | |
tree | 309e33a360996101c7bc0c5e3cc256c1f0709b6a /src/server/game/DungeonFinding | |
parent | 0d9cc47cbbe6256dd67b232996df7f7a4579f3d7 (diff) |
Core/PacketIO: Updated and enabled more LFG opcodes
Diffstat (limited to 'src/server/game/DungeonFinding')
-rw-r--r-- | src/server/game/DungeonFinding/LFG.h | 26 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 74 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.h | 47 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGScripts.cpp | 2 |
4 files changed, 83 insertions, 66 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); } |