static void Main(string[] args) { Console.WriteLine("Attach a native debugger now and press <enter> to continue."); Console.ReadLine(); try { using (CascStorageContext casc = new CascStorageContext(WOW_DATA_DIRECTORY_X64)) { Console.WriteLine("Successfully loaded CASC storage context."); Console.WriteLine("Game type is {0}, build {1}", casc.GameClient, casc.GameBuild); Console.WriteLine("{0} total file(s)", casc.FileCount); Console.WriteLine("Has listfile: {0}", casc.HasListfile); Console.ReadLine(); using (var file = casc.OpenFile(@"Interface\GLUES\LOADINGSCREENS\LoadingScreen_HighMaulRaid.blp")) { File.WriteAllBytes("LoadingScreen_HighMaulRaid.blp", file.ReadAllBytes()); } Console.WriteLine("Successfully extracted LoadingScreen_HighMaulRaid.blp"); try { using (var file = casc.OpenFileByEncodingKey(Convert.FromBase64String("2Pfre+Ss0jYg7lo3ZRYRtA=="))) { File.WriteAllBytes("BloodElfFemaleFaceLower16_02.blp", file.ReadAllBytes()); } Console.WriteLine("Successfully extracted BloodElfFemaleFaceLower16_02.blp via encoding key"); } catch (Exception ex) { Console.WriteLine(ex); } Console.ReadLine(); foreach (var file in casc.SearchFiles("*", WOW_LISTFILE_PATH)) { Console.WriteLine("{0}: {1} [{2}]", file.FileName, file.PlainFileName, Convert.ToBase64String(file.EncodingKey)); } Console.ReadLine(); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } /* * string listFile = null; * using (MpqArchive archive = new MpqArchive(@"d:\Projects\base-Win.MPQ", FileAccess.Read)) * { * using (MpqFileStream file = archive.OpenFile("(listfile)")) * using (StreamReader sr = new StreamReader(file)) * { * listFile = sr.ReadToEnd(); * Console.WriteLine(listFile); * } * * archive.ExtractFile("(listfile)", @"d:\projects\base-win-listfile.txt"); * } * * using (MpqArchive archive = MpqArchive.CreateNew(@"d:\projects\mynewmpq.mpq", MpqArchiveVersion.Version4)) * { * archive.AddFileFromDisk(@"D:\projects\base-win-listfile.txt", "base-win-listfile.txt"); * * int retval = archive.AddListFile(@"base-win-listfile.txt"); * archive.Compact("base-win-listfile.txt"); * archive.Flush(); * } */ Console.WriteLine("<enter> to exit."); Console.ReadLine(); }
public List <string> GetAllPaths() { List <string> returner = new List <string>(); //Look in map file first if (ProjectProperties.CurrentProjectPropperties.InputMap != null && ProjectProperties.CurrentProjectPropperties.InputMap.Exists) { if (ProjectProperties.CurrentProjectPropperties.InputMap is FileInfo) { using ( MpqEditor.MpqReader reader = new MpqEditor.MpqReader(ProjectProperties.CurrentProjectPropperties.InputMap.FullName)) { string[] files = reader.FindFiles(SupportedFiles); foreach (string file in files) { if (!returner.Contains(file)) { returner.Add(file); } } } } } //Look in standard library after if (Options.General.SC2Exe == null || !Options.General.SC2Exe.Exists) { RegistryKey key = Registry.LocalMachine; key = key.OpenSubKey("SOFTWARE\\Wow6432Node\\Blizzard Entertainment\\Starcraft II Retail"); Options.General.SC2Exe = new FileInfo((string)key.GetValue("GamePath")); } string sc2Dir = Options.General.SC2Exe.Directory.FullName; //no need to find new versions, just peek into the data directory to get all file path. //SC2Assets\Assets\Textures DirectoryInfo versionDir = new DirectoryInfo(Options.General.SC2Exe.Directory + @"\SC2Data"); String strModDir = versionDir.FullName; using (CascStorageContext casc = new CascStorageContext(strModDir)) { var files = casc.SearchFiles("*");//currently, only * operation is supported. foreach (var file in files) { //ignore if (!file.FileName.Contains(@"base.sc2assets/Assets/Textures/")) { continue; } bool supported = false; foreach (var ftype in SupportedFiles) { if (file.FileName.EndsWith(ftype.Substring(1))) { supported = true; } } if (!supported) { continue; } //add files to returner if (!returner.Contains(file.FileName)) { returner.Add(file.FileName); } } } //look in mod directories Stack <DirectoryInfo> modDirs = new Stack <DirectoryInfo>(); modDirs.Push(new DirectoryInfo(Options.General.SC2Exe.Directory + @"\Mods")); List <FileInfo> modfiles = new List <FileInfo>(); //parse base mods and store SC2Mod files while (modDirs.Count != 0) { DirectoryInfo curVdir = modDirs.Pop(); if (!curVdir.Exists) { continue; } foreach (var subDir in curVdir.GetDirectories()) { List <FileInfo> filesToSearch = new List <FileInfo>(); filesToSearch.AddRange(subDir.GetFiles("*.SC2Mod")); if (filesToSearch.Count > 0) { modfiles.AddRange(filesToSearch); } filesToSearch.Clear(); } } //Read Assets\Textures\files foreach (var archive in modfiles) { MpqEditor.MpqReader fileReader = new MpqEditor.MpqReader(archive.FullName); { if (!fileReader.Valid) { continue; } //fileReader.FindFiles("*.SC2Data"); foreach (var supportedfile in SupportedFiles) { string[] textureFiles = fileReader.FindFiles("Assets\\Textures\\" + supportedfile); foreach (var imagefile in textureFiles) { if (!returner.Contains(imagefile)) { returner.Add(imagefile); } } } fileReader.Dispose(); } } //no need to find new versions //StarCraft II\Versions\<newest>\patch.SC2Archive\Mods\Core.SC2Mod\Base.SC2Assets\Assets\Textures\.. //StarCraft II\Versions\<newest>\patch.SC2Archive\Mods\Liberty.SC2Mod\Base.SC2Assets\Assets\Textures\.. //StarCraft II\Versions\<newest>\patch.SC2Archive\Campaigns\Liberty.SC2Campaign\Base.SC2Assets\Assets\Textures\.. //StarCraft II\Mods\Core.SC2Mod\base.SC2Assets\Assets\Textures\.. //StarCraft II\Mods\Liberty.SC2Mod\base.SC2Assets\Assets\Textures\.. //StarCraft II\Mods\Liberty.SC2Mod\enGB.SC2Assets\Assets\Textures\.. //StarCraft II\*.SC2Assets|Assets\Textures\.. returner.Sort(); return(returner); }