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:
Dekadence
2014-09-27 14:28:10 +02:00
parent b48ba56efd
commit 5ac63a43fb
5 changed files with 118 additions and 8 deletions

View File

@@ -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
*/

View File

@@ -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; }

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);
}