Initial Code
This commit is contained in:
18
ModRegistry/ModEntry.cs
Normal file
18
ModRegistry/ModEntry.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using VMM.ModRegistry.Settings;
|
||||
|
||||
namespace VMM.ModRegistry
|
||||
{
|
||||
public class ModEntry
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Version { get; set; }
|
||||
public string Author { get; set; }
|
||||
public ModSettings Settings { get; set; }
|
||||
|
||||
internal Assembly assembly { get; set; }
|
||||
}
|
||||
}
|
||||
70
ModRegistry/ModManager.cs
Normal file
70
ModRegistry/ModManager.cs
Normal file
@@ -0,0 +1,70 @@
|
||||
using MelonLoader;
|
||||
using System.Reflection;
|
||||
using VMM.ModRegistry.Settings;
|
||||
using VMM.UI;
|
||||
|
||||
namespace VMM.ModRegistry
|
||||
{
|
||||
public class ModManager
|
||||
{
|
||||
public static ModManager Instance { get; internal set; }
|
||||
|
||||
public Action onFinishedLoading;
|
||||
|
||||
internal List<ModEntry> LoadedMods = new List<ModEntry>();
|
||||
|
||||
public ModManager()
|
||||
{
|
||||
if (Instance == null)
|
||||
Instance = this;
|
||||
else
|
||||
Core.Logger.Warning("Duplicate ModManager Detected");
|
||||
}
|
||||
|
||||
internal void LoadMods()
|
||||
{
|
||||
Core.Logger.Msg("=== Installed Melon Mods ===");
|
||||
foreach (var mod in MelonMod.RegisteredMelons.OrderBy(m => m.Info.Name))
|
||||
{
|
||||
Core.Logger.Msg($"Name: {mod.Info.Name} | Version: {mod.Info.Version} | Author: {mod.Info.Author}");
|
||||
|
||||
var modEntry = new ModEntry
|
||||
{
|
||||
Name = mod.Info.Name,
|
||||
Version = mod.Info.Version,
|
||||
Author = mod.Info.Author,
|
||||
assembly = mod.GetType().Assembly,
|
||||
Settings = null
|
||||
};
|
||||
|
||||
LoadedMods.Add(modEntry);
|
||||
UIManager.Instance.AddModButton(modEntry);
|
||||
}
|
||||
Core.Logger.Msg("============================");
|
||||
onFinishedLoading?.Invoke();
|
||||
}
|
||||
|
||||
public ModEntry GetModEntryByName(string modName)
|
||||
{
|
||||
return LoadedMods.FirstOrDefault(m =>
|
||||
m.Name.Equals(modName, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public List<ModEntry> GetLoadedMods() => LoadedMods;
|
||||
|
||||
public void RegisterSettings(Assembly modAssembly, ModSettings settings)
|
||||
{
|
||||
var mod = LoadedMods.Find(m => m.assembly == modAssembly);
|
||||
if (mod != null)
|
||||
{
|
||||
mod.Settings = new ModSettings();
|
||||
mod.Settings = settings;
|
||||
Core.Logger.Msg($"Registered settings for mod: {mod.Name}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Core.Logger.Error("Mod not found for the provided assembly.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
ModRegistry/Settings/ISettingsElement.cs
Normal file
13
ModRegistry/Settings/ISettingsElement.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace VMM.ModRegistry.Settings
|
||||
{
|
||||
public interface ISettingsElement
|
||||
{
|
||||
string Name { get; set; }
|
||||
object GetValue();
|
||||
void SetValue(object value);
|
||||
}
|
||||
}
|
||||
24
ModRegistry/Settings/ModSettings.cs
Normal file
24
ModRegistry/Settings/ModSettings.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
namespace VMM.ModRegistry.Settings
|
||||
{
|
||||
public class ModSettings
|
||||
{
|
||||
private readonly List<ISettingsElement> settings = new();
|
||||
|
||||
public void AddSetting(ISettingsElement newSetting)
|
||||
{
|
||||
settings.Add(newSetting);
|
||||
}
|
||||
|
||||
public T GetSetting<T>(string name) where T : class, ISettingsElement
|
||||
{
|
||||
foreach (var setting in settings)
|
||||
{
|
||||
if(setting.Name == name && setting is T typed)
|
||||
return typed;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IEnumerable<ISettingsElement> GetAllSettings() => settings;
|
||||
}
|
||||
}
|
||||
31
ModRegistry/Settings/SettingsElement.cs
Normal file
31
ModRegistry/Settings/SettingsElement.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using VMM.ModRegistry.Settings;
|
||||
|
||||
namespace VMM.ModRegistry.Settings
|
||||
{
|
||||
public abstract class SettingsElement<T> : ISettingsElement
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public T Value { get; set; }
|
||||
|
||||
public Action<T> OnChanged { get; set; }
|
||||
|
||||
public object GetValue() => Value;
|
||||
|
||||
public void SetValue(object value)
|
||||
{
|
||||
if (value is T typedValue)
|
||||
{
|
||||
Value = typedValue;
|
||||
OnChanged?.Invoke(typedValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidCastException($"Invalid value type. Expected {typeof(T)}, got {value?.GetType()}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
12
ModRegistry/Settings/Types/SliderSetting.cs
Normal file
12
ModRegistry/Settings/Types/SliderSetting.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace VMM.ModRegistry.Settings.Types
|
||||
{
|
||||
public class SliderSetting : SettingsElement<float>
|
||||
{
|
||||
public float Min { get; set; }
|
||||
public float Max { get; set; }
|
||||
}
|
||||
}
|
||||
10
ModRegistry/Settings/Types/ToggleSetting.cs
Normal file
10
ModRegistry/Settings/Types/ToggleSetting.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace VMM.ModRegistry.Settings.Types
|
||||
{
|
||||
public class ToggleSetting : SettingsElement<bool>
|
||||
{
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user