aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp14
-rw-r--r--src/server/game/Achievements/AchievementMgr.h1
-rw-r--r--src/server/game/Guilds/Guild.cpp5
-rw-r--r--src/server/game/Guilds/Guild.h1
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp6
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.h32
-rw-r--r--src/server/game/Server/Packets/GuildPackets.cpp1
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h2
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);