/// <summary> /// Adds a <see cref="ModChoiceOption"/> to the <see cref="ModOptions"/> menu. /// </summary> /// <param name="id"></param> /// <param name="label"></param> /// <param name="memberInfoMetadata">The metadata of the corresponding member.</param> /// <param name="choiceAttribute">The defined or generated <see cref="ChoiceAttribute"/> of the member.</param> private void BuildModChoiceOption(string id, string label, MemberInfoMetadata <T> memberInfoMetadata, ChoiceAttribute choiceAttribute) { if (memberInfoMetadata.ValueType.IsEnum && (choiceAttribute.Options == null || !choiceAttribute.Options.Any())) { // Enum-based choice where the values are parsed from the enum type string[] options = Enum.GetNames(memberInfoMetadata.ValueType); string value = memberInfoMetadata.GetValue(ConfigFileMetadata.Config).ToString(); AddChoiceOption(id, label, options, value); } else if (memberInfoMetadata.ValueType.IsEnum) { // Enum-based choice where the values are defined as custom strings string[] options = choiceAttribute.Options; string name = memberInfoMetadata.GetValue(ConfigFileMetadata.Config).ToString(); int index = Math.Max(Array.IndexOf(Enum.GetNames(memberInfoMetadata.ValueType), name), 0); AddChoiceOption(id, label, options, index); } else if (memberInfoMetadata.ValueType == typeof(string)) { // string-based choice value string[] options = choiceAttribute.Options; string value = memberInfoMetadata.GetValue <string>(ConfigFileMetadata.Config); AddChoiceOption(id, label, options, value); } else if (memberInfoMetadata.ValueType == typeof(int)) { // index-based choice value string[] options = choiceAttribute.Options; int index = memberInfoMetadata.GetValue <int>(ConfigFileMetadata.Config); AddChoiceOption(id, label, options, index); } }
/// <summary> /// Adds a <see cref="ModSliderOption"/> to the <see cref="ModOptions"/> menu. /// </summary> /// <param name="id"></param> /// <param name="label"></param> /// <param name="memberInfoMetadata">The metadata of the corresponding member.</param> /// <param name="sliderAttribute">The defined or generated <see cref="SliderAttribute"/> of the member.</param> private void BuildModSliderOption(string id, string label, MemberInfoMetadata <T> memberInfoMetadata, SliderAttribute sliderAttribute) { float value = Convert.ToSingle(memberInfoMetadata.GetValue(ConfigFileMetadata.Config)); float step = sliderAttribute.Step; if (memberInfoMetadata.ValueType == typeof(int)) { step = Mathf.CeilToInt(step); } AddSliderOption(id, label, sliderAttribute.Min, sliderAttribute.Max, Convert.ToSingle(value), sliderAttribute.DefaultValue, sliderAttribute.Format, step); }
/// <summary> /// Invokes the relevant method(s) specified with the <see cref="OnChangeAttribute"/>(s) /// and passes parameters when a value is changed when loaded from disk. /// </summary> /// <param name="modOptionMetadata">The metadata for the mod option.</param> /// <param name="sender">The sender of the event.</param> private void InvokeOnChangeEvents(ModOptionAttributeMetadata <T> modOptionMetadata, object sender) { string id = modOptionMetadata.ModOptionAttribute.Id; MemberInfoMetadata <T> memberInfoMetadata = modOptionMetadata.MemberInfoMetadata; switch (modOptionMetadata.ModOptionAttribute) { case ChoiceAttribute choiceAttribute when memberInfoMetadata.ValueType.IsEnum && (choiceAttribute.Options == null || !choiceAttribute.Options.Any()): // Enum-based choice where the values are parsed from the enum type { string[] options = Enum.GetNames(memberInfoMetadata.ValueType); string value = memberInfoMetadata.GetValue(Config).ToString(); var eventArgs = new ChoiceChangedEventArgs(id, Array.IndexOf(options, value), value); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case ChoiceAttribute _ when memberInfoMetadata.ValueType.IsEnum: // Enum-based choice where the values are defined as custom strings { string value = memberInfoMetadata.GetValue(Config).ToString(); int index = Math.Max(Array.IndexOf(Enum.GetValues(memberInfoMetadata.ValueType), value), 0); var eventArgs = new ChoiceChangedEventArgs(id, index, value); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case ChoiceAttribute choiceAttribute when memberInfoMetadata.ValueType == typeof(string): // string-based choice value { string[] options = choiceAttribute.Options; string value = memberInfoMetadata.GetValue <string>(Config); var eventArgs = new ChoiceChangedEventArgs(id, Array.IndexOf(options, value), value); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case ChoiceAttribute choiceAttribute when memberInfoMetadata.ValueType == typeof(int): // index-based choice value { string[] options = choiceAttribute.Options; int index = memberInfoMetadata.GetValue <int>(Config); var eventArgs = new ChoiceChangedEventArgs(id, index, options[index]); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case KeybindAttribute _: { var eventArgs = new KeybindChangedEventArgs(id, memberInfoMetadata.GetValue <KeyCode>(Config)); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case SliderAttribute _: { var eventArgs = new SliderChangedEventArgs(id, Convert.ToSingle(memberInfoMetadata.GetValue(Config))); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; case ToggleAttribute _: { var eventArgs = new ToggleChangedEventArgs(id, memberInfoMetadata.GetValue <bool>(Config)); InvokeOnChangeEvents(modOptionMetadata, sender, eventArgs); } break; } }
/// <summary> /// Adds a <see cref="ModToggleOption"/> to the <see cref="ModOptions"/> menu. /// </summary> /// <param name="id"></param> /// <param name="label"></param> /// <param name="memberInfoMetadata">The metadata of the corresponding member.</param> private void BuildModToggleOption(string id, string label, MemberInfoMetadata <T> memberInfoMetadata) { bool value = memberInfoMetadata.GetValue <bool>(ConfigFileMetadata.Config); AddToggleOption(id, label, value); }
/// <summary> /// Adds a <see cref="ModKeybindOption"/> to the <see cref="ModOptions"/> menu. /// </summary> /// <param name="id"></param> /// <param name="label"></param> /// <param name="memberInfoMetadata">The metadata of the corresponding member.</param> private void BuildModKeybindOption(string id, string label, MemberInfoMetadata <T> memberInfoMetadata) { KeyCode value = memberInfoMetadata.GetValue <KeyCode>(ConfigFileMetadata.Config); AddKeybindOption(id, label, GameInput.Device.Keyboard, value); }