Core/Commands: Added .modify power command allowing to change any power as long as player class can use it

* Power names are taken from PowerType.db2 (lowercase, using _ is optional)

Closes #20833
This commit is contained in:
Shauren
2017-11-11 22:41:05 +01:00
parent d947ba4292
commit bf0ae32d18
8 changed files with 119 additions and 5 deletions

View File

@@ -74,6 +74,7 @@ public:
{ "standstate", rbac::RBAC_PERM_COMMAND_MODIFY_STANDSTATE, false, &HandleModifyStandStateCommand, "" },
{ "talentpoints", rbac::RBAC_PERM_COMMAND_MODIFY_TALENTPOINTS, false, &HandleModifyTalentCommand, "" },
{ "xp", rbac::RBAC_PERM_COMMAND_MODIFY_XP, false, &HandleModifyXPCommand, "" },
{ "power", rbac::RBAC_PERM_COMMAND_MODIFY_POWER, false, &HandleModifyPowerCommand, "" },
};
static std::vector<ChatCommand> commandTable =
{
@@ -997,6 +998,81 @@ public:
target->GiveXP(xp, nullptr);
return true;
}
// Edit Player Power
static bool HandleModifyPowerCommand(ChatHandler* handler, const char* args)
{
if (!*args)
return false;
Player* target = handler->getSelectedPlayerOrSelf();
if (!target)
{
handler->SendSysMessage(LANG_NO_CHAR_SELECTED);
handler->SetSentErrorMessage(true);
return false;
}
if (handler->HasLowerSecurity(target, ObjectGuid::Empty))
return false;
char* powerTypeToken = strtok((char*)args, " ");
if (!powerTypeToken)
return false;
PowerTypeEntry const* powerType = sDB2Manager.GetPowerTypeByName(powerTypeToken);
if (!powerType)
{
handler->SendSysMessage(LANG_INVALID_POWER_NAME);
handler->SetSentErrorMessage(true);
return false;
}
if (target->GetPowerIndex(powerType->PowerTypeEnum) == MAX_POWERS)
{
handler->SendSysMessage(LANG_INVALID_POWER_NAME);
handler->SetSentErrorMessage(true);
return false;
}
char* amount = strtok(nullptr, " ");
if (!amount)
return false;
int32 powerAmount = atoi(amount);
if (powerAmount < 1)
{
handler->SendSysMessage(LANG_BAD_VALUE);
handler->SetSentErrorMessage(true);
return false;
}
std::string formattedPowerName = powerType->PowerTypeToken;
bool upperCase = true;
for (char& c : formattedPowerName)
{
if (upperCase)
{
c = char(::toupper(c));
upperCase = false;
}
else
c = char(::tolower(c));
if (c == '_')
{
c = ' ';
upperCase = true;
}
}
NotifyModification(handler, target, LANG_YOU_CHANGE_POWER, LANG_YOUR_POWER_CHANGED, formattedPowerName.c_str(), powerAmount, powerAmount);
powerAmount *= powerType->UIModifier;
target->SetMaxPower(Powers(powerType->PowerTypeEnum), powerAmount);
target->SetPower(Powers(powerType->PowerTypeEnum), powerAmount);
return true;
}
};
void AddSC_modify_commandscript()