aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-11-15 00:13:35 +0100
committerShauren <shauren.trinity@gmail.com>2015-11-15 00:13:35 +0100
commitc63b03313104da4b40df55afbc8ed09649b5f75f (patch)
treeff692d272865b6edee4aa911dc2a4943b0093048 /src/server/game/Guilds
parent2a9a68877a66f9c0e2c175fde70cfb23da538b78 (diff)
Core/PacketIO: Updated and enabled guild finder opcodes
Diffstat (limited to 'src/server/game/Guilds')
-rw-r--r--src/server/game/Guilds/Guild.cpp2
-rw-r--r--src/server/game/Guilds/Guild.h3
-rw-r--r--src/server/game/Guilds/GuildFinderMgr.cpp181
-rw-r--r--src/server/game/Guilds/GuildFinderMgr.h22
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);