Initial Code

This commit is contained in:
Exil Productions
2025-11-11 03:10:52 +01:00
commit 74e53205f4
21 changed files with 2039 additions and 0 deletions

18
ModRegistry/ModEntry.cs Normal file
View 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
View 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.");
}
}
}
}

View 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);
}
}

View 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;
}
}

View 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()}");
}
}
}
}

View 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; }
}
}

View File

@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace VMM.ModRegistry.Settings.Types
{
public class ToggleSetting : SettingsElement<bool>
{
}
}