public static void TryAddToVersionManifest(VersionManifest manifest) { foreach (var entryKvp in NewManifestEntries) { var id = entryKvp.Key; var newEntry = entryKvp.Value; if (newEntry.ShouldMergeJSON && manifest.Contains(id, newEntry.Type)) { // read the manifest pointed entry and hash the contents JsonHashToId.Add(File.ReadAllText(manifest.Get(id, newEntry.Type).FilePath).GetHashCode(), id); // The manifest already contains this information, so we need to queue it to be merged var partialJson = File.ReadAllText(newEntry.Path); if (!JsonMerges.ContainsKey(id)) { JsonMerges.Add(id, new List <string>()); } Log($"\tAdding id {id} to JSONMerges"); JsonMerges[id].Add(partialJson); } else { // This is a new definition or a replacement that doesn't get merged, so add or update the manifest Log($"\tAddOrUpdate({id}, {newEntry.Path}, {newEntry.Type}, {DateTime.Now}, {newEntry.AssetBundleName}, {newEntry.AssetBundlePersistent})"); manifest.AddOrUpdate(id, newEntry.Path, newEntry.Type, DateTime.Now, newEntry.AssetBundleName, newEntry.AssetBundlePersistent); } } }
private static void AddOrUpdateJSONToManifest() { try { string filePath = "mods/CommanderPortraitLoader/Portraits/"; VersionManifest manifest = VersionManifestUtilities.ManifestFromCSV("mods/CommanderPortraitLoader/VersionManifest.csv"); DirectoryInfo d1 = new DirectoryInfo(filePath); FileInfo[] f1 = d1.GetFiles("*.png"); foreach (VersionManifestEntry entry in manifest.Entries) { if (!File.Exists(entry.FilePath.Replace(".json", ".png"))) { if (File.Exists(entry.FilePath)) { File.Delete(entry.FilePath); } manifest.Remove(entry.Id, entry.Type, DateTime.Now); manifest.ClearRemoved(); } } f1 = d1.GetFiles("*.json"); CustomPreset preset = new CustomPreset(); foreach (FileInfo info in f1) { using (StreamReader r = new StreamReader(info.FullName)) { string json = r.ReadToEnd(); preset = JsonConvert.DeserializeObject <CustomPreset>(json); } manifest.AddOrUpdate(preset.Description.Id, info.FullName, "PortraitSettings", DateTime.Now, null, false); } VersionManifestUtilities.ManifestToCSV(manifest, "mods/CommanderPortraitLoader/VersionManifest.csv"); } catch (Exception e) { Logger.LogError(e); } }
static void Postfix(VersionManifest __result) { ModTek.LogWithDate("VersionManifestUtilities_LoadDefaultManifest_Patch"); // add to the manifest here // TODO: these freaking kvp look so bad foreach (var entryKVP in ModTek.NewManifestEntries) { var id = entryKVP.Key; var newEntry = entryKVP.Value; if (newEntry.ShouldMergeJSON && __result.Contains(id, newEntry.Type)) { // read the manifest pointed entry and hash the contents DoJSONMerge.JSONHashes.Add(File.ReadAllText(__result.Get(id, newEntry.Type).FilePath).GetHashCode()); // The manifest already contains this information, so we need to queue it to be merged var partialJSON = File.ReadAllText(newEntry.Path); if (!DoJSONMerge.JSONMerges.ContainsKey(id)) { DoJSONMerge.JSONMerges.Add(id, new List <string>()); } ModTek.Log("\tAdding id {0} to JSONMerges", id); DoJSONMerge.JSONMerges[id].Add(partialJSON); } else { // This is a new definition or a replacement that doesn't get merged, so add or update the manifest ModTek.Log("\tAddOrUpdate({0}, {1}, {2}, {3}, {4}, {5})", id, newEntry.Path, newEntry.Type, DateTime.Now, newEntry.AssetBundleName, newEntry.AssetBundlePersistent); __result.AddOrUpdate(id, newEntry.Path, newEntry.Type, DateTime.Now, newEntry.AssetBundleName, newEntry.AssetBundlePersistent); } } }
private static bool AddModEntryToVersionManifest(VersionManifest manifest, ModDef.ManifestEntry modEntry, bool addToDB = false) { if (modEntry.Path == null) { return(false); } VersionManifestAddendum addendum = null; if (!string.IsNullOrEmpty(modEntry.AddToAddendum)) { addendum = manifest.GetAddendumByName(modEntry.AddToAddendum); // create the addendum if it doesn't exist if (addendum == null) { Log($"\t\tCreated addendum: {modEntry.AddToAddendum}"); addendum = new VersionManifestAddendum(modEntry.AddToAddendum); manifest.ApplyAddendum(addendum); } } // add to DB if (addToDB && Path.GetExtension(modEntry.Path).ToLower() == ".json") { var type = (BattleTechResourceType)Enum.Parse(typeof(BattleTechResourceType), modEntry.Type); using (var metadataDatabase = new MetadataDatabase()) { VersionManifestHotReload.InstantiateResourceAndUpdateMDDB(type, modEntry.Path, metadataDatabase); Log($"\t\tAdding to MDDB! {type} {modEntry.Path}"); } } // add assetbundle path so it can be changed when the assetbundle path is requested if (modEntry.Type == "AssetBundle") { ModAssetBundlePaths[modEntry.Id] = modEntry.Path; } // add to addendum instead of adding to manifest if (addendum != null) { Log($"\t\tAddOrUpdate => {modEntry.Id} ({modEntry.Type}) to addendum {addendum.Name}"); addendum.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); return(true); } // not added to addendum, not added to jsonmerges Log($"\t\tAddOrUpdate => {modEntry.Id} ({modEntry.Type})"); manifest.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); return(true); }
public static void Postfix(ref VersionManifest __result) { try { var addendum = VersionManifestUtilities.ManifestFromCSV($"{ CommanderPortraitLoader.ModDirectory}/VersionManifest.csv"); foreach (var entry in addendum.Entries) { __result.AddOrUpdate(entry.Id, entry.FilePath, entry.Type, entry.AddedOn, entry.AssetBundleName, entry.IsAssetBundlePersistent); } } catch (Exception e) { Logger.LogError(e); } }
// ADDING TO VERSION MANIFEST private static bool AddModEntry(VersionManifest manifest, ModDef.ManifestEntry modEntry) { if (modEntry.Path == null) { return(false); } VersionManifestAddendum addendum = null; if (!string.IsNullOrEmpty(modEntry.AddToAddendum)) { addendum = manifest.GetAddendumByName(modEntry.AddToAddendum); // create the addendum if it doesn't exist if (addendum == null) { Log($"\t\tCreated addendum: {modEntry.AddToAddendum}"); addendum = new VersionManifestAddendum(modEntry.AddToAddendum); manifest.ApplyAddendum(addendum); } } // add special handling for particular types switch (modEntry.Type) { case "AssetBundle": ModAssetBundlePaths[modEntry.Id] = modEntry.Path; break; case "Texture2D": ModTexture2Ds.Add(modEntry.Id); break; } // add to addendum instead of adding to manifest if (addendum != null) { Log($"\t\tAddOrUpdate => {modEntry.Id} ({modEntry.Type}) to addendum {addendum.Name}"); addendum.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); return(true); } // not added to addendum, not added to jsonmerges Log($"\t\tAddOrUpdate => {modEntry.Id} ({modEntry.Type})"); manifest.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); return(true); }
public static void Postfix(ref VersionManifest __result) { try { string filePath = $"{ CommanderPortraitLoader.ModDirectory}/PortraitJsons/"; DirectoryInfo d1 = new DirectoryInfo(filePath); FileInfo[] f1 = d1.GetFiles("*.json"); PortraitSettings preset = new PortraitSettings(); foreach (FileInfo info in f1) { using (StreamReader r = new StreamReader(info.FullName)) { string json = r.ReadToEnd(); preset.FromJSON(json); } __result.AddOrUpdate(preset.Description.Id, info.FullName, "PortraitSettings", DateTime.Now, null, false); } } catch (Exception e) { Logger.LogError(e); } }
internal static void TryAddToVersionManifest(VersionManifest manifest) { if (!hasLoadedMods) { LoadMods(); } var breakMyGame = File.Exists(Path.Combine(ModDirectory, "break.my.game")); LogWithDate("Adding in mod manifests!"); if (breakMyGame) { var mddPath = Path.Combine(Path.Combine(StreamingAssetsDirectory, "MDD"), "MetadataDatabase.db"); var mddBackupPath = mddPath + ".orig"; Log($"\tBreak my game mode enabled! All new modded content (doesn't currently support merges) will be added to the DB."); if (!File.Exists(mddBackupPath)) { Log($"\t\tBacking up metadata database to {Path.GetFileName(mddBackupPath)}"); File.Copy(mddPath, mddBackupPath); } } foreach (var modName in modLoadOrder) { if (!ModManifest.ContainsKey(modName)) { continue; } Log($"\t{modName}:"); foreach (var modEntry in ModManifest[modName]) { var existingEntry = manifest.Find(x => x.Id == modEntry.Id); VersionManifestAddendum addendum = null; if (!string.IsNullOrEmpty(modEntry.AddToAddendum)) { addendum = manifest.GetAddendumByName(modEntry.AddToAddendum); // create the addendum if it doesn't exist if (addendum == null) { Log($"\t\tCreated addendum {modEntry.AddToAddendum}:"); addendum = new VersionManifestAddendum(modEntry.AddToAddendum); manifest.ApplyAddendum(addendum); } } if (modEntry.Type == null) { // null type means that we have to find existing entry with the same rel path to fill in the entry // TODO: + 16 is a little bizzare looking, it's the length of the substring + 1 because we want to get rid of it and the \ var relPath = modEntry.Path.Substring(modEntry.Path.LastIndexOf("StreamingAssets", StringComparison.Ordinal) + 16); var fakeStreamingAssetsPath = Path.Combine(StreamingAssetsDirectory, relPath); existingEntry = manifest.Find(x => Path.GetFullPath(x.FilePath) == Path.GetFullPath(fakeStreamingAssetsPath)); if (existingEntry == null) { continue; } modEntry.Id = existingEntry.Id; modEntry.Type = existingEntry.Type; } if (Path.GetExtension(modEntry.Path).ToLower() == ".json" && modEntry.ShouldMergeJSON && existingEntry != null) { // read the manifest pointed entry and hash the contents JsonHashToId[File.ReadAllText(existingEntry.FilePath).GetHashCode()] = modEntry.Id; // The manifest already contains this information, so we need to queue it to be merged var partialJson = File.ReadAllText(modEntry.Path); if (!JsonMerges.ContainsKey(modEntry.Id)) { JsonMerges.Add(modEntry.Id, new List <string>()); } if (JsonMerges[modEntry.Id].Contains(partialJson)) { Log($"\t\tAlready added {modEntry.Id} to JsonMerges"); continue; } Log($"\t\tAdding {modEntry.Id} to JsonMerges"); JsonMerges[modEntry.Id].Add(partialJson); continue; } if (breakMyGame && Path.GetExtension(modEntry.Path).ToLower() == ".json") { var type = (BattleTechResourceType)Enum.Parse(typeof(BattleTechResourceType), modEntry.Type); using (var metadataDatabase = new MetadataDatabase()) { VersionManifestHotReload.InstantiateResourceAndUpdateMDDB(type, modEntry.Path, metadataDatabase); Log($"\t\tAdding to MDDB! {type} {modEntry.Path}"); } } if (!string.IsNullOrEmpty(modEntry.AddToAddendum)) { Log($"\t\tAddOrUpdate {modEntry.Type} {modEntry.Id} to addendum {addendum.Name}"); addendum.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); continue; } // This is a new definition or a replacement that doesn't get merged, so add or update the manifest Log($"\t\tAddOrUpdate {modEntry.Type} {modEntry.Id}"); manifest.AddOrUpdate(modEntry.Id, modEntry.Path, modEntry.Type, DateTime.Now, modEntry.AssetBundleName, modEntry.AssetBundlePersistent); } } Log(""); }