![]() |
Всем привет! Не трудно догадаться, что в этой теме речь будет идти о использовании LUAскриптов в связке с MoonLoader API из под C++.
Вообще это довольно интересная тема, потому что в основном в сампе все ограничиваются использованием одного ЯП (языка программирования), а ведь можно использовать одновременно почти все фичи, благо которых в нашем арсенале очень и очень много. Например можно реализовать меню на LUA, а функционал на C++: https://www.blast.hk/threads/205273/ Помимо использования подобных фишек как реализация меню и функционала на разных ЯП мы можем даже сделать такую конструкцию: - C++ Основа [плагин] - C++Структура проекта / реализация функционала - LUA Готовые функции, работающие с GTA / SAMP для использовния в реализации функционала в пункте выше Единственные минусы, которые по-моему мнению есть в подобных решениях это: - другая изначальная задумка: никто ведь не плагировал использовать функции для скриптов в плагинах, в связи с этим возможны какие-то неожиданные проблемы. - излишние зависимости: у этого пункта есть как минусы, так и плюсы. Например, если мы создаем плагин, в котором будем использовать MoonLoader API, то очевидно, что мы зависим от MoonLoader. Однако, как плюс, весь функционал зачастую дублируется; например, функция для регистрации команды может повторяться во многих ASI плагинах. К этому мы добавляем SampFuncs, который экспортирует эту функцию. Хотелось бы реализовать что-то вроде либы для приятного использования этого всего, если кто-то захочет попробовать, могу отправить часть моей "попытки" Реализация Создать плагин, который будет использовать MoonLoader API, довольно просто, и вариантов самой реализации много. Я же буду использовать экспортируемые из lua51.dll, а также хук функции "lua_getfield" из того lua51.dll, эта функция используется в MoonLoader и нужна для того чтобы получить значение по имени ключа из таблицы LUA. C++: Код:
usingВ этой функции мы перехватываем следующее: - указатель на структуру lua_State(благодаря ей мы будем взаимодействовать) - индекс на структуру стека (где находится LUAтаблица, из которой нужно получить значение) - название ключа (из которого нужно получить значение) Сам хук выглядит так: C++: Код:
classПоскольку функция "lua_getfield" вызывается почти постоянно в различных местах, нам необходимо фильтровать эти вызовы и брать указатель на структуру lua_State только из скриптов. Сделать это можно легко, так как при инициализации скрипта MoonLoader обращается к ключу "main", на это мы и будем ориентироваться. C++: Код:
staticВсё почти готово! Теперь давайте определим парочку функций из lua51.dll, которые понадобятся чуть дальше.. C++: Код:
typedefПолучаем эти функции C++: Код:
autoПример использования Все готово для использования, теперь давайте воспользуемся ранее полученными функциями и попробуем воспроизвести какой-нибудь код на LUA. Для этого создадим мини-функцию-обёртку C++: [CODE] void load_string ( lua_State * L , const std :: string & code ) { if ( L == nullptr ) { std :: cerr g_lua это мой мини класс враппер для всего этого В этом коде мы просто загружаем код из переменной code и в случае ошибки выводим ее, как раз для этого нам нужна была функция tolstring, которая преобразовывает луашный текст. Теперь осталось просто вызвать эту функцию в хуке с любым кодом, который вы бы хотели воспроизвести внутри MoonLoader C++: Код:
staticИтог Получаем такую картину, в которой каждый скрипт вызвал нужный нам код https://forum.antichat.xyz/attachments/28488522/ https://forum.antichat.xyz/attachments/28488522/ |
В WoW так делают lua unlocker'ы protected функций от близзов или на базе этого пишут своих ботов или читы. Интересная тема
|
[QUOTE="g305noobo"]
Всем привет! Не трудно догадаться, что в этой теме речь будет идти о использовании LUAскриптов в связке с MoonLoader API из под C++. Вообще это довольно интересная тема, потому что в основном в сампе все ограничиваются использованием одного ЯП (языка программирования), а ведь можно использовать одновременно почти все фичи, благо которых в нашем арсенале очень и очень много. Например можно реализовать меню на LUA, а функционал на C++: https://www.blast.hk/threads/205273/ Помимо использования подобных фишек как реализация меню и функционала на разных ЯП мы можем даже сделать такую конструкцию: - C++ Основа [плагин] - C++Структура проекта / реализация функционала - LUA Готовые функции, работающие с GTA / SAMP для использовния в реализации функционала в пункте выше Единственные минусы, которые по-моему мнению есть в подобных решениях это: - другая изначальная задумка: никто ведь не плагировал использовать функции для скриптов в плагинах, в связи с этим возможны какие-то неожиданные проблемы. - излишние зависимости: у этого пункта есть как минусы, так и плюсы. Например, если мы создаем плагин, в котором будем использовать MoonLoader API, то очевидно, что мы зависим от MoonLoader. Однако, как плюс, весь функционал зачастую дублируется; например, функция для регистрации команды может повторяться во многих ASI плагинах. К этому мы добавляем SampFuncs, который экспортирует эту функцию. Хотелось бы реализовать что-то вроде либы для приятного использования этого всего, если кто-то захочет попробовать, могу отправить часть моей "попытки" Реализация Создать плагин, который будет использовать MoonLoader API, довольно просто, и вариантов самой реализации много. Я же буду использовать экспортируемые из lua51.dll, а также хук функции "lua_getfield" из того lua51.dll, эта функция используется в MoonLoader и нужна для того чтобы получить значение по имени ключа из таблицы LUA. C++: Код:
usingВ этой функции мы перехватываем следующее: - указатель на структуру lua_State(благодаря ей мы будем взаимодействовать) - индекс на структуру стека (где находится LUAтаблица, из которой нужно получить значение) - название ключа (из которого нужно получить значение) Сам хук выглядит так: C++: Код:
classПоскольку функция "lua_getfield" вызывается почти постоянно в различных местах, нам необходимо фильтровать эти вызовы и брать указатель на структуру lua_State только из скриптов. Сделать это можно легко, так как при инициализации скрипта MoonLoader обращается к ключу "main", на это мы и будем ориентироваться. C++: Код:
staticВсё почти готово! Теперь давайте определим парочку функций из lua51.dll, которые понадобятся чуть дальше.. C++: Код:
typedefПолучаем эти функции C++: Код:
autoПример использования Все готово для использования, теперь давайте воспользуемся ранее полученными функциями и попробуем воспроизвести какой-нибудь код на LUA. Для этого создадим мини-функцию-обёртку C++: [CODE] void load_string ( lua_State * L , const std :: string & code ) { if ( L == nullptr ) { std :: cerr C++: Код:
LSHookheader: Код:
#include |
Цитата:
но если просто сохранить эти указатели и использовать попозже, все будет ок |
Ку-ку, чего с модификацией? Есть обновления - мне для игры требуется скрипт без багов - это эта модификация - скачивать?
|
| Время: 00:45 |