diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-11-15 00:13:35 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-11-15 00:13:35 +0100 |
commit | c63b03313104da4b40df55afbc8ed09649b5f75f (patch) | |
tree | ff692d272865b6edee4aa911dc2a4943b0093048 /src | |
parent | 2a9a68877a66f9c0e2c175fde70cfb23da538b78 (diff) |
Core/PacketIO: Updated and enabled guild finder opcodes
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 3 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildFinderMgr.cpp | 181 | ||||
-rw-r--r-- | src/server/game/Guilds/GuildFinderMgr.h | 22 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildFinderHandler.cpp | 450 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildFinderPackets.cpp | 174 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildFinderPackets.h | 237 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 28 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_guild.cpp | 2 |
10 files changed, 680 insertions, 448 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index e7347a00732..b128458137f 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2509,7 +2509,7 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std:: } } -void Guild::BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const +void Guild::BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const { for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if (itr->second->IsRank(rankId)) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 8dc9a98365b..697ae25a856 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -766,7 +766,6 @@ public: std::string const& GetName() const { return m_name; } std::string const& GetMOTD() const { return m_motd; } std::string const& GetInfo() const { return m_info; } - uint32 GetMemberCount() const { return uint32(m_members.size()); } time_t GetCreatedDate() const { return m_createdDate; } uint64 GetBankMoney() const { return m_bankMoney; } @@ -836,7 +835,7 @@ public: // Broadcasts void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const; void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix) const; - void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const; + void BroadcastPacketToRank(WorldPacket const* packet, uint8 rankId) const; void BroadcastPacket(WorldPacket const* packet) const; void BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const; diff --git a/src/server/game/Guilds/GuildFinderMgr.cpp b/src/server/game/Guilds/GuildFinderMgr.cpp index 3eec50efbc8..1e93e1f0eb6 100644 --- a/src/server/game/Guilds/GuildFinderMgr.cpp +++ b/src/server/game/Guilds/GuildFinderMgr.cpp @@ -18,6 +18,7 @@ #include "ObjectMgr.h" #include "GuildFinderMgr.h" #include "GuildMgr.h" +#include "GuildFinderPackets.h" #include "World.h" GuildFinderMgr::GuildFinderMgr() @@ -103,7 +104,8 @@ void GuildFinderMgr::LoadMembershipRequests() MembershipRequest request(playerId, guildId, availability, classRoles, interests, comment, time_t(submitTime)); - _membershipRequests[guildId].push_back(request); + _membershipRequestsByGuild[guildId][playerId] = request; + _membershipRequestsByPlayer[playerId][guildId] = request; ++count; } while (result->NextRow()); @@ -113,7 +115,8 @@ void GuildFinderMgr::LoadMembershipRequests() void GuildFinderMgr::AddMembershipRequest(ObjectGuid const& guildGuid, MembershipRequest const& request) { - _membershipRequests[guildGuid].push_back(request); + _membershipRequestsByGuild[guildGuid][request.GetPlayerGUID()] = request; + _membershipRequestsByPlayer[request.GetPlayerGUID()][guildGuid] = request; SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GUILD_FINDER_APPLICANT); @@ -138,102 +141,102 @@ void GuildFinderMgr::AddMembershipRequest(ObjectGuid const& guildGuid, Membershi void GuildFinderMgr::RemoveAllMembershipRequestsFromPlayer(ObjectGuid const& playerId) { - for (MembershipRequestStore::iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) - { - std::vector<MembershipRequest>::iterator itr2 = itr->second.begin(); - for (; itr2 != itr->second.end(); ++itr2) - if (itr2->GetPlayerGUID() == playerId) - break; - - if (itr2 == itr->second.end()) - continue; + auto playerItr = _membershipRequestsByPlayer.find(playerId); + if (playerItr == _membershipRequestsByPlayer.end()) + return; - SQLTransaction trans = CharacterDatabase.BeginTransaction(); + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + for (auto& guildRequestPair : playerItr->second) + { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); - stmt->setUInt64(0, itr2->GetGuildGuid().GetCounter()); - stmt->setUInt64(1, itr2->GetPlayerGUID().GetCounter()); + stmt->setUInt64(0, guildRequestPair.first.GetCounter()); + stmt->setUInt64(1, playerId.GetCounter()); trans->Append(stmt); - CharacterDatabase.CommitTransaction(trans); - itr->second.erase(itr2); - // Notify the guild master and officers the list changed - if (Guild* guild = sGuildMgr->GetGuildByGuid(itr->first)) + if (Guild* guild = sGuildMgr->GetGuildByGuid(guildRequestPair.first)) SendApplicantListUpdate(guild); + + auto guildItr = _membershipRequestsByGuild.find(guildRequestPair.first); + if (guildItr == _membershipRequestsByGuild.end()) + continue; + + guildItr->second.erase(playerId); + if (guildItr->second.empty()) + _membershipRequestsByGuild.erase(guildItr); } + + CharacterDatabase.CommitTransaction(trans); + + _membershipRequestsByPlayer.erase(playerItr); } void GuildFinderMgr::RemoveMembershipRequest(ObjectGuid const& playerId, ObjectGuid const& guildId) { - std::vector<MembershipRequest>::iterator itr = _membershipRequests[guildId].begin(); - for (; itr != _membershipRequests[guildId].end(); ++itr) - if (itr->GetPlayerGUID() == playerId) - break; + auto guildItr = _membershipRequestsByGuild.find(guildId); + if (guildItr != _membershipRequestsByGuild.end()) + { + guildItr->second.erase(playerId); + if (guildItr->second.empty()) + _membershipRequestsByGuild.erase(guildItr); + } - if (itr == _membershipRequests[guildId].end()) - return; + auto playerItr = _membershipRequestsByPlayer.find(playerId); + if (playerItr != _membershipRequestsByPlayer.end()) + { + playerItr->second.erase(guildId); + if (playerItr->second.empty()) + _membershipRequestsByPlayer.erase(playerItr); + } SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); - stmt->setUInt64(0, itr->GetGuildGuid().GetCounter()); - stmt->setUInt64(1, itr->GetPlayerGUID().GetCounter()); + stmt->setUInt64(0, guildId.GetCounter()); + stmt->setUInt64(1, playerId.GetCounter()); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); // Notify the applicant his submittion has been removed - if (Player* player = ObjectAccessor::FindPlayer(itr->GetPlayerGUID())) + if (Player* player = ObjectAccessor::FindPlayer(playerId)) SendMembershipRequestListUpdate(player); // Notify the guild master and officers the list changed if (Guild* guild = sGuildMgr->GetGuildByGuid(guildId)) SendApplicantListUpdate(guild); - - _membershipRequests[guildId].erase(itr); } -std::list<MembershipRequest> GuildFinderMgr::GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid) +std::vector<MembershipRequest const*> GuildFinderMgr::GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid) { - std::list<MembershipRequest> resultSet; - for (MembershipRequestStore::const_iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) - { - std::vector<MembershipRequest> const& guildReqs = itr->second; - for (std::vector<MembershipRequest>::const_iterator itr2 = guildReqs.begin(); itr2 != guildReqs.end(); ++itr2) - { - if (itr2->GetPlayerGUID() == playerGuid) - { - resultSet.push_back(*itr2); - break; - } - } - } + std::vector<MembershipRequest const*> resultSet; + auto playerItr = _membershipRequestsByPlayer.find(playerGuid); + if (playerItr == _membershipRequestsByPlayer.end()) + return resultSet; + + resultSet.reserve(playerItr->second.size()); + for (auto const& guildRequestPair : playerItr->second) + resultSet.push_back(&guildRequestPair.second); + return resultSet; } uint8 GuildFinderMgr::CountRequestsFromPlayer(ObjectGuid const& playerId) { - uint8 result = 0; - for (MembershipRequestStore::const_iterator itr = _membershipRequests.begin(); itr != _membershipRequests.end(); ++itr) - { - for (std::vector<MembershipRequest>::const_iterator itr2 = itr->second.begin(); itr2 != itr->second.end(); ++itr2) - { - if (itr2->GetPlayerGUID() != playerId) - continue; - ++result; - break; - } - } - return result; + auto playerItr = _membershipRequestsByPlayer.find(playerId); + return playerItr != _membershipRequestsByPlayer.end() ? playerItr->second.size() : 0; } -LFGuildStore GuildFinderMgr::GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction) +std::vector<LFGuildSettings const*> GuildFinderMgr::GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction) { - LFGuildStore resultSet; + std::vector<LFGuildSettings const*> resultSet; for (LFGuildStore::const_iterator itr = _guildSettings.begin(); itr != _guildSettings.end(); ++itr) { LFGuildSettings const& guildSettings = itr->second; + if (!guildSettings.IsListed()) + continue; + if (guildSettings.GetTeam() != faction) continue; @@ -249,7 +252,7 @@ LFGuildStore GuildFinderMgr::GetGuildsMatchingSetting(LFGuildPlayer& settings, T if (!(guildSettings.GetLevel() & settings.GetLevel())) continue; - resultSet.insert(std::make_pair(itr->first, guildSettings)); + resultSet.push_back(&itr->second); } return resultSet; @@ -257,10 +260,11 @@ LFGuildStore GuildFinderMgr::GetGuildsMatchingSetting(LFGuildPlayer& settings, T bool GuildFinderMgr::HasRequest(ObjectGuid const& playerId, ObjectGuid const& guildId) { - for (std::vector<MembershipRequest>::const_iterator itr = _membershipRequests[guildId].begin(); itr != _membershipRequests[guildId].end(); ++itr) - if (itr->GetPlayerGUID() == playerId) - return true; - return false; + auto guildItr = _membershipRequestsByGuild.find(guildId); + if (guildItr == _membershipRequestsByGuild.end()) + return false; + + return guildItr->second.count(playerId) > 0; } void GuildFinderMgr::SetGuildSettings(ObjectGuid const& guildGuid, LFGuildSettings const& settings) @@ -284,30 +288,38 @@ void GuildFinderMgr::SetGuildSettings(ObjectGuid const& guildGuid, LFGuildSettin void GuildFinderMgr::DeleteGuild(ObjectGuid const& guildId) { - std::vector<MembershipRequest>::iterator itr = _membershipRequests[guildId].begin(); - while (itr != _membershipRequests[guildId].end()) + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + auto guildItr = _membershipRequestsByGuild.find(guildId); + if (guildItr != _membershipRequestsByGuild.end()) { - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); - stmt->setUInt64(0, itr->GetGuildGuid().GetCounter()); - stmt->setUInt64(1, itr->GetPlayerGUID().GetCounter()); - trans->Append(stmt); + for (auto playerRequestPair : guildItr->second) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT); + stmt->setUInt64(0, guildId.GetCounter()); + stmt->setUInt64(1, playerRequestPair.first.GetCounter()); + trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS); - stmt->setUInt64(0, itr->GetGuildGuid().GetCounter()); - trans->Append(stmt); + auto playerItr = _membershipRequestsByPlayer.find(playerRequestPair.first); + if (playerItr != _membershipRequestsByPlayer.end()) + { + playerItr->second.erase(guildId); + if (playerItr->second.empty()) + _membershipRequestsByPlayer.erase(playerItr); + } - CharacterDatabase.CommitTransaction(trans); + // Notify the applicant his submition has been removed + if (Player* player = ObjectAccessor::FindPlayer(playerRequestPair.first)) + SendMembershipRequestListUpdate(player); + } + } - // Notify the applicant his submition has been removed - if (Player* player = ObjectAccessor::FindPlayer(itr->GetPlayerGUID())) - SendMembershipRequestListUpdate(player); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS); + stmt->setUInt64(0, guildId.GetCounter()); + trans->Append(stmt); - ++itr; - } + CharacterDatabase.CommitTransaction(trans); - _membershipRequests.erase(guildId); + _membershipRequestsByGuild.erase(guildId); _guildSettings.erase(guildId); // Notify the guild master the list changed (even if he's not a GM any more, not sure if needed) @@ -317,14 +329,13 @@ void GuildFinderMgr::DeleteGuild(ObjectGuid const& guildId) void GuildFinderMgr::SendApplicantListUpdate(Guild* guild) { - WorldPacket data(SMSG_LF_GUILD_APPLICANT_LIST_CHANGED, 0); + WorldPackets::GuildFinder::LFGuildApplicantListChanged applicantListChanged; + guild->BroadcastPacketToRank(applicantListChanged.Write(), GR_OFFICER); if (Player* player = ObjectAccessor::FindPlayer(guild->GetLeaderGUID())) - player->SendDirectMessage(&data); - guild->BroadcastPacketToRank(&data, GR_OFFICER); + player->SendDirectMessage(applicantListChanged.GetRawPacket()); } void GuildFinderMgr::SendMembershipRequestListUpdate(Player* player) { - WorldPacket data(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, 0); - player->SendDirectMessage(&data); + player->SendDirectMessage(WorldPackets::GuildFinder::LFGuildApplicationsListChanged().Write()); } diff --git a/src/server/game/Guilds/GuildFinderMgr.h b/src/server/game/Guilds/GuildFinderMgr.h index 377af655aeb..1f799753e00 100644 --- a/src/server/game/Guilds/GuildFinderMgr.h +++ b/src/server/game/Guilds/GuildFinderMgr.h @@ -20,7 +20,6 @@ #include "Common.h" #include "ObjectGuid.h" -#include "World.h" #include "GuildMgr.h" enum GuildFinderOptionsInterest @@ -81,12 +80,9 @@ struct MembershipRequest uint8 GetAvailability() const { return _availability; } uint8 GetClassRoles() const { return _classRoles; } uint8 GetInterests() const { return _interests; } - uint8 GetClass() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Class; } - uint8 GetLevel() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Level; } time_t GetSubmitTime() const { return _time; } time_t GetExpiryTime() const { return time_t(_time + 30 * 24 * 3600); } // Adding 30 days std::string const& GetComment() const { return _comment; } - std::string const& GetName() const { return sWorld->GetCharacterInfo(GetPlayerGUID())->Name; } private: std::string _comment; @@ -182,8 +178,7 @@ struct LFGuildSettings : public LFGuildPlayer TeamId _team; }; -typedef std::map<ObjectGuid /* guildGuid */, LFGuildSettings> LFGuildStore; -typedef std::map<ObjectGuid /* guildGuid */, std::vector<MembershipRequest> > MembershipRequestStore; +typedef std::unordered_map<ObjectGuid /* guildGuid */, LFGuildSettings> LFGuildStore; class GuildFinderMgr { @@ -193,7 +188,8 @@ class GuildFinderMgr LFGuildStore _guildSettings; - MembershipRequestStore _membershipRequests; + std::unordered_map<ObjectGuid /*guildGUID*/, std::unordered_map<ObjectGuid /*playerGUID*/, MembershipRequest>> _membershipRequestsByGuild; + std::unordered_map<ObjectGuid /*playerGUID*/, std::unordered_map<ObjectGuid /*guildGUID*/, MembershipRequest>> _membershipRequestsByPlayer; void LoadGuildSettings(); void LoadMembershipRequests(); @@ -212,7 +208,7 @@ class GuildFinderMgr * @brief Returns settings for a guild. * @param guildGuid The guild's database guid. */ - LFGuildSettings GetGuildSettings(ObjectGuid const& guildGuid) { return _guildSettings[guildGuid]; } + LFGuildSettings const& GetGuildSettings(ObjectGuid const& guildGuid) { return _guildSettings[guildGuid]; } /** * @brief Files a membership request to a guild @@ -241,20 +237,24 @@ class GuildFinderMgr * @brief Returns a set of membership requests for a guild * @param guildGuid The guild's database guid. */ - std::vector<MembershipRequest> GetAllMembershipRequestsForGuild(ObjectGuid const& guildGuid) { return _membershipRequests[guildGuid]; } + std::unordered_map<ObjectGuid, MembershipRequest> const* GetAllMembershipRequestsForGuild(ObjectGuid const& guildGuid) + { + auto itr = _membershipRequestsByGuild.find(guildGuid); + return itr != _membershipRequestsByGuild.end() ? &itr->second : nullptr; + } /** * @brief Returns a list of membership requests for a player. * @param playerGuid The player's database guid. */ - std::list<MembershipRequest> GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid); + std::vector<MembershipRequest const*> GetAllMembershipRequestsForPlayer(ObjectGuid const& playerGuid); /** * @brief Returns a store of guilds matching the settings provided, using bitmask operators. * @param settings The player's finder settings * @param teamId The player's faction (TEAM_ALLIANCE or TEAM_HORDE) */ - LFGuildStore GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction); + std::vector<LFGuildSettings const*> GetGuildsMatchingSetting(LFGuildPlayer& settings, TeamId faction); /// Provided a player guid and a guild guid, determines if a pending request is filed with these keys. bool HasRequest(ObjectGuid const& playerId, ObjectGuid const& guildId); diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp index 714be0c51bc..b8b3e29557c 100644 --- a/src/server/game/Handlers/GuildFinderHandler.cpp +++ b/src/server/game/Handlers/GuildFinderHandler.cpp @@ -21,403 +21,200 @@ #include "SharedDefines.h" #include "GuildFinderMgr.h" #include "GuildMgr.h" +#include "GuildFinderPackets.h" +#include "World.h" -void WorldSession::HandleGuildFinderAddRecruit(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderAddRecruit(WorldPackets::GuildFinder::LFGuildAddRecruit& lfGuildAddRecruit) { - if (sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUID()).size() == 10) + if (sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUID()) >= 10) return; - uint32 classRoles = 0; - uint32 availability = 0; - uint32 guildInterests = 0; - - recvPacket >> classRoles >> guildInterests >> availability; - - ObjectGuid guid; - guid[3] = recvPacket.ReadBit(); - guid[0] = recvPacket.ReadBit(); - guid[6] = recvPacket.ReadBit(); - guid[1] = recvPacket.ReadBit(); - uint16 commentLength = recvPacket.ReadBits(11); - guid[5] = recvPacket.ReadBit(); - guid[4] = recvPacket.ReadBit(); - guid[7] = recvPacket.ReadBit(); - uint8 nameLength = recvPacket.ReadBits(7); - guid[2] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(guid[4]); - recvPacket.ReadByteSeq(guid[5]); - std::string comment = recvPacket.ReadString(commentLength); - std::string playerName = recvPacket.ReadString(nameLength); - recvPacket.ReadByteSeq(guid[7]); - recvPacket.ReadByteSeq(guid[2]); - recvPacket.ReadByteSeq(guid[0]); - recvPacket.ReadByteSeq(guid[6]); - recvPacket.ReadByteSeq(guid[1]); - recvPacket.ReadByteSeq(guid[3]); - - if (!guid.IsGuild()) + if (!lfGuildAddRecruit.GuildGUID.IsGuild()) return; - if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + if (!(lfGuildAddRecruit.ClassRoles & GUILDFINDER_ALL_ROLES) || lfGuildAddRecruit.ClassRoles > GUILDFINDER_ALL_ROLES) return; - if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS) + if (!(lfGuildAddRecruit.Availability & AVAILABILITY_ALWAYS) || lfGuildAddRecruit.Availability > AVAILABILITY_ALWAYS) return; - if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + if (!(lfGuildAddRecruit.PlayStyle & ALL_INTERESTS) || lfGuildAddRecruit.PlayStyle > ALL_INTERESTS) return; - MembershipRequest request = MembershipRequest(GetPlayer()->GetGUID(), guid, availability, classRoles, guildInterests, comment, time(NULL)); - sGuildFinderMgr->AddMembershipRequest(guid, request); + MembershipRequest request = MembershipRequest(GetPlayer()->GetGUID(), lfGuildAddRecruit.GuildGUID, lfGuildAddRecruit.Availability, + lfGuildAddRecruit.ClassRoles, lfGuildAddRecruit.PlayStyle, lfGuildAddRecruit.Comment, time(NULL)); + sGuildFinderMgr->AddMembershipRequest(lfGuildAddRecruit.GuildGUID, request); } -void WorldSession::HandleGuildFinderBrowse(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderBrowse(WorldPackets::GuildFinder::LFGuildBrowse& lfGuildBrowse) { - uint32 classRoles = 0; - uint32 availability = 0; - uint32 guildInterests = 0; - uint32 playerLevel = 0; // Raw player level (1-85), do they use MAX_FINDER_LEVEL when on level 85 ? - - recvPacket >> classRoles >> availability >> guildInterests >> playerLevel; - - if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + if (!(lfGuildBrowse.ClassRoles & GUILDFINDER_ALL_ROLES) || lfGuildBrowse.ClassRoles > GUILDFINDER_ALL_ROLES) return; - if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS) + if (!(lfGuildBrowse.Availability & AVAILABILITY_ALWAYS) || lfGuildBrowse.Availability > AVAILABILITY_ALWAYS) return; - if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + if (!(lfGuildBrowse.PlayStyle & ALL_INTERESTS) || lfGuildBrowse.PlayStyle > ALL_INTERESTS) return; - if (playerLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || playerLevel < 1) + if (lfGuildBrowse.CharacterLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || lfGuildBrowse.CharacterLevel < 1) return; Player* player = GetPlayer(); - LFGuildPlayer settings(player->GetGUID(), classRoles, availability, guildInterests, ANY_FINDER_LEVEL); - LFGuildStore guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId()); - uint32 guildCount = guildList.size(); - - if (guildCount == 0) - { - WorldPacket packet(SMSG_LF_GUILD_BROWSE, 0); - player->SendDirectMessage(&packet); - return; - } + LFGuildPlayer settings(player->GetGUID(), lfGuildBrowse.ClassRoles, lfGuildBrowse.Availability, lfGuildBrowse.PlayStyle, ANY_FINDER_LEVEL); + std::vector<LFGuildSettings const*> guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId()); - ByteBuffer bufferData(65 * guildCount); - WorldPacket data(SMSG_LF_GUILD_BROWSE, 3 + guildCount * 65); // Estimated size - data.WriteBits(guildCount, 19); + WorldPackets::GuildFinder::LFGuildBrowseResult lfGuildBrowseResult; + lfGuildBrowseResult.Post.resize(guildList.size()); - for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr) + for (std::size_t i = 0; i < guildList.size(); ++i) { - LFGuildSettings guildSettings = itr->second; - Guild* guild = sGuildMgr->GetGuildByGuid(itr->first); - ASSERT(guild); - - ObjectGuid guildGUID = guild->GetGUID(); - - data.WriteBit(guildGUID[7]); - data.WriteBit(guildGUID[5]); - data.WriteBits(guild->GetName().size(), 8); - data.WriteBit(guildGUID[0]); - data.WriteBits(guildSettings.GetComment().size(), 11); - data.WriteBit(guildGUID[4]); - data.WriteBit(guildGUID[1]); - data.WriteBit(guildGUID[2]); - data.WriteBit(guildGUID[6]); - data.WriteBit(guildGUID[3]); - - bufferData << uint32(guild->GetEmblemInfo().GetColor()); - bufferData << uint32(guild->GetEmblemInfo().GetBorderStyle()); // Guessed - bufferData << uint32(guild->GetEmblemInfo().GetStyle()); - - bufferData.WriteString(guildSettings.GetComment()); - - bufferData << uint8(0); // Unk - - bufferData.WriteByteSeq(guildGUID[5]); - - bufferData << uint32(guildSettings.GetInterests()); - - bufferData.WriteByteSeq(guildGUID[6]); - bufferData.WriteByteSeq(guildGUID[4]); - - bufferData << uint32(guild->GetLevel()); - - bufferData.WriteString(guild->GetName()); - - bufferData << uint32(guild->GetAchievementMgr().GetAchievementPoints()); - - bufferData.WriteByteSeq(guildGUID[7]); - - bufferData << uint8(sGuildFinderMgr->HasRequest(player->GetGUID(), guild->GetGUID())); // Request pending - - bufferData.WriteByteSeq(guildGUID[2]); - bufferData.WriteByteSeq(guildGUID[0]); - - bufferData << uint32(guildSettings.GetAvailability()); - - bufferData.WriteByteSeq(guildGUID[1]); - - bufferData << uint32(guild->GetEmblemInfo().GetBackgroundColor()); - bufferData << uint32(0); // Unk Int 2 (+ 128) // Always 0 or 1 - bufferData << uint32(guild->GetEmblemInfo().GetBorderColor()); - bufferData << uint32(guildSettings.GetClassRoles()); - - bufferData.WriteByteSeq(guildGUID[3]); - bufferData << uint32(guild->GetMembersCount()); + LFGuildSettings const* guildSettings = guildList[i]; + WorldPackets::GuildFinder::LFGuildBrowseData& guildData = lfGuildBrowseResult.Post[i]; + Guild* guild = ASSERT_NOTNULL(sGuildMgr->GetGuildByGuid(guildSettings->GetGUID())); + + guildData.GuildName = guild->GetName(); + guildData.GuildGUID = guild->GetGUID(); + guildData.GuildVirtualRealm = GetVirtualRealmAddress(); + guildData.GuildMembers = guild->GetMembersCount(); + guildData.GuildAchievementPoints = guild->GetAchievementMgr().GetAchievementPoints(); + guildData.PlayStyle = guildSettings->GetInterests(); + guildData.Availability = guildSettings->GetAvailability(); + guildData.ClassRoles = guildSettings->GetClassRoles(); + guildData.LevelRange = guildSettings->GetLevel(); + guildData.EmblemStyle = guild->GetEmblemInfo().GetStyle(); + guildData.EmblemColor = guild->GetEmblemInfo().GetColor(); + guildData.BorderStyle = guild->GetEmblemInfo().GetBorderStyle(); + guildData.BorderColor = guild->GetEmblemInfo().GetBorderColor(); + guildData.Background = guild->GetEmblemInfo().GetBackgroundColor(); + guildData.Comment = guildSettings->GetComment(); + guildData.Cached = 0; + guildData.MembershipRequested = sGuildFinderMgr->HasRequest(player->GetGUID(), guild->GetGUID()); } - data.FlushBits(); - data.append(bufferData); - - player->SendDirectMessage(&data); + player->SendDirectMessage(lfGuildBrowseResult.Write()); } -void WorldSession::HandleGuildFinderDeclineRecruit(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderDeclineRecruit(WorldPackets::GuildFinder::LFGuildDeclineRecruit& lfGuildDeclineRecruit) { if (!GetPlayer()->GetGuild()) - { - recvPacket.rfinish(); return; - } - ObjectGuid playerGuid; - - playerGuid[1] = recvPacket.ReadBit(); - playerGuid[4] = recvPacket.ReadBit(); - playerGuid[5] = recvPacket.ReadBit(); - playerGuid[2] = recvPacket.ReadBit(); - playerGuid[6] = recvPacket.ReadBit(); - playerGuid[7] = recvPacket.ReadBit(); - playerGuid[0] = recvPacket.ReadBit(); - playerGuid[3] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(playerGuid[5]); - recvPacket.ReadByteSeq(playerGuid[7]); - recvPacket.ReadByteSeq(playerGuid[2]); - recvPacket.ReadByteSeq(playerGuid[3]); - recvPacket.ReadByteSeq(playerGuid[4]); - recvPacket.ReadByteSeq(playerGuid[1]); - recvPacket.ReadByteSeq(playerGuid[0]); - recvPacket.ReadByteSeq(playerGuid[6]); - - if (!playerGuid.IsPlayer()) + if (!lfGuildDeclineRecruit.RecruitGUID.IsPlayer()) return; - sGuildFinderMgr->RemoveMembershipRequest(playerGuid, GetPlayer()->GetGuild()->GetGUID()); + sGuildFinderMgr->RemoveMembershipRequest(lfGuildDeclineRecruit.RecruitGUID, GetPlayer()->GetGuild()->GetGUID()); } -void WorldSession::HandleGuildFinderGetApplications(WorldPacket& /*recvPacket*/) +void WorldSession::HandleGuildFinderGetApplications(WorldPackets::GuildFinder::LFGuildGetApplications& /*lfGuildGetApplications*/) { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_LF_GUILD_GET_APPLICATIONS"); // Empty opcode - - std::list<MembershipRequest> applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUID()); - uint32 applicationsCount = applicatedGuilds.size(); - WorldPacket data(SMSG_LF_GUILD_APPLICATIONS, 7 + 54 * applicationsCount); - data.WriteBits(applicationsCount, 20); + std::vector<MembershipRequest const*> applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUID()); + WorldPackets::GuildFinder::LFGuildApplications lfGuildApplications; + lfGuildApplications.Application.resize(applicatedGuilds.size()); + lfGuildApplications.NumRemaining = 10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUID()); - if (applicationsCount > 0) + for (std::size_t i = 0; i < applicatedGuilds.size(); ++i) { - ByteBuffer bufferData(54 * applicationsCount); - for (std::list<MembershipRequest>::const_iterator itr = applicatedGuilds.begin(); itr != applicatedGuilds.end(); ++itr) - { - Guild* guild = sGuildMgr->GetGuildByGuid(itr->GetGuildGuid()); - ASSERT(guild); - LFGuildSettings guildSettings = sGuildFinderMgr->GetGuildSettings(itr->GetGuildGuid()); - MembershipRequest request = *itr; - - ObjectGuid guildGuid = ObjectGuid(guild->GetGUID()); - - data.WriteBit(guildGuid[1]); - data.WriteBit(guildGuid[0]); - data.WriteBit(guildGuid[5]); - data.WriteBits(request.GetComment().size(), 11); - data.WriteBit(guildGuid[3]); - data.WriteBit(guildGuid[7]); - data.WriteBit(guildGuid[4]); - data.WriteBit(guildGuid[6]); - data.WriteBit(guildGuid[2]); - data.WriteBits(guild->GetName().size(), 8); - - bufferData.WriteByteSeq(guildGuid[2]); - bufferData.WriteString(request.GetComment()); - bufferData.WriteByteSeq(guildGuid[5]); - bufferData.WriteString(guild->GetName()); - - bufferData << uint32(guildSettings.GetAvailability()); - bufferData << uint32(request.GetExpiryTime() - time(NULL)); // Time left to application expiry (seconds) - - bufferData.WriteByteSeq(guildGuid[0]); - bufferData.WriteByteSeq(guildGuid[6]); - bufferData.WriteByteSeq(guildGuid[3]); - bufferData.WriteByteSeq(guildGuid[7]); - - bufferData << uint32(guildSettings.GetClassRoles()); - - bufferData.WriteByteSeq(guildGuid[4]); - bufferData.WriteByteSeq(guildGuid[1]); - - bufferData << uint32(time(NULL) - request.GetSubmitTime()); // Time since application (seconds) - bufferData << uint32(guildSettings.GetInterests()); - } - - data.FlushBits(); - data.append(bufferData); + MembershipRequest const* application = applicatedGuilds[i]; + WorldPackets::GuildFinder::LFGuildApplicationData& applicationData = lfGuildApplications.Application[i]; + + Guild* guild = ASSERT_NOTNULL(sGuildMgr->GetGuildByGuid(application->GetGuildGuid())); + LFGuildSettings const& guildSettings = sGuildFinderMgr->GetGuildSettings(application->GetGuildGuid()); + + applicationData.GuildGUID = application->GetGuildGuid(); + applicationData.GuildVirtualRealm = GetVirtualRealmAddress(); + applicationData.GuildName = guild->GetName(); + applicationData.ClassRoles = guildSettings.GetClassRoles(); + applicationData.PlayStyle = guildSettings.GetInterests(); + applicationData.Availability = guildSettings.GetAvailability(); + applicationData.SecondsSinceCreated = time(NULL) - application->GetSubmitTime(); + applicationData.SecondsUntilExpiration = application->GetExpiryTime() - time(NULL); + applicationData.Comment = application->GetComment(); } - data << uint32(10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUID())); // Applications count left - GetPlayer()->SendDirectMessage(&data); + GetPlayer()->SendDirectMessage(lfGuildApplications.Write()); } -// Lists all recruits for a guild - Misses times -void WorldSession::HandleGuildFinderGetRecruits(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderGetGuildPost(WorldPackets::GuildFinder::LFGuildGetGuildPost& /*lfGuildGetGuildPost*/) { - uint32 unkTime = 0; - recvPacket >> unkTime; - Player* player = GetPlayer(); + Guild* guild = player->GetGuild(); - if (!guild) + if (!guild) // Player must be in guild return; - std::vector<MembershipRequest> recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(guild->GetGUID()); - uint32 recruitCount = recruitsList.size(); - - ByteBuffer dataBuffer(53 * recruitCount); - WorldPacket data(SMSG_LF_GUILD_RECRUITS, 7 + 26 * recruitCount + 53 * recruitCount); - data.WriteBits(recruitCount, 20); - - for (std::vector<MembershipRequest>::const_iterator itr = recruitsList.begin(); itr != recruitsList.end(); ++itr) + WorldPackets::GuildFinder::LFGuildPost lfGuildPost; + if (guild->GetLeaderGUID() == player->GetGUID()) { - MembershipRequest request = *itr; - ObjectGuid playerGuid = request.GetPlayerGUID(); - - data.WriteBits(request.GetComment().size(), 11); - data.WriteBit(playerGuid[2]); - data.WriteBit(playerGuid[4]); - data.WriteBit(playerGuid[3]); - data.WriteBit(playerGuid[7]); - data.WriteBit(playerGuid[0]); - data.WriteBits(request.GetName().size(), 7); - data.WriteBit(playerGuid[5]); - data.WriteBit(playerGuid[1]); - data.WriteBit(playerGuid[6]); - - dataBuffer.WriteByteSeq(playerGuid[4]); - - dataBuffer << int32(time(NULL) <= request.GetExpiryTime()); - - dataBuffer.WriteByteSeq(playerGuid[3]); - dataBuffer.WriteByteSeq(playerGuid[0]); - dataBuffer.WriteByteSeq(playerGuid[1]); - - dataBuffer << int32(request.GetLevel()); - - dataBuffer.WriteByteSeq(playerGuid[6]); - dataBuffer.WriteByteSeq(playerGuid[7]); - dataBuffer.WriteByteSeq(playerGuid[2]); - - dataBuffer << int32(time(NULL) - request.GetSubmitTime()); // Time in seconds since application submitted. - dataBuffer << int32(request.GetAvailability()); - dataBuffer << int32(request.GetClassRoles()); - dataBuffer << int32(request.GetInterests()); - dataBuffer << int32(request.GetExpiryTime() - time(NULL)); // TIme in seconds until application expires. - - dataBuffer.WriteString(request.GetName()); - dataBuffer.WriteString(request.GetComment()); - - dataBuffer << int32(request.GetClass()); - - dataBuffer.WriteByteSeq(playerGuid[5]); + LFGuildSettings const& settings = sGuildFinderMgr->GetGuildSettings(guild->GetGUID()); + lfGuildPost.Post = boost::in_place(); + lfGuildPost.Post->Active = settings.IsListed(); + lfGuildPost.Post->PlayStyle = settings.GetInterests(); + lfGuildPost.Post->Availability = settings.GetAvailability(); + lfGuildPost.Post->ClassRoles = settings.GetClassRoles(); + lfGuildPost.Post->LevelRange = settings.GetLevel(); + lfGuildPost.Post->Comment = settings.GetComment(); } - data.FlushBits(); - data.append(dataBuffer); - data << uint32(time(NULL)); // Unk time - - player->SendDirectMessage(&data); + player->SendDirectMessage(lfGuildPost.Write()); } -void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/) +// Lists all recruits for a guild - Misses times +void WorldSession::HandleGuildFinderGetRecruits(WorldPackets::GuildFinder::LFGuildGetRecruits& /*lfGuildGetRecruits*/) { Player* player = GetPlayer(); - Guild* guild = player->GetGuild(); - if (!guild) // Player must be in guild + if (!guild) return; - bool isGuildMaster = guild->GetLeaderGUID() == player->GetGUID(); - - LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(guild->GetGUID()); - - WorldPacket data(SMSG_LF_GUILD_POST, 35); - data.WriteBit(isGuildMaster); // Guessed - - if (isGuildMaster) + time_t now = time(nullptr); + WorldPackets::GuildFinder::LFGuildRecruits lfGuildRecruits; + lfGuildRecruits.UpdateTime = now; + if (std::unordered_map<ObjectGuid, MembershipRequest> const* recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(guild->GetGUID())) { - data.WriteBits(settings.GetComment().size(), 11); - data.WriteBit(settings.IsListed()); - data << uint32(settings.GetLevel()); - data.WriteString(settings.GetComment()); - data << uint32(0); // Unk Int32 - data << uint32(settings.GetAvailability()); - data << uint32(settings.GetClassRoles()); - data << uint32(settings.GetInterests()); + lfGuildRecruits.Recruits.resize(recruitsList->size()); + std::size_t i = 0; + for (auto const& recruitRequestPair : *recruitsList) + { + WorldPackets::GuildFinder::LFGuildRecruitData& recruitData = lfGuildRecruits.Recruits[i++]; + recruitData.RecruitGUID = recruitRequestPair.first; + recruitData.RecruitVirtualRealm = GetVirtualRealmAddress(); + recruitData.Comment = recruitRequestPair.second.GetComment(); + recruitData.ClassRoles = recruitRequestPair.second.GetClassRoles(); + recruitData.PlayStyle = recruitRequestPair.second.GetInterests(); + recruitData.Availability = recruitRequestPair.second.GetAvailability(); + recruitData.SecondsSinceCreated = now - recruitRequestPair.second.GetSubmitTime(); + recruitData.SecondsUntilExpiration = recruitRequestPair.second.GetExpiryTime() - now; + if (CharacterInfo const* charInfo = sWorld->GetCharacterInfo(recruitRequestPair.first)) + { + recruitData.Name = charInfo->Name; + recruitData.CharacterClass = charInfo->Class; + recruitData.CharacterGender = charInfo->Sex; + recruitData.CharacterLevel = charInfo->Level; + } + } } - else - data.FlushBits(); - player->SendDirectMessage(&data); + + player->SendDirectMessage(lfGuildRecruits.Write()); } -void WorldSession::HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderRemoveRecruit(WorldPackets::GuildFinder::LFGuildRemoveRecruit& lfGuildRemoveRecruit) { - ObjectGuid guildGuid; - - guildGuid[0] = recvPacket.ReadBit(); - guildGuid[4] = recvPacket.ReadBit(); - guildGuid[3] = recvPacket.ReadBit(); - guildGuid[5] = recvPacket.ReadBit(); - guildGuid[7] = recvPacket.ReadBit(); - guildGuid[6] = recvPacket.ReadBit(); - guildGuid[2] = recvPacket.ReadBit(); - guildGuid[1] = recvPacket.ReadBit(); - - recvPacket.ReadByteSeq(guildGuid[4]); - recvPacket.ReadByteSeq(guildGuid[0]); - recvPacket.ReadByteSeq(guildGuid[3]); - recvPacket.ReadByteSeq(guildGuid[6]); - recvPacket.ReadByteSeq(guildGuid[5]); - recvPacket.ReadByteSeq(guildGuid[1]); - recvPacket.ReadByteSeq(guildGuid[2]); - recvPacket.ReadByteSeq(guildGuid[7]); - - if (!guildGuid.IsGuild()) + if (!lfGuildRemoveRecruit.GuildGUID.IsGuild()) return; - sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUID(), guildGuid); + sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUID(), lfGuildRemoveRecruit.GuildGUID); } // Sent any time a guild master sets an option in the interface and when listing / unlisting his guild -void WorldSession::HandleGuildFinderSetGuildPost(WorldPacket& recvPacket) +void WorldSession::HandleGuildFinderSetGuildPost(WorldPackets::GuildFinder::LFGuildSetGuildPost& lfGuildSetGuildPost) { - uint32 classRoles = 0; - uint32 availability = 0; - uint32 guildInterests = 0; - uint32 level = 0; - - recvPacket >> level >> availability >> guildInterests >> classRoles; // Level sent is zero if untouched, force to any (from interface). Idk why - if (!level) - level = ANY_FINDER_LEVEL; - - uint16 length = recvPacket.ReadBits(11); - bool listed = recvPacket.ReadBit(); - std::string comment = recvPacket.ReadString(length); + if (!lfGuildSetGuildPost.LevelRange) + lfGuildSetGuildPost.LevelRange = ANY_FINDER_LEVEL; - if (!(classRoles & GUILDFINDER_ALL_ROLES) || classRoles > GUILDFINDER_ALL_ROLES) + if (!(lfGuildSetGuildPost.ClassRoles & GUILDFINDER_ALL_ROLES) || lfGuildSetGuildPost.ClassRoles > GUILDFINDER_ALL_ROLES) return; - if (!(availability & AVAILABILITY_ALWAYS) || availability > AVAILABILITY_ALWAYS) + if (!(lfGuildSetGuildPost.Availability & AVAILABILITY_ALWAYS) || lfGuildSetGuildPost.Availability > AVAILABILITY_ALWAYS) return; - if (!(guildInterests & ALL_INTERESTS) || guildInterests > ALL_INTERESTS) + if (!(lfGuildSetGuildPost.PlayStyle & ALL_INTERESTS) || lfGuildSetGuildPost.PlayStyle > ALL_INTERESTS) return; - if (!(level & ALL_GUILDFINDER_LEVELS) || level > ALL_GUILDFINDER_LEVELS) + if (!(lfGuildSetGuildPost.LevelRange & ALL_GUILDFINDER_LEVELS) || lfGuildSetGuildPost.LevelRange > ALL_GUILDFINDER_LEVELS) return; Player* player = GetPlayer(); @@ -430,6 +227,7 @@ void WorldSession::HandleGuildFinderSetGuildPost(WorldPacket& recvPacket) if (guild->GetLeaderGUID() != player->GetGUID()) return; - LFGuildSettings settings(listed, player->GetTeamId(), guild->GetGUID(), classRoles, availability, guildInterests, level, comment); + LFGuildSettings settings(lfGuildSetGuildPost.Active, player->GetTeamId(), guild->GetGUID(), lfGuildSetGuildPost.ClassRoles, + lfGuildSetGuildPost.Availability, lfGuildSetGuildPost.PlayStyle, lfGuildSetGuildPost.LevelRange, lfGuildSetGuildPost.Comment); sGuildFinderMgr->SetGuildSettings(guild->GetGUID(), settings); } diff --git a/src/server/game/Server/Packets/GuildFinderPackets.cpp b/src/server/game/Server/Packets/GuildFinderPackets.cpp new file mode 100644 index 00000000000..db7ac6556ed --- /dev/null +++ b/src/server/game/Server/Packets/GuildFinderPackets.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "GuildFinderPackets.h" +#include "PacketUtilities.h" + +void WorldPackets::GuildFinder::LFGuildAddRecruit::Read() +{ + _worldPacket >> GuildGUID; + _worldPacket >> PlayStyle; + _worldPacket >> Availability; + _worldPacket >> ClassRoles; + Comment = _worldPacket.ReadString(_worldPacket.ReadBits(10)); +} + +void WorldPackets::GuildFinder::LFGuildBrowse::Read() +{ + _worldPacket >> PlayStyle; + _worldPacket >> Availability; + _worldPacket >> ClassRoles; + _worldPacket >> CharacterLevel; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::GuildFinder::LFGuildBrowseData const& guildData) +{ + data.WriteBits(guildData.GuildName.length(), 7); + data.WriteBits(guildData.Comment.length(), 10); + data << guildData.GuildGUID; + data << uint32(guildData.GuildVirtualRealm); + data << int32(guildData.GuildMembers); + data << int32(guildData.GuildAchievementPoints); + data << int32(guildData.PlayStyle); + data << int32(guildData.Availability); + data << int32(guildData.ClassRoles); + data << int32(guildData.LevelRange); + data << int32(guildData.EmblemStyle); + data << int32(guildData.EmblemColor); + data << int32(guildData.BorderStyle); + data << int32(guildData.BorderColor); + data << int32(guildData.Background); + data << int8(guildData.Cached); + data << int8(guildData.MembershipRequested); + data.WriteString(guildData.GuildName); + data.WriteString(guildData.Comment); + return data; +} + +WorldPacket const* WorldPackets::GuildFinder::LFGuildBrowseResult::Write() +{ + _worldPacket << uint32(Post.size()); + for (LFGuildBrowseData const& guildData : Post) + _worldPacket << guildData; + + return &_worldPacket; +} + +void WorldPackets::GuildFinder::LFGuildDeclineRecruit::Read() +{ + _worldPacket >> RecruitGUID; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::GuildFinder::LFGuildApplicationData const& application) +{ + data << application.GuildGUID; + data << uint32(application.GuildVirtualRealm); + data << int32(application.ClassRoles); + data << int32(application.PlayStyle); + data << int32(application.Availability); + data << uint32(application.SecondsSinceCreated); + data << uint32(application.SecondsUntilExpiration); + data.WriteBits(application.GuildName.length(), 7); + data.WriteBits(application.Comment.length(), 10); + data.FlushBits(); + data.WriteString(application.GuildName); + data.WriteString(application.Comment); + return data; +} + +WorldPacket const* WorldPackets::GuildFinder::LFGuildApplications::Write() +{ + _worldPacket << uint32(Application.size()); + _worldPacket << int32(NumRemaining); + for (LFGuildApplicationData const& application : Application) + _worldPacket << application; + + return &_worldPacket; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::GuildFinder::GuildPostData const& post) +{ + data.WriteBit(post.Active); + data.WriteBits(post.Comment.length(), 10); + data << int32(post.PlayStyle); + data << int32(post.Availability); + data << int32(post.ClassRoles); + data << int32(post.LevelRange); + data << uint32(post.SecondsRemaining); + data.WriteString(post.Comment); + return data; +} + +WorldPacket const* WorldPackets::GuildFinder::LFGuildPost::Write() +{ + _worldPacket.WriteBit(Post.is_initialized()); + _worldPacket.FlushBits(); + if (Post) + _worldPacket << *Post; + + return &_worldPacket; +} + +void WorldPackets::GuildFinder::LFGuildGetRecruits::Read() +{ + _worldPacket >> LastUpdate; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::GuildFinder::LFGuildRecruitData const& recruit) +{ + data << recruit.RecruitGUID; + data << uint32(recruit.RecruitVirtualRealm); + data << int32(recruit.CharacterClass); + data << int32(recruit.CharacterGender); + data << int32(recruit.CharacterLevel); + data << int32(recruit.ClassRoles); + data << int32(recruit.PlayStyle); + data << int32(recruit.Availability); + data << uint32(recruit.SecondsSinceCreated); + data << uint32(recruit.SecondsUntilExpiration); + data.WriteBits(recruit.Name.length(), 6); + data.WriteBits(recruit.Comment.length(), 10); + data.FlushBits(); + data.WriteString(recruit.Name); + data.WriteString(recruit.Comment); + return data; +} + +WorldPacket const* WorldPackets::GuildFinder::LFGuildRecruits::Write() +{ + _worldPacket << uint32(Recruits.size()); + _worldPacket << uint32(UpdateTime); + for (LFGuildRecruitData const& recruit : Recruits) + _worldPacket << recruit; + + return &_worldPacket; +} + +void WorldPackets::GuildFinder::LFGuildRemoveRecruit::Read() +{ + _worldPacket >> GuildGUID; +} + +void WorldPackets::GuildFinder::LFGuildSetGuildPost::Read() +{ + _worldPacket >> PlayStyle; + _worldPacket >> Availability; + _worldPacket >> ClassRoles; + _worldPacket >> LevelRange; + Active = _worldPacket.ReadBit(); + Comment = _worldPacket.ReadString(_worldPacket.ReadBits(10)); +} diff --git a/src/server/game/Server/Packets/GuildFinderPackets.h b/src/server/game/Server/Packets/GuildFinderPackets.h new file mode 100644 index 00000000000..02b4e5de29c --- /dev/null +++ b/src/server/game/Server/Packets/GuildFinderPackets.h @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GuildFinderPackets_h__ +#define GuildFinderPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace GuildFinder + { + class LFGuildAddRecruit final : public ClientPacket + { + public: + LFGuildAddRecruit(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_ADD_RECRUIT, std::move(packet)) { } + + void Read() override; + + ObjectGuid GuildGUID; + int32 Availability = 0; + int32 ClassRoles = 0; + int32 PlayStyle = 0; + std::string Comment; + }; + + class LFGuildApplicationsListChanged final : public ServerPacket + { + public: + LFGuildApplicationsListChanged() : ServerPacket(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class LFGuildApplicantListChanged final : public ServerPacket + { + public: + LFGuildApplicantListChanged() : ServerPacket(SMSG_LF_GUILD_APPLICANT_LIST_CHANGED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class LFGuildBrowse final : public ClientPacket + { + public: + LFGuildBrowse(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_BROWSE, std::move(packet)) { } + + void Read() override; + + int32 CharacterLevel = 0; + int32 Availability = 0; + int32 ClassRoles = 0; + int32 PlayStyle = 0; + }; + + struct LFGuildBrowseData + { + std::string GuildName; + ObjectGuid GuildGUID; + uint32 GuildVirtualRealm = 0; + int32 GuildMembers = 0; + int32 GuildAchievementPoints = 0; + int32 PlayStyle = 0; + int32 Availability = 0; + int32 ClassRoles = 0; + int32 LevelRange = 0; + int32 EmblemStyle = 0; + int32 EmblemColor = 0; + int32 BorderStyle = 0; + int32 BorderColor = 0; + int32 Background = 0; + std::string Comment; + int8 Cached = 0; + int8 MembershipRequested = 0; + }; + + class LFGuildBrowseResult final : public ServerPacket + { + public: + LFGuildBrowseResult() : ServerPacket(SMSG_LF_GUILD_BROWSE) { } + + WorldPacket const* Write() override; + + std::vector<LFGuildBrowseData> Post; + }; + + class LFGuildDeclineRecruit final : public ClientPacket + { + public: + LFGuildDeclineRecruit(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_DECLINE_RECRUIT, std::move(packet)) { } + + void Read() override; + + ObjectGuid RecruitGUID; + }; + + class LFGuildGetApplications final : public ClientPacket + { + public: + LFGuildGetApplications(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_GET_APPLICATIONS, std::move(packet)) { } + + void Read() override { } + }; + + struct LFGuildApplicationData + { + ObjectGuid GuildGUID; + uint32 GuildVirtualRealm = 0; + std::string GuildName; + int32 ClassRoles = 0; + int32 PlayStyle = 0; + int32 Availability = 0; + uint32 SecondsSinceCreated = 0; + uint32 SecondsUntilExpiration = 0; + std::string Comment; + }; + + class LFGuildApplications final : public ServerPacket + { + public: + LFGuildApplications() : ServerPacket(SMSG_LF_GUILD_APPLICATIONS) { } + + WorldPacket const* Write() override; + + std::vector<LFGuildApplicationData> Application; + int32 NumRemaining = 0; + }; + + class LFGuildGetGuildPost final : public ClientPacket + { + public: + LFGuildGetGuildPost(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_GET_GUILD_POST, std::move(packet)) { } + + void Read() override { } + }; + + struct GuildPostData + { + bool Active = false; + int32 PlayStyle = 0; + int32 Availability = 0; + int32 ClassRoles = 0; + int32 LevelRange = 0; + time_t SecondsRemaining = time_t(0); + std::string Comment; + }; + + class LFGuildPost final : public ServerPacket + { + public: + LFGuildPost() : ServerPacket(SMSG_LF_GUILD_POST, 1 + 1 + 4 + 4 + 4 + 4 + 4 + 255) { } + + WorldPacket const* Write() override; + + Optional<GuildPostData> Post; + }; + + class LFGuildGetRecruits final : public ClientPacket + { + public: + LFGuildGetRecruits(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_GET_RECRUITS, std::move(packet)) { } + + void Read() override; + + uint32 LastUpdate = 0; + }; + + struct LFGuildRecruitData + { + ObjectGuid RecruitGUID; + std::string Name; + uint32 RecruitVirtualRealm = 0; + std::string Comment; + int32 CharacterClass = 0; + int32 CharacterGender = 0; + int32 CharacterLevel = 0; + int32 ClassRoles = 0; + int32 PlayStyle = 0; + int32 Availability = 0; + uint32 SecondsSinceCreated = 0; + uint32 SecondsUntilExpiration = 0; + }; + + class LFGuildRecruits final : public ServerPacket + { + public: + LFGuildRecruits() : ServerPacket(SMSG_LF_GUILD_RECRUITS) { } + + WorldPacket const* Write() override; + + std::vector<LFGuildRecruitData> Recruits; + time_t UpdateTime = time_t(0); + }; + + class LFGuildRemoveRecruit final : public ClientPacket + { + public: + LFGuildRemoveRecruit(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_REMOVE_RECRUIT, std::move(packet)) { } + + void Read() override; + + ObjectGuid GuildGUID; + }; + + class LFGuildSetGuildPost final : public ClientPacket + { + public: + LFGuildSetGuildPost(WorldPacket&& packet) : ClientPacket(CMSG_LF_GUILD_SET_GUILD_POST, std::move(packet)) { } + + void Read() override; + + int32 Availability = 0; + int32 PlayStyle = 0; + int32 ClassRoles = 0; + int32 LevelRange = 0; + bool Active = false; + std::string Comment; + }; + } +} + +#endif // GuildFinderPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 6acb1cfb3a3..e37d9c7818c 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -36,6 +36,7 @@ #include "Packets/GameObjectPackets.h" #include "Packets/GarrisonPackets.h" #include "Packets/GuildPackets.h" +#include "Packets/GuildFinderPackets.h" #include "Packets/PartyPackets.h" #include "Packets/InspectPackets.h" #include "Packets/InstancePackets.h" @@ -483,14 +484,14 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LFG_LIST_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_SEARCH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_UPDATE_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_ADD_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderAddRecruit ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_BROWSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderBrowse ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_DECLINE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderDeclineRecruit ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_APPLICATIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetApplications); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderPostRequest ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_RECRUITS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetRecruits ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost ); + DEFINE_HANDLER(CMSG_LF_GUILD_ADD_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildAddRecruit, &WorldSession::HandleGuildFinderAddRecruit); + DEFINE_HANDLER(CMSG_LF_GUILD_BROWSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildBrowse, &WorldSession::HandleGuildFinderBrowse); + DEFINE_HANDLER(CMSG_LF_GUILD_DECLINE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildDeclineRecruit, &WorldSession::HandleGuildFinderDeclineRecruit); + DEFINE_HANDLER(CMSG_LF_GUILD_GET_APPLICATIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildGetApplications, &WorldSession::HandleGuildFinderGetApplications); + DEFINE_HANDLER(CMSG_LF_GUILD_GET_GUILD_POST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildGetGuildPost, &WorldSession::HandleGuildFinderGetGuildPost); + DEFINE_HANDLER(CMSG_LF_GUILD_GET_RECRUITS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildGetRecruits, &WorldSession::HandleGuildFinderGetRecruits); + DEFINE_HANDLER(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildRemoveRecruit, &WorldSession::HandleGuildFinderRemoveRecruit); + DEFINE_HANDLER(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GuildFinder::LFGuildSetGuildPost, &WorldSession::HandleGuildFinderSetGuildPost); DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode); DEFINE_HANDLER(CMSG_LOADING_SCREEN_NOTIFY, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::LoadingScreenNotify, &WorldSession::HandleLoadScreenOpcode); DEFINE_HANDLER(CMSG_LOAD_SELECTED_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -1290,13 +1291,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUITS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUITS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_CHARACTER_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 3134ad331b1..4c55c93567e 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -308,6 +308,18 @@ namespace WorldPackets class GuildSetAchievementTracking; } + namespace GuildFinder + { + class LFGuildAddRecruit; + class LFGuildBrowse; + class LFGuildDeclineRecruit; + class LFGuildGetApplications; + class LFGuildGetGuildPost; + class LFGuildGetRecruits; + class LFGuildRemoveRecruit; + class LFGuildSetGuildPost; + } + namespace Inspect { class Inspect; @@ -1237,14 +1249,14 @@ class WorldSession void HandleGuildChallengeUpdateRequest(WorldPackets::Guild::GuildChallengeUpdateRequest& packet); void HandleDeclineGuildInvites(WorldPackets::Guild::DeclineGuildInvites& packet); - void HandleGuildFinderAddRecruit(WorldPacket& recvPacket); - void HandleGuildFinderBrowse(WorldPacket& recvPacket); - void HandleGuildFinderDeclineRecruit(WorldPacket& recvPacket); - void HandleGuildFinderGetApplications(WorldPacket& recvPacket); - void HandleGuildFinderGetRecruits(WorldPacket& recvPacket); - void HandleGuildFinderPostRequest(WorldPacket& recvPacket); - void HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket); - void HandleGuildFinderSetGuildPost(WorldPacket& recvPacket); + void HandleGuildFinderAddRecruit(WorldPackets::GuildFinder::LFGuildAddRecruit& lfGuildAddRecruit); + void HandleGuildFinderBrowse(WorldPackets::GuildFinder::LFGuildBrowse& lfGuildBrowse); + void HandleGuildFinderDeclineRecruit(WorldPackets::GuildFinder::LFGuildDeclineRecruit& lfGuildDeclineRecruit); + void HandleGuildFinderGetApplications(WorldPackets::GuildFinder::LFGuildGetApplications& lfGuildGetApplications); + void HandleGuildFinderGetGuildPost(WorldPackets::GuildFinder::LFGuildGetGuildPost& lfGuildGetGuildPost); + void HandleGuildFinderGetRecruits(WorldPackets::GuildFinder::LFGuildGetRecruits& lfGuildGetRecruits); + void HandleGuildFinderRemoveRecruit(WorldPackets::GuildFinder::LFGuildRemoveRecruit& lfGuildRemoveRecruit); + void HandleGuildFinderSetGuildPost(WorldPackets::GuildFinder::LFGuildSetGuildPost& lfGuildSetGuildPost); void HandleEnableTaxiNodeOpcode(WorldPackets::Taxi::EnableTaxiNode& enableTaxiNode); void HandleTaxiNodeStatusQueryOpcode(WorldPackets::Taxi::TaxiNodeStatusQuery& taxiNodeStatusQuery); diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 7375dd48f49..3c685593ada 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -276,7 +276,7 @@ public: strftime(createdDateStr, 20, "%Y-%m-%d %H:%M:%S", localtime_r(&createdDate, &localTm)); handler->PSendSysMessage(LANG_GUILD_INFO_CREATION_DATE, createdDateStr); // Creation Date - handler->PSendSysMessage(LANG_GUILD_INFO_MEMBER_COUNT, guild->GetMemberCount()); // Number of Members + handler->PSendSysMessage(LANG_GUILD_INFO_MEMBER_COUNT, guild->GetMembersCount()); // Number of Members handler->PSendSysMessage(LANG_GUILD_INFO_BANK_GOLD, guild->GetBankMoney() / 100 / 100); // Bank Gold (in gold coins) handler->PSendSysMessage(LANG_GUILD_INFO_LEVEL, guild->GetLevel()); // Level handler->PSendSysMessage(LANG_GUILD_INFO_MOTD, guild->GetMOTD().c_str()); // Message of the Day |