Автор Тема: LuaLoader - как MoonLoader, только для GTA VC, на основе Plugin SDK от DK  (Прочитано 8502 раз)

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: lualoader как modloader, только для GTA vc на основе SDK Plugin DK
« Ответ #15 : Февраль 03, 2020, 02:39:12 am »
Спасибо большое за ответ  xanser, чтобы избавиться от лодов, переустановил игру.   А как увеличить SStreaming memory в sdk?   Благодаря вашему совету, пед  выполняет заданные  ему анимации.

Код: Javascript
  1.  
  2. int ped_anim(lua_State* L) {// анимация.
  3.  
  4.         try {
  5.  
  6.                 if (LUA_TLIGHTUSERDATA == lua_type(L, 1) && LUA_TNUMBER == lua_type(L, 2)
  7.  
  8.                         && LUA_TNUMBER == lua_type(L, 3) && LUA_TNUMBER == lua_type(L, 4)) {//число.
  9.  
  10.  
  11.  
  12.                         const void* p = lua_topointer(L, 1);
  13.  
  14.                         int tipe = Stack<int>::get(L, 2);
  15.  
  16.                         int idanimation = Stack<int>::get(L, 3);
  17.  
  18.                         int time = Stack<int>::get(L, 4);
  19.  
  20.                         CPed* ped = findpedinpool(p);//  получить указатель на педа.
  21.  
  22.                         RpClump* pe = ped->m_pRwClump;
  23.  
  24.                         CAnimManager::BlendAnimation(pe, tipe, idanimation, time);
  25.  
  26.                         return 0;
  27.  
  28.                 }
  29.  
  30.                 else { throw "bad argument in function ped_anim"; }
  31.  
  32.         }
  33.  
  34.         catch (const char* x) { writelog(x); }// записать ошибку в файл.
  35.  
  36.         return 0;
  37.  
  38. };
  39.  
  40.  в Lua  эта   функция выглядит так ped_anim(ped, 14)
  41.  
  42.  



пед  выполняет  анимацию,  но как её сбросить?  Скажите пожалуйста.

 будьте  добры, посоветуйте мне функции для работы с анимации.

 Тут написал небольшую миссию,  "Убить Диасса" видео https://www.youtube.com/watch?v=RVFIn2GBfmw&feature=youtu.be

 она очень короткая, тут важен принцип написания миссий, функция Star_mission_marker (8, 525,7, -77,5, 10,6) -    она принимает номер иконки. создаёт маркер миссии на карте. Если игрок сидеть в машине, иначе удаляет его, Когда игрок становится на маркер, запускается миссия, также в новом потоке,  вызывается функция которая постоянно проверяет жив или  арестован ли  игрок?

 Благодарен ей,  код удалось сократить до   20 с большим строчек.

вот как она выглядит в Lua скрипте.

Код: Javascript
  1.  
  2. require("lualoader/mod")
  3.  
  4. функция main ()
  5.  
  6. while lualoader == nil do wait()
  7.  
  8.  player = findplayer()-- получить игрока
  9.  
  10.  if Star_mission_marker(8, 525.7, -77.5, 10.6) -- создать маркер миссии на карте.
  11.  
  12.  then  showtext("Kill diasa", 500,1)-- вывод названия миссии.
  13.  
  14.   fade(1,1100) --просветления, 600 время.
  15.  
  16.   ped = create_spec_ped("IGDIAZ", 487.2, -98.8, 10.6 )-- создать педа на координатах.
  17.  
  18.   Giveweaponped(player,600,"uzi")-- дать педу оружие.
  19.  
  20.   Giveweaponped(ped,600,"m4")-- дать педу оружие.
  21.  
  22.   m = create_marker(ped)-- создать маркер над педом.
  23.  
  24.   Kill_ped_on_foot(ped, player)-- пед хочет убить игрока.
  25.  
  26.  while true == getflagmission() do  wait() -- цикл пока статус миссии не изменится.
  27.  
  28.   if not player_defined(ped) -- если враг убит.
  29.  
  30.    then  miss(3000)-- миссия выполнена сколько денег получено за выполнение.
  31.  
  32.    break   end  end--
  33.  
  34.   destroy()-- удалить все объекты, которые были созданы скриптом.     
  35.  
  36.   end    
  37.  
  38.   end
  39.  
  40. end
  41.  
  42.  

  Не совсем понятно  как работает данная команда команда,

