mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 01:46:15 +00:00
Removed middleman classes and fields that can be handled much easier
This commit is contained in:
1 parent
f9a33ce109
commit
b0be07192e
2 files changed
+39
-326
No files matched your search
@@ -1,9 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BepInEx.Configuration;
|
||||
using MiraAPI.Networking;
|
||||
using MiraAPI.PluginLoading;
|
||||
using UnityEngine;
|
||||
|
||||
namespace MiraAPI.GameOptions;
|
||||
|
||||
@@ -23,15 +21,9 @@ public interface IModdedOptionList
|
||||
IReadOnlyList<uint> Ids { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the titles of the options.
|
||||
/// The end title will equal this value with its index appended (e.g., Title1).
|
||||
/// Gets the titles of the options.
|
||||
/// </summary>
|
||||
string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the first option's title has a 0, else starts with 1.
|
||||
/// </summary>
|
||||
bool ZeroIndexTitle { get; set; }
|
||||
IReadOnlyList<string> Titles { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the StringName for the options, used for localization.
|
||||
@@ -64,42 +56,9 @@ public interface IModdedOptionList
|
||||
bool IncludeInPreset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the array of ConfigDefinition for the options, used for BepInEx configuration.
|
||||
/// Gets the set of ConfigDefinition for the options, used for BepInEx configuration.
|
||||
/// </summary>
|
||||
ConfigDefinition?[] ConfigDefinitions { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Creates the option behaviour for the modded option at index <paramref name="idx"/>.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <param name="toggleOpt">The ToggleOption template.</param>
|
||||
/// <param name="numberOpt">The NumberOption template.</param>
|
||||
/// <param name="stringOpt">The StringOption template.</param>
|
||||
/// <param name="playerOpt">The PlayerOption template.</param>
|
||||
/// <param name="container">>The Transform container for the option.</param>
|
||||
/// <returns>The created OptionBehaviour object.</returns>
|
||||
OptionBehaviour CreateOption(int idx, ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, PlayerOption playerOpt, Transform container);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the value at index <paramref name="idx"/> as a float.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <returns>The value of the option as a float.</returns>
|
||||
float GetFloatData(int idx);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the NetData for the option at index <paramref name="idx"/>, used for network synchronization.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <returns>Returns the NetData object for the option.</returns>
|
||||
NetData GetNetData(int idx);
|
||||
|
||||
/// <summary>
|
||||
/// Handles incoming network data for the option at index <paramref name="idx"/>.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <param name="data">The byte array representing the network data.</param>
|
||||
void HandleNetData(int idx, byte[] data);
|
||||
IReadOnlyList<ConfigDefinition?> ConfigDefinitions { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Saves the options to a preset configuration file.
|
||||
|
||||
@@ -1,43 +1,33 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using BepInEx.Configuration;
|
||||
using MiraAPI.Networking;
|
||||
using MiraAPI.PluginLoading;
|
||||
using Reactor.Localization.Utilities;
|
||||
using Reactor.Networking.Rpc;
|
||||
using Reactor.Utilities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace MiraAPI.GameOptions.OptionTypes;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a modded option list.
|
||||
/// </summary>
|
||||
public abstract class ModdedOptionList : IModdedOptionList
|
||||
/// <typeparam name="T">The type of options.</typeparam>
|
||||
public class ModdedOptionList<T> : IModdedOptionList where T : IModdedOption
|
||||
{
|
||||
protected IMiraPlugin? _parentMod;
|
||||
private IMiraPlugin? _parentMod;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public int Count { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<uint> Ids { get; }
|
||||
public IReadOnlyList<uint> Ids => FromOptions(o => o.Id);
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <inheritdoc/>
|
||||
public bool ZeroIndexTitle { get; set; }
|
||||
public IReadOnlyList<string> Titles => FromOptions(o => o.Title);
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<StringNames> StringNames { get; }
|
||||
|
||||
protected readonly BaseGameSetting[] _data;
|
||||
public IReadOnlyList<StringNames> StringNames => FromOptions(o => o.StringName);
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<BaseGameSetting> Data => _data;
|
||||
public IReadOnlyList<BaseGameSetting> Data => FromOptions(o => o.Data);
|
||||
|
||||
/// <inheritdoc />
|
||||
public IMiraPlugin? ParentMod
|
||||
@@ -48,233 +38,10 @@ public abstract class ModdedOptionList : IModdedOptionList
|
||||
if (_parentMod != null || value == null) return;
|
||||
_parentMod = value;
|
||||
|
||||
OnParentModChange();
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void OnParentModChange();
|
||||
|
||||
/// <inheritdoc />
|
||||
public Func<int, bool> Visible { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IncludeInPreset { get; set; }
|
||||
|
||||
protected readonly OptionBehaviour?[] _optionBehaviours;
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<OptionBehaviour?> OptionBehaviours => _optionBehaviours;
|
||||
|
||||
/// <inheritdoc />
|
||||
public ConfigDefinition?[] ConfigDefinitions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ModdedOptionList"/> class.
|
||||
/// </summary>
|
||||
/// <param name="title">The options' title.</param>
|
||||
/// <param name="count">The option list's length.</param>
|
||||
/// <param name="includeInPreset">Whether to include the options in the preset.</param>
|
||||
/// <param name="zeroIndexTitle">Whether the first option's title index is 0, else 1.</param>
|
||||
protected ModdedOptionList(string title, int count, bool includeInPreset = true, bool zeroIndexTitle = false)
|
||||
{
|
||||
Count = count;
|
||||
ZeroIndexTitle = zeroIndexTitle;
|
||||
|
||||
var range = Enumerable.Range(0, Count);
|
||||
var titleOffset = ZeroIndexTitle ? 0 : 1;
|
||||
|
||||
Ids = range.Select(_ => ModdedOptionsManager.NextId).ToList();
|
||||
Title = title;
|
||||
StringNames = range.Select(i => CustomStringName.CreateAndRegister($"{Title}{i + titleOffset}")).ToList();
|
||||
Visible = _ => true;
|
||||
IncludeInPreset = includeInPreset;
|
||||
|
||||
_optionBehaviours = range.Select<int, OptionBehaviour?>(_ => null).ToArray();
|
||||
ConfigDefinitions = range.Select<int, ConfigDefinition?>(_ => null).ToArray();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract void SaveToPreset(ConfigFile presetConfig, bool saveDefault = false);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract void Bind(ConfigFile config);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract void LoadFromPreset(ConfigFile presetConfig);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract float GetFloatData(int idx);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract NetData GetNetData(int idx);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract void HandleNetData(int idx, byte[] data);
|
||||
|
||||
/// <inheritdoc/>
|
||||
public abstract OptionBehaviour CreateOption(
|
||||
int idx,
|
||||
ToggleOption toggleOpt,
|
||||
NumberOption numberOpt,
|
||||
StringOption stringOpt,
|
||||
PlayerOption playerOpt,
|
||||
Transform container);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a modded option list.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The value type.</typeparam>
|
||||
public abstract class ModdedOptionList<T> : ModdedOptionList
|
||||
{
|
||||
protected override void OnParentModChange()
|
||||
{
|
||||
var configFile = _parentMod!.GetConfigFile();
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
var entry = configFile.Bind(ConfigDefinitions[i], DefaultValue(i));
|
||||
Values[i] = entry.Value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the list of values of the options.
|
||||
/// </summary>
|
||||
public T[] Values { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the list of default value of the options.
|
||||
/// </summary>
|
||||
public Func<int, T> DefaultValue { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the event that is invoked when the value of an option changes.
|
||||
/// </summary>
|
||||
public Action<int, T>? ChangedEvent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ModdedOptionList{T}"/> class.
|
||||
/// </summary>
|
||||
/// <param name="title">The options' title.</param>
|
||||
/// <param name="count">The option list's length.</param>
|
||||
/// <param name="defaultValues">The default values.</param>
|
||||
/// <param name="includeInPreset">Whether to include the options in the preset.</param>
|
||||
/// <param name="zeroIndexTitle">Whether the first option's title index is 0, else 1.</param>
|
||||
protected ModdedOptionList(string title, int count, Func<int, T> defaultValues, bool includeInPreset = true, bool zeroIndexTitle = false)
|
||||
: base(title, count, includeInPreset, zeroIndexTitle)
|
||||
{
|
||||
DefaultValue = defaultValues;
|
||||
Values = Enumerable.Range(0, Count).Select(defaultValues).ToArray();
|
||||
}
|
||||
|
||||
internal void ValueChanged(int idx, OptionBehaviour optionBehaviour)
|
||||
{
|
||||
SetValue(idx, GetValueFromOptionBehaviour(idx, optionBehaviour));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the value of the option.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <param name="newValue">The new value.</param>
|
||||
/// <param name="sendRpc">Whether to send the value to other players.</param>
|
||||
public void SetValue(int idx, T newValue, bool sendRpc = true)
|
||||
{
|
||||
var oldVal = Values[idx];
|
||||
Values[idx] = newValue;
|
||||
|
||||
if (Values[idx]?.Equals(oldVal) == false)
|
||||
{
|
||||
ChangedEvent?.Invoke(idx, Values[idx]);
|
||||
}
|
||||
|
||||
if (sendRpc && AmongUsClient.Instance.AmHost)
|
||||
{
|
||||
if (ParentMod?.GetConfigFile().TryGetEntry<T>(ConfigDefinitions[idx], out var entry) == true)
|
||||
foreach (var option in Options)
|
||||
{
|
||||
entry.Value = Values[idx];
|
||||
option.ParentMod = _parentMod!;
|
||||
}
|
||||
|
||||
Rpc<SyncOptionsRpc>.Instance.Send(PlayerControl.LocalPlayer, [GetNetData(idx)], true); // This might not work
|
||||
}
|
||||
|
||||
OnValueChanged(idx, newValue);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void SaveToPreset(ConfigFile presetConfig, bool saveDefault = false)
|
||||
{
|
||||
if (ConfigDefinitions.Any(d => d is null))
|
||||
{
|
||||
Error($"Attempted to save {Title} to preset, but some ConfigDefinitions are null.");
|
||||
return;
|
||||
}
|
||||
Bind(presetConfig);
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
presetConfig[ConfigDefinitions[i]].BoxedValue = saveDefault ? DefaultValue(i) : Values[i];
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Bind(ConfigFile config)
|
||||
{
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
config.Bind(ConfigDefinitions[i], DefaultValue(i));
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void LoadFromPreset(ConfigFile presetConfig)
|
||||
{
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
if (presetConfig.TryGetEntry(ConfigDefinitions[i], out ConfigEntry<T> entry))
|
||||
{
|
||||
SetValue(i, entry.Value, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Error($"Attempted to load {Title} from preset, but ConfigDefinition {i} is not found in preset.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles the value changed event.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <param name="newValue">The new value.</param>
|
||||
protected abstract void OnValueChanged(int idx, T newValue);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the value from the option behaviour.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <param name="optionBehaviour">The OptionBehaviour.</param>
|
||||
/// <returns>The value.</returns>
|
||||
public abstract T GetValueFromOptionBehaviour(int idx, OptionBehaviour optionBehaviour);
|
||||
|
||||
/// <summary>
|
||||
/// Indexes the option for its value of type <typeparamref name="T"/>.
|
||||
/// </summary>
|
||||
/// <param name="idx">The option's index.</param>
|
||||
/// <returns>value of type <typeparamref name="T"/>.</returns>
|
||||
public T this[int idx] => Values[idx];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents a modded option list.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The option's type.</typeparam>
|
||||
public class ModdedOptionsList<T> : ModdedOptionList where T : IModdedOption
|
||||
{
|
||||
protected override void OnParentModChange()
|
||||
{
|
||||
foreach (var option in Options)
|
||||
{
|
||||
option.ParentMod = _parentMod!;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,28 +50,39 @@ public class ModdedOptionsList<T> : ModdedOptionList where T : IModdedOption
|
||||
/// </summary>
|
||||
public T[] Options { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default option from its index.
|
||||
/// </summary>
|
||||
public Func<int, T> DefaultOption { get; }
|
||||
/// <inheritdoc />
|
||||
public Func<int, bool> Visible { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IncludeInPreset { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<OptionBehaviour?> OptionBehaviours => FromOptions(o => o.OptionBehaviour);
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyList<ConfigDefinition?> ConfigDefinitions => FromOptions(o => o.ConfigDefinition);
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ModdedOptionsList{T}"/> class.
|
||||
/// Initializes a new instance of the <see cref="ModdedOptionList{T}"/> class.
|
||||
/// </summary>
|
||||
/// <param name="title">The options' title.</param>
|
||||
/// <param name="count">The option list's length.</param>
|
||||
/// <param name="defaultOption">The default option.</param>
|
||||
/// <param name="optionFactory">The option factory to instantiate the options from.</param>
|
||||
/// <param name="includeInPreset">Whether to include the options in the preset.</param>
|
||||
/// <param name="zeroIndexTitle">Whether the first option's title index is 0, else 1.</param>
|
||||
protected ModdedOptionsList(string title, int count, Func<int, T> defaultOption, bool includeInPreset = true, bool zeroIndexTitle = false)
|
||||
: base(title, count, includeInPreset, zeroIndexTitle)
|
||||
public ModdedOptionList(int count, Func<int, T> optionFactory, bool includeInPreset = true)
|
||||
{
|
||||
DefaultOption = defaultOption;
|
||||
Options = Enumerable.Range(0, Count).Select(defaultOption).ToArray();
|
||||
Count = count;
|
||||
Visible = _ => true;
|
||||
IncludeInPreset = includeInPreset;
|
||||
Options = Enumerable.Range(0, Count).Select(optionFactory).ToArray();
|
||||
}
|
||||
|
||||
internal IReadOnlyList<TVal> FromOptions<TVal>(Func<T, TVal> getter)
|
||||
{
|
||||
return Options.Select(getter).ToArray();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void SaveToPreset(ConfigFile presetConfig, bool saveDefault = false)
|
||||
public void SaveToPreset(ConfigFile presetConfig, bool saveDefault = false)
|
||||
{
|
||||
foreach (var option in Options)
|
||||
{
|
||||
@@ -313,7 +91,7 @@ public class ModdedOptionsList<T> : ModdedOptionList where T : IModdedOption
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Bind(ConfigFile config)
|
||||
public void Bind(ConfigFile config)
|
||||
{
|
||||
foreach (var option in Options)
|
||||
{
|
||||
@@ -322,7 +100,7 @@ public class ModdedOptionsList<T> : ModdedOptionList where T : IModdedOption
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void LoadFromPreset(ConfigFile presetConfig)
|
||||
public void LoadFromPreset(ConfigFile presetConfig)
|
||||
{
|
||||
foreach (var option in Options)
|
||||
{
|
||||
@@ -330,30 +108,6 @@ public class ModdedOptionsList<T> : ModdedOptionList where T : IModdedOption
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override float GetFloatData(int idx)
|
||||
{
|
||||
return Options[idx].GetFloatData();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override NetData GetNetData(int idx)
|
||||
{
|
||||
return Options[idx].GetNetData();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void HandleNetData(int idx, byte[] data)
|
||||
{
|
||||
Options[idx].HandleNetData(data);
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override OptionBehaviour CreateOption(int idx, ToggleOption toggleOpt, NumberOption numberOpt, StringOption stringOpt, PlayerOption playerOpt, Transform container)
|
||||
{
|
||||
return _optionBehaviours[idx] = Options[idx].CreateOption(toggleOpt, numberOpt, stringOpt, playerOpt, container);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indexes the option of type <typeparamref name="T"/>.
|
||||
/// </summary>
|
||||
|
||||
Reference in new issue
Block a user