plakapenka
Специалист
В течении некоторого времени я опубликую ряд статей, где мы будем создать свой собственный 'лаунчер' cамп. Но не такой лаунчер какими кишит интернет, где поле для имени и пароля с кнопкой вход, а функционал его на этом заканчивается...
В этом уроке мы рассмотрим:
Все действия производились в Visual Studio 2022
Поехали.
Настройка проекта:
» Открываем visual studio > жмем создание проекта > выбираем библиотека динамической компоновки (DLL) > указываем имя проекта.
» В верхнем меню выбираем x86
» Идем во вкладку Проект > Свойства:
1. (Вкладка слева - 'Свойства конфигурации' > 'Общие') Выходной каталог > ставим папку GTA. Это то куда скрипт будет помещен после компиляции. В конце добавляем слеш, чтобы избежать предупреждения в дальнейшем.
2. (Вкладка слева - 'Свойства конфигурации' > 'Дополнительно') Расширение целевого файла > cтавим ASI
3. (Вкладка слева - 'C/C++' > 'Предварительно откомпилированные заголовки') Использовать предварительно откомпилированные заголовки > cтавим нет
Наш проект готов. Уже можно нажать компиляцию, дождаться окончания и увидеть готовый файл в папке в игре.
Давайте создадим ему функционал.
Подключение MinHook:
Нам нужна библиотека перехватов ( хуков ). В этом мануале мы будем использовать MinHook (кликабельно)
Скачайте, распакуйте папку с MinHook и переместите её в проект
Идем в Visual Studio и нажимаем 'показать все файлы'
Щелкаем ПМК по папке MinHook в обозревателе и выбираем 'включить в проект'.
Снова заходим в Проект > Свойства:
1. (Вкладка слева - 'C/C++' > 'Общие'). Дополнительные каталоги включаемых файлов. Нажимаем на стрелку вниз > изменить > на иконку создания папки > на три точки ... > и выбираем там папку Minhook>Include. Жмем ок
2. (Вкладка слева - 'Компоновщик' > 'Общие'). Дополнительные каталоги библиотек. Снова стрелку > изменить >иконку папки>... > и выбираем папку minhook>bin
3. (Вкладка слева - 'Компоновщик' > 'Ввод'). Дополнительные зависимости > Дописываем в начало ' MinHook.x86.lib; '
Жмем ок. С настройками закончили.
Написание кода:
Подключим наш minhook.
Функция DllMain - основная функция Dll библиотеки ( ASI плагина в нашем случае ). Эта функция вызывается при четырех условиях - которые перечислены в switche.
Нас интересует DLL_PROCESS_ATTACH. DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с ней на этом моменте, и придется дождаться ее инициализации. Для этого нам и нужен MinHook.
SAMP инициализирует свои структуры в вызове DrawRadar, поэтому мы перехватим эту функцию, и после ее вызова будем уверены что самп инициализировался.
Создадим функцию которую будем вызывать при хуке.
И в DLL_PROCESS_ATTACH создадим хук
0x58A330 это адрес функции DrawRadar в gta. Где искать эти адреса - мы поговорим позже.
Отлично. Все готово. Но как мы узнаем что наша функция вызвалась?
Давайте возьмем из Plugin-SDK одну из функций отрисовки сообщений на экран.
и используем её в нашей функции:
Жмем компиляцию
Значит все готово. Заходим в игру
Для того чтобы все работало, у вас должен быть установлен ASI Loader, а так же в папке с GTA должен находиться файл MinHook.x86.dll из папки bin MinHook
- Мы научимся рисовать полноценные интерфейсы и отображать в них данные с сервера
- Изменять параметры машин. Скорость, ускорение, торможение, тонировки и прочее..
- Использовать функции GTA которых нет в сампе
- да и хз, много всего интересного
В этом уроке мы рассмотрим:
- Как создать свой ASI плагин
- Как безопасно инициализироваться
Все действия производились в Visual Studio 2022
Поехали.
Настройка проекта:
» Открываем visual studio > жмем создание проекта > выбираем библиотека динамической компоновки (DLL) > указываем имя проекта.
» В верхнем меню выбираем x86
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
» Идем во вкладку Проект > Свойства:
1. (Вкладка слева - 'Свойства конфигурации' > 'Общие') Выходной каталог > ставим папку GTA. Это то куда скрипт будет помещен после компиляции. В конце добавляем слеш, чтобы избежать предупреждения в дальнейшем.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
2. (Вкладка слева - 'Свойства конфигурации' > 'Дополнительно') Расширение целевого файла > cтавим ASI
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Наш проект готов. Уже можно нажать компиляцию, дождаться окончания и увидеть готовый файл в папке в игре.
Давайте создадим ему функционал.
Подключение MinHook:
Нам нужна библиотека перехватов ( хуков ). В этом мануале мы будем использовать MinHook (кликабельно)
Скачайте, распакуйте папку с MinHook и переместите её в проект
Идем в Visual Studio и нажимаем 'показать все файлы'
Щелкаем ПМК по папке MinHook в обозревателе и выбираем 'включить в проект'.
Снова заходим в Проект > Свойства:
1. (Вкладка слева - 'C/C++' > 'Общие'). Дополнительные каталоги включаемых файлов. Нажимаем на стрелку вниз > изменить > на иконку создания папки > на три точки ... > и выбираем там папку Minhook>Include. Жмем ок
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Жмем ок. С настройками закончили.
Написание кода:
Подключим наш minhook.
C++:
#include <MinHook.h>
Нас интересует DLL_PROCESS_ATTACH. DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с ней на этом моменте, и придется дождаться ее инициализации. Для этого нам и нужен MinHook.
SAMP инициализирует свои структуры в вызове DrawRadar, поэтому мы перехватим эту функцию, и после ее вызова будем уверены что самп инициализировался.
Создадим функцию которую будем вызывать при хуке.
C++:
void __cdecl Hook_DrawRadar()
{
}
C++:
MH_Initialize();
MH_CreateHook(reinterpret_cast<void*>(0x58A330), &Hook_DrawRadar, NULL);
MH_EnableHook(reinterpret_cast<void*>(0x58A330));
Отлично. Все готово. Но как мы узнаем что наша функция вызвалась?
Давайте возьмем из Plugin-SDK одну из функций отрисовки сообщений на экран.
C++:
void AddMessageJumpQ(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))0x69F1E0)(text, time, flag, bPreviousBrief);
}
C++:
void __cdecl Hook_DrawRadar()
{
AddMessageJumpQ("~b~Hello pawno-info.RU", 5000, 0, false);
}
Жмем компиляцию
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
, ждем. Увидели подобную ошибку:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Значит все готово. Заходим в игру
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Для того чтобы все работало, у вас должен быть установлен ASI Loader, а так же в папке с GTA должен находиться файл MinHook.x86.dll из папки bin MinHook
До встречи в некст уроке.
Надеюсь это будет скоро...
Надеюсь это будет скоро...
Последнее редактирование:
