HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Экспорт из pak архива. (https://hlfx.ru/forum/showthread.php?threadid=2882)
Отправлено Alex_Gordon 13-06-2011 в 12:31:
Экспорт из pak архива.
Ковырял код HLMV, нашел там функцию экспорта из pak'ов:
C++ Source Code:
1 | int pak_ExtractFile (const char *pakFile, const char *lumpName, char *outFile) |
3 | FILE *file = fopen (pakFile, "rb"); |
7 | int ident, dirofs, dirlen; |
9 | fread (&ident, sizeof (int), 1, file); |
10 | if (ident != (int) (('K' << 24) + ('C' << 16) + ('A' << 8) + 'P')) |
16 | fread (&dirofs, sizeof (int), 1, file); |
17 | fread (&dirlen, sizeof (int), 1, file); |
19 | fseek (file, dirofs, SEEK_SET); |
20 | int numLumps = dirlen / 64; |
22 | for (int i = 0; i < numLumps; i++) |
27 | fread (name, 56, 1, file); |
28 | fread (&filepos, sizeof (int), 1, file); |
29 | fread (&filelen, sizeof (int), 1, file); |
31 | if (!mx_strcasecmp (name, lumpName)) |
33 | FILE *out = fopen (outFile, "wb"); |
40 | fseek (file, filepos, SEEK_SET); |
43 | fputc (fgetc (file), out); |
В принципе она работает. Я попытался пихнуть ее в консольное приложение - все отлично работает, но выгружает только файлы, лежащие в корне пака. Например, titles.txt выгружает, а models\barney.mdl - нет. Никак не могу понять в чем проблема. И собственно - в чем проблема?
Добавлено 13-06-2011 в 18:31:
Я идиот! Слэш не в ту сторону ставил

__________________
Ха, тюремный автомобиль!!!
Ιερά λάμδα
Quisque moritur Gordon sinistram. Alex Gordon.
Отправлено Jimmy C. 13-06-2011 в 12:49:
Этих пакеров пруд пруди. вот кто бы сделал импорт файлов в .nar архивы (cso)
P.S экспорт из .nar уже сделан.
__________________
Все что делает маппер, программист делает в движке, поскольку ему лень. ©Дядя Миша

Отправлено XaeroX 13-06-2011 в 12:55:
(epeFk@
Где это в халфе юзаются .nar архивы? 
__________________
Отправлено Jimmy C. 13-06-2011 в 12:56:
Цитата:
(epeFk@ писал:
(cso)
Counter-Strike Online,китайская контра,там вместо пак юзаются нар__________________
Все что делает маппер, программист делает в движке, поскольку ему лень. ©Дядя Миша

Отправлено Alex_Gordon 13-06-2011 в 13:27:
Слушайте, а не подскажете какую-нибудь функцию для записи файла в пак?
__________________
Ха, тюремный автомобиль!!!
Ιερά λάμδα
Quisque moritur Gordon sinistram. Alex Gordon.
Отправлено Дядя Миша 13-06-2011 в 15:03:
Цитата:
Alex_Gordon писал:
Я идиот! Слэш не в ту сторону ставил
известная трабла. Наверное все на эти грабли хоть раз, да наступали.
Еще следи, чтобы у тебя там был stricmp вместо strcmp. В паках регистр не учитывается. Точнее говоря программки для создания паков его игнорируют.
Цитата:
Alex_Gordon писал:
Слушайте, а не подскажете какую-нибудь функцию для записи файла в пак?
Функцию не подскажу, но могу объяснить принцип на пальцах.
В самом начале файла у нас лежит два LittleLong.
Первый содержит в себе буквы PACK - это идентификатор.
Второй - смещение от начала файла до оглавления. Оглавление находится в самом конце файла, и поскольку его размер заранее неизвестен, то высчитать оффсет с конца файла не получится да и не нужно.
Принцип записи для простого, ламерского варианта:
1. открываем пак
2. считываем всё файло в память\делаем копию пака в виде tmp-файла
3. создаем новый пак
4. пишем туда идентификатор PACK, и пустую переменную в 4 байта.
5. записываем дальше все наши файлы как были
6. записываем новый файл, делаем отметку о новом файле в оглавлении (имя, начало и размер), само оглавление пока лежит в памяти
7. запоминаем место записи последнего файла, сохраняем в переменную то что вернет ftell
8. пишем наше новое оглавление (с учетом добавленного файла)
9. возвращаемся в начало + 4 байта и записываем то что нам вернул ftell в седьмом пункте.
10.Профит
Принцип записи для красивого проффесионального варианта:
1.открываем пак
2.считываем оглавление в память
3.добавляем в оглавление наш новый файлик (оглавлениев памяти)
4.делаем fssek на начало оглавление и перезатираем его новым файлом
5.запоминаем где конец файла при помощи ftell, сохраняем в переменную
6.пишем оглавление (с учетом добавленного файла)
7.возвращаемся в начало + 4 байта и записываем то, что нам вернул ftell в шестом пункте
8.Профит
Добавлено 13-06-2011 в 18:59:
ЗЫ. Если уж совсем никак непонятно - открой в ксаше filesystem.c, промотай в самый конец и кури работу с вадами, там будет добавлялка лумпов в вад, по вышеописанному принципу. Хотя вад это и не пак, но они во многом схожи, будет проще разобраться на примере.
Добавлено 13-06-2011 в 19:03:
Упс. Я извиняюсь, я этот функционал вырезал из финальной версии ксаша.
Вот в аттаче старая версия, где он еще имеется.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'