Эксклюзив [WIP] AsiLoader

SR_team

like pancake
Автор темы
BH Team
4,707
6,347
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R2
  3. 0.3.7-R3
  4. 0.3.7-R4
  5. 0.3DL
  6. 0.3e (R1) / CR-MP
  7. CR-MP 0.3.7
  8. Любая
  9. Другая
NIH-синдром процветал и я начал писать свой AsiLoader.

Всем известно, что 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)
}
Это код на C, для C++ перед void надо будет дописать еще extern "C"
А если вы используете студийный компилятор, то надо еще перед void дописать __declspec(dllexport)

Установка
на чистую игру:
  • переместить скаченый VorbisFile в папку с игрой
  • согласится на замену файла
Установка на игру с другим asi-loader'ом без удаления старого asi-loader'а (вариант №1 - использование данного asi-loader'а как proxy):
  • переименовать скаченный VorbisFile в VorbisHooked
  • переместить VorbisHooked (тот что переименовали из VorbisFile) в папку с игрой
  • согласится на замену файла
  • создать в папке с игрой файл VorbisFile.ini со следующим содержанием:
INI:
[AsiLoader]
enable="false"
[DllLoader]
loadState="GetStartupInfoA"
У данного вариант есть недостаток - в зависимости от того какой у Вас установлен asi-loader, может не работать стадия загрузки crtMain и запуск сампа из консоли. Решение - использовать вариант №2 (см. ниже), либо не использовать 2 asi-loader'а одновременно.
Установка на игру с другим 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
 
Последнее редактирование:

sаnеk

Всефорумный sanek
Проверенный
2,107
2,051
объясните вкратце нахуя эта разработка нужна? яниче не понял :sad_frog:
 
  • Нравится
Реакции: MAHEKEH

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
объясните вкратце нахуя эта разработка нужна? яниче не понял :sad_frog:
Если коротко - это лучше и есть адекватный INI для DLL`k и еще пару плюх о которых тебе ненужно знать если ты не пишешь ASI-СКРИПТЫ (ХАХА)
 

SR_team

like pancake
Автор темы
BH Team
4,707
6,347
объясните вкратце нахуя эта разработка нужна? яниче не понял :sad_frog:
Смотри:
85321542548415.png


Видишь последние 2 параметра? С ними конструктор проекта смотрится очень клево, не то что без них, и если их убрать, конструктор выглядит как говно! Дело в том, что данная инфа отображается в свойствах dll, но проводник слишком тупой, что бы понять, что asi и dll это одно и тоже, по этому эта инфа не отображается в свойствах asi. Следовательно нужен dll-loader вместо asi-loader'а. Но еще один аси, который будет грузить dll'ки - как-то тупо, по этому я решил написать свой asi-loader.
Если кратко, как ты хотел, это нужно, что бы я мог писать dll-софт, вместо asi, потому что у asi в свойствах не отображаются копирайты и описание плагина.

UPD: Вот такая вот красота получилась, и все благодаря asi-loader'у, который умеет грузить dll
107231542549702.png
 
Последнее редактирование:
  • Нравится
Реакции: AnWu, 4el0ve4ik и sаnеk

iAmerican

Известный
Друг
615
257
Это всё вообще никому не нужно, за исключением тех 3 пунктов которые ты указал в тодо.
 

FYP

Известный
Администратор
1,757
5,684
т.е. ты сделал свой длл/аси лоадер, а не расширение для проводника, отображающее эту инфу для аси.
просто видишь ли, разрабы плагинов продолжат публиковать свои плагины в виде аси, а не длл, потому что это гарантирует совместимость с другими аси лоадерами и простоту установки. и в результате получается, что эта фича, которая так важна, никогда не будет использована.

перед void надо будет дописать еще extern "C"
и __declspec(dllexport)
 

SR_team

like pancake
Автор темы
BH Team
4,707
6,347
разрабы плагинов продолжат публиковать свои плагины в виде аси, а не длл
Ну я в ответе саньку ясно сказал, что я сам хочу в dll распространять и для этого написал asi-loader. Будут ли так поступать другие авторы меня не ебет, они и с инфой для свойств обычно не заморачиваются.
 

FYP

Известный
Администратор
1,757
5,684
Ну я в ответе саньку ясно сказал, что я сам хочу в dll распространять и для этого написал asi-loader. Будут ли так поступать другие авторы меня не ебет, они и с инфой для свойств обычно не заморачиваются.
но ведь тогда пользователи твоих плагинов будут вынуждены устанавливать именно этот длл лоадер, что делает его зависимостью, а как я помню зависимости тебя не очень радуют, причем целесообразность таскания зависимости из-за такой маловажной фичи довольно сомнительна.
 

SR_team

like pancake
Автор темы
BH Team
4,707
6,347
а как я помню зависимости тебя не очень радуют
Пишешь человеку, у которого плагины имели по 4 зависимости: CLEO, SF, 0pReg, MenuManager.
Меня не радует ебля, когда COFF и OMF не совместимы и я вынужден искать другой выход (переходить с sf на asi).
 

SR_team

like pancake
Автор темы
BH Team
4,707
6,347
Вкусняшку завез.
Режим разработчика:
  • Плагины не блокируются на диске (можно обновлять не закрывая игру)
  • Авто-перезагрузка плагинов при изменении
  • Авто-выгрузка удаленных плагинов
  • Авто-загрузка новых плагинов