/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="openrenderer"></param> public void PostLoadFile(string filename = "", bool openrenderer = false) { #region SetupFile // Backgroundwork Start Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); switch (Path.GetExtension(filename)) { case ".w2scene": case ".w2quest": case ".w2phase": { //this.flowDiagram = new frmChunkFlowDiagram(); //this.flowDiagram.OnOutput += MainController.LogString; //this.flowDiagram.File = this.File; //this.flowDiagram.DockAreas = DockAreas.Document; //this.flowDiagram.OnSelectChunk += this.frmCR2WDocument_OnSelectChunk; //this.flowDiagram.Show(this.FormPanel, DockState.Document); break; } case ".journal": { this.JournalEditor = new frmJournalEditor { File = this.File, DockAreas = DockAreas.Document }; this.JournalEditor.Show(this.FormPanel, DockState.Document); break; } case ".xbm": { this.ImageViewer = new frmImagePreview { DockAreas = DockAreas.Document }; this.ImageViewer.Show(this.FormPanel, DockState.Document); CR2WExportWrapper imagechunk = this.File?.Chunks?.FirstOrDefault(_ => _.data.REDType.Contains("CBitmapTexture")); this.ImageViewer.SetImage(imagechunk); break; } case ".redswf": { CR2WExportWrapper imagechunk = this.File?.Chunks?.FirstOrDefault(_ => _.data is CBitmapTexture); if (imagechunk != null) { this.ImageViewer = new frmImagePreview { DockAreas = DockAreas.Document }; this.ImageViewer.Show(this.FormPanel, DockState.Document); this.ImageViewer.SetImage(imagechunk); } break; } case ".w2mesh": { if (openrenderer) { try { // add all dependencies MockKernel.Get().Window.PauseMonitoring(); WccHelper.AddAllImports(filename, true, false); MockKernel.Get().Window.ResumeMonitoring(); this.RenderViewer = new Render.frmRender { LoadDocument = LoadDocumentAndGetFile, MeshFile = this.File, DockAreas = DockAreas.Document, renderHelper = new Render.RenderHelper(MainController.Get().ActiveMod, MainController.Get().Logger) }; this.RenderViewer.Show(this.FormPanel, DockState.Document); } catch (Exception ex) { MainController.LogString(ex.ToString(), Logtype.Error); } } break; } default: { break; } } var output = new StringBuilder(); if (this.File.UnknownTypes.Any()) { //ShowConsole(); //ShowOutput(); output.Append(this.FileName + ": contains " + this.File.UnknownTypes.Count + " unknown type(s):\n"); foreach (var unk in this.File.UnknownTypes) { output.Append("\"" + unk + "\", \n"); } output.Append("-------\n\n"); } var hasUnknownBytes = false; foreach (var t in this.File.Chunks.Where(t => t.unknownBytes?.Bytes != null && t.unknownBytes.Bytes.Length > 0)) { output.Append(t.REDName + " contains " + t.unknownBytes.Bytes.Length + " unknown bytes. \n"); hasUnknownBytes = true; } if (hasUnknownBytes) { output.Append("-------\n\n"); } //output.Append($"CR2WFile {filename} loaded in: {stopwatch.Elapsed}\n\n"); stopwatch.Stop(); MainController.LogString(output.ToString(), Logtype.Important); #endregion CR2WFile LoadDocumentAndGetFile(string path) { throw new NotImplementedException(); //foreach (var t in MockKernel.Get().GetMainViewModel().OpenDocuments.Where(_ => _.File is CR2WFile).Where(t => t.FileName == path)) // return t.File as CR2WFile; ////var activedoc = vm.OpenDocuments.FirstOrDefault(d => d.IsActivated); //var doc2 = LoadDocument(path) as frmCR2WDocument; ////activedoc.Activate(); //return doc2?.File; } }
public async override Task <bool> PackAndInstallProject() { var ActiveMod = MainController.Get().ActiveMod; var _logger = ServiceLocator.Default.ResolveType <ILoggerService>(); if (ActiveMod == null) { return(false); } if (Process.GetProcessesByName("Witcher3").Length != 0) { _logger.LogString("Please close The Witcher 3 before tinkering with the files!", Logtype.Error); return(false); } var packsettings = new WolvenKit.Common.Model.WitcherPackSettings(); if (packsettings != null) { MainController.Get().ProjectStatus = EProjectStatus.Busy; MainController.Get().StatusProgress = 0; //IsToolStripBtnPackEnabled = false; //SaveAllFiles(); //Create the dirs. So script only mods don't die. Directory.CreateDirectory(ActiveMod.PackedModDirectory); if (!string.IsNullOrEmpty(ActiveMod.GetDlcName())) { Directory.CreateDirectory(ActiveMod.PackedDlcDirectory); } //------------------------PRE COOKING------------------------------------// // have a check if somehow users forget to add a dlc folder in their dlc :( // but have files inform them that it just not gonna work bool initialDlcCheck = true; if (ActiveMod.DLCFiles.Any() && string.IsNullOrEmpty(ActiveMod.GetDlcName())) { _logger.LogString("Files in your dlc directory need to have the following structure: dlc\\DLCNAME\\files. Dlc will not be packed.", Logtype.Error); initialDlcCheck = false; } #region Pre Cooking //Handle strings. //if (packsettings.Strings.Item1 || packsettings.Strings.Item2) { //m_windowFactory.RequestStringsGUI(); TODO } // Cleanup Directories WccHelper.CleanupDirectories(); // Create Virtial Links WccHelper.CreateVirtualLinks(); // analyze files in dlc int statusanalyzedlc = -1; var seedfile = Path.Combine(ActiveMod.ProjectDirectory, @"cooked", $"seed_dlc{ActiveMod.Name}.files"); if (initialDlcCheck) { if (Directory.GetFiles(ActiveMod.DlcDirectory, "*", SearchOption.AllDirectories).Any()) { _logger.LogString($"======== Analyzing dlc files ======== \n", Logtype.Important); if (Directory.GetFiles(ActiveMod.DlcDirectory, "*.reddlc", SearchOption.AllDirectories).Any()) { var reddlcfile = Directory.GetFiles(ActiveMod.DlcDirectory, "*.reddlc", SearchOption.AllDirectories).FirstOrDefault(); var analyze = new Wcc_lite.analyze() { Analyzer = analyzers.r4dlc, Out = seedfile, reddlc = reddlcfile }; statusanalyzedlc *= await Task.Run(() => MainController.Get().WccHelper.RunCommand(analyze)); if (statusanalyzedlc == 0) { _logger.LogString("Analyzing dlc failed, creating fallback seedfiles. \n", Logtype.Error); WccHelper.CreateFallBackSeedFile(seedfile); } } else { _logger.LogString("No reddlc found, creating fallback seedfiles. \n", Logtype.Error); WccHelper.CreateFallBackSeedFile(seedfile); } } } #endregion MainController.Get().StatusProgress = 5; //------------------------- COOKING -------------------------------------// #region Cooking int statusCook = -1; // cook uncooked files var taskCookCol = Task.Run(() => WccHelper.Cook()); await taskCookCol.ContinueWith(antecedent => { //Logger.LogString($"Cooking Collision ended with status: {antecedent.Result}", Logtype.Important); statusCook = antecedent.Result; }); if (statusCook == 0) { _logger.LogString("Cooking collision finished with errors. \n", Logtype.Error); } #endregion MainController.Get().StatusProgress = 15; //------------------------- POST COOKING --------------------------------// #region Copy Cooked Files // copy mod files from Archive (cooked files) to \cooked if (Directory.GetFiles(ActiveMod.ModCookedDirectory, "*", SearchOption.AllDirectories).Any()) { _logger.LogString($"======== Adding cooked mod files ======== \n", Logtype.Important); try { var di = new DirectoryInfo(ActiveMod.ModCookedDirectory); var files = di.GetFiles("*", SearchOption.AllDirectories); _logger.LogString($"Found {files.Length} files in {di.FullName}. \n"); foreach (var fi in files) { string relpath = fi.FullName.Substring(ActiveMod.ModCookedDirectory.Length + 1); string newpath = Path.Combine(ActiveMod.CookedModDirectory, relpath); if (File.Exists(newpath)) { _logger.LogString($"Duplicate cooked file found {newpath}. Overwriting. \n", Logtype.Important); File.Delete(newpath); } fi.CopyToAndCreate(newpath); _logger.LogString($"Copied file to cooked directory: {fi.FullName}. \n", Logtype.Normal); } } catch (Exception) { _logger.LogString("Copying cooked mod files finished with errors. \n", Logtype.Error); } finally { _logger.LogString("Finished succesfully. \n", Logtype.Success); } } // copy dlc files from Archive (cooked files) to \cooked if (Directory.GetFiles(ActiveMod.DlcCookedDirectory, "*", SearchOption.AllDirectories).Any()) { _logger.LogString($"======== Adding cooked dlc files ======== \n", Logtype.Important); try { var di = new DirectoryInfo(ActiveMod.DlcCookedDirectory); var files = di.GetFiles("*", SearchOption.AllDirectories); _logger.LogString($"Found {files.Length} files in {di.FullName}. \n"); foreach (var fi in files) { string relpath = fi.FullName.Substring(ActiveMod.DlcCookedDirectory.Length + 1); string newpath = Path.Combine(ActiveMod.CookedDlcDirectory, relpath); if (File.Exists(newpath)) { _logger.LogString($"Duplicate cooked file found {newpath}. Overwriting. \n", Logtype.Important); File.Delete(newpath); } fi.CopyToAndCreate(newpath); _logger.LogString($"Copied file to cooked directory: {fi.FullName}. \n", Logtype.Normal); } } catch (Exception) { _logger.LogString("Copying cooked dlc files finished with errors. \n", Logtype.Error); } finally { _logger.LogString("Finished succesfully. \n", Logtype.Success); } } #endregion MainController.Get().StatusProgress = 20; //------------------------- PACKING -------------------------------------// #region Packing int statusPack = -1; //Handle bundle packing. if (packsettings.dlcPackBundles || packsettings.modPackBundles) { // packing //if (statusCookCol * statusCookTex != 0) { var t = WccHelper.Pack(packsettings.modPackBundles, packsettings.dlcPackBundles); await t.ContinueWith(antecedent => { //Logger.LogString($"Packing Bundles ended with status: {antecedent.Result}", Logtype.Important); statusPack = (int)antecedent.Status; }); if (statusPack == 0) { _logger.LogString("Packing bundles finished with errors. \n", Logtype.Error); } } //else // Logger.LogString("Cooking assets failed. No bundles will be packed!\n", Logtype.Error); } #endregion MainController.Get().StatusProgress = 40; //------------------------ METADATA -------------------------------------// #region Metadata //Handle metadata generation. int statusMetaData = -1; if (packsettings.modGenMetadata || packsettings.dlcGenMetadata) { if (statusPack == 1) { var t = WccHelper.CreateMetaData(packsettings.modGenMetadata, packsettings.dlcGenMetadata); await t.ContinueWith(antecedent => { statusMetaData = antecedent.Result; //Logger.LogString($"Creating metadata ended with status: {statusMetaData}", Logtype.Important); }); if (statusMetaData == 0) { _logger.LogString("Creating metadata finished with errors. \n", Logtype.Error); } } else { _logger.LogString("Packing bundles failed. No metadata will be created!\n", Logtype.Error); } } #endregion MainController.Get().StatusProgress = 50; //------------------------ POST COOKING ---------------------------------// //---------------------------- CACHES -----------------------------------// #region Buildcache int statusCol = -1; int statusTex = -1; //Generate collision cache if (packsettings.modGenCollCache || packsettings.dlcGenCollCache) { var t = WccHelper.GenerateCache(EArchiveType.CollisionCache, packsettings.modGenCollCache, packsettings.dlcGenCollCache); await t.ContinueWith(antecedent => { statusCol = antecedent.Result; //Logger.LogString($"Building collision cache ended with status: {statusCol}", Logtype.Important); }); if (statusCol == 0) { _logger.LogString("Building collision cache finished with errors. \n", Logtype.Error); } } //Handle texture caching if (packsettings.modGenTexCache || packsettings.dlcGenTexCache) { var t = WccHelper.GenerateCache(EArchiveType.TextureCache, packsettings.modGenTexCache, packsettings.dlcGenTexCache); await t.ContinueWith(antecedent => { statusTex = antecedent.Result; //Logger.LogString($"Building texture cache ended with status: {statusTex}", Logtype.Important); }); if (statusTex == 0) { _logger.LogString("Building texture cache finished with errors. \n", Logtype.Error); } } //Handle sound caching if (packsettings.modSound || packsettings.dlcSound) { if (packsettings.modSound) { var soundmoddir = Path.Combine(ActiveMod.ModDirectory, EArchiveType.SoundCache.ToString()); // We need to have the original soundcache's so we can rebuild them when packing the mod foreach (var wem in Directory.GetFiles(soundmoddir, "*.wem", SearchOption.AllDirectories)) { // Get the file id so we can search for the parent soundcache var id = Path.GetFileNameWithoutExtension(SoundCache.GetIDFromPath(wem)); // Find the parent bank foreach (var bnk in SoundCache.info.Banks) { if (bnk.IncludedFullFiles.Any(x => x.Id == id) || bnk.IncludedPrefetchFiles.Any(x => x.Id == id)) { if (!File.Exists(Path.Combine(soundmoddir, bnk.Path))) { //TODO: Fix this somehow //var bytes = MainController.ImportFile(bnk.Path, MainController.Get().SoundManager); //File.WriteAllBytes(Path.Combine(soundmoddir, bnk.Path), bytes[0].ToArray()); MainController.Get().Logger.LogString("Imported " + bnk.Path + " for rebuilding with the modded wem files!"); } break; } } } foreach (var bnk in Directory.GetFiles(soundmoddir, "*.bnk", SearchOption.AllDirectories)) { Soundbank bank = new Soundbank(bnk); bank.readFile(); bank.read_wems(soundmoddir); bank.rebuild_data(); File.Delete(bnk); bank.build_bnk(bnk); _logger.LogString("Rebuilt modded bnk " + bnk, Logtype.Success); } //Create mod soundspc.cache if (Directory.Exists(soundmoddir) && new DirectoryInfo(soundmoddir) .GetFiles("*.*", SearchOption.AllDirectories) .Where(file => file.Name.ToLower().EndsWith("wem") || file.Name.ToLower().EndsWith("bnk")).Any()) { SoundCache.Write( new DirectoryInfo(soundmoddir) .GetFiles("*.*", SearchOption.AllDirectories) .Where(file => file.Name.ToLower().EndsWith("wem") || file.Name.ToLower().EndsWith("bnk")) .ToList().Select(x => x.FullName).ToList(), Path.Combine(ActiveMod.PackedModDirectory, @"soundspc.cache")); _logger.LogString("Mod soundcache generated!\n", Logtype.Important); } else { _logger.LogString("Mod soundcache wasn't generated!\n", Logtype.Important); } } if (packsettings.dlcSound) { var sounddlcdir = Path.Combine(ActiveMod.DlcDirectory, EArchiveType.SoundCache.ToString()); //Create dlc soundspc.cache if (Directory.Exists(sounddlcdir) && new DirectoryInfo(sounddlcdir) .GetFiles("*.*", SearchOption.AllDirectories).Any(file => file.Name.ToLower().EndsWith("wem") || file.Name.ToLower().EndsWith("bnk"))) { SoundCache.Write( new DirectoryInfo(sounddlcdir) .GetFiles("*.*", SearchOption.AllDirectories) .Where(file => file.Name.ToLower().EndsWith("wem") || file.Name.ToLower().EndsWith("bnk")).ToList().Select(x => x.FullName).ToList(), Path.Combine(ActiveMod.PackedDlcDirectory, @"soundspc.cache")); _logger.LogString("DLC soundcache generated!\n", Logtype.Important); } else { _logger.LogString("DLC soundcache wasn't generated!\n", Logtype.Important); } } } #endregion MainController.Get().StatusProgress = 60; //---------------------------- SCRIPTS ----------------------------------// #region Scripts bool packscriptsMod = packsettings.modScripts; bool packscriptsdlc = packsettings.dlcScripts; //Handle mod scripts if (packscriptsMod && Directory.Exists(Path.Combine(ActiveMod.ModDirectory, "scripts")) && Directory.GetFiles(Path.Combine(ActiveMod.ModDirectory, "scripts"), "*.*", SearchOption.AllDirectories).Any()) { if (!Directory.Exists(Path.Combine(ActiveMod.ModDirectory, "scripts"))) { Directory.CreateDirectory(Path.Combine(ActiveMod.ModDirectory, "scripts")); } //Now Create all of the directories foreach (string dirPath in Directory.GetDirectories(Path.Combine(ActiveMod.ModDirectory, "scripts"), "*.*", SearchOption.AllDirectories)) { Directory.CreateDirectory(dirPath.Replace(Path.Combine(ActiveMod.ModDirectory, "scripts"), Path.Combine(ActiveMod.PackedModDirectory, "scripts"))); } //Copy all the files & Replaces any files with the same name foreach (string newPath in Directory.GetFiles(Path.Combine(ActiveMod.ModDirectory, "scripts"), "*.*", SearchOption.AllDirectories)) { File.Copy(newPath, newPath.Replace(Path.Combine(ActiveMod.ModDirectory, "scripts"), Path.Combine(ActiveMod.PackedModDirectory, "scripts")), true); } } //Handle the DLC scripts if (packscriptsdlc && Directory.Exists(Path.Combine(ActiveMod.DlcDirectory, "scripts")) && Directory.GetFiles(Path.Combine(ActiveMod.DlcDirectory, "scripts"), "*.*", SearchOption.AllDirectories).Any()) { if (!Directory.Exists(Path.Combine(ActiveMod.DlcDirectory, "scripts"))) { Directory.CreateDirectory(Path.Combine(ActiveMod.DlcDirectory, "scripts")); } //Now Create all of the directories foreach (string dirPath in Directory.GetDirectories(Path.Combine(ActiveMod.DlcDirectory, "scripts"), "*.*", SearchOption.AllDirectories)) { Directory.CreateDirectory(dirPath.Replace(Path.Combine(ActiveMod.DlcDirectory, "scripts"), Path.Combine(ActiveMod.PackedDlcDirectory, "scripts"))); } //Copy all the files & Replaces any files with the same name foreach (string newPath in Directory.GetFiles(Path.Combine(ActiveMod.DlcDirectory, "scripts"), "*.*", SearchOption.AllDirectories)) { File.Copy(newPath, newPath.Replace(Path.Combine(ActiveMod.DlcDirectory, "scripts"), Path.Combine(ActiveMod.PackedDlcDirectory, "scripts")), true); } } #endregion MainController.Get().StatusProgress = 80; //---------------------------- STRINGS ----------------------------------// #region Strings //Copy the generated w3strings if (packsettings.modStrings || packsettings.dlcStrings) { var files = Directory.GetFiles((ActiveMod.ProjectDirectory + "\\strings")).Where(s => Path.GetExtension(s) == ".w3strings").ToList(); if (packsettings.modStrings) { files.ForEach(x => File.Copy(x, Path.Combine(ActiveMod.PackedDlcDirectory, Path.GetFileName(x)))); } if (packsettings.dlcStrings) { files.ForEach(x => File.Copy(x, Path.Combine(ActiveMod.PackedModDirectory, Path.GetFileName(x)))); } } #endregion MainController.Get().StatusProgress = 90; //---------------------------- FINALIZE ---------------------------------// InstallMod(); //Report that we are done MainController.Get().StatusProgress = 100; MainController.Get().ProjectStatus = EProjectStatus.Ready; return(true); } else { return(false); } }