mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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:
File diff suppressed because one or more lines are too long
7
sql/updates/auth/master/2017_11_11_01_auth.sql
Normal file
7
sql/updates/auth/master/2017_11_11_01_auth.sql
Normal 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);
|
||||
9
sql/updates/world/master/2017_11_11_10_world.sql
Normal file
9
sql/updates/world/master/2017_11_11_10_world.sql
Normal 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.');
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user