- 4,795
- 6,468
- Версия SA-MP
-
- 0.3.7 (R1)
- 0.3.7-R2
- 0.3.7-R3
- 0.3.7-R4
- 0.3DL
- 0.3e (R1) / CR-MP
- CR-MP 0.3.7
- Любая
- Другая
NIH-синдром процветал и я начал писать свой AsiLoader.
Всем известно, что asi это те же самые dll, но с другим расширением. Вероятно другое расширение было выбрано, что бы было проще грузить пользовательские библиотеки, но при этом не загружать лишних библиотек от всяких редакторов ресурсов, которые пользователь может установить в директорию с игрой. AsiLoader от silent способен так же грузить и dll, однако их надо прописать в специальном файле конфигураций, о котором по самым оптимальным оценкам не знает 95% пользователей. И меня пичалил данный факт. Дело в том, что файл с расширением dll имеет одно маловажное, но очень приятное преимущество над asi - проводник windows умеет показывать дополнительную информацию в свойствах для .dll файлов. Вроде мелочь, но в этих свойствах можно указать ряд полезной информации: версию, автора и краткое описание. Данные поля могут быть крайне полезны, по скольку не все пользователи могут с ходу сказать какой версии у них плагины, и что именно они делают, пример тому куча тем, когда пользователи спрашивают что делает тот или иной asi или пытаются использовать не совместимые версии библиотек (почитай самп, сф и плагины к сф).
Таким образом было решено, что нужен новый asi-loader, который будет грузить dll-плагины и будет иметь понятный ini-файл. Таки примерно такое и получилось, однако в процессе планирования вылезли дополнительные идеи, которые могут быть в нем реализованы:
Скачать asi-loader можно тут: AsiLoader
Пример использования функций `load` и `unload` в dll-плагине:
Это код на C, для C++ перед void надо будет дописать еще extern "C"
А если вы используете студийный компилятор, то надо еще перед void дописать __declspec(dllexport)
Установка на чистую игру:
У данного вариант есть недостаток - в зависимости от того какой у Вас установлен asi-loader, может не работать стадия загрузки crtMain и запуск сампа из консоли. Решение - использовать вариант №2 (см. ниже), либо не использовать 2 asi-loader'а одновременно.
Установка на игру с другим asi-loader'ом без удаления старого asi-loader'а (вариант №2 - использование имеющегося asi-loader'а как proxy):
Запуск SAMP из консоли:
Всем известно, что asi это те же самые dll, но с другим расширением. Вероятно другое расширение было выбрано, что бы было проще грузить пользовательские библиотеки, но при этом не загружать лишних библиотек от всяких редакторов ресурсов, которые пользователь может установить в директорию с игрой. AsiLoader от silent способен так же грузить и dll, однако их надо прописать в специальном файле конфигураций, о котором по самым оптимальным оценкам не знает 95% пользователей. И меня пичалил данный факт. Дело в том, что файл с расширением dll имеет одно маловажное, но очень приятное преимущество над asi - проводник windows умеет показывать дополнительную информацию в свойствах для .dll файлов. Вроде мелочь, но в этих свойствах можно указать ряд полезной информации: версию, автора и краткое описание. Данные поля могут быть крайне полезны, по скольку не все пользователи могут с ходу сказать какой версии у них плагины, и что именно они делают, пример тому куча тем, когда пользователи спрашивают что делает тот или иной asi или пытаются использовать не совместимые версии библиотек (почитай самп, сф и плагины к сф).
Таким образом было решено, что нужен новый asi-loader, который будет грузить dll-плагины и будет иметь понятный ini-файл. Таки примерно такое и получилось, однако в процессе планирования вылезли дополнительные идеи, которые могут быть в нем реализованы:
- Ручная перезагрузка плагинов не выходя из игры
- Небольшое базовое API, которое могли бы использовать плагины (с этой идеей @FYP носится наверно последние 2 года, что ж попробую реализовать)
- Загрузка asi и dll на самой ранней стадии, перед выполнением функции _CrtMain
- Выполнение функции `load` из dll-плагинов, данная функция должна дать безопасный аналог выполнению кода в DllMain::DLL_PROCESS_ATTACH
- Выполнение функции `unload` из dll-плагинов
- Возможность загружать плагины в отложенной стадии, когда кишки игры уже инициализированы
- Возможность успользовать произвольную прокси-библиотеку для VorbisFile, что позволяет использовать несколько asi-loader'ов одновременно
- Возможность предзагрузки любых библиотек (можно указать samp.dll в предзагрузку и запускать samp из командной строки без лончера)
- Возможность отлючения автоматических загрузчиков asi и dll
- Наличие черного списка для загружаемых плагинов
- Простой ini с подсказками, который создается после первого запуска игры
- Режим разработчика:
- Плагины не блокируются на диске (можно обновлять не закрывая игру)
- Авто-перезагрузка плагинов при изменении
- Авто-выгрузка удаленных плагинов
- Авто-загрузка новых плагинов
Скачать asi-loader можно тут: AsiLoader
Пример использования функций `load` и `unload` в dll-плагине:
C++:
#include <windows.h>
#define crtMainLoad 0
#define GetStartupInfoALoad 1
#define mainloopLoad 2
#define devCrtMainLoad 3
#define devGetStartupInfoALoad 4
#define devMainloopLoad 5
#define devLoad 6
#define load 7
void load(char loadType)
{
switch (loadType){
case crtMainLoad:
MessageBoxA(0, "crtMainLoad", "Test", 0);
break;
case GetStartupInfoALoad:
MessageBoxA(0, "GetStartupInfoALoad", "Test", 0);
break;
case mainloopLoad:
MessageBoxA(0, "mainloopLoad", "Test", 0);
break;
case devCrtMainLoad:
MessageBoxA(0, "devCrtMainLoad", "Test", 0);
break;
case devGetStartupInfoALoad:
MessageBoxA(0, "devGetStartupInfoALoad", "Test", 0);
break;
case devMainloopLoad:
MessageBoxA(0, "devMainloopLoad", "Test", 0);
break;
case devLoad:
MessageBoxA(0, "devLoad", "Test", 0);
break;
case load:
MessageBoxA(0, "load", "Test", 0);
break;
};
}
void unload()
{
// safe some data (example write ini file)
}
А если вы используете студийный компилятор, то надо еще перед void дописать __declspec(dllexport)
Установка на чистую игру:
- переместить скаченый VorbisFile в папку с игрой
- согласится на замену файла
- переименовать скаченный VorbisFile в VorbisHooked
- переместить VorbisHooked (тот что переименовали из VorbisFile) в папку с игрой
- согласится на замену файла
- создать в папке с игрой файл VorbisFile.ini со следующим содержанием:
INI:
[AsiLoader]
enable="false"
[DllLoader]
loadState="GetStartupInfoA"
Установка на игру с другим asi-loader'ом без удаления старого asi-loader'а (вариант №2 - использование имеющегося asi-loader'а как proxy):
- переименовать VorbisFile в папке с игрой в AsiLoader
- переместить скаченный VorbisFile в папку с игрой
- создать в папке с игрой файл VorbisFile.ini со следующим содержанием:
INI:
[Config]
proxy="AsiLoader"
[AsiLoader]
enable="false"
Запуск SAMP из консоли:
- Если ранее игра не запускалась, то запустить и выйти.
- В файле VorbisFile.ini в секции Config в preload записать samp.dll, что бы было так: preload="samp.dll"
- В папке с игрй убедившись что нет выделеных файлов, а если есть, то сняв выделение, зажать Шифт и не отпуская нажать правую кнопку мыши, после чего в появившемся контестном меню выбрать пункт "Командная строка" (или как-то иначе он называется, не помню)
- Набрать в командной строке следующее: gta_sa.exe -c -n Kalcor -h 127.0.0.1 -p 7777
Последнее редактирование: