Exemplo n.º 1
0
        public void Save(FpmfArchive archive, string directoryPath)
        {
            DirectoryInfo directory = new DirectoryInfo(directoryPath);

            if (!directory.Exists)
            {
                throw new FileNotFoundException($"Directory: {directoryPath} not found.");
            }


            string relativeArchiveDir = archive.DatPath
                                        .Replace("/%08x.dat", "")
                                        .Replace("./", "")
                                        .Replace('/', Path.DirectorySeparatorChar);

            string rootPath = Path.Combine(directory.FullName, relativeArchiveDir);

            List <FpmfArchiveFile> files = archive.GetFiles();

            foreach (FpmfArchiveFile file in files)
            {
                string relativeFilePath = file.FilePath
                                          .Replace(".\\", "")
                                          .Replace('\\', Path.DirectorySeparatorChar);
                string filePath = Path.Combine(rootPath, relativeFilePath);

                FileInfo fileInfo = new FileInfo(filePath);
                if (!Directory.Exists(fileInfo.DirectoryName))
                {
                    Directory.CreateDirectory(fileInfo.DirectoryName);
                }

                File.WriteAllBytes(filePath, file.Data);
            }
        }
        private void SavePack(FpmfArchive archive, string inPath, string outPath, string archiveName)
        {
            Directory.CreateDirectory(outPath);
            IBuffer fileBuff   = new StreamBuffer();
            IBuffer headerBuff = new StreamBuffer();
            List <FpmfArchiveFile> archiveFiles = archive.GetFiles();

            foreach (FpmfArchiveFile archiveFile in archiveFiles)
            {
                fileBuff.WriteByte((byte)archiveFile.directoryPathSize);
                fileBuff.WriteCString(archiveFile.directoryPath);
                fileBuff.Position = fileBuff.Position - 1;
                fileBuff.WriteByte((byte)archiveFile.filePathSize);
                fileBuff.WriteCString(archiveFile.filePath);
                fileBuff.Position = fileBuff.Position - 1;
                fileBuff.WriteUInt32(archiveFile.datNumber);
                fileBuff.WriteUInt32(archiveFile.offset);
                fileBuff.WriteUInt32(archiveFile.size);
                fileBuff.WriteUInt32(archiveFile.unknown0);
                fileBuff.WriteUInt32(archiveFile.unknown1);
            }

            headerBuff.WriteBytes(_MagicBytes);
            headerBuff.WriteInt32(0);
            headerBuff.WriteUInt32(archive.unknown0);
            headerBuff.WriteUInt32(archive.unknown1);
            headerBuff.WriteUInt32(archive.unknown2);
            headerBuff.WriteByte(archive.unknown3);
            headerBuff.WriteByte(archive.unknown4);
            headerBuff.WriteUInt32(archive.unknown5);
            headerBuff.WriteInt32(archive.datPath.Length + 9);
            headerBuff.WriteByte((byte)archive.datPath.Length);
            headerBuff.WriteCString(archive.datPath);
            headerBuff.Position = headerBuff.Position - 1;
            uint type = 0;

            switch (archiveName)
            {
            case "script":
            case "settings":
            case "item":
            case "interface":
                type = 1;
                break;

            case "help_end":
                type = 2;
                break;
            }

            headerBuff.WriteUInt32(type);
            headerBuff.WriteUInt32(archive.unknown8);
            headerBuff.WriteUInt32(archive.unknown9);
            headerBuff.WriteUInt32(archive.unknown10);
            headerBuff.WriteInt32(archive.key.Length);
            headerBuff.WriteBytes(archive.key);
            headerBuff.WriteUInt32(archive.unknown11);
            headerBuff.WriteInt32(fileBuff.Size + 4);
            headerBuff.WriteUInt32(archive.numFiles);
            headerBuff.WriteBytes(fileBuff.GetAllBytes());

            headerBuff = EncryptHed(headerBuff);

            string       hedPath      = outPath.Substring(0, outPath.LastIndexOf("\\")) + ".hed";
            BinaryWriter headerWriter = new BinaryWriter(File.Open(hedPath, FileMode.Create));

            headerBuff.Position = 4;
            headerBuff.WriteInt32(headerBuff.Size - 12);
            headerWriter.Write(headerBuff.GetAllBytes(), 0, headerBuff.Size);
            headerWriter.Flush();
            headerWriter.Close();

            BinaryWriter datWriter = new BinaryWriter(File.Open(outPath + "\\" + "00000000.dat", FileMode.Create));
            IBuffer      outBuff   = new StreamBuffer();

            foreach (FpmfArchiveFile archiveFile in archiveFiles)
            {
                string  inputFile     = inPath + "\\" + archiveName + archiveFile.filePath.Substring(1);
                IBuffer datFileReader = new StreamBuffer(inputFile);
                datFileReader = EncryptDat(datFileReader, archive.key);
                outBuff.WriteBytes(datFileReader.GetAllBytes());
            }

            datWriter.Write(outBuff.GetAllBytes(), 0, outBuff.Size);
            datWriter.Flush();
            datWriter.Close();
        }