diff --git a/sql/characters.sql b/sql/characters.sql index f59862449..c6f18a193 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_7644_01_characters_character_pet` bit(1) default NULL + `required_7802_02_characters_character_achievement_progress` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- @@ -253,9 +253,9 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `character_achievement`; CREATE TABLE `character_achievement` ( - `guid` int(11) NOT NULL, - `achievement` int(11) NOT NULL, - `date` int(11) NOT NULL, + `guid` int(11) unsigned NOT NULL, + `achievement` int(11) unsigned NOT NULL, + `date` bigint(11) unsigned NOT NULL default '0', PRIMARY KEY (`guid`,`achievement`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -274,10 +274,10 @@ UNLOCK TABLES; DROP TABLE IF EXISTS `character_achievement_progress`; CREATE TABLE `character_achievement_progress` ( - `guid` int(11) NOT NULL, - `criteria` int(11) NOT NULL, - `counter` int(11) NOT NULL, - `date` int(11) NOT NULL, + `guid` int(11) unsigned NOT NULL, + `criteria` int(11) unsigned NOT NULL, + `counter` int(11) unsigned NOT NULL, + `date` bigint(11) unsigned NOT NULL default '0', PRIMARY KEY (`guid`,`criteria`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/sql/updates/7802_01_characters_character_achievement.sql b/sql/updates/7802_01_characters_character_achievement.sql new file mode 100644 index 000000000..774d1f6b3 --- /dev/null +++ b/sql/updates/7802_01_characters_character_achievement.sql @@ -0,0 +1,6 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_7644_01_characters_character_pet required_7802_01_characters_character_achievement bit; + +ALTER TABLE character_achievement + CHANGE COLUMN guid guid int(11) unsigned NOT NULL, + CHANGE COLUMN achievement achievement int(11) unsigned NOT NULL, + CHANGE COLUMN date date bigint(11) unsigned NOT NULL default '0'; diff --git a/sql/updates/7802_02_characters_character_achievement_progress.sql b/sql/updates/7802_02_characters_character_achievement_progress.sql new file mode 100644 index 000000000..318a430ac --- /dev/null +++ b/sql/updates/7802_02_characters_character_achievement_progress.sql @@ -0,0 +1,7 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_7802_01_characters_character_achievement required_7802_02_characters_character_achievement_progress bit; + +ALTER TABLE character_achievement_progress + CHANGE COLUMN guid guid int(11) unsigned NOT NULL, + CHANGE COLUMN criteria criteria int(11) unsigned NOT NULL, + CHANGE COLUMN counter counter int(11) unsigned NOT NULL, + CHANGE COLUMN date date bigint(11) unsigned NOT NULL default '0'; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index c7e40654d..499016c4b 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -182,6 +182,8 @@ pkgdata_DATA = \ 7782_01_mangos_spell_proc_event.sql \ 7796_01_mangos_command.sql \ 7796_02_mangos_mangos_string.sql \ + 7802_01_characters_character_achievement.sql \ + 7802_02_characters_character_achievement_progress.sql \ README ## Additional files to include when running 'make dist' @@ -344,4 +346,6 @@ EXTRA_DIST = \ 7782_01_mangos_spell_proc_event.sql \ 7796_01_mangos_command.sql \ 7796_02_mangos_mangos_string.sql \ + 7802_01_characters_character_achievement.sql \ + 7802_02_characters_character_achievement_progress.sql \ README diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 12bca0ed5..6c6620465 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -407,7 +407,14 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri do { Field *fields = achievementResult->Fetch(); - CompletedAchievementData& ca = m_completedAchievements[fields[0].GetUInt32()]; + + uint32 achievement_id = fields[0].GetUInt32(); + + // don't must happen: cleanup at server startup in achievementmgr.LoadCompletedAchievements() + if(!sAchievementStore.LookupEntry(achievement_id)) + continue; + + CompletedAchievementData& ca = m_completedAchievements[achievement_id]; ca.date = time_t(fields[1].GetUInt64()); ca.changed = false; } while(achievementResult->NextRow()); @@ -425,7 +432,15 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri time_t date = time_t(fields[2].GetUInt64()); AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id); - if (!criteria || (criteria->timeLimit && time_t(date + criteria->timeLimit) < time(NULL))) + if (!criteria) + { + // we will remove not existed criteria for all characters + sLog.outError("Not existed achievement creataria %u data removed from table `character_achievement_progress`.",id); + CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE criteria = %u",id); + continue; + } + + if (criteria->timeLimit && time_t(date + criteria->timeLimit) < time(NULL)) continue; CriteriaProgress& progress = m_criteriaProgress[id]; @@ -1763,7 +1778,17 @@ void AchievementGlobalMgr::LoadCompletedAchievements() { bar.step(); Field *fields = result->Fetch(); - m_allCompletedAchievements.insert(fields[0].GetUInt32()); + + uint32 achievement_id = fields[0].GetUInt32(); + if(!sAchievementStore.LookupEntry(achievement_id)) + { + // we will remove not existed achievement for all characters + sLog.outError("Not existed achievement %u data removed from table `character_achievement`.",achievement_id); + CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE achievement = %u",achievement_id); + continue; + } + + m_allCompletedAchievements.insert(achievement_id); } while(result->NextRow()); delete result; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index bc98b3ab8..9fe69ba29 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 "7801" + #define REVISION_NR "7802" #endif // __REVISION_NR_H__