aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-11-11 22:41:05 +0100
committerShauren <shauren.trinity@gmail.com>2017-11-11 22:41:05 +0100
commitbf0ae32d189d4579920e027f9d2dbfacc5552df3 (patch)
treee08f1ed944c1d96daf3b6106144dc1965d32fd56 /src
parentd947ba42927d75ccd7293bba65feee2ac6bbf46c (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.h1
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp19
-rw-r--r--src/server/game/DataStores/DB2Stores.h1
-rw-r--r--src/server/game/Miscellaneous/Language.h5
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp76
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()