diff --git a/sql/characters.sql b/sql/characters.sql index 1548a6b11..078afe024 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_7100_01_characters_character_spell` bit(1) default NULL + `required_7113_01_characters_character_achievement_progress` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- diff --git a/sql/updates/7113_01_characters_character_achievement_progress.sql b/sql/updates/7113_01_characters_character_achievement_progress.sql new file mode 100644 index 000000000..6e38cd998 --- /dev/null +++ b/sql/updates/7113_01_characters_character_achievement_progress.sql @@ -0,0 +1,3 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_7100_01_characters_character_spell required_7113_01_characters_character_achievement_progress bit; + +DELETE FROM character_achievement_progress WHERE counter=0; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index d8fed763e..2cee52875 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -141,6 +141,7 @@ pkgdata_DATA = \ 7097_01_mangos_spell_proc_event.sql \ 7100_01_characters_character_spell.sql \ 7107_01_mangos_string.sql \ + 7113_01_characters_character_achievement_progress.sql \ README ## Additional files to include when running 'make dist' @@ -262,4 +263,5 @@ EXTRA_DIST = \ 7097_01_mangos_spell_proc_event.sql \ 7100_01_characters_character_spell.sql \ 7107_01_mangos_string.sql \ + 7113_01_characters_character_achievement_progress.sql \ README diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index fb6684892..6fb0497db 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; - } - /// 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 (); } } @@ -729,6 +747,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 +760,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; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2599845fe..b6502b1cb 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7112" + #define REVISION_NR "7113" #endif // __REVISION_NR_H__