Код: Javascript
  1.  
  2. const void* p = lua_topointer(L, -3);
  3.  
  4. CVehicle* car = findcarinpool(p);//  получить указатель на авто.
  5.  
  6. float distance = Stack<float>::get(L, -2);
  7.  
  8. int time = Stack<int>::get(L, -1);
  9.  
  10. Command<COMMAND_ADD_STUCK_CAR_CHECK>(time, distance,  CPools::GetVehicleRef(car));// условия для того, чтобы авто считалась застрявшей.
  11.  
  12.  она  устанавливает,  когда сработает  следующая  скриптовая команда
  13.  
  14. const void* p = lua_topointer(L, -1); CVehicle* car = findcarinpool(p);// получить указатель на авто.
  15.  
  16.  bool checkstuck = Command<COMMAND_IS_CAR_STUCK>(CPools::GetVehicleRef(car));
  17.  
  18.  даже когда машина застраивает, проверка не срабатывает, что она застряла.
  19.  
  20.  Помогите мне пожалуйста в этом разобраться,  чтобы и дальше улучшать и развивать Lua плагин.  
  21.  
  22.  

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: lualoader как modloader, только для GTA vc на основе SDK Plugin DK
« Ответ #16 : Февраль 03, 2020, 05:48:51 am »
А как увеличить SStreaming memory в sdk?

Значение хранится здесь: 0x41079F, равное StreamMemory * 1024 * 1024 (изначально 68157440 = 65 * 1024 * 1024). Тут надо уточнить, что изменение нужно делать до начала игры, не знаю, умеет ли это lua. Иначе это делается LimitAdjuster-ом через редактирование exe.

пед  выполняет  анимацию, но как её сбросить?
Если не в цикле, то анимация сама должна останавливаться.
« Последнее редактирование: Февраль 03, 2020, 09:34:12 am от xanser »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Спасибо большое вам xanserза ваш ответ.

Lua  умеет вызывать функции на с++,  передача аргументов и возврат результатов происходит через стек.

  А как  изменить  значения адрес памяти 0x41079F в sdk plugin, всегда понять на маленькой примере.

подскажите, пожалуйста, функцию аналог скриптовой команды Command<COMMAND_LOCATE_CHAR_ANY_MEANS_3D>(CPools::GetPedRef(ped), x, y, z, rx, ry, rz); потому что из-за неё происходит вылет.

 Сейчас переписываю миссию "Вечеринка" на Lua, без кат сцен.

 Вот как выглядит миссия.

