aboutsummaryrefslogtreecommitdiff
path: root/src/game/AchievementMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/AchievementMgr.cpp')
-rw-r--r--src/game/AchievementMgr.cpp69
1 files changed, 49 insertions, 20 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index c4a634c15c0..598bca0087f 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -141,7 +141,8 @@ void AchievementMgr::SaveToDB()
if(!m_criteriaProgress.empty())
{
/// prepare deleting and insert
- bool need_execute = false;
+ bool need_execute_del = false;
+ bool need_execute_ins = false;
std::ostringstream ssdel;
std::ostringstream ssins;
for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
@@ -149,36 +150,53 @@ void AchievementMgr::SaveToDB()
if(!iter->second.changed)
continue;
- /// first new/changed record prefix
- if(!need_execute)
+ // deleted data (including 0 progress state)
{
- ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
- ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
- need_execute = true;
+ /// first new/changed record prefix (for any counter value)
+ if(!need_execute_del)
+ {
+ ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
+ need_execute_del = true;
+ }
+ /// next new/changed record prefix
+ else
+ ssdel << ", ";
+
+ // new/changed record data
+ ssdel << iter->first;
}
- /// next new/changed record prefix
- else
+
+ // store data only for real progress
+ if(iter->second.counter != 0)
{
- ssdel << ", ";
- ssins << ", ";
- }
+ /// first new/changed record prefix
+ if(!need_execute_ins)
+ {
+ ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
+ need_execute_ins = true;
+ }
+ /// next new/changed record prefix
+ else
+ ssins << ", ";
- // new/changed record data
- ssdel << iter->first;
- ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
+ // new/changed record data
+ ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
+ }
- /// mark as saved in db
+ /// mark as updated in db
iter->second.changed = false;
}
- if(need_execute)
+ if(need_execute_del) // DELETE ... IN (.... _)_
ssdel << ")";
- if(need_execute)
+ if(need_execute_del || need_execute_ins)
{
CharacterDatabase.BeginTransaction ();
- CharacterDatabase.Execute( ssdel.str().c_str() );
- CharacterDatabase.Execute( ssins.str().c_str() );
+ if(need_execute_del)
+ CharacterDatabase.Execute( ssdel.str().c_str() );
+ if(need_execute_ins)
+ CharacterDatabase.Execute( ssins.str().c_str() );
CharacterDatabase.CommitTransaction ();
}
}
@@ -386,6 +404,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
if(GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
SetCriteriaProgress(achievementCriteria, 1);
break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ if(m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end())
+ SetCriteriaProgress(achievementCriteria, 1);
+ break;
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
@@ -628,7 +650,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
- return m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end();
+ return progress->counter >= 1;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
@@ -729,6 +751,10 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
if(iter == m_criteriaProgress.end())
{
+ // not create record for 0 counter
+ if(newValue == 0)
+ return;
+
progress = &m_criteriaProgress[entry->ID];
progress->counter = newValue;
progress->date = time(NULL);
@@ -738,8 +764,11 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
progress = &iter->second;
if(relative)
newValue += progress->counter;
+
+ // not update (not mark as changed) if counter will have same value
if(progress->counter == newValue)
return;
+
progress->counter = newValue;
}