using System; using System.Collections.Generic; using System.IO; using System.Linq; using BepInEx.Bootstrap; namespace BepInEx { /// /// Data class that represents information about a loadable BepInEx plugin. /// Contains all metadata and additional info required for plugin loading by . /// public class PluginInfo : ICacheable { /// /// General metadata about a plugin. /// public BepInPlugin Metadata { get; internal set; } /// /// Collection of attributes that describe what processes the plugin can run on. /// public IEnumerable Processes { get; internal set; } /// /// Collection of attributes that describe what plugins this plugin depends on. /// public IEnumerable Dependencies { get; internal set; } /// /// Collection of attributes that describe what plugins this plugin /// is incompatible with. /// public IEnumerable Incompatibilities { get; internal set; } /// /// File path to the plugin DLL /// public string Location { get; internal set; } /// /// Instance of the plugin that represents this info. NULL if no plugin is instantiated from info (yet) /// public object Instance { get; internal set; } public string TypeName { get; internal set; } internal Version TargettedBepInExVersion { get; set; } void ICacheable.Save(BinaryWriter bw) { bw.Write(TypeName); bw.Write(Location); bw.Write(Metadata.GUID); bw.Write(Metadata.Name); bw.Write(Metadata.Version.ToString()); var processList = Processes.ToList(); bw.Write(processList.Count); foreach (var bepInProcess in processList) bw.Write(bepInProcess.ProcessName); var depList = Dependencies.ToList(); bw.Write(depList.Count); foreach (var bepInDependency in depList) ((ICacheable)bepInDependency).Save(bw); var incList = Incompatibilities.ToList(); bw.Write(incList.Count); foreach (var bepInIncompatibility in incList) ((ICacheable)bepInIncompatibility).Save(bw); bw.Write(TargettedBepInExVersion.ToString(4)); } void ICacheable.Load(BinaryReader br) { TypeName = br.ReadString(); Location = br.ReadString(); Metadata = new BepInPlugin(br.ReadString(), br.ReadString(), br.ReadString()); var processListCount = br.ReadInt32(); var processList = new List(processListCount); for (int i = 0; i < processListCount; i++) processList.Add(new BepInProcess(br.ReadString())); Processes = processList; var depCount = br.ReadInt32(); var depList = new List(depCount); for (int i = 0; i < depCount; i++) { var dep = new BepInDependency(""); ((ICacheable)dep).Load(br); depList.Add(dep); } Dependencies = depList; var incCount = br.ReadInt32(); var incList = new List(incCount); for (int i = 0; i < incCount; i++) { var inc = new BepInIncompatibility(""); ((ICacheable)inc).Load(br); incList.Add(inc); } Incompatibilities = incList; TargettedBepInExVersion = new Version(br.ReadString()); } /// public override string ToString() => $"{Metadata?.Name} {Metadata?.Version}"; } }