Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - egor230

Страницы: [1]
1
Начал играть в 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++/
Код: Javascript
  1. int findplayer(lua_State* L) {// получить указатель на игрока.
  2.         CPed* player = FindPlayerPed();// найти Томми.
  3.         Stack<CPed*>::push(L, player);// отправить в стек указатель на игрока.
  4.         return 1;
  5. };
  6. int setpedhealth(lua_State* L) {// установить здоровье педу.
  7.         try {
  8.                 if (LUA_TUSERDATA == lua_type(L, -2)) {// указатель на игрока.
  9.                         if (LUA_TNUMBER == lua_type(L, -1)) {
  10.                                 CPed* player = (CPed*)Userdata::get<CPed>(L, 1, false);// получить указатель на игрока.
  11.                                 float health = Stack<float>::get(L, 2);// если число.
  12.                                 health += 0.99f; player->m_fHealth = health; return 0;
  13.                         }// установить здоровье игрока.
  14.                         else { throw "bad argument in function setpedhealth option health"; }
  15.                 }
  16.                 else { throw "bad argument in function setpedhealth option of the player"; }
  17.         }
  18.         catch (const char* x) { writelog(x); }
  19.         return 0;
  20. };
  21.  

на lua это выглядит так.
Код: Javascript
  1. require("lualoader/mod")-- функции упрощающие написания скрипта.
  2. function main()
  3. while lualoader == nil do
  4.  wait()-- задержка.
  5.  player = findplayer()-- получить игрока
  6.  setpedhealth(player,200)-- уст 200 здоровье педу.
  7. end
  8. end
  9.  
  10.  

Мы загружаем модуль "mod" там куча вспомогательных функций, чтобы меньше писать код.
Функция main запускается всегда первой, как в MoonLoader.
Почему while lualoader == nil, а не while true? Чтобы выполнять перезагрузку скрипта по нажатию "ctrl". Другого способа пока не нашёл.

вот более полезный скрипт, который по нажатию клавиши "H" Устанавливает 200 здоровье, дает оружие, создает авто.

Код: Javascript
  1. require("lualoader/mod")-- функции упрощающие написания скрипта.
  2. function main()
  3. while lualoader == nil do
  4.  wait()-- задержка.
  5.  player = findplayer()-- получить игрока
  6.  if Keypress(VK_H) -- если клавиша H.
  7. then  
  8.  Giveweaponped(player,300,"ingramsl")-- дать педу оружие.  
  9.  setpedhealth(player,200)-- уст 200 здоровье педу
  10.  setarmour(player,200)-- уст 200 броню педу
  11.  x,y,z =getcoordinates_on_y(player,10)-- получить координаты на 10 м впереди от игрока.
  12.  mycar = Createcar(MODEL_SENTXS,x,y,z) -- создать авто на 10 м впереди.
  13. end
  14. end
  15.  
  16. end
  17.  


Страницы: [1]