diff --git a/Source/Framework/Constants/AccountConst.cs b/Source/Framework/Constants/AccountConst.cs index 43cdc65e0..c1043f8a8 100644 --- a/Source/Framework/Constants/AccountConst.cs +++ b/Source/Framework/Constants/AccountConst.cs @@ -748,6 +748,7 @@ namespace Framework.Constants CommandGoOffset = 852, CommandReloadConversationTemplate = 853, CommandDebugConversation = 854, + ModifyPower = 867, // Custom Permissions 1000+ Max diff --git a/Source/Framework/Constants/Language.cs b/Source/Framework/Constants/Language.cs index bebb28aba..eea8e397c 100644 --- a/Source/Framework/Constants/Language.cs +++ b/Source/Framework/Constants/Language.cs @@ -1266,7 +1266,10 @@ namespace Framework.Constants CreatureNotAiEnabled = 11015, SelectPlayerOrPet = 11016, ShutdownDelayed = 11017, - ShutdownCancelled = 11018 + ShutdownCancelled = 11018, + YouChangePower = 11019, + YourPowerChanged = 11020, + InvalidPowerName = 11021 } public enum BroadcastTextIds diff --git a/Source/Game/Chat/Commands/ModifyCommands.cs b/Source/Game/Chat/Commands/ModifyCommands.cs index ea9f2ce9c..5470ef287 100644 --- a/Source/Game/Chat/Commands/ModifyCommands.cs +++ b/Source/Game/Chat/Commands/ModifyCommands.cs @@ -516,6 +516,53 @@ namespace Game.Chat return true; } + [Command("power", RBACPermissions.ModifyPower)] + static bool HandleModifyPowerCommand(StringArguments args, CommandHandler handler) + { + if (args.Empty()) + return false; + + Player target = handler.getSelectedPlayerOrSelf(); + if (!target) + { + handler.SendSysMessage(CypherStrings.NoCharSelected); + return false; + } + + if (handler.HasLowerSecurity(target, ObjectGuid.Empty)) + return false; + + string powerTypeToken = args.NextString(); + if (powerTypeToken.IsEmpty()) + return false; + + PowerTypeRecord powerType = Global.DB2Mgr.GetPowerTypeByName(powerTypeToken); + if (powerType == null) + { + handler.SendSysMessage(CypherStrings.InvalidPowerName); + return false; + } + + if (target.GetPowerIndex(powerType.PowerTypeEnum) == (int)PowerType.Max) + { + handler.SendSysMessage(CypherStrings.InvalidPowerName); + return false; + } + + int powerAmount = args.NextInt32(); + if (powerAmount < 1) + { + handler.SendSysMessage(CypherStrings.BadValue); + return false; + } + + NotifyModification(handler, target, CypherStrings.YouChangePower, CypherStrings.YourPowerChanged, powerType.PowerTypeToken, powerAmount, powerAmount); + powerAmount *= powerType.UIModifier; + target.SetMaxPower(powerType.PowerTypeEnum, powerAmount); + target.SetPower(powerType.PowerTypeEnum, powerAmount); + return true; + } + [Command("standstate", RBACPermissions.CommandModifyStandstate)] static bool HandleModifyStandStateCommand(StringArguments args, CommandHandler handler) { diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index 617d828f2..b475cbf18 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -1106,6 +1106,22 @@ namespace Game.DataStorage return _powerTypes[power]; } + public PowerTypeRecord GetPowerTypeByName(string name) + { + foreach (PowerTypeRecord powerType in CliDB.PowerTypeStorage.Values) + { + string powerName = powerType.PowerTypeToken; + if (powerName.ToLower() == name) + return powerType; + + powerName = powerName.Replace("_", ""); + if (powerName == name) + return powerType; + } + + return null; + } + public List GetRewardPackItemsByRewardID(uint rewardPackID) { return _rewardPackItems.LookupByKey(rewardPackID);