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/server/game/Guilds | |
| parent | 2a9a68877a66f9c0e2c175fde70cfb23da538b78 (diff) | |
Core/PacketIO: Updated and enabled guild finder opcodes
Diffstat (limited to 'src/server/game/Guilds')
| -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 |
4 files changed, 109 insertions, 99 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); |
