Что-бы создавать плагины к Vice Lua, вам в свою очередь нужно иметь хорошо исследованный код GTA Vice City, где у вас есть своя наработанная база адресов. Чем больше у вас будет информации, тем лучше вы сможете написать моды. Ну ладно с этим как бы ясно, давайте приступим к разработке простого плагина, который добавит всего лишь пару функций, для работы с гравитацией. Это мы сделаем в качестве примера, что-бы показать общую концепцию.
Напомню, если вы не читали как подключить Vice Lua SDK, то перейдите по этой ссылке к прочтению.
И так, проект у нас готов, теперь остается сделать ряд действий. Начнем с того, что пропишем инклуды для этого сделаем таким образом в сорцах dllmain.cpp :
Первая переменная это для LUA, вторая это для того что-бы мы меняли потом значение гравитации, грубо говоря хакнули ее. Следующий шаг, это мы напишем две функции, которые в дальнейшем и будут добавлены в скриптинг LUA.
int l_SetGravity(lua_State *l){ float value = lua_tonumber(l, 1);
gravity = value; return0; }
int l_GetGravity(lua_State *l){ float value = lua_tonumber(l, 1);
lua_pushnumber(l, gravity); return1; }
Что-бы ознакомиться конкретно с LUA API, совету вам почитать официальную документацию тут. Скажу правду, этот язык очень легко встраиваемый и быстро осваивается у программистов, не должно быть не каких проблем.
Теперь финальный этап.
Вывозим наши функции из Vice Lua SDK и зарегаем их.
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_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, такой блок иногда нужен.
Ну вот собственно и все, теперь у нас появились функции для скриптинга: