Core/PacketIO: Implemented CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS/SMSG_GUILD_ACHIEVEMENT_MEMBERS

This commit is contained in:
Shauren
2016-12-19 23:59:23 +01:00
parent 32570f7203
commit 63fd633d79
10 changed files with 87 additions and 3 deletions

View File

@@ -852,6 +852,20 @@ void GuildAchievementMgr::SendAllTrackedCriterias(Player* receiver, std::set<uin
receiver->GetSession()->SendPacket(guildCriteriaUpdate.Write());
}
void GuildAchievementMgr::SendAchievementMembers(Player* receiver, uint32 achievementId) const
{
auto itr = _completedAchievements.find(achievementId);
if (itr != _completedAchievements.end())
{
WorldPackets::Achievement::GuildAchievementMembers guildAchievementMembers;
guildAchievementMembers.GuildGUID = _owner->GetGUID();
guildAchievementMembers.AchievementID = achievementId;
guildAchievementMembers.Member.reserve(itr->second.CompletingPlayers.size());
for (ObjectGuid const& member : itr->second.CompletingPlayers)
guildAchievementMembers.Member.emplace_back(member);
}
}
void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achievement, Player* referencePlayer)
{
TC_LOG_DEBUG("criteria.achievement", "GuildAchievementMgr::CompletedAchievement(%u)", achievement->ID);

View File

@@ -122,6 +122,7 @@ public:
void SendAllData(Player const* receiver) const override;
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
void SendAchievementMembers(Player* receiver, uint32 achievementId) const;
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) override;

View File

@@ -1409,6 +1409,11 @@ void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32>
}
}
void Guild::HandleGetAchievementMembers(WorldSession* session, uint32 achievementId)
{
m_achievementMgr.SendAchievementMembers(session->GetPlayer(), achievementId);
}
void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
{
if (m_motd == motd)

View File

@@ -774,6 +774,7 @@ public:
void HandleRoster(WorldSession* session);
void SendQueryResponse(WorldSession* session);
void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds);
void HandleGetAchievementMembers(WorldSession* session, uint32 achievementId);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);
void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo);

View File

@@ -25,6 +25,7 @@
#include "Log.h"
#include "Opcodes.h"
#include "Guild.h"
#include "AchievementPackets.h"
#include "GuildPackets.h"
void WorldSession::HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo& query)
@@ -426,3 +427,8 @@ void WorldSession::HandleGuildSetAchievementTracking(WorldPackets::Guild::GuildS
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleSetAchievementTracking(this, packet.AchievementIDs);
}
void WorldSession::HandleGuildGetAchievementMembers(WorldPackets::Achievement::GuildGetAchievementMembers& getAchievementMembers)
{
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleGetAchievementMembers(this, uint32(getAchievementMembers.AchievementID));
}

View File

@@ -180,3 +180,27 @@ WorldPacket const* WorldPackets::Achievement::AllGuildAchievements::Write()
return &_worldPacket;
}
void WorldPackets::Achievement::GuildGetAchievementMembers::Read()
{
_worldPacket >> PlayerGUID;
_worldPacket >> GuildGUID;
_worldPacket >> AchievementID;
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Achievement::GuildAchievementMember const& guildAchievementMember)
{
data << guildAchievementMember.MemberGUID;
return data;
}
WorldPacket const* WorldPackets::Achievement::GuildAchievementMembers::Write()
{
_worldPacket << GuildGUID;
_worldPacket << int32(AchievementID);
_worldPacket << uint32(Member.size());
for (GuildAchievementMember const& member : Member)
_worldPacket << member;
return &_worldPacket;
}

View File

@@ -213,6 +213,38 @@ namespace WorldPackets
std::vector<EarnedAchievement> Earned;
};
class GuildGetAchievementMembers final : public ClientPacket
{
public:
GuildGetAchievementMembers(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS, std::move(packet)) { }
void Read() override;
ObjectGuid PlayerGUID;
ObjectGuid GuildGUID;
int32 AchievementID = 0;
};
struct GuildAchievementMember
{
GuildAchievementMember() = default;
GuildAchievementMember(ObjectGuid guid) : MemberGUID(guid) { }
ObjectGuid MemberGUID;
};
class GuildAchievementMembers final : public ServerPacket
{
public:
GuildAchievementMembers() : ServerPacket(SMSG_GUILD_ACHIEVEMENT_MEMBERS) { }
WorldPacket const* Write() override;
ObjectGuid GuildGUID;
int32 AchievementID = 0;
std::vector<GuildAchievementMember> Member;
};
}
}

View File

@@ -802,7 +802,6 @@ WorldPacket const* WorldPackets::Guild::PlayerSaveGuildEmblem::Write()
return &_worldPacket;
}
void WorldPackets::Guild::GuildSetAchievementTracking::Read()
{
uint32 count;

View File

@@ -413,7 +413,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_DELETE_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDeleteRank);
DEFINE_HANDLER(CMSG_GUILD_DEMOTE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDemoteMember);
DEFINE_HANDLER(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildEventLogQuery);
DEFINE_HANDLER(CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildGetAchievementMembers);
DEFINE_HANDLER(CMSG_GUILD_GET_RANKS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildGetRanks);
DEFINE_HANDLER(CMSG_GUILD_GET_ROSTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildGetRoster);
DEFINE_HANDLER(CMSG_GUILD_INVITE_BY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildInviteByName);
@@ -1184,7 +1184,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY, STATUS_NEVER, CONNECTION_TYPE_REALM);

View File

@@ -78,6 +78,7 @@ namespace WorldPackets
namespace Achievement
{
class GuildSetFocusedAchievement;
class GuildGetAchievementMembers;
}
namespace Artifact
@@ -1320,6 +1321,7 @@ class TC_GAME_API WorldSession
void HandleGuildLeave(WorldPackets::Guild::GuildLeave& leave);
void HandleGuildDelete(WorldPackets::Guild::GuildDelete& packet);
void HandleGuildSetAchievementTracking(WorldPackets::Guild::GuildSetAchievementTracking& packet);
void HandleGuildGetAchievementMembers(WorldPackets::Achievement::GuildGetAchievementMembers& getAchievementMembers);
void HandleGuildSetGuildMaster(WorldPackets::Guild::GuildSetGuildMaster& packet);
void HandleGuildUpdateMotdText(WorldPackets::Guild::GuildUpdateMotdText& packet);
void HandleGuildNewsUpdateSticky(WorldPackets::Guild::GuildNewsUpdateSticky& packet);