mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Merge pull request #13017 from DDuarte/guild_achiev_tracking
Core/Guild: Only send achievement criteria updates to players that requested them.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
@@ -2625,6 +2631,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;
|
||||
|
||||
@@ -395,6 +395,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);
|
||||
@@ -426,6 +429,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;
|
||||
@@ -784,6 +789,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);
|
||||
@@ -840,6 +846,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);
|
||||
|
||||
|
||||
@@ -829,3 +829,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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user