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 Texture2D Load(string path, GraphicsDevice device) { if (LoadedTextures.ContainsKey(path)) { LoadedTexture texture = LoadedTextures[path]; texture.UsedCount++; return(texture.Texture); } //check long path //if(path.StartsWith("Assess")) //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)) { if (reader.HasFile(path)) { byte[] rawFile = reader.ExtractFile(path); using (MemoryStream stream = new MemoryStream(rawFile)) { //Texture tex = Texture.FromFile(device, stream); //Texture2D texture; //if (tex is Texture2D) //{ // texture = (Texture2D)tex; //} //else //{ // /*MessageBox.Show( // "Unable to load texture:\n" + path + // "\nBecause it is not a two dimentional texture.", "Error");*/ // return null; //} Texture2D texture = null; DDSLib.DDSFromStream(stream, device, 0, true, out texture); if (texture == null) { return(null); } LoadedTextures.Add(path, new LoadedTexture() { Texture = texture, UsedCount = 1 }); return(texture); } } } } } //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"); if (key != null) { Options.General.SC2Exe = new FileInfo((string)key.GetValue("GamePath")); } else { MessageBox.Show(Form1.Form, "I lost track of where Starcraft II is located. Can you help me?", "Missing data"); OpenFileDialog dialog = new OpenFileDialog(); dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); dialog.InitialDirectory = dialog.InitialDirectory.Substring(0, dialog.InitialDirectory.IndexOf("\\")); dialog.Filter = "StarCraft II (Starcraft II.exe)|Starcraft II.exe"; if (dialog.ShowDialog(Form1.Form) == DialogResult.Cancel) { return(null); } Options.General.SC2Exe = new FileInfo(dialog.FileName); } } //can only get the file from the casc file system. DirectoryInfo DataDir = new DirectoryInfo(Options.General.SC2Exe.Directory + @"\SC2Data"); String strDataDir = DataDir.FullName; using (CascStorageContext casc = new CascStorageContext(strDataDir)) { try { using (var file = casc.OpenFile(path)) {//currently, only * operation is supported. byte[] rawFile = ReadAllBytes(file); using (MemoryStream stream = new MemoryStream(rawFile)) { Texture2D texture = null; DDSLib.DDSFromStream(stream, device, 0, true, out texture); if (texture == null) { return(null); } LoadedTextures.Add(path, new LoadedTexture() { Texture = texture, UsedCount = 1 }); return(texture); } } }catch (Exception ex) { } } //load textures from 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[] files = fileReader.FindFiles("Assets\\Textures\\" + supportedfile); foreach (var file in files) { int i = file.LastIndexOf("Assets\\Textures"); if (i == -1) { continue; } string fileName = file.Substring(i); if (fileName == path) { byte[] rawFile = fileReader.ExtractFile(file); using (MemoryStream stream = new MemoryStream(rawFile)) { Texture2D texture = null; try { DDSLib.DDSFromStream(stream, device, 0, true, out texture); } catch (Exception ex) { } if (texture == null) { return(null); } LoadedTextures.Add(path, new LoadedTexture() { Texture = texture, UsedCount = 1 }); return(texture); } } } } } } //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\.. return(null); }