Core/PacketIO: Updated and enabled guild finder opcodes

This commit is contained in:
Shauren
2015-11-15 00:13:35 +01:00
parent 2a9a68877a
commit c63b033131
10 changed files with 690 additions and 458 deletions

View File

@@ -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)
auto playerItr = _membershipRequestsByPlayer.find(playerId);
if (playerItr == _membershipRequestsByPlayer.end())
return;
SQLTransaction trans = CharacterDatabase.BeginTransaction();
for (auto& guildRequestPair : playerItr->second)
{
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;
SQLTransaction trans = CharacterDatabase.BeginTransaction();
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();
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);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_APPLICANT);
stmt->setUInt64(0, itr->GetGuildGuid().GetCounter());
stmt->setUInt64(1, itr->GetPlayerGUID().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);
}
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS);
stmt->setUInt64(0, itr->GetGuildGuid().GetCounter());
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);
// Notify the applicant his submition has been removed
if (Player* player = ObjectAccessor::FindPlayer(itr->GetPlayerGUID()))
SendMembershipRequestListUpdate(player);
++itr;
// Notify the applicant his submition has been removed
if (Player* player = ObjectAccessor::FindPlayer(playerRequestPair.first))
SendMembershipRequestListUpdate(player);
}
}
_membershipRequests.erase(guildId);
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_FINDER_GUILD_SETTINGS);
stmt->setUInt64(0, guildId.GetCounter());
trans->Append(stmt);
CharacterDatabase.CommitTransaction(trans);
_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());
}