diff options
author | megamage <none@none> | 2009-02-06 15:40:48 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-02-06 15:40:48 -0600 |
commit | f08e9d323b91720fa46382d9f7c6670ae9afb129 (patch) | |
tree | 31e647e33e80f9edf5b26f13d75b6b52510a041d /src | |
parent | e920c9d1abb165f533dc9563a27e342cc93e100d (diff) |
[7235] New command: .reset achievements. Author: VladimirMangos
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/AchievementMgr.cpp | 36 | ||||
-rw-r--r-- | src/game/AchievementMgr.h | 2 | ||||
-rw-r--r-- | src/game/Chat.cpp | 1 | ||||
-rw-r--r-- | src/game/Chat.h | 1 | ||||
-rw-r--r-- | src/game/Level3.cpp | 39 | ||||
-rw-r--r-- | src/shared/revision_nr.h | 2 |
6 files changed, 78 insertions, 3 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index f0a88bee05a..5d69a6c23c3 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; i<ACHIEVEMENT_CRITERIA_TYPE_TOTAL; i++) + for(uint32 i=0; i<ACHIEVEMENT_CRITERIA_TYPE_TOTAL; ++i) UpdateAchievementCriteria(AchievementCriteriaTypes(i)); } diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index 5c7f34873f6..aadf1f16bd9 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -93,6 +93,8 @@ class AchievementMgr AchievementMgr(Player* pl); ~AchievementMgr(); + void Reset(); + static void DeleteFromDB(uint32 lowguid); void LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult); void SaveToDB(); void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0); diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 497c8fd3c2d..1fb6bad508e 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -393,6 +393,7 @@ ChatCommand * ChatHandler::getCommandTable() static ChatCommand resetCommandTable[] = { + { "achievements", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAchievementsCommand, "", NULL }, { "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL }, { "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL }, { "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL }, diff --git a/src/game/Chat.h b/src/game/Chat.h index 8f75ae9ec9b..111f8163093 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -407,6 +407,7 @@ class ChatHandler bool HandleDelTeleCommand(const char * args); bool HandleListAurasCommand(const char * args); + bool HandleResetAchievementsCommand(const char * args); bool HandleResetHonorCommand(const char * args); bool HandleResetLevelCommand(const char * args); bool HandleResetSpellsCommand(const char * args); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index f8c226110af..240e20ec2bf 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -4749,6 +4749,45 @@ bool ChatHandler::HandleListAurasCommand (const char * /*args*/) return true; } +bool ChatHandler::HandleResetAchievementsCommand (const char * args) +{ + char* pName = strtok((char*)args, ""); + Player *player = NULL; + uint64 guid = 0; + if (pName) + { + std::string name = extractPlayerNameFromLink(pName); + if(name.empty()) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + guid = objmgr.GetPlayerGUIDByName(name); + player = objmgr.GetPlayer(guid); + } + else + { + player = getSelectedPlayer(); + if(player) + guid = player->GetGUID(); + } + + 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 039ee980c15..f64a9a60594 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__ |