diff options
| author | megamage <none@none> | 2009-01-20 19:59:43 -0600 | 
|---|---|---|
| committer | megamage <none@none> | 2009-01-20 19:59:43 -0600 | 
| commit | 68c0bcd06980cbc5babc842d990d1b8eb564e388 (patch) | |
| tree | 0dbed1b4453a0361cecd2608325107902696ab22 /src/game/AchievementMgr.cpp | |
| parent | 1bbd8968615e4b89fe4549bd1cccd089f6ad38f0 (diff) | |
*Update to Mangos 7125.
--HG--
branch : trunk
Diffstat (limited to 'src/game/AchievementMgr.cpp')
| -rw-r--r-- | src/game/AchievementMgr.cpp | 69 | 
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;      }  | 
