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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
--
DELETE FROM `rbac_permissions` WHERE `id`=867;
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
(867, 'Command: modify power');
DELETE FROM `rbac_linked_permissions` WHERE `id`=198 AND `linkedId`=867;
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES (198, 867);

View File

@@ -0,0 +1,9 @@
DELETE FROM `trinity_string` WHERE `entry` IN (11019,11020,11021);
INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_loc2`,`content_loc3`,`content_loc4`,`content_loc5`,`content_loc6`,`content_loc7`,`content_loc8`) VALUES
(11019, 'You changed %s of %s to %d/%d.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(11020, '%s changed your %s to %d/%d.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(11021, 'Invalid power name.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
DELETE FROM `command` WHERE `name`='modify power' and `permission`= 867;
INSERT INTO `command` (`name`, `permission`, `help`) VALUES
('modify power', 867, 'Syntax: .modify power #powerType #amount \r\n\r\nModify the power of the selected player. If no player is selected, modify your power.');

View File

@@ -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
};

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

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()