using System.Reflection; using LibAC.NBT; using LibAC.NBT.API; namespace ForgeCoreAPI; public class PluginSystem { public static string PluginDirectory { get; set; } = "Plugins"; public static List Plugins = new List(); private static void PSysLog(string Message) { Console.WriteLine($"[PLUGINS] {Message}"); } public static void InitializeSystem(string pluginDirectory) { CompoundTag pluginsData = new CompoundTag(); if (!File.Exists("PluginStorage.dat")) { // We have no existing saved config for plugins, or this is the first run // Leave pluginsData empty } else pluginsData = NbtIo.Read("PluginStorage.dat"); // Search the Plugins directory for DLL files string[] files = Directory.GetFiles(pluginDirectory, "*.dll"); // Begin loading assemblies foreach (var file in files) { Assembly asm = Assembly.LoadFile(file); // Scan types for ForgeCorePlugin attribute foreach (var types in asm.GetTypes()) { if (types.GetCustomAttribute() != null) { PluginContainer nPlugin = new PluginContainer(); IPlugin plugin = Activator.CreateInstance(types) as IPlugin; plugin.Initialize(); nPlugin.plugin = plugin; ForgeCorePluginAttribute attrib = types.GetCustomAttribute(); Tag? pluginStore = pluginsData.Get(attrib.pluginName); nPlugin.pluginName = attrib.pluginName; PSysLog($"> Loading plugin: {nPlugin.pluginName}"); if (pluginStore == null) { plugin.ResetMemory(); } else { CompoundTag tag = (CompoundTag) pluginStore; CompoundTag dataTag = tag["data"] as CompoundTag; plugin.LoadConfig(dataTag); PSysLog($"> Loaded plugin: {nPlugin.pluginName}"); if (NbtUtils.ReadBoolean(tag, "enabled")) { nPlugin.enabled = true; plugin.Enable(); PSysLog($"> Enabled plugin: {nPlugin.pluginName}"); } else { plugin.Disable(); nPlugin.enabled = false; PSysLog($"> Disabled plugin: {nPlugin.pluginName}"); } } Plugins.Add(nPlugin); } } } } }