diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-11-11 22:41:05 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-11-11 22:41:05 +0100 |
commit | bf0ae32d189d4579920e027f9d2dbfacc5552df3 (patch) | |
tree | e08f1ed944c1d96daf3b6106144dc1965d32fd56 /src | |
parent | d947ba42927d75ccd7293bba65feee2ac6bbf46c (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 19 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 5 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_modify.cpp | 76 |
5 files changed, 100 insertions, 2 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 304cea95098..adda306ba40 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -771,6 +771,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_GROUP_MAINASSIST = 864, // reserved RBAC_PERM_COMMAND_NPC_SHOWLOOT = 865, // reserved RBAC_PERM_COMMAND_LIST_SPAWNPOINTS = 866, // reserved + RBAC_PERM_COMMAND_MODIFY_POWER = 867, // custom permissions 1000+ RBAC_PERM_MAX }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index ebde5fbb1b5..a695af58b6b 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -1522,7 +1522,7 @@ std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTre { if (bonusTreeNode->BonusTreeModID != itemBonusTreeMod) continue; - + if (bonusTreeNode->BonusListID) { bonusListIDs.insert(bonusTreeNode->BonusListID); @@ -1876,6 +1876,23 @@ PowerTypeEntry const* DB2Manager::GetPowerTypeEntry(Powers power) const return _powerTypes[power]; } +PowerTypeEntry const* DB2Manager::GetPowerTypeByName(std::string const& name) const +{ + for (PowerTypeEntry const* powerType : sPowerTypeStore) + { + std::string powerName = powerType->PowerTypeToken; + std::transform(powerName.begin(), powerName.end(), powerName.begin(), [](char c) { return char(::tolower(c)); }); + if (powerName == name) + return powerType; + + powerName.erase(std::remove(powerName.begin(), powerName.end(), '_'), powerName.end()); + if (powerName == name) + return powerType; + } + + return nullptr; +} + std::vector<RewardPackXItemEntry const*> const* DB2Manager::GetRewardPackItemsByRewardID(uint32 rewardPackID) const { auto itr = _rewardPackItems.find(rewardPackID); diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index c9f1bcd1eba..e1d31f7141b 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -300,6 +300,7 @@ public: ResponseCodes ValidateName(std::wstring const& name, LocaleConstant locale) const; std::set<uint32> GetPhasesForGroup(uint32 group) const; PowerTypeEntry const* GetPowerTypeEntry(Powers power) const; + PowerTypeEntry const* GetPowerTypeByName(std::string const& name) const; uint8 GetMaxPrestige() const; static PvpDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); static PvpDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index ca7190756ac..63817ab023e 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1246,6 +1246,9 @@ enum TrinityStrings LANG_CREATURE_NOT_AI_ENABLED = 11015, LANG_SELECT_PLAYER_OR_PET = 11016, LANG_SHUTDOWN_DELAYED = 11017, - LANG_SHUTDOWN_CANCELLED = 11018 + LANG_SHUTDOWN_CANCELLED = 11018, + LANG_YOU_CHANGE_POWER = 11019, + LANG_YOUR_POWER_CHANGED = 11020, + LANG_INVALID_POWER_NAME = 11021 }; #endif 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<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() |