mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 13:37:00 +00:00
[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:
parent
5c2fc55fe4
commit
4c838a1c31
14 changed files with 701 additions and 184 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue