From bf0ae32d189d4579920e027f9d2dbfacc5552df3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 11 Nov 2017 22:41:05 +0100 Subject: 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 --- src/server/scripts/Commands/cs_modify.cpp | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) (limited to 'src/server/scripts/Commands') diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 69eba057f6e..be836943087 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -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 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() -- cgit v1.2.3