public unsafe CascFoundFile ToFoundFile(CascStorageContext ownerContext) { string fileName = null; fixed(void *pFileName = szFileName) { fileName = Marshal.PtrToStringAnsi(new IntPtr(pFileName)); } byte[] encodingKey = new byte[16]; fixed(void *pEncodingKey = EncodingKey) { Marshal.Copy(new IntPtr(pEncodingKey), encodingKey, 0, 16); } return(new CascFoundFile(fileName, szPlainName, encodingKey, (CascLocales)dwLocaleFlags, dwFileSize, ownerContext)); }
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 unsafe CascFoundFile ToFoundFile(CascStorageContext ownerContext) { string fileName = null; fixed (void* pFileName = szFileName) { fileName = Marshal.PtrToStringAnsi(new IntPtr(pFileName)); } byte[] encodingKey = new byte[16]; fixed (void* pEncodingKey = EncodingKey) { Marshal.Copy(new IntPtr(pEncodingKey), encodingKey, 0, 16); } return new CascFoundFile(fileName, szPlainName, encodingKey, (CascLocales)dwLocaleFlags, dwFileSize, ownerContext); }
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); }
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); }