Создание своего инстяллятора для модов
| |
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
|
|
| |
dim1988 |
Дата: Воскресенье, 15.01.2012, 12:39 | Сообщение # 2 |
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: 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 |
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: 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 байта? Ты перепутал байты с битами |
|
| |
dim1988 |
Дата: Воскресенье, 22.01.2012, 16:24 | Сообщение # 13 |
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: 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 |
Создатель
Группа: Администраторы
Сообщений: 2242
Статус: 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 клиент есть с исходниками, а инсталлятора нет... Жаль. А ломать 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 писал? Вспомни. Релиз будет, но когда и что я не знаю. Ещё надо базу для него найти и оформить нормально, а то байду делать не хочется. |
|
| |
|