Код: Javascript
  1.  
  2. require("lualoader/mod")
  3.  
  4. function main()
  5. while lualoader == nil do wait()
  6.  player = findplayer()-- получить игрока
  7.  if Star_mission_marker(9, 118.0, -825.9, 10.5) -- создать маркер миссии на карте.
  8.  then  showtext(" patry", 500,1)-- вывод названия миссии.
  9.   fade(1,1100) --просветления, 600 время.  
  10.  setcord(player, 118.0, -825.9, 10.5)
  11.  setangle(player, 54.0 ) -- установить угол для педа.
  12.  bike = Createcar(MODEL_FREEWAY, 123.8, -810.9, 10.5 )
  13.  setangle(bike,  320) -- установить угол для байка.
  14.  blip = createmarker(1,2, 95.4, -1136.2, 10.5) -- создать маркер на карте. Принимает тип, размер, координаты, id маркера.
  15.  setsizemarker(blip,3)--уст размер маркера. Принимает маркер, значение его размера
  16.  sp = create_sphere(95.4, -1136.2, 10.5,3.0)-- создать сферу.
  17.  
  18.   printmessage("~r~Go get some new threads from Rafael's clothes shop",3000,1)  
  19.  while true == getflagmission() do  wait() -- цикл пока статус миссии не изменится.
  20.  local b, mycar = incar(player)
  21.   if ped_in_point_in_radius(player,95.4, -1136.2, 10.5, 2.0,2.0,2.0 ) and b == false
  22.  then  remove_blip(blip)
  23.  remove_sphere(sp)-- удалить сферу.
  24.   fade(0,1100) --затенение, 600 время.
  25.    
  26.   set_widescreen(1)--
  27.   set_skin(player, "PLAYER9")
  28.  setcord(player, 95.5, -1135.8, 10.5 )
  29.  setangle(player, 42.0 ) -- установить угол для педа.
  30.   fade(1,1100) --просветления, 600 время.  
  31.    set_camera_position(91.813, -1131.116, 17.251, 0.0, 0.0, 0.0) --уст камеру в координатах.
  32.    camera_at_point(92.39, -1131.74, 16.724, 2) --переместить камеру в координатах.
  33.   wait(4000)  
  34.   restore_camera()-- восстановить камеру.
  35.   set_widescreen(0)
  36.  break
  37.  end
  38.   end  
  39.   printmessage("~r~Get to then Colonel's boat",3000,1)
  40.   local blip1 = createmarker(1,2, -251.2, -1360.8, 8.1 ) -- создать маркер на карте. Принимает тип, размер, координаты, id маркера.
  41.   setsizemarker(blip1,3)--уст размер маркера. Принимает маркер, значение его размера
  42.   local sp1 = create_sphere(-251.2, -1360.8, 8.1 ,3.0,3.0,2.0)-- создать сферу.
  43.   while true == getflagmission() do  wait() -- цикл пока статус миссии не изменится.  
  44.   if ped_in_point_in_radius(player,-251.2, -1360.8, 8.1, 2.0,2.0,2.0 ) --and b == false
  45.  then  remove_blip(blip1)
  46.  remove_sphere(sp1)-- удалить сферу.
  47.   printmessage("You are on the site",3000,1)  
  48.   fade(0,1100) -- тьма, 600 время.  
  49.   wait(2500)  
  50.  setcord(player, -241.7, -1362.3, 8.1 )
  51.  setangle(player, 269.0 ) -- установить угол для педа.
  52.   ped = create_spec_ped("IGMERC", -241.7, -1360.3, 8.1 )-- создать педа на координатах.
  53.   wait(2500)  
  54.   fade(1,1100) --просветления, 600 время.    load_scene(-236.6, -1374.6, 10.0)
  55.   follow_the_leader(ped)
  56.   printmessage("~r~Take the Colonel's daughter to the Pole Position club", 3000,1)  
  57.   break
  58.  end
  59.   end    
  60.   local blip2 = createmarker(1,2,  100.7, -1477.6, 10.1  ) -- создать маркер на карте. Принимает тип, размер, координаты, id маркера.
  61.   setsizemarker(blip2,3)--уст размер маркера. Принимает маркер, значение его размера
  62.   local sp2 = create_sphere( 100.7, -1477.6, 10.1, 3.0,3.0,2.0)-- создать сферу.
  63.   while true == getflagmission() do  wait() -- цикл пока статус миссии не изменится.  
  64.   if ped_in_radius(player, 100.7, -1477.6, 10.1 , 2.0,2.0,2.0 ) --and b == false
  65.  then  remove_blip(blip2)
  66.  remove_sphere(sp2)-- удалить сферу.
  67.  exitcar(ped)
  68.  Remove(ped)
  69.  wait(1000)
  70.  miss(1000)-- миссия выполнена сколько денег получено за выполнение.
  71.   break
  72.   end
  73.  if not player_defined(ped) then   printmessage("mesgess dead", 3000,1)  end_mission("mission failed!")
  74. break
  75.  end
  76.   end
  77.   destroy()-- удалить все объекты, которые были созданы скриптом.     
  78.   end
  79.  end
  80.  end
  81.  
« Последнее редактирование: Февраль 11, 2020, 11:32:31 am от egor230 »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
А как  изменить  значения адрес памяти 0x41079F в sdk plugin, всегда понять на маленькой примере.

kenking выше отвечал: http://forum.gtabuilder.ru/index.php?topic=502.msg3856#msg3856

Не все подряд имеет смысл делать через lua. В данном случае стоит сделать отдельный плагин на с++ и загружать через какой-нибудь loader до начала игры, чтобы инициализация всех первоначальных параметров уже подхватила изменения. Ты проверь для начала увеличение Streaming Memory через Limit Adjuster, а то может тебе оно и не надо. А для работы с адресами памяти в lua может и есть какие-то функции, этого я уже не знаю.

