mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Achievements/Guilds: Fix guild achievement tracking
- This fix a typo on commit TrinityCore@7ec22c5 - This fix update of criteria progress on login Thanks to @DDuarte for initial commit and help with pull request Thanks to @Kiritoo for send me sniffs
This commit is contained in:
@@ -998,6 +998,95 @@ void AchievementMgr<Guild>::SendCriteriaUpdate(AchievementCriteriaEntry const* e
|
||||
GetOwner()->BroadcastPacketIfTrackingAchievement(&data, entry->ID);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void AchievementMgr<T>::SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const
|
||||
{
|
||||
}
|
||||
|
||||
template<>
|
||||
void AchievementMgr<Guild>::SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const
|
||||
{
|
||||
ObjectGuid counter;
|
||||
ObjectGuid guid;
|
||||
uint32 trackedCriteriasCount = 0;
|
||||
|
||||
for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
|
||||
{
|
||||
AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(*itr);
|
||||
|
||||
CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
|
||||
if (progress == m_criteriaProgress.end())
|
||||
continue;
|
||||
|
||||
++trackedCriteriasCount;
|
||||
}
|
||||
|
||||
ByteBuffer criteriaBits(21 + (trackedCriteriasCount * (8 + 8)));
|
||||
ByteBuffer criteriaData(trackedCriteriasCount * (8 + 8 + 4 + 4 + 4 + 4 + 4));
|
||||
|
||||
criteriaBits.WriteBits(trackedCriteriasCount, 21);
|
||||
|
||||
for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
|
||||
{
|
||||
AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteria(*itr);
|
||||
|
||||
CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
|
||||
if (progress == m_criteriaProgress.end())
|
||||
continue;
|
||||
|
||||
counter.Set(progress->second.counter);
|
||||
guid = progress->second.CompletedGUID;
|
||||
|
||||
criteriaBits.WriteBit(counter[4]);
|
||||
criteriaBits.WriteBit(counter[1]);
|
||||
criteriaBits.WriteBit(guid[2]);
|
||||
criteriaBits.WriteBit(counter[3]);
|
||||
criteriaBits.WriteBit(guid[1]);
|
||||
criteriaBits.WriteBit(counter[5]);
|
||||
criteriaBits.WriteBit(counter[0]);
|
||||
criteriaBits.WriteBit(guid[3]);
|
||||
criteriaBits.WriteBit(counter[2]);
|
||||
criteriaBits.WriteBit(guid[7]);
|
||||
criteriaBits.WriteBit(guid[5]);
|
||||
criteriaBits.WriteBit(guid[0]);
|
||||
criteriaBits.WriteBit(counter[6]);
|
||||
criteriaBits.WriteBit(guid[6]);
|
||||
criteriaBits.WriteBit(counter[7]);
|
||||
criteriaBits.WriteBit(guid[4]);
|
||||
criteriaBits.FlushBits();
|
||||
|
||||
criteriaData.WriteByteSeq(guid[5]);
|
||||
criteriaData << uint32(progress->second.date); // unknown date
|
||||
criteriaData.WriteByteSeq(counter[3]);
|
||||
criteriaData.WriteByteSeq(counter[7]);
|
||||
criteriaData << uint32(progress->second.date); // unknown date
|
||||
criteriaData.WriteByteSeq(counter[6]);
|
||||
criteriaData.WriteByteSeq(guid[4]);
|
||||
criteriaData.WriteByteSeq(guid[1]);
|
||||
criteriaData.WriteByteSeq(counter[4]);
|
||||
criteriaData.WriteByteSeq(guid[3]);
|
||||
criteriaData.WriteByteSeq(counter[0]);
|
||||
criteriaData.WriteByteSeq(guid[2]);
|
||||
criteriaData.WriteByteSeq(counter[1]);
|
||||
criteriaData.WriteByteSeq(guid[6]);
|
||||
criteriaData << uint32(progress->second.date); // last update time (not packed!)
|
||||
criteriaData << uint32(entry->ID);
|
||||
criteriaData.WriteByteSeq(counter[5]);
|
||||
criteriaData << uint32(0);
|
||||
criteriaData.WriteByteSeq(guid[7]);
|
||||
criteriaData.WriteByteSeq(counter[2]);
|
||||
criteriaData.WriteByteSeq(guid[0]);
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_GUILD_CRITERIA_DATA, criteriaBits.size() + criteriaData.size());
|
||||
data.append(criteriaBits);
|
||||
|
||||
if (trackedCriteriasCount)
|
||||
data.append(criteriaData);
|
||||
|
||||
receiver->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
/**
|
||||
* called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet
|
||||
*/
|
||||
|
||||
@@ -264,6 +264,7 @@ class AchievementMgr
|
||||
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
|
||||
void CheckAllAchievementCriteria(Player* referencePlayer);
|
||||
void SendAllAchievementData(Player* receiver) const;
|
||||
void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
|
||||
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
T* GetOwner() const { return _owner; }
|
||||
|
||||
@@ -1562,10 +1562,29 @@ 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)
|
||||
void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds)
|
||||
{
|
||||
if (Member* member = GetMember(session->GetPlayer()->GetGUID()))
|
||||
Player* player = session->GetPlayer();
|
||||
|
||||
if (Member* member = GetMember(player->GetGUID()))
|
||||
{
|
||||
std::set<uint32> criteriaIds;
|
||||
|
||||
for (std::set<uint32>::iterator achievementId = achievementIds.begin(); achievementId != achievementIds.end(); ++achievementId)
|
||||
{
|
||||
if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(*achievementId))
|
||||
{
|
||||
for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
|
||||
{
|
||||
AchievementCriteriaEntry const* criteria = *itr;
|
||||
criteriaIds.insert(criteria->ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
member->SetTrackedCriteriaIds(criteriaIds);
|
||||
m_achievementMgr.SendAllTrackedCriterias(player, member->GetTrackedCriteriaIds());
|
||||
}
|
||||
}
|
||||
|
||||
void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
|
||||
|
||||
@@ -395,6 +395,7 @@ private:
|
||||
uint32 GetTotalReputation() const { return m_totalReputation; }
|
||||
uint32 GetWeekReputation() const { return m_weekReputation; }
|
||||
|
||||
std::set<uint32> GetTrackedCriteriaIds() const { return m_trackedCriteriaIds; }
|
||||
void SetTrackedCriteriaIds(std::set<uint32> criteriaIds) { m_trackedCriteriaIds.swap(criteriaIds); }
|
||||
bool IsTrackingCriteriaId(uint32 criteriaId) const { return m_trackedCriteriaIds.find(criteriaId) != m_trackedCriteriaIds.end(); }
|
||||
|
||||
@@ -789,7 +790,7 @@ public:
|
||||
// Handle client commands
|
||||
void HandleRoster(WorldSession* session);
|
||||
void HandleQuery(WorldSession* session);
|
||||
void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& criteriaIds);
|
||||
void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds);
|
||||
void HandleSetMOTD(WorldSession* session, std::string const& motd);
|
||||
void HandleSetInfo(WorldSession* session, std::string const& info);
|
||||
void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo);
|
||||
|
||||
@@ -832,15 +832,15 @@ void WorldSession::HandleGuildSetGuildMaster(WorldPacket& recvPacket)
|
||||
void WorldSession::HandleGuildSetAchievementTracking(WorldPacket& recvPacket)
|
||||
{
|
||||
uint32 count = recvPacket.ReadBits(24);
|
||||
std::set<uint32> criteriaIds;
|
||||
std::set<uint32> achievementIds;
|
||||
|
||||
for (uint32 i = 0; i < count; ++i)
|
||||
{
|
||||
uint32 criteriaId;
|
||||
recvPacket >> criteriaId;
|
||||
criteriaIds.insert(criteriaId);
|
||||
uint32 achievementId;
|
||||
recvPacket >> achievementId;
|
||||
achievementIds.insert(achievementId);
|
||||
}
|
||||
|
||||
if (Guild* guild = GetPlayer()->GetGuild())
|
||||
guild->HandleSetAchievementTracking(this, criteriaIds);
|
||||
guild->HandleSetAchievementTracking(this, achievementIds);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user