Создание своего инстяллятора для модов - Форум
Скрипты для GTA от dim1988 aka d88

Главная | Регистрация | Вход

Приветствую Вас Гость | RSS
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Другие темы » Моддинг » Создание своего инстяллятора для модов (Работа с IMG архивами на Deplhi)
Создание своего инстяллятора для модов
MrMADRYAN Дата: Воскресенье, 15.01.2012, 09:49 | Сообщение # 1
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
Для начала надо разобрать верхние строки. Архивы GTA имеют расширение .IMG. IMG-архивы - в пониманни Ashampoo Burning Studio 6 - образы диска, например, DVD, но при записи их выдаёт ошибку 103 I/O Err. Делятся архивы на 3 версии – VER1 (GTA III, GTA: Vice City), VER2 (GTA: San Andreas), VER3 - GTA IV

VER1
Архивы первой версии разделены на два файла – файл содержания архива .DIR и сам архив .IMG.
Файл директории .DIR содержит только всю информацию о файлах, содержащихся в самом архиве: смещение, размер, имя. Каждый блок информации о файлах равен 32 байтам. Отсюда мы можем узнать общее количество файлов в архиве – разделим размер файла директории на 32. Например, если размер файла директории равен 193 280 байтам, то 193 280 / 32 = 6040 файлов. Чтобы определить информацию о файлах, необходимо сделать цикл, повторяющийся n раз, где n – число файлов в архиве.
Вот так описывается содержимое блока:

4 байта - DWORD - смещение файла в архиве
4 байта - DWORD - размер файла в архиве
24 байта - CHAR[24] - имя файла

Чтобы узнать реальное смещение и размер файла в архиве – их следует умножать на 2048.

VER2
Архивы второй версии содержат файл директории и сам архив в одном файле .IMG. Вот его строение:

Заголовок:

4 байта - CHAR[4] - всегда имеет значение "VER2"
4 байта - DWORD - число файлов (n)

Содержимое: (повторяется n раз)

4 байта - DWORD - смещение файла от начала архива
4 байта - DWORD - размер файла в архиве
24 байта - CHAR[24] - имя файла

Далее расположены файлы.
Чтобы узнать реальное смещение и размер файла в архиве – их следует так же умножать на 2048. Смещения файлов начинаются не с конца таблицы содержимого, а с начала архива. Отсюда, немного пораскинув мозгами, можно понять, что если добавить слишком много файлов в архив и первый файл в архиве будет небольшого размера, то возникнут проблемы с работой.

Пример работы с архивами VER2 в Delphi

Есть множество способов работы с IMG-архивами в Delphi. Допустим, мы хотим получить список всех фалов в архиве и извечь какие-либо файлы в своей программе. Создаём новое приложение, кидаем на форму пять компонентов – TEdit, два TButton, TListView, TOpenDialog и TSaveDialog. Задайте компоненту TEdit имя CFileName, TListView – CFileList. CFileList разделите на 3 колонки – имя файла, размер и смещение.
Code

...

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
    Stream: TFileStream;  // Глобальная переменная, в которую мы будем загружать архив

implementation

{$R *.dfm}

...

Итак, жмём два раза на кнопке «Обзор», и вставляем в обработчик события OnClick такой вот код:

procedure TForm1.Button1Click(Sender: TObject);
var
  Size, Offset, FileNum, A : Integer;
  Name : PChar;
  FileName : String;
  ListItem : TListItem;
begin
  if OpenDialog1.Execute then
  begin
    CFileName.Text := OpenDialog1.FileName;
    Size := 0;
    Offset := 0;
    Name := PChar(AllocMem(24));                    
    CFileList.Clear;
    FileName := OpenDialog1.FileName;
    Stream := TFileStream.Create(FileName, fmOpenRead);   // Открываем архив для чтения
    Stream.Seek(4, 0);   // Пропускаем первые 4 байта, так как они всегда равны «VER2»
    Stream.Read(FileNum, 4);   // Считываем количество файлов
    for A := 0 to FileNum - 1 do  // Цикл считывания всех файлов
    begin
      Stream.Read(Offset, 4);   // Считываем смещение файла
      Stream.Read(Size, 4);   // Считываем размер файла
      Stream.Read(Name^, 24);  // Считываем имя файла
      ListItem := CFileList.Items.Add;                  //
      ListItem.Caption := Name;                         // Добавляем файл со всеми  
      ListItem.SubItems.Add(IntToStr(Size * 2048));     //      параметрами в список файлов
      ListItem.SubItems.Add(IntToStr(Offset * 2048));   //  
    end;
  end;
end;

Вот с этим кодом мы уже можем провести самую важную операцию – открыть IMG-архив. Скажу прямо, показанный мною пример имеет очень плохую производительность – оригинальный архив (16316 файлов) может открываться около 30 секунд, тк я в дельфи неочень, я больше знаю LUA и C++ Производительность зависит от используемых компонентов и классов (например, вместо TFileStream гораздо выгоднее использовать стандартные WinAPI-функции, но они требуют большего опыта в программировании).
Теперь нажмём два раза на кнопку «Извлечь» и вставляем в обработчик события такой вот код:
Это сам пример работы с IMG, в архиве ниже, а как писать сам инсталлятор, это уже не мои проблемы, ибо любой программер с этим справится (не новичёк)
На Ваши вопросы постараюсь ответить. Возможно сделаю версию для C++

Добавлено (15.01.2012, 09:49)
---------------------------------------------
Всё тестировал на Windows Vista x64, Delphi 7, GTA: Vice City

Прикрепления: IMG.rar(8Kb)




 
 
dim1988 Дата: Воскресенье, 15.01.2012, 12:39 | Сообщение # 2
Создатель
Группа: Администраторы
Сообщений: 2226
Статус: Offline
Минуточку, я думал ты выложишь готовый инсталлятор. А так я не понимаю, для кого эта тема – у нас тут много программистов что ли?

Mortal Kombat Conquest for GTA SA V2.0
GTA Invasion V2.0
Частная собственность
 
 
MrMADRYAN Дата: Воскресенье, 15.01.2012, 15:01 | Сообщение # 3
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
Эмм, а сложно понять что тут? Для меня это самое лёгкое.



 
 
dim1988 Дата: Воскресенье, 15.01.2012, 17:18 | Сообщение # 4
Создатель
Группа: Администраторы
Сообщений: 2226
Статус: Offline
Ну не знаю кто как, но лично я вообще ни один язык программирования не знаю.

Mortal Kombat Conquest for GTA SA V2.0
GTA Invasion V2.0
Частная собственность
 
 
MrMADRYAN Дата: Воскресенье, 15.01.2012, 17:28 | Сообщение # 5
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
dim1988, я понимаю. Раньше тоже вот так было со мной. Но учиться никогда не поздно, есть в сети оч много разных учебников, вот и можно учить. Я сам того не зная, тут выучил Pawno (на нём пишут моды для sa-mp), тк Pawno - Pawn C++. Я считаю, что как без инглиша, так и без хотя бы одного языка программирования не обойтись.



 
 
Scripter100 Дата: Понедельник, 16.01.2012, 10:01 | Сообщение # 6
Группа: Проверенные
Сообщений: 108
Замечания: 0%
Статус: Offline
MrMADRYAN, я тоже pawno неплохо знаю, C++ и pawno чем-то похожи, но C++ для меня не понятно)

 
 
MrMADRYAN Дата: Вторник, 17.01.2012, 18:10 | Сообщение # 7
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
Открою секрет, Pawno и C++ одно и тоже. Фактически Pawno - это Pawn Security Libraries в C++



 
 
GSoris Дата: Суббота, 21.01.2012, 14:51 | Сообщение # 8
Группа: Заблокированные
Сообщений: 56
Замечания: 20%
Статус: Offline
Quote (MrMADRYAN)
24 байта - CHAR[24] - имя файла

А разьве не 32 байта?
WinAPI легче, я устроил тест открытия архива по этой программе на разных системах, вот итоги:
Windows XP SP3 (win16) 16 разрядная - 49 секунд
Windows XP SP3 (win32) 32 разрядная - 36 секунд
Windows XP SP3 (win64) 64 рязрядная - 27 секунд
Однако ещё зависит от процессора и памяти!




 
 
SPIRITS Дата: Суббота, 21.01.2012, 18:46 | Сообщение # 9
Группа: Проверенные
Сообщений: 103
Замечания: 0%
Статус: Offline
Знаешь нужен инсталлятор всем но не всем дано выучить ЯП
есть программа для создание инсталлятора Smart Install Maker v 5.02 на русском языке
 
 
MrMADRYAN Дата: Суббота, 21.01.2012, 19:11 | Сообщение # 10
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
Я не понял, подробно напиши.



 
 
SPIRITS Дата: Суббота, 21.01.2012, 21:08 | Сообщение # 11
Группа: Проверенные
Сообщений: 103
Замечания: 0%
Статус: Offline
Я сказал , что инсталлятор нужен всем но не все могут выучить Язык программирования что бы его создать
 
 
MrMADRYAN Дата: Воскресенье, 22.01.2012, 12:38 | Сообщение # 12
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
Quote (SPIRITS)
инсталлятор нужен всем