И ты вот скидываешь огромные куски кода на lua, но я не вижу на форуме ни одного человека, который был бы в теме этого языка. Sektor делал целый раздел Vice Lua, может туда лучше писать, хотя сомневаюсь, что кто-то тебе подскажет хоть что-то. Пока интересующихся этим особо нет.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
xanser согласен с Вами. Потихоньку набираюсь опыта. Плагин существует благодаря sdk, на котором пишу функции.
Может кому-то будет он интересен. Конечно, плагин ещё нужно дорабатывать, постоянно тестировать. Моя мечта сделать, как можно более простой и лёгкой инструмент для написания миссии, аналог Moonloader только для gta vc. Вот  миссия “вечеринка ” написана на lua.  https://www.youtube.com/watch?v=PnulI-BlR1w&feature=youtu.be

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Вот написал новую миссию, конечно простую, выезжать взять пикап, доехать до точки.
Вот видео  https://www.youtube.com/watch?v=r6R4Rt4sGaU&feature=youtu.be
Постоянно что-то  обновляю, тестирую, нахожу баги,  исправляю их.   

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
По поводу Lua и прочее скрипты, нужно смотреть как на язык дизайнера, делать всякие расчеты, сложные функции какие нибудь ближе к харду, это совсем не лучшее решение. А вот выносить в луа, чисто для мода функции, как раз рациональное решение. Аналог тому, как рокстар сделал опкоды так называемые. Чисто геймдизайнерский подход.

По поводу изменить значения, ну луа об этом не обязан знать, об этом я писал статью по созданию плагина под Lua:
http://gtabuilder.ru/gta_vc/modding/other_lessons/120-sozdanie-prostogo-plagina-dlya-vice-lua.html
http://gtabuilder.ru/gta_vc/modding/other_lessons/121-sozdanie-plagina-dlya-vice-lua.html

Это один из моментов.


« Последнее редактирование: Март 10, 2020, 12:06:51 am от Sektor »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
 Sektor, спасибо за ваш ответ. Много очень чего добавил  в плагин.
Вот миссию написал. “Убить Кортеса” видео https://www.youtube.com/watch?v=2m0w7wDr7_c&feature=youtu.be

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Обновил немного свой плагин.
 
Код: Javascript
  1.  
  2.  
  3. Новые функции.
  4.  
  5. lua_register(L, "setbomb_in_car", setbomb_in_car); // 189 установить бомбу в авто.
  6. lua_register(L, "getbomb_in_car", getbomb_in_car); // 190 получить тип бомбы в авто.
  7. lua_register(L, "activetbomb", activetbomb); // 191 активировать бомбу в авто.
  8. lua_register(L, "is_ped_in_this_car", is_ped_in_this_car); // 192 игрок в этом авто?
  9. lua_register(L, "ishorncar", ishorncar); // 193 проверить гудит ли авто.
  10. lua_register(L, "getcarfirstcolor", getcarfirstcolor); // 194 получить первый цвет авто.
  11. lua_register(L, "getcarseconscolor", getcarseconscolor); // 195 получить второй цвет авто.
  12. lua_register(L, "ped_char_spotted_player", ped_char_spotted_player); // 196 если пед увидел игрока.
  13. lua_register(L, "set_timer_bomb_car", set_timer_bomb_car); // 197 установить таймер на взрыв бомбы в авто.
  14. lua_register(L, "is_ped_objective", is_ped_objective); // 198 если пед выполнил задачу.
  15. lua_register(L, "set_time_scale", set_time_scale); // 199 установить ход времени в игре.
  16. lua_register(L, "is_ped_in_air", is_ped_in_air); // 200 если пед в воздухе.
  17. lua_register(L, "kill_peds_in_car", kill_peds_in_car); // 201 убить педов в авто.
  18. lua_register(L, "getstamina_ped", getstamina_ped); // 202 получить выносливость педа.
  19. lua_register(L, "setstamina_ped", setstamina_ped); // 203 установить выносливость педа.
  20. lua_register(L, "get_radio_car", get_radio_car); // 204 получить текущую радиостанцию авто.
  21. lua_register(L, "is_ped_passenger_car", is_ped_passenger_car); // 205 пед пассажир авто.
  22. lua_register(L, "is_ped_driver_car", is_ped_driver_car); // 206 пед пассажир авто.
  23. lua_register(L, "ped_in_turret_on_car", ped_in_turret_on_car); // 207 переместить педа в турель авто.
  24. lua_register(L, "ped_from_turret_on_car", ped_from_turret_on_car); // 208 убрать педа из турели авто.
  25. lua_register(L, "is_button_pressed", is_button_pressed); // 209 если спец клавиша нажата.
  26. lua_register(L, "getmoney_ped", getmoney_ped); // 210 получить кол-во деньги педа.
  27. lua_register(L, "setmoney_ped", setmoney_ped); // 211 установить кол-во деньги педа.
  28. lua_register(L, "addmoney_ped", addmoney_ped); // 212 добавить кол-во деньги педа.
  29. lua_register(L, "getgravity", getgravity); // 213 получить значения гравитации.
  30. lua_register(L, "setgravity", setgravity); // 214 установить значения гравитации.
  31. lua_register(L, "gravity_default", gravity_default); // 215 вернуть значения по умолчанию гравитации.
  32. lua_register(L, "create_shots_on_ped", create_shots_on_ped); // 216 создать выстрелы.
  33. lua_register(L, "get_wheel_status", get_wheel_status); // 217 получить состояния шины авто.
  34. lua_register(L, "create_shots_on_car", create_shots_on_car);// 218 создать выстрелы.
  35. lua_register(L, "ped_save_pos_attack", ped_save_pos_attack);// 219 пед сохраняет ли свою позицию при атаке.
  36. lua_register(L, "ped_rebuff", ped_rebuff);// 220 пед атакует любого, кто нападает на него.
  37. lua_register(L, "ped_search_threat", ped_search_threat);// 221 пед ищет угрозу.
  38. lua_register(L, "ped_clean_threat", ped_clean_threat);// 222 очистить угрозы для педа.
  39. lua_register(L, "save_car_color", save_car_color);// 223 авто сохраняет цвет при перекраске.
  40. lua_register(L, "is_car_passenger_free", is_car_passenger_free);// 224 Проверяет, свободно ли место пассажира в авто.
  41. lua_register(L, "set_ped_bleeding", set_ped_bleeding);// 225 вкл\выкл крованные у педа.
  42. lua_register(L, "all_exit_from_car", all_exit_from_car);// 226 все педы выходят из авто.
  43. lua_register(L, "is_ped_duck", is_ped_duck);// 227 Проверяет, пед присел.
  44. lua_register(L, "set_car_tank", set_car_tank);// 228 установить способность танка детонировать авто при контакте.
  45. lua_register(L, "set_display_radar", set_display_radar);// 229 показать скрывать радар.
  46. lua_register(L, "set_ped_in_car", set_ped_in_car);// 230 установить педа в авто как водителя или пассажира.
  47.  
  48.  


Новая миссия https://www.youtube.com/watch?v=fFEyUxfGrLM&t=0s

Стабильность плагина стала выше.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Обновленная версия плагина
Код: Javascript
  1. Новые функции .
  2.  
  3. lua_register(L, "set_ped_traffic", set_ped_traffic); // 231 установить плотноcть трафика педов.
  4. lua_register(L, "heli_to_fly", heli_to_fly); // 232 вертолет летит на координаты.
  5. lua_register(L, "set_ped_immunities", set_ped_immunities); // 233 уст иммунитеты педу.
  6. lua_register(L, "set_car_immunities", set_car_immunities); // 234 уст иммунитеты авто.
  7. lua_register(L, "setcolourmarker", setcolourmarker); // 235 установить цвет маркера.
  8. lua_register(L, "set_camera_on_car", set_camera_on_car); // 236 уст камеру на авто.
  9. lua_register(L, "ped_run_to_point", ped_run_to_point); // 237 пед бежит к точке пешком.
  10. lua_register(L, "select_interiour", select_interiour); // 238 уcтановить интерьер.
  11. lua_register(L, "set_ped_stats_to", set_ped_stats_to); // 239 уст поведения педа.
  12. lua_register(L, "ped_maintain_position_when_attacked", ped_maintain_position_when_attacked); // 240 пед удерживает позицию при атаке.
  13. lua_register(L, "set_timer_ped_attack", set_timer_ped_attack); // 241 установить таймер атаки педа.
  14. lua_register(L, "set_cops_ignored", set_cops_ignored); // 242 установить игнор копов.
  15.  

Первая миссия из gta vice city long night переделанная https://www.youtube.com/watch?v=y9SkUbCbXD4&featu..

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Отличная работа!
Тебе обязательно нужно продвигать также этот плагин на gtaforums.com
Так будет больше шансов раскрутить проект.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Спасибо вам большое уважаемый Shagg_E. У меня всё работает без багов, но знаю, как всегда баги будут возникать у людей.
Мне очень хотелось создать инструмент для написания миссий, только благодаря вашим советам от знающих людей, удалось это сделать.
полтора года ушло на написание плагина, конечно мой энтузиазмом немного поугас, тем более всё время что-то отвлекает, прекрасно понимаю, что можно было сделать и лучше. У меня нет исходников moonloader, так бы всё было гораздо быстрее. Меня вдохновило vice lua  Sektor, он настоящий молодец.
Теперь останется развивать проект, но уже на  малых оборотах.