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
+1 -1
View File
@@ -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))
+1 -2
View File
@@ -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;
+97 -86
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());
}
+11 -11
View File
@@ -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);
+133 -335
View File
@@ -21,321 +21,116 @@
#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();
LFGuildPlayer settings(player->GetGUID(), lfGuildBrowse.ClassRoles, lfGuildBrowse.Availability, lfGuildBrowse.PlayStyle, ANY_FINDER_LEVEL);
std::vector<LFGuildSettings const*> guildList = sGuildFinderMgr->GetGuildsMatchingSetting(settings, player->GetTeamId());
if (guildCount == 0)
WorldPackets::GuildFinder::LFGuildBrowseResult lfGuildBrowseResult;
lfGuildBrowseResult.Post.resize(guildList.size());
for (std::size_t i = 0; i < guildList.size(); ++i)
{
WorldPacket packet(SMSG_LF_GUILD_BROWSE, 0);
player->SendDirectMessage(&packet);
return;
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());
}
ByteBuffer bufferData(65 * guildCount);
WorldPacket data(SMSG_LF_GUILD_BROWSE, 3 + guildCount * 65); // Estimated size
data.WriteBits(guildCount, 19);
for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr)
{
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());
}
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())
return;
sGuildFinderMgr->RemoveMembershipRequest(playerGuid, GetPlayer()->GetGuild()->GetGUID());
if (!lfGuildDeclineRecruit.RecruitGUID.IsPlayer())
return;
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::vector<MembershipRequest const*> applicatedGuilds = sGuildFinderMgr->GetAllMembershipRequestsForPlayer(GetPlayer()->GetGUID());
WorldPackets::GuildFinder::LFGuildApplications lfGuildApplications;
lfGuildApplications.Application.resize(applicatedGuilds.size());
lfGuildApplications.NumRemaining = 10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUID());
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);
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;
MembershipRequest const* application = applicatedGuilds[i];
WorldPackets::GuildFinder::LFGuildApplicationData& applicationData = lfGuildApplications.Application[i];
ObjectGuid guildGuid = ObjectGuid(guild->GetGUID());
Guild* guild = ASSERT_NOTNULL(sGuildMgr->GetGuildByGuid(application->GetGuildGuid()));
LFGuildSettings const& guildSettings = sGuildFinderMgr->GetGuildSettings(application->GetGuildGuid());
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);
}
data << uint32(10 - sGuildFinderMgr->CountRequestsFromPlayer(GetPlayer()->GetGUID())); // Applications count left
GetPlayer()->SendDirectMessage(&data);
}
// Lists all recruits for a guild - Misses times
void WorldSession::HandleGuildFinderGetRecruits(WorldPacket& recvPacket)
{
uint32 unkTime = 0;
recvPacket >> unkTime;
Player* player = GetPlayer();
Guild* guild = player->GetGuild();
if (!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)
{
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]);
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.FlushBits();
data.append(dataBuffer);
data << uint32(time(NULL)); // Unk time
player->SendDirectMessage(&data);
GetPlayer()->SendDirectMessage(lfGuildApplications.Write());
}
void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/)
void WorldSession::HandleGuildFinderGetGuildPost(WorldPackets::GuildFinder::LFGuildGetGuildPost& /*lfGuildGetGuildPost*/)
{
Player* player = GetPlayer();
@@ -343,81 +138,83 @@ void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/)
if (!guild) // Player must be in 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)
WorldPackets::GuildFinder::LFGuildPost lfGuildPost;
if (guild->GetLeaderGUID() == player->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());
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();
}
else
data.FlushBits();
player->SendDirectMessage(&data);
player->SendDirectMessage(lfGuildPost.Write());
}
void WorldSession::HandleGuildFinderRemoveRecruit(WorldPacket& recvPacket)
// Lists all recruits for a guild - Misses times
void WorldSession::HandleGuildFinderGetRecruits(WorldPackets::GuildFinder::LFGuildGetRecruits& /*lfGuildGetRecruits*/)
{
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())
Player* player = GetPlayer();
Guild* guild = player->GetGuild();
if (!guild)
return;
sGuildFinderMgr->RemoveMembershipRequest(GetPlayer()->GetGUID(), guildGuid);
time_t now = time(nullptr);
WorldPackets::GuildFinder::LFGuildRecruits lfGuildRecruits;
lfGuildRecruits.UpdateTime = now;
if (std::unordered_map<ObjectGuid, MembershipRequest> const* recruitsList = sGuildFinderMgr->GetAllMembershipRequestsForGuild(guild->GetGUID()))
{
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;
}
}
}
player->SendDirectMessage(lfGuildRecruits.Write());
}
void WorldSession::HandleGuildFinderRemoveRecruit(WorldPackets::GuildFinder::LFGuildRemoveRecruit& lfGuildRemoveRecruit)
{
if (!lfGuildRemoveRecruit.GuildGUID.IsGuild())
return;
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;
if (!lfGuildSetGuildPost.LevelRange)
lfGuildSetGuildPost.LevelRange = ANY_FINDER_LEVEL;
uint16 length = recvPacket.ReadBits(11);
bool listed = recvPacket.ReadBit();
std::string comment = recvPacket.ReadString(length);
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);
}
@@ -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));
}
@@ -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__
+15 -14
View File
@@ -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);
+20 -8
View File
@@ -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);
+1 -1
View File
@@ -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