[10342] Cleanup achievement code and add new commands.

* .achievement - let see achievement state and list criteria with progress data.
                 It provide criteria ids/shift-links for other commands.
* .achievement add - let complete achivement (set all criteria progress to max) with related events.
* .achievement remove - let reset achievement  criteria progress and undo complete state for achievement.
                 Command also partly remove rewards (title part).
* .achievement criteria add - let increase criteria progress at specific amount or to complete state
* .achievement criteria remove - let reset/descrease criteria progress and undo criteria and related achivement complete state if need.
This commit is contained in:
VladimirMangos 2010-08-11 05:14:03 +04:00
parent 5c2fc55fe4
commit 4c838a1c31
14 changed files with 701 additions and 184 deletions

View file

@ -1018,6 +1018,269 @@ bool ChatHandler::HandleAccountSetPasswordCommand(char* args)
return true;
}
void ChatHandler::ShowAchievementCriteriaListHelper(AchievementCriteriaEntry const* criEntry, AchievementEntry const * achEntry, LocaleConstant loc, Player* target /*= NULL*/)
{
std::ostringstream ss;
if (m_session)
{
ss << criEntry->ID << " - |cffffffff|Hachievement_criteria:" << criEntry->ID << "|h[" << criEntry->name[loc] << " " << localeNames[loc] << "]|h|r";
}
else
ss << criEntry->ID << " - " << criEntry->name[loc] << " " << localeNames[loc];
if (target)
ss << " = " << target->GetAchievementMgr().GetCriteriaProgressCounter(criEntry);
if (achEntry->flags & ACHIEVEMENT_FLAG_COUNTER)
ss << GetMangosString(LANG_COUNTER);
else
{
ss << " [" << AchievementMgr::GetCriteriaProgressMaxCounter(criEntry) << "]";
if (target && target->GetAchievementMgr().IsCompletedCriteria(criEntry, achEntry))
ss << GetMangosString(LANG_COMPLETE);
}
SendSysMessage(ss.str().c_str());
}
bool ChatHandler::HandleAchievementCommand(char* args)
{
char* nameStr = ExtractOptNotLastArg(&args);
Player* target = NULL;
if (nameStr)
{
if (!ExtractPlayerTarget(&nameStr, &target))
return false;
}
else
target = getSelectedPlayer();
uint32 achId;
if (!ExtractUint32KeyFromLink(&args, "Hachievement", achId))
return false;
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(achId);
if (!achEntry)
{
PSendSysMessage(LANG_ACHIEVEMENT_NOT_EXIST, achId);
SetSentErrorMessage(true);
return false;
}
LocaleConstant loc = GetSessionDbcLocale();
CompletedAchievementData const* completed = target ? target->GetAchievementMgr().GetCompleteData(achId) : NULL;
ShowAchievementListHelper(achEntry, loc, completed ? &completed->date : NULL, target);
if (AchievementCriteriaEntryList const* criteriaList = sAchievementMgr.GetAchievementCriteriaByAchievement(achEntry->ID))
{
SendSysMessage(LANG_COMMAND_ACHIEVEMENT_CREATERIA);
for (AchievementCriteriaEntryList::const_iterator itr = criteriaList->begin(); itr != criteriaList->end(); ++itr)
ShowAchievementCriteriaListHelper(*itr, achEntry, loc, target);
}
return true;
}
bool ChatHandler::HandleAchievementAddCommand(char* args)
{
char* nameStr = ExtractOptNotLastArg(&args);
Player* target;
if (!ExtractPlayerTarget(&nameStr, &target))
return false;
uint32 achId;
if (!ExtractUint32KeyFromLink(&args, "Hachievement", achId))
return false;
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(achId);
if (!achEntry || achEntry->flags & ACHIEVEMENT_FLAG_COUNTER)
{
PSendSysMessage(LANG_ACHIEVEMENT_NOT_EXIST, achId);
SetSentErrorMessage(true);
return false;
}
AchievementMgr& mgr = target->GetAchievementMgr();
if (AchievementCriteriaEntryList const* criteriaList = sAchievementMgr.GetAchievementCriteriaByAchievement(achEntry->ID))
{
for (AchievementCriteriaEntryList::const_iterator itr = criteriaList->begin(); itr != criteriaList->end(); ++itr)
{
if (mgr.IsCompletedCriteria(*itr, achEntry))
continue;
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(*itr);
mgr.SetCriteriaProgress(*itr, achEntry, maxValue);
}
}
LocaleConstant loc = GetSessionDbcLocale();
CompletedAchievementData const* completed = target ? target->GetAchievementMgr().GetCompleteData(achId) : NULL;
ShowAchievementListHelper(achEntry, loc, completed ? &completed->date : NULL, target);
return true;
}
bool ChatHandler::HandleAchievementRemoveCommand(char* args)
{
char* nameStr = ExtractOptNotLastArg(&args);
Player* target;
if (!ExtractPlayerTarget(&nameStr, &target))
return false;
uint32 achId;
if (!ExtractUint32KeyFromLink(&args, "Hachievement", achId))
return false;
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(achId);
if (!achEntry)
{
PSendSysMessage(LANG_ACHIEVEMENT_NOT_EXIST, achId);
SetSentErrorMessage(true);
return false;
}
AchievementMgr& mgr = target->GetAchievementMgr();
if (AchievementCriteriaEntryList const* criteriaList = sAchievementMgr.GetAchievementCriteriaByAchievement(achEntry->ID))
for (AchievementCriteriaEntryList::const_iterator itr = criteriaList->begin(); itr != criteriaList->end(); ++itr)
mgr.SetCriteriaProgress(*itr, achEntry, 0);
LocaleConstant loc = GetSessionDbcLocale();
CompletedAchievementData const* completed = target ? target->GetAchievementMgr().GetCompleteData(achId) : NULL;
ShowAchievementListHelper(achEntry, loc, completed ? &completed->date : NULL, target);
return true;
}
bool ChatHandler::HandleAchievementCriteriaAddCommand(char* args)
{
Player* target;
uint32 criId;
if (!ExtractUint32KeyFromLink(&args, "Hachievement_criteria", criId))
{
// maybe player first
char* nameStr = ExtractArg(&args);
if (!ExtractPlayerTarget(&nameStr, &target))
return false;
if (!ExtractUint32KeyFromLink(&args, "Hachievement_criteria", criId))
return false;
}
else
target = getSelectedPlayer();
AchievementCriteriaEntry const *criEntry = sAchievementCriteriaStore.LookupEntry(criId);
if (!criEntry)
{
PSendSysMessage(LANG_ACHIEVEMENT_CRITERIA_NOT_EXIST, criId);
SetSentErrorMessage(true);
return false;
}
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(criEntry->referredAchievement);
if (!achEntry)
return false;
LocaleConstant loc = GetSessionDbcLocale();
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry);
AchievementMgr& mgr = target->GetAchievementMgr();
// nothing do if completed
if (mgr.IsCompletedCriteria(criEntry, achEntry))
{
ShowAchievementCriteriaListHelper(criEntry, achEntry, loc, target);
return true;
}
uint32 progress = mgr.GetCriteriaProgressCounter(criEntry);
uint32 val;
if (!ExtractOptUInt32(&args, val, maxValue ? maxValue : 1))
return false;
uint32 new_val;
if (maxValue)
new_val = progress < maxValue && maxValue - progress > val ? progress + val : maxValue;
else
{
uint32 max_int = std::numeric_limits<uint32>::max();
new_val = progress < max_int && max_int - progress > val ? progress + val : max_int;
}
mgr.SetCriteriaProgress(criEntry, achEntry, new_val); // value will move to allowed range into function
ShowAchievementCriteriaListHelper(criEntry, achEntry, loc, target);
return true;
}
bool ChatHandler::HandleAchievementCriteriaRemoveCommand(char* args)
{
Player* target;
uint32 criId;
if (!ExtractUint32KeyFromLink(&args, "Hachievement_criteria", criId))
{
// maybe player first
char* nameStr = ExtractArg(&args);
if (!ExtractPlayerTarget(&nameStr, &target))
return false;
if (!ExtractUint32KeyFromLink(&args, "Hachievement_criteria", criId))
return false;
}
else
target = getSelectedPlayer();
AchievementCriteriaEntry const *criEntry = sAchievementCriteriaStore.LookupEntry(criId);
if (!criEntry)
{
PSendSysMessage(LANG_ACHIEVEMENT_CRITERIA_NOT_EXIST, criId);
SetSentErrorMessage(true);
return false;
}
AchievementEntry const *achEntry = sAchievementStore.LookupEntry(criEntry->referredAchievement);
if (!achEntry)
return false;
LocaleConstant loc = GetSessionDbcLocale();
uint32 maxValue = AchievementMgr::GetCriteriaProgressMaxCounter(criEntry);
AchievementMgr& mgr = target->GetAchievementMgr();
uint32 progress = mgr.GetCriteriaProgressCounter(criEntry);
// nothing do if not started
if (progress == 0)
{
ShowAchievementCriteriaListHelper(criEntry, achEntry, loc, target);
return true;
}
uint32 change;
if (!ExtractOptUInt32(&args, change, maxValue ? maxValue : 1))
return false;
uint32 newval = change < progress ? progress - change : 0;
mgr.SetCriteriaProgress(criEntry, achEntry, newval); // value will move to allowed range into function
ShowAchievementCriteriaListHelper(criEntry, achEntry, loc, target);
return true;
}
bool ChatHandler::HandleMaxSkillCommand(char* /*args*/)
{
Player* SelectedPlayer = getSelectedPlayer();
@ -4176,22 +4439,22 @@ bool ChatHandler::HandleChangeWeatherCommand(char* args)
return false;
}
uint32 type;
if (!ExtractUInt32(&args, type))
return false;
//0 to 3, 0: fine, 1: rain, 2: snow, 3: sand
if (type > 3)
return false;
float grade;
if (!ExtractFloat(&args, grade))
return false;
//0 to 1, sending -1 is instand good weather
if (grade < 0.0f || grade > 1.0f)
return false;
uint32 type;
if (!ExtractUInt32(&args, type))
return false;
//0 to 3, 0: fine, 1: rain, 2: snow, 3: sand
if (type > 3)
return false;
float grade;
if (!ExtractFloat(&args, grade))
return false;
//0 to 1, sending -1 is instand good weather
if (grade < 0.0f || grade > 1.0f)
return false;
Player *player = m_session->GetPlayer();
uint32 zoneid = player->GetZoneId();