- Это да, но у меня нет время собирать под каждого инсталлятор.
Quote (SPIRITS)
не все могут выучить Язык программирования что бы его создать

- И это да. Просто вот так совпало, что я по специальности - программист. А так, я стараюсь не использовать свои навыки в играх, тк на работе хватает по горло C++.

Добавлено (22.01.2012, 12:38)
---------------------------------------------

Quote (GSoris)
А разьве не 32 байта?

Ты перепутал байты с битами biggrin




 
 
dim1988 Дата: Воскресенье, 22.01.2012, 16:24 | Сообщение # 13
Создатель
Группа: Администраторы
Сообщений: 2226
Статус: Offline
Quote (MrMADRYAN)
но у меня нет время собирать под каждого инсталлятор.

А что, разве нельзя сделать один для всех? Почему?


Mortal Kombat Conquest for GTA SA V2.0
GTA Invasion V2.0
Частная собственность
 
 
MrMADRYAN Дата: Воскресенье, 22.01.2012, 17:33 | Сообщение # 14
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
dim1988, вообще-то можно. Но если делать, то делать нормально. С графикой, оформлением, кучей функционала и тому подобное. Вряд ли кто-то возьмётся рисовать графику для него. Сам я не умею. Только есла пара надписей.
Да и если делать, то делать уже на C++, я же написал, что тут 30 секунд на разбор архива.
А если уж говорить про время, то до десятых чисел марта у меня почти не будет время.

Добавлено (22.01.2012, 17:33)
---------------------------------------------
А вот так, примерно будет выглядеть это на C++
Code

// Заголовочные файлы для ввода-вывода
#include <iostream>
#include <fstream>
     
void printFileTwice (const char* filename)
{
      // Открытие файла
      std::ifstream file(filename);
     
      // Первый вывод содержимого
      std::cout << file.rdbuf();
     
      // Возврат к началу файла
      file.seekg(0);
     
      // Второй вывод содержимого
      std::cout << file.rdbuf();
}
     
int main (int argc, char* argv[])
{
      // Двукратный вывод всех файлов, переданных в командной строке
      for (int i=1; i<argc; ++i) {
          printFileTwice(argv[i]);
      }
}

Согласитесь - всё гораздо легче. Даже выглядит так.






Сообщение отредактировал MrMADRYAN - Воскресенье, 22.01.2012, 17:34
 
 
dim1988 Дата: Воскресенье, 22.01.2012, 19:08 | Сообщение # 15
Создатель
Группа: Администраторы
Сообщений: 2226
Статус: Offline
MrMADRYAN, а если просто подредактировать уже существующий инсталлятор? Хотя, наверное, нет таких, с которыми было бы разрешено делать что хочешь и распространять переделку.

Mortal Kombat Conquest for GTA SA V2.0
GTA Invasion V2.0
Частная собственность
 
 
MrMADRYAN Дата: Воскресенье, 22.01.2012, 19:33 | Сообщение # 16
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
dim1988, я посмотрел на Проекте Open Source ничего подобного, веди даже FTP клиент есть с исходниками, а инсталлятора нет... sad Жаль. А ломать InnoSetup или Nullsoft Installing System - не выход. Хотя по zlib лицензии есть вот NSIS, там язык C++, то, что и нужно мне, но одного zlib не достаточно для изменения ядра программы. Если я всё же решусь выпустить LUA Developer Kit for Windows x64, то инсталлятор с img сделаю сразу же.

Добавлено (22.01.2012, 19:33)
---------------------------------------------

Quote (SPIRITS)
Smart Install Maker

Тут не при чём. Поверь. Эта прога относится теме, как последний юзербар в моей подписи к этому сайту.




 
 
GSoris Дата: Пятница, 27.01.2012, 19:10 | Сообщение # 17
Группа: Заблокированные
Сообщений: 56
Замечания: 20%
Статус: Offline
MrMADRYAN, ты вместо этого лучше давай доделывай LUA for win64!



 
 
MrMADRYAN Дата: Суббота, 28.01.2012, 17:37 | Сообщение # 18
Группа: Проверенные
Сообщений: 387
Замечания: 40%
Статус: Offline
GSoris, сделал, но инсталлятор тоже не фигня. Я тебе вчера что в ICQ писал? smile Вспомни. Релиз будет, но когда и что я не знаю. Ещё надо базу для него найти и оформить нормально, а то байду делать не хочется.



 
 
Форум » Другие темы » Моддинг » Создание своего инстяллятора для модов (Работа с IMG архивами на Deplhi)
Страница 1 из 11
Поиск:

Copyright dim1988 aka d88 © 2017
Сайт управляется системой uCoz