Files
RobustToolbox/Robust.Shared/ContentPack/BaseModLoader.cs
Acruid 2183cd7ca1 Massive Namespace Cleanup (#1544)
* 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.
2021-02-10 23:27:19 -08:00

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