diff --git a/HKMP/Game/Command/Server/SettingsCommand.cs b/HKMP/Game/Command/Server/SettingsCommand.cs index a2194f8..55fcf8a 100644 --- a/HKMP/Game/Command/Server/SettingsCommand.cs +++ b/HKMP/Game/Command/Server/SettingsCommand.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Reflection; using Hkmp.Api.Command.Server; using Hkmp.Game.Server; @@ -41,14 +42,25 @@ public virtual void Execute(ICommandSender commandSender, string[] args) { return; } - var settingName = args[1]; + var settingName = args[1].ToLower().Replace("_", "").Replace("-", ""); var propertyInfos = typeof(ServerSettings).GetProperties(); PropertyInfo settingProperty = null; foreach (var prop in propertyInfos) { - if (prop.Name.Equals(settingName)) { + // Check if the property name in lower case equals the argument + if (prop.Name.ToLower().Equals(settingName)) { settingProperty = prop; + break; + } + + // Alternatively check for the alias attribute and all aliases + var aliasAttribute = prop.GetCustomAttribute(); + if (aliasAttribute != null) { + if (aliasAttribute.Aliases.Contains(settingName)) { + settingProperty = prop; + break; + } } } @@ -56,19 +68,21 @@ public virtual void Execute(ICommandSender commandSender, string[] args) { commandSender.SendMessage($"Could not find setting with name: {settingName}"); return; } + + var propName = settingProperty.Name; if (args.Length < 3) { // The user only supplied the name of the setting, so we print its value var currentValue = settingProperty.GetValue(ServerSettings, null); - commandSender.SendMessage($"Setting '{settingName}' currently has value: {currentValue}"); + commandSender.SendMessage($"Setting '{propName}' currently has value: {currentValue}"); return; } var newValueString = args[2]; if (!settingProperty.CanWrite) { - commandSender.SendMessage($"Could not change value of setting with name: {settingName} (non-writable)"); + commandSender.SendMessage($"Could not change value of setting with name: {propName} (non-writable)"); return; } @@ -90,18 +104,18 @@ public virtual void Execute(ICommandSender commandSender, string[] args) { newValueObject = newValueByte; } else { commandSender.SendMessage( - $"Could not change value of setting with name: {settingName} (unhandled type)"); + $"Could not change value of setting with name: {propName} (unhandled type)"); return; } if (settingProperty.GetValue(ServerSettings).Equals(newValueObject)) { - commandSender.SendMessage($"Setting '{settingName}' already has value: {newValueObject}"); + commandSender.SendMessage($"Setting '{propName}' already has value: {newValueObject}"); return; } settingProperty.SetValue(ServerSettings, newValueObject, null); - commandSender.SendMessage($"Changed setting '{settingName}' to: {newValueObject}"); + commandSender.SendMessage($"Changed setting '{propName}' to: {newValueObject}"); _serverManager.OnUpdateServerSettings(); } diff --git a/HKMP/Game/Settings/ServerSettings.cs b/HKMP/Game/Settings/ServerSettings.cs index 6fbe134..2e6b5c0 100644 --- a/HKMP/Game/Settings/ServerSettings.cs +++ b/HKMP/Game/Settings/ServerSettings.cs @@ -2,75 +2,98 @@ using Hkmp.Api.Server; // ReSharper disable UnusedAutoPropertyAccessor.Global // ReSharper disable AutoPropertyCanBeMadeGetOnly.Global +// ReSharper disable StringLiteralTypo namespace Hkmp.Game.Settings; /// public class ServerSettings : IServerSettings, IEquatable { /// + [SettingAlias("pvp")] public bool IsPvpEnabled { get; set; } /// + [SettingAlias("bodydamage")] public bool IsBodyDamageEnabled { get; set; } = true; /// + [SettingAlias("globalmapicons")] public bool AlwaysShowMapIcons { get; set; } /// + [SettingAlias("compassicon", "compassicons", "waywardicon", "waywardicons")] public bool OnlyBroadcastMapIconWithWaywardCompass { get; set; } = true; /// + [SettingAlias("names")] public bool DisplayNames { get; set; } = true; /// + [SettingAlias("teams")] public bool TeamsEnabled { get; set; } /// + [SettingAlias("skins")] public bool AllowSkins { get; set; } = true; /// + [SettingAlias("parries")] public bool AllowParries { get; set; } = true; /// + [SettingAlias("naildmg")] public byte NailDamage { get; set; } = 1; /// + [SettingAlias("elegydmg")] public byte GrubberflyElegyDamage { get; set; } = 1; /// + [SettingAlias("vsdmg", "fireballdamage", "fireballdmg")] public byte VengefulSpiritDamage { get; set; } = 1; /// + [SettingAlias("shadesouldmg")] public byte ShadeSoulDamage { get; set; } = 2; /// + [SettingAlias("desolatedivedmg", "ddivedmg")] public byte DesolateDiveDamage { get; set; } = 1; /// + [SettingAlias("descendingdarkdmg", "ddarkdmg")] public byte DescendingDarkDamage { get; set; } = 2; /// + [SettingAlias("howlingwraithsdamage", "howlingwraithsdmg", "wraithsdmg")] public byte HowlingWraithDamage { get; set; } = 1; /// + [SettingAlias("abyssshriekdmg", "shriekdmg")] public byte AbyssShriekDamage { get; set; } = 2; /// + [SettingAlias("greatslashdmg")] public byte GreatSlashDamage { get; set; } = 2; /// + [SettingAlias("dashslashdmg")] public byte DashSlashDamage { get; set; } = 2; /// + [SettingAlias("cycloneslashdmg", "cyclonedmg")] public byte CycloneSlashDamage { get; set; } = 1; /// + [SettingAlias("sporeshroomdmg")] public byte SporeShroomDamage { get; set; } = 1; /// + [SettingAlias("sporedungshroomdmg", "dungshroomdmg")] public byte SporeDungShroomDamage { get; set; } = 1; /// + [SettingAlias("thornsofagonydamage", "thornsofagonydmg", "thornsdamage", "thornsdmg")] public byte ThornOfAgonyDamage { get; set; } = 1; /// diff --git a/HKMP/Game/Settings/SettingAliasAttribute.cs b/HKMP/Game/Settings/SettingAliasAttribute.cs new file mode 100644 index 0000000..a72d0b8 --- /dev/null +++ b/HKMP/Game/Settings/SettingAliasAttribute.cs @@ -0,0 +1,22 @@ +using System; + +namespace Hkmp.Game.Settings; + +/// +/// Attribute to define aliases to settings properties/fields. +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] +public class SettingAliasAttribute : Attribute { + /// + /// The string array containing the aliases. + /// + public string[] Aliases { get; private set; } + + /// + /// Constructs the attribute with the given alias strings. + /// + /// One or more strings containing aliases. + public SettingAliasAttribute(params string[] aliases) { + Aliases = aliases; + } +} \ No newline at end of file