*Update to Mangos 7125.
--HG-- branch : trunk
This commit is contained in:
+50
-21
@@ -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;
|
||||
}
|
||||
/// next new/changed record prefix
|
||||
else
|
||||
{
|
||||
ssdel << ", ";
|
||||
ssins << ", ";
|
||||
/// 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;
|
||||
}
|
||||
|
||||
// new/changed record data
|
||||
ssdel << iter->first;
|
||||
ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
|
||||
// store data only for real progress
|
||||
if(iter->second.counter != 0)
|
||||
{
|
||||
/// 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 << ", ";
|
||||
|
||||
/// mark as saved in db
|
||||
// new/changed record data
|
||||
ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
|
||||
}
|
||||
|
||||
/// 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user