HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Экспорт из pak архива.
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Alex_Gordon
Добрых дел мастер

Группа: Неопытный
Дата регистрации: Mar 2010
Проживает: Екатеринбург
Сообщений: 651
Возраст: 34

Рейтинг



Экспорт из 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.


Сообщить модератору | | IP: Записан
Сообщение: 79038

Старое сообщение 13-06-2011 12:31
- За что?
Jimmy C.
Житель форума

Дата регистрации: Aug 2010
Проживает: (void)
Сообщений: 618
Возраст: 28

Рейтинг



Этих пакеров пруд пруди. вот кто бы сделал импорт файлов в .nar архивы (cso)
P.S экспорт из .nar уже сделан.

__________________
Все что делает маппер, программист делает в движке, поскольку ему лень. ©Дядя Миша

Сообщить модератору | | IP: Записан
Сообщение: 79039

Старое сообщение 13-06-2011 12:49
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34553
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


(epeFk@
Где это в халфе юзаются .nar архивы?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 79040

Старое сообщение 13-06-2011 12:55
-
Jimmy C.
Житель форума

Дата регистрации: Aug 2010
Проживает: (void)
Сообщений: 618
Возраст: 28

Рейтинг



Цитата:
(epeFk@ писал:
(cso)

Counter-Strike Online,китайская контра,там вместо пак юзаются нар

__________________
Все что делает маппер, программист делает в движке, поскольку ему лень. ©Дядя Миша

Сообщить модератору | | IP: Записан
Сообщение: 79041

Старое сообщение 13-06-2011 12:56
- За что?
Alex_Gordon
Добрых дел мастер

Группа: Неопытный
Дата регистрации: Mar 2010
Проживает: Екатеринбург
Сообщений: 651
Возраст: 34

Рейтинг



Слушайте, а не подскажете какую-нибудь функцию для записи файла в пак?

__________________
Ха, тюремный автомобиль!!!

Ιερά λάμδα

Quisque moritur Gordon sinistram. Alex Gordon.


Сообщить модератору | | IP: Записан
Сообщение: 79044

Старое сообщение 13-06-2011 13:27
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32248
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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:

Упс. Я извиняюсь, я этот функционал вырезал из финальной версии ксаша.
Вот в аттаче старая версия, где он еще имеется.

Вложение: fs.zip (24.6 кб)
Этот файл был скачан 179 раз.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 79045

Старое сообщение 13-06-2011 15:03
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 18:23. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Экспорт из pak архива.
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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