Опрос на сайте
Оцените дизайн сайта

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

Magic - TXD Builder 0.9.1

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

Main Menu Scene

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

Vertex Alpha в Vice City

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

[CLEO]CarRec(plus ObjRec)

[CLEO]CarRec(plus ObjRec)
"CarRec" дает вам возможность записывать движения автомобиля в файл ".cr" для воспроизведения их позднее в ваших скриптах и

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качиваний: 30)

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

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

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

Полужирный Наклонный текст Подчёркнутый текст Зачёркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Вставка ссылкиВставка защищённой ссылки Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Другие материалы

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

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

VC Memory editor для Vice Lua

VC Memory editor для Vice Lua
VC memory editor- Это плагин для движка Vice Lua, который добавит функции для работы с памятью игры из ваших lua скриптов.

Вызов функций и процедур в GTA Vice City

Вызов функций и процедур в GTA Vice City
Вся игра состоит на самом деле из функций и процедур а также методов различных классов, о которых мы поговорим позднее.

Чтение и запись адресов GTA Vice City

Чтение и запись адресов GTA Vice City
В этом уроке мы научимся, записывать и считывать значения из адресов памяти игры GTA Vice City непосредственно из нашего
Ads

Группа GTA Builder
Наши партнеры

GTA FreeRunning Story