diff --git a/sql/mangos.sql b/sql/mangos.sql index 2eaa29c0a..f48fd62b9 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_7230_02_mangos_spell_bonus_data` bit(1) default NULL + `required_7235_01_mangos_command` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -425,6 +425,7 @@ INSERT INTO `command` VALUES ('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.'), ('reload config',3,'Syntax: .reload config\r\n\r\nReload config settings (by default stored in mangosd.conf). Not all settings can be change at reload: some new setting values will be ignored until restart, some values will applied with delay or only to new objects/maps, some values will explicitly rejected to change at reload.'), ('repairitems',2,'Syntax: .repairitems\r\n\r\nRepair all selected player''s items.'), +('reset achievements',3,'Syntax: .reset achievements [$playername]\r\n\r\nReset achievements data for selected or named (online or offline) character. Achievements for persistance progress data like completed quests/etc re-filled at reset. Achievements for events like kills/casts/etc will lost.'), ('reset all',3,'Syntax: .reset all spells\r\n\r\nSyntax: .reset all talents\r\n\r\nRequest reset spells or talents at next login each existed character.'), ('reset honor',3,'Syntax:\r\n.reset honor [Playername]\r\n Reset all honor data for targeted character.'), ('reset level',3,'Syntax:\r\n.reset level [Playername]\r\n Reset level to 1 including reset stats and talents. Equipped items with greater level requirement can be lost.'), diff --git a/sql/updates/7235_01_mangos_command.sql b/sql/updates/7235_01_mangos_command.sql new file mode 100644 index 000000000..05c24480f --- /dev/null +++ b/sql/updates/7235_01_mangos_command.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_7230_02_mangos_spell_bonus_data required_7235_01_mangos_command bit; + +DELETE FROM `command` WHERE `name` = 'reset achievements'; +INSERT INTO `command` VALUES +('reset achievements',3,'Syntax: .reset achievements [$playername]\r\n\r\nReset achievements data for selected or named (online or offline) character. Achievements for persistance progress data like completed quests/etc re-filled at reset. Achievements for events like kills/casts/etc will lost.'); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index bd0cfa7c4..e3afd7339 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -167,6 +167,7 @@ pkgdata_DATA = \ 7214_02_mangos_mangos_string.sql \ 7230_01_mangos_spell_chain.sql \ 7230_02_mangos_spell_bonus_data.sql \ + 7235_01_mangos_command.sql \ README ## Additional files to include when running 'make dist' @@ -314,4 +315,5 @@ EXTRA_DIST = \ 7214_02_mangos_mangos_string.sql \ 7230_01_mangos_spell_chain.sql \ 7230_02_mangos_spell_bonus_data.sql \ + 7235_01_mangos_command.sql \ README diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index f0a88bee0..5d69a6c23 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -92,6 +92,38 @@ AchievementMgr::~AchievementMgr() { } +void AchievementMgr::Reset() +{ + for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter) + { + WorldPacket data(SMSG_ACHIEVEMENT_DELETED,4); + data << uint32(iter->first); + m_player->SendDirectMessage(&data); + } + + for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter) + { + WorldPacket data(SMSG_CRITERIA_DELETED,4); + data << uint32(iter->first); + m_player->SendDirectMessage(&data); + } + + m_completedAchievements.clear(); + m_criteriaProgress.clear(); + DeleteFromDB(m_player->GetGUIDLow()); + + // re-fill data + CheckAllAchievementCriteria(); +} + +void AchievementMgr::DeleteFromDB(uint32 lowguid) +{ + CharacterDatabase.BeginTransaction (); + CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = %u",lowguid); + CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = %u",lowguid); + CharacterDatabase.CommitTransaction (); +} + void AchievementMgr::SaveToDB() { if(!m_completedAchievements.empty()) @@ -99,7 +131,7 @@ void AchievementMgr::SaveToDB() bool need_execute = false; std::ostringstream ssdel; std::ostringstream ssins; - for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); iter++) + for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter) { if(!iter->second.changed) continue; @@ -314,7 +346,7 @@ void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progr void AchievementMgr::CheckAllAchievementCriteria() { // suppress sending packets - for(uint32 i=0; iGetGUID(); + } + + if(!player && !guid) + { + SendSysMessage(LANG_NO_CHAR_SELECTED); + return true; + } + + if(player) + player->GetAchievementMgr().Reset(); + else if(guid) + AchievementMgr::DeleteFromDB(GUID_LOPART(guid)); + + return true; +} + bool ChatHandler::HandleResetHonorCommand (const char * args) { char* pName = strtok((char*)args, ""); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 039ee980c..f64a9a605 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 "7234" + #define REVISION_NR "7235" #endif // __REVISION_NR_H__