private static void LoadMod(ModDef modDef) { var potentialAdditions = new List <ModDef.ManifestEntry>(); LogWithDate($"Loading {modDef.Name}"); // load out of the manifest if (modDef.LoadImplicitManifest && modDef.Manifest.All(x => Path.GetFullPath(Path.Combine(modDef.Directory, x.Path)) != Path.GetFullPath(Path.Combine(modDef.Directory, "StreamingAssets")))) { modDef.Manifest.Add(new ModDef.ManifestEntry("StreamingAssets", true)); } foreach (var entry in modDef.Manifest) { // handle prefabs; they have potential internal path to assetbundle if (entry.Type == "Prefab" && !string.IsNullOrEmpty(entry.AssetBundleName)) { if (!potentialAdditions.Any(x => x.Type == "AssetBundle" && x.Id == entry.AssetBundleName)) { Log($"\t{modDef.Name} has a Prefab that's referencing an AssetBundle that hasn't been loaded. Put the assetbundle first in the manifest!"); return; } entry.Id = Path.GetFileNameWithoutExtension(entry.Path); potentialAdditions.Add(entry); continue; } if (string.IsNullOrEmpty(entry.Path) && string.IsNullOrEmpty(entry.Type) && entry.Path != "StreamingAssets") { Log($"\t{modDef.Name} has a manifest entry that is missing its path or type! Aborting load."); return; } var entryPath = Path.Combine(modDef.Directory, entry.Path); if (Directory.Exists(entryPath)) { // path is a directory, add all the files there var files = Directory.GetFiles(entryPath, "*", SearchOption.AllDirectories); foreach (var filePath in files) { var childModDef = new ModDef.ManifestEntry(entry, filePath, InferIDFromFileAndType(filePath, entry.Type)); potentialAdditions.Add(childModDef); } } else if (File.Exists(entryPath)) { // path is a file, add the single entry entry.Id = entry.Id ?? InferIDFromFileAndType(entryPath, entry.Type); entry.Path = entryPath; potentialAdditions.Add(entry); } else if (entry.Path != "StreamingAssets") { // path is not streamingassets and it's missing Log($"\tMissing Entry: Manifest specifies file/directory of {entry.Type} at path {entry.Path}, but it's not there. Continuing to load."); } } // load mod dll if (modDef.DLL != null) { var dllPath = Path.Combine(modDef.Directory, modDef.DLL); string typeName = null; var methodName = "Init"; if (!File.Exists(dllPath)) { Log($"\t{modDef.Name} has a DLL specified ({dllPath}), but it's missing! Aborting load."); return; } if (modDef.DLLEntryPoint != null) { var pos = modDef.DLLEntryPoint.LastIndexOf('.'); if (pos == -1) { methodName = modDef.DLLEntryPoint; } else { typeName = modDef.DLLEntryPoint.Substring(0, pos); methodName = modDef.DLLEntryPoint.Substring(pos + 1); } } Log($"\tUsing BTML to load dll {Path.GetFileName(dllPath)} with entry path {typeName ?? "NoNameSpecified"}.{methodName}"); BTModLoader.LoadDLL(dllPath, methodName, typeName, new object[] { modDef.Directory, modDef.Settings.ToString(Formatting.None) }); } // actually add the additions, since we successfully got through loading the other stuff if (potentialAdditions.Count > 0) { foreach (var addition in potentialAdditions) { Log($"\tNew Entry: {addition.Path.Replace(ModDirectory, "")}"); } ModManifest[modDef.Name] = potentialAdditions; } }
public static void LoadMod(ModDef modDef) { var potentialAdditions = new Dictionary <string, ModDef.ManifestEntry>(); LogWithDate($"Loading {modDef.Name}"); // load out of the manifest // TODO: actually ignore the modDef specified files/directories if (modDef.Manifest != null && modDef.Manifest.Count > 0) { foreach (var entry in modDef.Manifest) { var entryPath = Path.Combine(modDef.Directory, entry.Path); if (string.IsNullOrEmpty(entry.Path) || string.IsNullOrEmpty(entry.Type)) { LogWithDate($"{modDef.Name} has a manifest entry that is missing its type or path! Aborting load."); return; } if (Directory.Exists(entryPath)) { // path is a directory, add all the files there var files = Directory.GetFiles(entryPath); foreach (var filePath in files) { var id = InferIDFromFileAndType(filePath, entry.Type); if (potentialAdditions.ContainsKey(id)) { LogWithDate($"{modDef.Name}'s manifest has a file at {filePath}, but it's inferred ID is already used by this mod! Aborting load."); return; } potentialAdditions.Add(id, new ModDef.ManifestEntry(entry.Type, filePath)); } } else if (File.Exists(entryPath)) { // path is a file, add the single entry var id = entry.Id ?? InferIDFromFileAndType(entryPath, entry.Type); if (potentialAdditions.ContainsKey(id)) { LogWithDate($"{modDef.Name}'s manifest has a file at {entryPath}, but it's inferred ID is already used by this mod! Aborting load."); return; } potentialAdditions.Add(id, new ModDef.ManifestEntry(entry.Type, entryPath)); } else { // wasn't a file and wasn't a path, must not exist LogWithDate($"{modDef.Name} has a manifest entry {entryPath}, but it's missing! Aborting load."); return; } } } // load mod dll if (modDef.DLL != null) { var dllPath = Path.Combine(modDef.Directory, modDef.DLL); string typeName = null; var methodName = "Init"; if (!File.Exists(dllPath)) { LogWithDate($"{modDef.Name} has a DLL specified ({dllPath}), but it's missing! Aborting load."); return; } if (modDef.DLLEntryPoint != null) { var pos = modDef.DLLEntryPoint.LastIndexOf('.'); if (pos == -1) { methodName = modDef.DLLEntryPoint; } else { typeName = modDef.DLLEntryPoint.Substring(0, pos - 1); methodName = modDef.DLLEntryPoint.Substring(pos + 1); } } LogWithDate($"Using BTML to load dll {Path.GetFileName(dllPath)} with entry path {typeName ?? "NoNameSpecified"}.{methodName}"); BTModLoader.LoadDLL(dllPath, methodName, typeName, new object[] { modDef.Directory, modDef.Settings.ToString(Formatting.None) }); } // actually add the additions, since we successfully got through loading the other stuff if (potentialAdditions.Count > 0) { // TODO, this kvp is the weirdest thing foreach (var additionKvp in potentialAdditions) { Log($"\tWill load manifest entry -- id: {additionKvp.Key} type: {additionKvp.Value.Type} path: {additionKvp.Value.Path}"); NewManifestEntries[additionKvp.Key] = additionKvp.Value; } } LogWithDate($"Loaded {modDef.Name}"); }
public static void LoadMod(ModDef modDef) { var potentialAdditions = new List <ModDef.ManifestEntry>(); LogWithDate($"Loading {modDef.Name}"); // load out of the manifest if (modDef.LoadImplicitManifest && modDef.Manifest.All(x => Path.GetFullPath(Path.Combine(modDef.Directory, x.Path)) != Path.GetFullPath(Path.Combine(modDef.Directory, "StreamingAssets")))) { modDef.Manifest.Add(new ModDef.ManifestEntry("StreamingAssets", true)); } foreach (var entry in modDef.Manifest) { var entryPath = Path.Combine(modDef.Directory, entry.Path); if (string.IsNullOrEmpty(entry.Path) && (string.IsNullOrEmpty(entry.Type) || entry.Path == "StreamingAssets")) { Log($"\t{modDef.Name} has a manifest entry that is missing its path! Aborting load."); return; } if (Directory.Exists(entryPath)) { // path is a directory, add all the files there var files = Directory.GetFiles(entryPath, "*", SearchOption.AllDirectories); foreach (var filePath in files) { var childModDef = new ModDef.ManifestEntry(entry, filePath, InferIDFromFileAndType(filePath, entry.Type)); potentialAdditions.Add(childModDef); } } else if (File.Exists(entryPath)) { // path is a file, add the single entry entry.Id = entry.Id ?? InferIDFromFileAndType(entryPath, entry.Type); entry.Path = entryPath; potentialAdditions.Add(entry); } else { // wasn't a file and wasn't a path, must not exist // TODO: what to do with manifest entries that aren't implicit that are missing? //Log($"\t{modDef.Name} has a manifest entry {entryPath}, but it's missing! Aborting load."); //return; } } // load mod dll if (modDef.DLL != null) { var dllPath = Path.Combine(modDef.Directory, modDef.DLL); string typeName = null; var methodName = "Init"; if (!File.Exists(dllPath)) { Log($"\t{modDef.Name} has a DLL specified ({dllPath}), but it's missing! Aborting load."); return; } if (modDef.DLLEntryPoint != null) { var pos = modDef.DLLEntryPoint.LastIndexOf('.'); if (pos == -1) { methodName = modDef.DLLEntryPoint; } else { typeName = modDef.DLLEntryPoint.Substring(0, pos); methodName = modDef.DLLEntryPoint.Substring(pos + 1); } } Log($"\tUsing BTML to load dll {Path.GetFileName(dllPath)} with entry path {typeName ?? "NoNameSpecified"}.{methodName}"); BTModLoader.LoadDLL(dllPath, methodName, typeName, new object[] { modDef.Directory, modDef.Settings.ToString(Formatting.None) }); } // actually add the additions, since we successfully got through loading the other stuff if (potentialAdditions.Count > 0) { foreach (var addition in potentialAdditions) { Log($"\tNew Entry: {addition.Path.Replace(ModDirectory, "")}"); } ModManifest[modDef.Name] = potentialAdditions; } }