[7113] Not update/store achievement progress for counter == 0

This commit is contained in:
VladimirMangos 2009-01-19 13:25:57 +03:00
parent be051a706c
commit 9fba64aeae
5 changed files with 52 additions and 22 deletions

View file

@ -21,7 +21,7 @@
DROP TABLE IF EXISTS `character_db_version`; DROP TABLE IF EXISTS `character_db_version`;
CREATE TABLE `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'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
-- --

View file

@ -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;

View file

@ -141,6 +141,7 @@ pkgdata_DATA = \
7097_01_mangos_spell_proc_event.sql \ 7097_01_mangos_spell_proc_event.sql \
7100_01_characters_character_spell.sql \ 7100_01_characters_character_spell.sql \
7107_01_mangos_string.sql \ 7107_01_mangos_string.sql \
7113_01_characters_character_achievement_progress.sql \
README README
## Additional files to include when running 'make dist' ## Additional files to include when running 'make dist'
@ -262,4 +263,5 @@ EXTRA_DIST = \
7097_01_mangos_spell_proc_event.sql \ 7097_01_mangos_spell_proc_event.sql \
7100_01_characters_character_spell.sql \ 7100_01_characters_character_spell.sql \
7107_01_mangos_string.sql \ 7107_01_mangos_string.sql \
7113_01_characters_character_achievement_progress.sql \
README README

View file

@ -141,7 +141,8 @@ void AchievementMgr::SaveToDB()
if(!m_criteriaProgress.empty()) if(!m_criteriaProgress.empty())
{ {
/// prepare deleting and insert /// prepare deleting and insert
bool need_execute = false; bool need_execute_del = false;
bool need_execute_ins = false;
std::ostringstream ssdel; std::ostringstream ssdel;
std::ostringstream ssins; std::ostringstream ssins;
for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter) for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
@ -149,35 +150,52 @@ void AchievementMgr::SaveToDB()
if(!iter->second.changed) if(!iter->second.changed)
continue; continue;
/// first new/changed record prefix // deleted data (including 0 progress state)
if(!need_execute) {
/// 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 ("; 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_del = true;
need_execute = true;
} }
/// next new/changed record prefix /// next new/changed record prefix
else else
{
ssdel << ", "; ssdel << ", ";
ssins << ", ";
}
// new/changed record data // new/changed record data
ssdel << iter->first; ssdel << iter->first;
ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")"; }
/// mark as saved in db // 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 << ", ";
// new/changed record data
ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
}
/// mark as updated in db
iter->second.changed = false; iter->second.changed = false;
} }
if(need_execute) if(need_execute_del) // DELETE ... IN (.... _)_
ssdel << ")"; ssdel << ")";
if(need_execute) if(need_execute_del || need_execute_ins)
{ {
CharacterDatabase.BeginTransaction (); CharacterDatabase.BeginTransaction ();
if(need_execute_del)
CharacterDatabase.Execute( ssdel.str().c_str() ); CharacterDatabase.Execute( ssdel.str().c_str() );
if(need_execute_ins)
CharacterDatabase.Execute( ssins.str().c_str() ); CharacterDatabase.Execute( ssins.str().c_str() );
CharacterDatabase.CommitTransaction (); CharacterDatabase.CommitTransaction ();
} }
@ -729,6 +747,10 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
if(iter == m_criteriaProgress.end()) if(iter == m_criteriaProgress.end())
{ {
// not create record for 0 counter
if(newValue == 0)
return;
progress = &m_criteriaProgress[entry->ID]; progress = &m_criteriaProgress[entry->ID];
progress->counter = newValue; progress->counter = newValue;
progress->date = time(NULL); progress->date = time(NULL);
@ -738,8 +760,11 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
progress = &iter->second; progress = &iter->second;
if(relative) if(relative)
newValue += progress->counter; newValue += progress->counter;
// not update (not mark as changed) if counter will have same value
if(progress->counter == newValue) if(progress->counter == newValue)
return; return;
progress->counter = newValue; progress->counter = newValue;
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7112" #define REVISION_NR "7113"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__