Скрипт выдирает все инстансы мода изнутри бадстрапера, не нашел как это сделать легально, кроме как вручную в каждом скрипте добавлять в список текущий инстанс,
поэтому наговнокодил такую хрень. Может кому пригодится
поэтому наговнокодил такую хрень. Может кому пригодится
C#:
using System.Reflection;
namespace HardLife.Utils
{
internal class ScriptInstances : Script
{
internal static Action<List<Script>> OnScriptInstancesLoaded = null;
[ServerEvent(Event.ResourceStart)]
public void OnResourceStart()
{
OnScriptInstancesLoaded?.Invoke(GetScriptInstances());
}
internal static List<Script> GetScriptInstances()
{
List<Script> scripts = new List<Script>();
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
Assembly assembly = Assembly.GetEntryAssembly();
Type gameServer = assembly.GetTypes().First(t => t.Name == "GameServer");
PropertyInfo serverInstance = gameServer.GetProperty("ServerInstance", bf);
var gameserver = serverInstance.GetValue(gameServer, null);
FieldInfo eventHandler = gameServer.GetField("EventHandler", bf);
var eventHandlerData = eventHandler.GetValue(gameServer);
FieldInfo _cachedCollectionsInfo = eventHandlerData.GetType().GetField("_cachedCollections", bf);
object _cachedCollections = ((object[])_cachedCollectionsInfo.GetValue(eventHandlerData))[0];
FieldInfo resourcesField = _cachedCollections.GetType().GetField("Resource", bf);
object resources = resourcesField.GetValue(_cachedCollections);
if (resources != null)
{
PropertyInfo enginesProperty = resources.GetType().GetProperty("Engines", bf);
var enginesValue = enginesProperty.GetValue(resources, null);
object[] engines = (object[])enginesValue.GetType().GetMethod("ToArray", bf).Invoke(enginesValue, null);
foreach (var item in engines)
{
FieldInfo conpileScriptProp = item.GetType().GetField("CompiledScript", bf);
scripts.Add((Script)conpileScriptProp.GetValue(item));
}
}
return scripts;
}
}
}