diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-12-19 23:59:23 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-12-19 23:59:23 +0100 |
commit | 63fd633d79985c3a4626f8c4d637a89586df420d (patch) | |
tree | d70ad214ab01710f609fb9959599fb08b1897624 /src | |
parent | 32570f7203bb27206f8eb1669a35fa6f0c8f931b (diff) |
Core/PacketIO: Implemented CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS/SMSG_GUILD_ACHIEVEMENT_MEMBERS
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AchievementPackets.cpp | 24 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AchievementPackets.h | 32 | ||||
-rw-r--r-- | src/server/game/Server/Packets/GuildPackets.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
10 files changed, 87 insertions, 3 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 8c7678a3f47..ecbfd020780 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -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); diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index ef0ee5e87e6..267070a14f8 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -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; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 47900f87afd..60f6d6acc9f 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -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) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index c365a4bbcbb..95fd836567b 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -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); diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 4d23717129e..a9fe59000fc 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -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)); +} diff --git a/src/server/game/Server/Packets/AchievementPackets.cpp b/src/server/game/Server/Packets/AchievementPackets.cpp index 155fa43b806..7c0fba9f16c 100644 --- a/src/server/game/Server/Packets/AchievementPackets.cpp +++ b/src/server/game/Server/Packets/AchievementPackets.cpp @@ -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; +} diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h index 70feedaf1e4..e74ac65d0ae 100644 --- a/src/server/game/Server/Packets/AchievementPackets.h +++ b/src/server/game/Server/Packets/AchievementPackets.h @@ -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; + }; } } diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 90b2664a07c..c39950e9132 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -802,7 +802,6 @@ WorldPacket const* WorldPackets::Guild::PlayerSaveGuildEmblem::Write() return &_worldPacket; } - void WorldPackets::Guild::GuildSetAchievementTracking::Read() { uint32 count; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index df091d53d56..1bb358f7f73 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -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); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index f94d956f52f..44c133db4c1 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -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); |