aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/characters.sql14
-rw-r--r--sql/updates/7802_01_characters_character_achievement.sql6
-rw-r--r--sql/updates/7802_02_characters_character_achievement_progress.sql7
-rw-r--r--src/game/AchievementMgr.cpp31
4 files changed, 48 insertions, 10 deletions
diff --git a/sql/characters.sql b/sql/characters.sql
index 4cab438342a..098be23596e 100644
--- a/sql/characters.sql
+++ b/sql/characters.sql
@@ -316,9 +316,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;
@@ -337,10 +337,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 00000000000..774d1f6b3a9
--- /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 00000000000..318a430acc4
--- /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/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index 321922f821e..84ae9cb659e 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;