Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }