Core/Achievements: Achievement title rewards will be readded when loading achievements (fixes cases like player completing achievement X and not getting reward because it was misssing from database at that time)

This commit is contained in:
Shauren
2011-01-28 15:34:53 +01:00
parent 3f0d888b0e
commit e41e3544ff

View File

@@ -574,17 +574,25 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ
do
{
Field* fields = achievementResult->Fetch();
uint32 achievement_id = fields[0].GetUInt16();
uint32 achievementid = fields[0].GetUInt16();
// don't must happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements()
if (!sAchievementStore.LookupEntry(achievement_id))
AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid);
if (!achievement)
continue;
CompletedAchievementData& ca = m_completedAchievements[achievement_id];
CompletedAchievementData& ca = m_completedAchievements[achievementid];
ca.date = time_t(fields[1].GetUInt32());
ca.changed = false;
}
while (achievementResult->NextRow());
// title achievement rewards are retroactive
if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement))
if (uint32 titleId = reward->titleId[GetPlayer()->GetTeam() == ALLIANCE ? 0 : 1])
if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId))
if (!GetPlayer()->HasTitle(titleEntry))
GetPlayer()->SetTitle(titleEntry);
} while (achievementResult->NextRow());
}
if (criteriaResult)
@@ -612,8 +620,7 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ
progress.counter = counter;
progress.date = date;
progress.changed = false;
}
while (criteriaResult->NextRow());
} while (criteriaResult->NextRow());
}
}