1
Программирование / LuaLoader - как MoonLoader, только для GTA VC, на основе Plugin SDK от DK
« : Ноябрь 07, 2019, 12:58:20 am »
Начал играть в GTA Vice City в 14, очень понравилась сама атмосфера. Всегда хотелось, что-то добавить свое в игру, как миссии, новые возможности. Попробовал CLEO, написал пару десятков скриптов. Но CLEO не является полноценным языком программирования. Узнал о MoonLoader - это lua плагин для игры GTA San Andreas, на нем очень удобно и быстро можно писать скрипты, лучше чем на CLEO. Больше года назад, узнал, что можно писать плагины для VC на C++ используя SDK Plugin DK. Изучил основы с++, потом стал писать примитивные плагины. Тут возникла идея, что если написать свой аналог MoonLoader для VC на основе SDK Plugin DK, приступил к изучению api lua c++ это было очень тяжело из-за отсутствие подробной информации по ней в интернете. взял за привязку LuaBridge, кому интересно весь исходной код здесь https://pastebin.com/VatypnLb Есть гитхаб https://github.com/egor230/lualoader
Нужно поместить все файлы с расширением lua в папку lualoader, которую нужно создать в корневой папке игры. Остальные файлы в корень игры. Если не работает, ошибка запишется в лог, в папке lualoader.
вот ссылка https://github.com/egor230/lualoader
Рассмотрим как работает пара функций. Установим уровень здоровье для Томми 200.
Как устроено на стороне C++/
на lua это выглядит так.
Мы загружаем модуль "mod" там куча вспомогательных функций, чтобы меньше писать код.
Функция main запускается всегда первой, как в MoonLoader.
Почему while lualoader == nil, а не while true? Чтобы выполнять перезагрузку скрипта по нажатию "ctrl". Другого способа пока не нашёл.
вот более полезный скрипт, который по нажатию клавиши "H" Устанавливает 200 здоровье, дает оружие, создает авто.
Нужно поместить все файлы с расширением lua в папку lualoader, которую нужно создать в корневой папке игры. Остальные файлы в корень игры. Если не работает, ошибка запишется в лог, в папке lualoader.
вот ссылка https://github.com/egor230/lualoader
Рассмотрим как работает пара функций. Установим уровень здоровье для Томми 200.
Как устроено на стороне C++/
Код: Javascript
- int findplayer(lua_State* L) {// получить указатель на игрока.
- CPed* player = FindPlayerPed();// найти Томми.
- Stack<CPed*>::push(L, player);// отправить в стек указатель на игрока.
- return 1;
- };
- int setpedhealth(lua_State* L) {// установить здоровье педу.
- try {
- if (LUA_TUSERDATA == lua_type(L, -2)) {// указатель на игрока.
- if (LUA_TNUMBER == lua_type(L, -1)) {
- CPed* player = (CPed*)Userdata::get<CPed>(L, 1, false);// получить указатель на игрока.
- float health = Stack<float>::get(L, 2);// если число.
- health += 0.99f; player->m_fHealth = health; return 0;
- }// установить здоровье игрока.
- else { throw "bad argument in function setpedhealth option health"; }
- }
- else { throw "bad argument in function setpedhealth option of the player"; }
- }
- catch (const char* x) { writelog(x); }
- return 0;
- };
на lua это выглядит так.
Код: Javascript
- require("lualoader/mod")-- функции упрощающие написания скрипта.
- function main()
- while lualoader == nil do
- wait()-- задержка.
- player = findplayer()-- получить игрока
- setpedhealth(player,200)-- уст 200 здоровье педу.
- end
- end
Мы загружаем модуль "mod" там куча вспомогательных функций, чтобы меньше писать код.
Функция main запускается всегда первой, как в MoonLoader.
Почему while lualoader == nil, а не while true? Чтобы выполнять перезагрузку скрипта по нажатию "ctrl". Другого способа пока не нашёл.
вот более полезный скрипт, который по нажатию клавиши "H" Устанавливает 200 здоровье, дает оружие, создает авто.
Код: Javascript
- require("lualoader/mod")-- функции упрощающие написания скрипта.
- function main()
- while lualoader == nil do
- wait()-- задержка.
- player = findplayer()-- получить игрока
- if Keypress(VK_H) -- если клавиша H.
- then
- Giveweaponped(player,300,"ingramsl")-- дать педу оружие.
- setpedhealth(player,200)-- уст 200 здоровье педу
- setarmour(player,200)-- уст 200 броню педу
- x,y,z =getcoordinates_on_y(player,10)-- получить координаты на 10 м впереди от игрока.
- mycar = Createcar(MODEL_SENTXS,x,y,z) -- создать авто на 10 м впереди.
- end
- end
- end