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

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 169
  • Репутация: +6/-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

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 578
  • Репутация: +84/-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

  • Новичок
  • **
  • Сообщений: 169
  • Репутация: +6/-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

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 578
  • Репутация: +84/-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

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