aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp2
-rw-r--r--src/server/game/Guilds/Guild.cpp14
-rw-r--r--src/server/game/Guilds/Guild.h7
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp16
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h1
6 files changed, 40 insertions, 2 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 06e19b6ebd1..c85aacb3336 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1018,7 +1018,7 @@ void AchievementMgr<Guild>::SendCriteriaUpdate(AchievementCriteriaEntry const* e
data.WriteByteSeq(counter[2]);
data.WriteByteSeq(guid[0]);
- SendPacket(&data);
+ GetOwner()->BroadcastPacketIfTrackingAchievement(&data, entry->ID);
}
/**
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 8cfa6a4e681..3ee01c88c3f 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -1562,6 +1562,12 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
TC_LOG_DEBUG("guild", "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str());
}
+void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& criteriaIds)
+{
+ if (Member* member = GetMember(session->GetPlayer()->GetGUID()))
+ member->SetTrackedCriteriaIds(criteriaIds);
+}
+
void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
{
if (m_motd == motd)
@@ -2603,6 +2609,14 @@ void Guild::BroadcastPacket(WorldPacket* packet) const
player->GetSession()->SendPacket(packet);
}
+void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket* packet, uint32 criteriaId) const
+{
+ for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
+ if (itr->second->IsTrackingCriteriaId(criteriaId))
+ if (Player* player = itr->second->FindPlayer())
+ player->GetSession()->SendPacket(packet);
+}
+
void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank)
{
uint32 count = 0;
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index c8ee4d7b0a8..d5421bc67b5 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -387,6 +387,9 @@ private:
uint32 GetTotalReputation() const { return m_totalReputation; }
uint32 GetWeekReputation() const { return m_weekReputation; }
+ void SetTrackedCriteriaIds(std::set<uint32> criteriaIds) { m_trackedCriteriaIds.swap(criteriaIds); }
+ bool IsTrackingCriteriaId(uint32 criteriaId) const { return m_trackedCriteriaIds.find(criteriaId) != m_trackedCriteriaIds.end(); }
+
bool IsOnline() { return (m_flags & GUILDMEMBER_STATUS_ONLINE); }
void ChangeRank(uint8 newRank);
@@ -418,6 +421,8 @@ private:
std::string m_publicNote;
std::string m_officerNote;
+ std::set<uint32> m_trackedCriteriaIds;
+
int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1];
uint32 m_achievementPoints;
uint64 m_totalActivity;
@@ -776,6 +781,7 @@ public:
// Handle client commands
void HandleRoster(WorldSession* session);
void HandleQuery(WorldSession* session);
+ void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& criteriaIds);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);
void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo);
@@ -831,6 +837,7 @@ public:
void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix) const;
void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const;
void BroadcastPacket(WorldPacket* packet) const;
+ void BroadcastPacketIfTrackingAchievement(WorldPacket* packet, uint32 criteriaId) const;
void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank);
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index a6e63d196c2..a4229f0fe66 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -823,3 +823,19 @@ void WorldSession::HandleGuildSetGuildMaster(WorldPacket& recvPacket)
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleSetNewGuildMaster(this, playerName);
}
+
+void WorldSession::HandleGuildSetAchievementTracking(WorldPacket& recvPacket)
+{
+ uint32 count = recvPacket.ReadBits(24);
+ std::set<uint32> criteriaIds;
+
+ for (int i = 0; i < count; ++i)
+ {
+ uint32 criteriaId;
+ recvPacket >> criteriaId;
+ criteriaIds.insert(criteriaId);
+ }
+
+ if (Guild* guild = GetPlayer()->GetGuild())
+ guild->HandleSetAchievementTracking(this, criteriaIds);
+}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index cbf766ee279..f5bd0ce9071 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -279,7 +279,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER(CMSG_GUILD_REQUEST_MAX_DAILY_XP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestMaxDailyXP );
DEFINE_OPCODE_HANDLER(CMSG_GUILD_REQUEST_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState );
DEFINE_OPCODE_HANDLER(CMSG_GUILD_ROSTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRosterOpcode );
- DEFINE_OPCODE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetAchievementTracking);
DEFINE_OPCODE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetGuildMaster );
DEFINE_OPCODE_HANDLER(CMSG_GUILD_SET_NOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetNoteOpcode );
DEFINE_OPCODE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetRankPermissionsOpcode);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 646a76bcbe5..b5eb168cbbd 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -582,6 +582,7 @@ class WorldSession
void HandleGuildAssignRankOpcode(WorldPacket& recvPacket);
void HandleGuildLeaveOpcode(WorldPacket& recvPacket);
void HandleGuildDisbandOpcode(WorldPacket& recvPacket);
+ void HandleGuildSetAchievementTracking(WorldPacket& recvPacket);
void HandleGuildSetGuildMaster(WorldPacket& recvPacket);
void HandleGuildMOTDOpcode(WorldPacket& recvPacket);
void HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket);