mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
* Removed the Interfaces folder. * All objects inside the GameObjects subfolders are now in the GameObjects namespace. * Added a Resharper DotSettings file to mark the GameObjects subfolders as not providing namespaces. * Simplified Robust.client.Graphics namespace. * Automated remove redundant using statements.
122 lines
3.6 KiB
C#
122 lines
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Log;
|
|
using Robust.Shared.Reflection;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Robust.Shared.ContentPack
|
|
{
|
|
public abstract class BaseModLoader
|
|
{
|
|
[Dependency] protected readonly IReflectionManager ReflectionManager = default!;
|
|
|
|
private readonly List<ModuleTestingCallbacks> _testingCallbacks = new();
|
|
|
|
/// <summary>
|
|
/// Loaded assemblies.
|
|
/// </summary>
|
|
protected readonly List<ModInfo> Mods = new();
|
|
|
|
public IEnumerable<Assembly> LoadedModules => Mods.Select(p => p.GameAssembly);
|
|
|
|
public Assembly GetAssembly(string name)
|
|
{
|
|
return Mods.Select(p => p.GameAssembly).Single(p => p.GetName().Name == name);
|
|
}
|
|
|
|
protected void InitMod(Assembly assembly)
|
|
{
|
|
var mod = new ModInfo(assembly);
|
|
|
|
ReflectionManager.LoadAssemblies(mod.GameAssembly);
|
|
|
|
var entryPoints = mod.GameAssembly.GetTypes().Where(t => typeof(GameShared).IsAssignableFrom(t));
|
|
|
|
foreach (var entryPoint in entryPoints)
|
|
{
|
|
var entryPointInstance = (GameShared) Activator.CreateInstance(entryPoint)!;
|
|
if (_testingCallbacks != null)
|
|
{
|
|
entryPointInstance.SetTestingCallbacks(_testingCallbacks);
|
|
}
|
|
|
|
mod.EntryPoints.Add(entryPointInstance);
|
|
}
|
|
|
|
Mods.Add(mod);
|
|
}
|
|
|
|
public bool IsContentAssembly(Assembly typeAssembly)
|
|
{
|
|
foreach (var mod in Mods)
|
|
{
|
|
if (mod.GameAssembly == typeAssembly)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void BroadcastRunLevel(ModRunLevel level)
|
|
{
|
|
foreach (var mod in Mods)
|
|
{
|
|
foreach (var entry in mod.EntryPoints)
|
|
{
|
|
switch (level)
|
|
{
|
|
case ModRunLevel.PreInit:
|
|
entry.PreInit();
|
|
break;
|
|
case ModRunLevel.Init:
|
|
entry.Init();
|
|
break;
|
|
case ModRunLevel.PostInit:
|
|
entry.PostInit();
|
|
break;
|
|
default:
|
|
Logger.ErrorS("res.mod", $"Unknown RunLevel: {level}");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void BroadcastUpdate(ModUpdateLevel level, FrameEventArgs frameEventArgs)
|
|
{
|
|
foreach (var module in Mods)
|
|
{
|
|
foreach (var entryPoint in module.EntryPoints)
|
|
{
|
|
entryPoint.Update(level, frameEventArgs);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SetModuleBaseCallbacks(ModuleTestingCallbacks testingCallbacks)
|
|
{
|
|
_testingCallbacks.Add(testingCallbacks);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Holds info about a loaded assembly.
|
|
/// </summary>
|
|
protected sealed class ModInfo
|
|
{
|
|
public ModInfo(Assembly gameAssembly)
|
|
{
|
|
GameAssembly = gameAssembly;
|
|
EntryPoints = new List<GameShared>();
|
|
}
|
|
|
|
public Assembly GameAssembly { get; }
|
|
public List<GameShared> EntryPoints { get; }
|
|
}
|
|
}
|
|
}
|