Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Как создать свой собственный ПК-клиент (ASI) с нуля?

plakapenka

Специалист
В течении некоторого времени я опубликую ряд статей, где мы будем создать свой собственный 'лаунчер' cамп. Но не такой лаунчер какими кишит интернет, где поле для имени и пароля с кнопкой вход, а функционал его на этом заканчивается...
  • Мы научимся рисовать полноценные интерфейсы и отображать в них данные с сервера
  • Изменять параметры машин. Скорость, ускорение, торможение, тонировки и прочее..
  • Использовать функции GTA которых нет в сампе
  • да и хз, много всего интересного


В этом уроке мы рассмотрим:
  • Как создать свой ASI плагин
  • Как безопасно инициализироваться

Все действия производились в 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.
C++:
#include <MinHook.h>
Функция DllMain - основная функция Dll библиотеки ( ASI плагина в нашем случае ). Эта функция вызывается при четырех условиях - которые перечислены в switche.

Нас интересует DLL_PROCESS_ATTACH. DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с ней на этом моменте, и придется дождаться ее инициализации. Для этого нам и нужен MinHook.

SAMP инициализирует свои структуры в вызове DrawRadar, поэтому мы перехватим эту функцию, и после ее вызова будем уверены что самп инициализировался.

Создадим функцию которую будем вызывать при хуке.
C++:
void __cdecl Hook_DrawRadar()
{

}
И в DLL_PROCESS_ATTACH создадим хук
C++:
MH_Initialize();
MH_CreateHook(reinterpret_cast<void*>(0x58A330), &Hook_DrawRadar, NULL);
MH_EnableHook(reinterpret_cast<void*>(0x58A330));
0x58A330 это адрес функции DrawRadar в gta. Где искать эти адреса - мы поговорим позже.

Отлично. Все готово. Но как мы узнаем что наша функция вызвалась?
Давайте возьмем из 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


​
До встречи в некст уроке.
Надеюсь это будет скоро...​
​
 
Последнее редактирование:
Сверху Снизу