diff options
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/GuildHandler.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 1 |
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); |