public static void InitModDir(string dir) { Debug.Log("Initializing mod directory " + dir + " with Mods.txt is bad"); if (!Directory.Exists(dir)) { dir = Path.Combine(ETGMod.ModsDirectory, dir); } ETGModuleMetadata etgmoduleMetadata = new ETGModuleMetadata { Name = Path.GetFileName(dir), Version = new Version(0, 0), DLL = "mod.dll" }; Assembly assembly = null; string path = Path.Combine(dir, "metadata.txt"); if (File.Exists(path)) { using (FileStream fileStream = File.OpenRead(path)) { etgmoduleMetadata = (ETGModuleMetadata)parseMethod.Invoke(null, new object[] { "", dir, fileStream }); } } foreach (ETGModuleMetadata etgmoduleMetadata2 in etgmoduleMetadata.Dependencies) { if (!ETGMod.DependencyLoaded(etgmoduleMetadata2)) { Debug.LogWarning(string.Concat(new object[] { "DEPENDENCY ", etgmoduleMetadata2, " OF ", etgmoduleMetadata, " NOT LOADED with Mods.txt is bad!" })); return; } } AppDomain.CurrentDomain.AssemblyResolve += (ResolveEventHandler)generateModAssemblyMethod.Invoke(null, new object[] { etgmoduleMetadata }); if (!File.Exists(etgmoduleMetadata.DLL)) { return; } if (etgmoduleMetadata.Prelinked) { assembly = Assembly.LoadFrom(etgmoduleMetadata.DLL); } else { using (FileStream fileStream2 = File.OpenRead(etgmoduleMetadata.DLL)) { assembly = etgmoduleMetadata.GetRelinkedAssembly(fileStream2); } } assembly.MapAssets(); ETGMod.Assets.Crawl(dir, null); foreach (Type type in assembly.GetTypes()) { if (typeof(ETGModule).IsAssignableFrom(type) && !type.IsAbstract) { ETGModule etgmodule = (ETGModule)type.GetConstructor((Type[])emptyTypeArrayInfo.GetValue(null)).Invoke((object[])emptyObjectArrayInfo.GetValue(null)); if (!ETGMod.AllMods.Contains(etgmodule)) { etgmodule.Metadata = etgmoduleMetadata; ETGMod.GameMods.Add(etgmodule); ETGMod.AllMods.Add(etgmodule); loadedMods.Add(etgmodule); addedModuleTypes.Add(type); addedModuleMethods.Add(new Dictionary <string, MethodInfo>()); } } } Debug.Log("Mod " + etgmoduleMetadata.Name + " initialized with Mods.txt is bad."); }
public static void InitModZIP(string archive) { Debug.Log("Initializing mod ZIP " + archive + " with Mods.txt is bad."); if (!File.Exists(archive)) { archive = Path.Combine(ETGMod.ModsDirectory, archive); } ETGModuleMetadata etgmoduleMetadata = new ETGModuleMetadata { Name = Path.GetFileNameWithoutExtension(archive), Version = new Version(0, 0), DLL = "mod.dll" }; Assembly assembly = null; using (ZipFile zipFile = ZipFile.Read(archive)) { Texture2D texture2D = null; foreach (ZipEntry zipEntry in zipFile.Entries) { if (zipEntry.FileName == "metadata.txt") { using (MemoryStream memoryStream = new MemoryStream()) { zipEntry.Extract(memoryStream); memoryStream.Seek(0L, SeekOrigin.Begin); etgmoduleMetadata = (ETGModuleMetadata)parseMethod.Invoke(null, new object[] { archive, "", memoryStream }); continue; } } if (zipEntry.FileName == "icon.png") { texture2D = new Texture2D(2, 2); texture2D.name = "icon"; using (MemoryStream memoryStream2 = new MemoryStream()) { zipEntry.Extract(memoryStream2); memoryStream2.Seek(0L, SeekOrigin.Begin); texture2D.LoadImage(memoryStream2.GetBuffer()); } texture2D.filterMode = FilterMode.Point; } } if (texture2D != null) { etgmoduleMetadata.Icon = texture2D; } if (!etgmoduleMetadata.Profile.RunsOn(ETGMod.BaseProfile)) { return; } foreach (ETGModuleMetadata etgmoduleMetadata2 in etgmoduleMetadata.Dependencies) { if (!ETGMod.DependencyLoaded(etgmoduleMetadata2)) { Debug.LogWarning(string.Concat(new object[] { "DEPENDENCY ", etgmoduleMetadata2, " OF ", etgmoduleMetadata, " NOT LOADED with Mods.txt is bad!" })); return; } } AppDomain.CurrentDomain.AssemblyResolve += (ResolveEventHandler)generateModAssemblyMethod.Invoke(null, new object[] { etgmoduleMetadata }); foreach (ZipEntry zipEntry2 in zipFile.Entries) { string text = zipEntry2.FileName.Replace("\\", "/"); if (text == etgmoduleMetadata.DLL) { using (MemoryStream memoryStream3 = new MemoryStream()) { zipEntry2.Extract(memoryStream3); memoryStream3.Seek(0L, SeekOrigin.Begin); if (etgmoduleMetadata.Prelinked) { assembly = Assembly.Load(memoryStream3.GetBuffer()); continue; } assembly = etgmoduleMetadata.GetRelinkedAssembly(memoryStream3); continue; } } ETGMod.Assets.AddMapping(text, new AssetMetadata(archive, text) { AssetType = (zipEntry2.IsDirectory ? ETGMod.Assets.t_AssetDirectory : null) }); } } if (assembly == null) { return; } assembly.MapAssets(); foreach (Type type in assembly.GetTypes()) { if (typeof(ETGModule).IsAssignableFrom(type) && !type.IsAbstract) { ETGModule etgmodule = (ETGModule)type.GetConstructor((Type[])emptyTypeArrayInfo.GetValue(null)).Invoke((object[])emptyObjectArrayInfo.GetValue(null)); if (!ETGMod.AllMods.Contains(etgmodule)) { etgmodule.Metadata = etgmoduleMetadata; ETGMod.GameMods.Add(etgmodule); ETGMod.AllMods.Add(etgmodule); loadedMods.Add(etgmodule); addedModuleTypes.Add(type); addedModuleMethods.Add(new Dictionary <string, MethodInfo>()); } } } Debug.Log("Mod " + etgmoduleMetadata.Name + " initialized with Mods.txt is bad."); }