HLFX.Ru Forum
Показать все 6 сообщений этой темы на одной странице

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)
2
{
3
  FILE *file = fopen (pakFile, "rb");
4
  if (!file)
5
    return 0;
6
 
7
  int ident, dirofs, dirlen;
8
 
9
  fread (&ident, sizeof (int), 1, file);
10
  if (ident != (int) (('K' << 24) + ('C' << 16) + ('A' << 8) + 'P'))
11
  {
12
    fclose (file);
13
    return 0;
14
  }
15
 
16
  fread (&dirofs, sizeof (int), 1, file);
17
  fread (&dirlen, sizeof (int), 1, file);
18
 
19
  fseek (file, dirofs, SEEK_SET);
20
  int numLumps = dirlen / 64;
21
 
22
  for (int i = 0; i < numLumps; i++)
23
  {
24
    char name[56];
25
    int filepos, filelen;
26
 
27
    fread (name, 56, 1, file);
28
    fread (&filepos, sizeof (int), 1, file);
29
    fread (&filelen, sizeof (int), 1, file);
30
 
31
    if (!mx_strcasecmp (name, lumpName))
32
    {
33
      FILE *out = fopen (outFile, "wb");
34
      if (!out)
35
      {
36
        fclose (file);
37
        return 0;
38
      }
39
 
40
      fseek (file, filepos, SEEK_SET);
41
 
42
      while (filelen--)
43
        fputc (fgetc (file), out);
44
 
45
      fclose (out);
46
      fclose (file);
47
 
48
      return 1;
49
    }
50
  }
51
 
52
  fclose (file);
53
 
54
  return 0;
55
}


В принципе она работает. Я попытался пихнуть ее в консольное приложение - все отлично работает, но выгружает только файлы, лежащие в корне пака. Например, 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 архивы?

__________________

xaerox on Vivino


Отправлено 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'


Временная зона GMT. Текущее время 23:18.
Показать все 6 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024