[7235] New command: .reset achievements. Author: VladimirMangos
--HG-- branch : trunk
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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, "");
|
||||
|
||||
Reference in New Issue
Block a user