| 1 | #include <iostream>
|
|---|
| 2 | #include "StormLib.h"
|
|---|
| 3 |
|
|---|
| 4 | using namespace std;
|
|---|
| 5 |
|
|---|
| 6 | int main(int argc, char* argv[])
|
|---|
| 7 | {
|
|---|
| 8 | if (argc > 1)
|
|---|
| 9 | if(strcmp(argv[1],"-h")==0){
|
|---|
| 10 | cout << "Program for add file to MPQ file."<< endl;
|
|---|
| 11 | cout << "Suported by projekt wowpreklad (wowpreklad.zdechov.net)."<< endl;
|
|---|
| 12 | cout << "Created by maron"<< endl;
|
|---|
| 13 | cout << "email: maron2@centrum.cz\n"<< endl;
|
|---|
| 14 | cout << "Parameters:"<< endl;
|
|---|
| 15 | cout << " -h --help write this help"<< endl;
|
|---|
| 16 | cout << "Usage:\n"<< argv[0]<< " MPQ_Archive file file\patch\in\win\\in\\linux " << endl;
|
|---|
| 17 |
|
|---|
| 18 | return 0;
|
|---|
| 19 | }
|
|---|
| 20 | // argc = 4;
|
|---|
| 21 | // argv[1] = "patch-5.MPQ";
|
|---|
| 22 | // argv[2] = "Interface\\FrameXML\\GlobalStrings.lua";
|
|---|
| 23 | // argv[3] = "Achievement.dbc";
|
|---|
| 24 |
|
|---|
| 25 | if (argc < 4){
|
|---|
| 26 | cout << "Bad count of argumets!"<< endl;
|
|---|
| 27 | return 1;
|
|---|
| 28 | }
|
|---|
| 29 |
|
|---|
| 30 | HANDLE hMpq = NULL;
|
|---|
| 31 | HANDLE hFile = NULL;
|
|---|
| 32 | ULONGLONG FileSize = 0;
|
|---|
| 33 | ULONGLONG ByteOffset;
|
|---|
| 34 | TFileStream * pStream = NULL;
|
|---|
| 35 |
|
|---|
| 36 | SFileSetLocale(0x405);
|
|---|
| 37 |
|
|---|
| 38 |
|
|---|
| 39 | pStream = FileStream_OpenFile(argv[3], false);
|
|---|
| 40 | if(pStream == NULL){
|
|---|
| 41 | cout << "Error opening file" << endl;
|
|---|
| 42 | return 1;
|
|---|
| 43 | }
|
|---|
| 44 | if(!FileStream_GetSize(pStream, &FileSize)){
|
|---|
| 45 | cout << "Error geting size file" << endl;
|
|---|
| 46 | return 1;
|
|---|
| 47 | }
|
|---|
| 48 |
|
|---|
| 49 | if (!SFileOpenArchive(argv[1], 0, 0, &hMpq)){
|
|---|
| 50 | cout << "Error open archive!" << endl;
|
|---|
| 51 | return 1;
|
|---|
| 52 | }
|
|---|
| 53 |
|
|---|
| 54 | ULONGLONG EndOffset = ByteOffset + FileSize;
|
|---|
| 55 | BYTE pbCopyBuffer[0x7000];
|
|---|
| 56 | DWORD BytesToRead;
|
|---|
| 57 | DWORD BlockLength = 0x7000;
|
|---|
| 58 |
|
|---|
| 59 | if(!SFileCreateFile(hMpq, argv[2], 0, FileSize, 0, MPQ_FILE_REPLACEEXISTING, &hFile))
|
|---|
| 60 | {
|
|---|
| 61 | cout << "Error creating file" << endl;
|
|---|
| 62 | return 1;
|
|---|
| 63 | }
|
|---|
| 64 |
|
|---|
| 65 | if(pbCopyBuffer != NULL)
|
|---|
| 66 | {
|
|---|
| 67 | while(ByteOffset < EndOffset)
|
|---|
| 68 | {
|
|---|
| 69 | // Notify the user
|
|---|
| 70 |
|
|---|
| 71 | // Read source
|
|---|
| 72 | BytesToRead = ((EndOffset - ByteOffset) > BlockLength) ? BlockLength : (DWORD)(EndOffset - ByteOffset);
|
|---|
| 73 | if(!FileStream_Read(pStream, &ByteOffset, pbCopyBuffer, BytesToRead))
|
|---|
| 74 | {
|
|---|
| 75 | cout << "Error reading file" << endl;
|
|---|
| 76 | return 1;
|
|---|
| 77 | }
|
|---|
| 78 | if(!SFileWriteFile(hFile, pbCopyBuffer, BytesToRead, MPQ_COMPRESSION_ZLIB))
|
|---|
| 79 | {
|
|---|
| 80 | cout << "Error writing" << endl;
|
|---|
| 81 | return 1;
|
|---|
| 82 | }
|
|---|
| 83 | // cout << pbCopyBuffer << endl;
|
|---|
| 84 | ByteOffset += BytesToRead;
|
|---|
| 85 | }
|
|---|
| 86 | }
|
|---|
| 87 |
|
|---|
| 88 | cout << argv[3] << " Done!" <<endl;
|
|---|
| 89 |
|
|---|
| 90 | SFileSetLocale(0x405);
|
|---|
| 91 | SFileCompactArchive(hMpq, NULL, 0);
|
|---|
| 92 | SFileCloseArchive(hMpq);
|
|---|
| 93 | return 0;
|
|---|
| 94 | }
|
|---|