Опрос на сайте
Что вы делаете с GTA?

Популярные новости

Magic - TXD Builder 0.9.1

Magic - TXD Builder 0.9.1
Полезная программа для сборки TXD файлов, которая важные параметры, такие как mip map, DXT сжатие... Кроме того, программа

Vertex Alpha в Vice City

Vertex Alpha в Vice City
То, что некогда было доступно лишь в GTA: San Andreas и выше: Vertex Alpha, а потенциально - и физический бленд текстур в

Компактное меню

Компактное меню
Компактное меню для глобальных модов. Исключено все лишнее.

Main Menu Scene

Main Menu Scene
"Main Menu Scene" дает вам возможность создавать собственные сцены в "Главном Меню" игры с кастомными картой и скриптом, при

Rollerskates Mod

Rollerskates Mod
Модификация позволяет кататься на роликах, прямо как пляжные девушки.

16 июнь 2015

Создание плагина для Vice Lua


Что-бы создавать плагины к Vice Lua, вам в свою очередь нужно иметь хорошо исследованный код GTA Vice City, где у вас есть своя наработанная база адресов. Чем больше у вас будет информации, тем лучше вы сможете написать моды. Ну ладно с этим как бы ясно, давайте приступим к разработке простого плагина, который добавит всего лишь пару функций, для работы с гравитацией. Это мы сделаем в качестве примера, что-бы показать общую концепцию.

Напомню, если вы не читали как подключить Vice Lua SDK, то перейдите по этой ссылке к прочтению.

И так, проект у нас готов, теперь остается сделать ряд действий. Начнем с того, что пропишем инклуды для этого сделаем таким образом в сорцах dllmain.cpp :


 
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
 
#include <vclua_sdk.h>
 



Далее, объявим всего лишь две переменные:


lua_State * main_Luastate;  
float & gravity = *(float*)0x068F5F0;



Первая переменная это для LUA, вторая это для того что-бы мы меняли потом значение гравитации, грубо говоря хакнули ее.
Следующий шаг, это мы напишем две функции, которые в дальнейшем и будут добавлены в скриптинг LUA.


 
int l_SetGravity(lua_State *l) {
float value = lua_tonumber(l, 1);
 
gravity = value;
return 0;
}
 
 
int l_GetGravity(lua_State *l) {
float value = lua_tonumber(l, 1);
 
lua_pushnumber(l, gravity);
return 1;
}
 



Что-бы ознакомиться конкретно с LUA API, совету вам почитать официальную документацию тут.
Скажу правду, этот язык очень легко встраиваемый и быстро осваивается у программистов, не должно быть не каких проблем.

Теперь финальный этап.

Вывозим наши функции из Vice Lua SDK и зарегаем их.


BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
 
VCLUA_Init();
main_Luastate = (lua_State*)VCLUA_GetLuaState();
lua_register(main_Luastate, "SetGravity", l_SetGravity);
lua_register(main_Luastate, "GetGravity", l_GetGravity);
 
break;
 
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}



Ну вот собственно плагин готов к работе, но я вынужден рассказать еще кое какие важные вещи. Я должен описать что делают функции Vice Lua SDK и в чем же суть?

VCLUA_Init(); - Функция инициализирует движок.
VCLUA_GetLuaState(); - Функция возвращает указатель на состояние луа, который нам очень нужен.
VCLUA_RegisterFunction(DWORD address, DWORD type); - А вот эта функция регистрирует вашу функцию для события.

Расскажу для чего это надо. Для примера вы создаете плагин, которому нужен рендер и апдейт, вы бы сказали, ну я бы мог сделать инжект, но так делать нельзя. Представьте теперь если 1 плагин одного разработчика делает инжект в адреса и 2-ой плагин другого разработчика делает в те же самые адреса инжект, что будет? Правильно мыслите, будет то что, последний плагин который сделает инжект он и будет работать, а остальные прекратят работу. Вот так рождается не совместимость многих плагинов. Но к счастью в LUA более менее это устроенно. Что нужно сделать для этого? Для это давайте к примеру объявим пару функций одну для рендера а другую для апдейта.


void OnGameUpdate(){
 
}
 
void OnGameRender(){
 
}
 



Там внутри в них, может быть ваш код, который будет нужен для работы вашего плагина. А теперь достаточно вызвать функции в инициализации после VCLUA_GetLuaState(); вот так:


VCLUA_RegisterFunction((DWORD)OnGameUpdate, VCLUA_ON_UPDATE_GAME);
VCLUA_RegisterFunction((DWORD)OnGameRender, VCLUA_ON_DRAW_GAME);



Все ваши функции добавлены в список обработок. Сейчас я опишу что делают дефайны:

VCLUA_ON_DRAW_GAME 0 - Рендер игры
VCLUA_ON_UPDATE_GAME 1 - Апдейт игры
VCLUA_ON_INIT 2 - Инициализация игры во время запуска.
VCLUA_ON_START_GAME 4 - Старт игры
VCLUA_ON_SAVE_GAME 5 - Событие, когда совершилось сохранение
VCLUA_ON_LOAD_GAME 6 - Событие, когда игра стала загружаться из файла.

// Version 1.1
VCLUA_ON_STUTDOWN_GAME 7 - Когда игра была закрыта.
VCLUA_ON_UPDATEMENU_GAME 8 - Апдейт игрового меню.
VCLUA_ON_RENDERWARE_INIT 9 - Инициализация Render Ware, такой блок иногда нужен.


Ну вот собственно и все, теперь у нас появились функции для скриптинга:

SetGravity(value) -- Устанавливает гравитацию
gravity = GetGravity() --Получает текущую гравитацию.


Для примера я по пробовал, в свое скрипте сделать так:

SetGravity(0.002)


И вот что получилось:



Ах да! Чуть не забыл) Исходник плагина:

vc-plugin.rar [199,45 Kb] (cкачиваний: 56)

Все, всем приятного моддинга дорогие друзья!

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Добавить свой комментарий

Полужирный Наклонный текст Подчёркнутый текст Зачёркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Вопрос: Введите первые 3 (Русские) буквы сайта (заглавные).
Ответ:*
Другие материалы

Подключение Vice Lua SDK к проекту.

Подключение Vice Lua SDK к проекту.
В данном уроке мы научимся использовать подключать Vice Lua SDK а также хорошо настроим наш проект, для дальнейшего его

Вывод на экран TXD GTA

Вывод на экран TXD GTA
После того как мы научились в предыдущих статьях по программированию хорошо работать с памятью игры, то можно уже приступить

Подхват переменных в GTA Vice City

Подхват переменных в GTA Vice City
Сейчас в начале разберем вкратце, что же за такой подхват переменных в GTA Vice City. Например мы просто объявляем некую

Создаем первый плагин ASI на C++ Часть 3

Создаем первый плагин ASI на C++ Часть 3
Сейчас мы сделаем, самый простой плагин, который лишь выведет системное сообщение в виде привет, после запуска игры. Из кода
Ads

Группа GTA Builder