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

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


Сообщения - egor230

Страницы: 1 [2] 3 4 ... 13
16
xanser согласен с Вами. Потихоньку набираюсь опыта. Плагин существует благодаря sdk, на котором пишу функции.
Может кому-то будет он интересен. Конечно, плагин ещё нужно дорабатывать, постоянно тестировать. Моя мечта сделать, как можно более простой и лёгкой инструмент для написания миссии, аналог Moonloader только для gta vc. Вот  миссия “вечеринка ” написана на lua.  https://www.youtube.com/watch?v=PnulI-BlR1w&feature=youtu.be

17
Спасибо большое вам 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.  

18
Спасибо большое за ответ  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.  

19
Здравствуйте, всем. Была задержка в разработке.  Написал миссию.
Теперь спец актеры, это обычный пед с измененным скином, меньше мороки.
Код: Javascript
  1. Новые функции.
  2. ped = create_spec_ped("IGHLARY", 0.0,0.0,0.0) – Создать спец актер.
  3.    go_to_route(car, road)- авто следует по маршруту, принимает указатель на авто, таблицу с координатами.
  4. Теперь, чтобы создать корону чекпойнта, не нужно ставить ее в цикл.
  5.  local t = {true, 4.5, 6, 0, 255, 0, 0, x,y,z}
  6.   draw_corona(t) -- вкл корону
  7.   then  sound_coordinate(7, 0.0,0.0,0.0)
  8. local t = {false, 4.5, 6, 0, 255, 0, 0, x,y,z}
  9.   draw_corona(t) -- выкл корону
  10.  
Новая миссия  “ driver”. Для активации введите чит-код “mission4”.
Вот видео  https://www.youtube.com/watch?v=GTIX6V4P1Vk&feature=youtu.be

Хотел у Вас спросить почему в игре некоторые части карты, имеют не полностью загруженные текстурами, на видео эти глюки есть если убрать только все asi плагины( а не только мой) то все текстуры прогружаются хорошо, у меня студия 19.
Скажите, пожалуйста,  как заставить актера – сидеть, лежать и т.д. где можно посмотреть полный список анимации? есть ли проверка, что пед удален?

20
просто, супер.  хочу детально разобраться, для переноса в lua.

21

  Благодарю вас kenking за  ответ,  ваши примеры смог перенести в плагин. Как всегда долго тупил.
 Вот как создавать специального актера.
Код: Text
  1.  
  2.  ped1 = Create_spec_ped("SAM", 1,x,y,z) --
  3.  
  4. Вот список имен спец актеров.
  5.  
  6. SPEC_PED_MODELS_AND_TYPES = {
  7.  BGA = {129,4,20}, BGB = {129,4,20}, BOUNCA = {129,4,20}, BURGER = {129,4,20}, CGONA = {129,4,20}, CGONB = {129,4,20}, CGONC = {129,4,20},
  8.  CHEF = {129,4,20}, CMRAMAN = {129,4,20}, COURIER = {129,4,20}, CREWA = {129,4,20}, CREWB = {129,4,20}, CSJUGGZ = {129,5,20},
  9.  DGOONA = {129,4,20}, DGOONB = {129,4,20}, DGOONC = {129,4,20}, FLOOZYA = {129,5,20}, FLOOZYB = {129,5,20}, FLOOZYC = {129,5,20},
  10.  FSFA = {129,4,20}, IGALSCB = {129,4,20}, IGBUDDY = {129,4,20}, IGBUDY2 = {129,4,20}, IGBUDY3 = {129,4,20}, IGCANDY = {129,5,20},
  11.  IGCOLON = {129,4,20}, IGDIAZ = {129,4,20}, IGDICK = {129,4,20}, IGGONZ = {129,4,20}, IGHLARY = {129,4,20}, IGHLRY2 = {129,4,20},
  12.  IGJEZZ = {129,4,20}, IGKEN = {129,4,20}, IGMERC = {129,5,20}, IGMIKE = {129,4,20}, IGMIKE2 = {129,4,20}, IGPERCY = {129,4,20},
  13.  IGPHIL = {129,4,20}, IGPHIL2 = {129,4,20}, IGPHIL3 = {129,4,20}, IGSONNY = {129,4,20}, IGMERC2 = {129,5,20}, MBA = {129,4,20},
  14.  MBB = {129,4,20}, MPORNA = {129,4,20}, MGOONA = {129,4,20}, MSERVER = {129,4,20}, MBA = {129,4,20}, MBB = {129,4,20}, MPORNA = {129,4,20},
  15.  MGOONA = {129,4,20}, MSERVER = {129,4,20}, PLAY10 = {129,4,20}, PLAY11 = {129,4,20}, PLAY12 = {129,4,20}, PLAYER2 = {129,4,20},
  16.  PLAYER3 = {129,4,20}, PLAYER4 = {129,4,20},  PLAYER5 = {129,4,20},  PLAYER6 = {129,4,20},   PLAYER7 = {129,4,20},
  17.  PLAYER8 = {129,4,20}, PLAYER9 = {129,4,20}, PRINTRA = {129,4,20},  PRINTRB = {129,4,20}, PRINTRC = {129,4,20}, PSYCHO = {129,4,20},
  18.  S_KEEP = {129,4,20}, SAM = {129,4,20}, SGC = {129,4,20}, SGOONA = {129,4,20}, SGOONB = {129,4,20}, SHOOTRA = {129,5,20},
  19.  SHOOTRB = {129,4,20}, SPANDXA = {129,5,20},SPANDXB = {129,5,20}, STRIPA = {129,5,20}
  20. }
  21.  
  22. Теперь рассмотрим функцию создания специального актёра.
  23.  
  24. function Create_spec_ped(m, slot, x,y,z)--создать спец пед.
  25. idmodel, t = model_and_type(m, SPEC_PED_MODELS_AND_TYPES)-- модель и тип.
  26. tipe = idmodel -108- slot
  27. create_spec_ped(m,idmodel,tipe, t ,slot, x,y,z)
  28.  return ped
  29. end
  30.  
Видео демонстрация https://www.youtube.com/watch?v=yoV30HMnZY4&feature=youtu.be

Также есть пара функций
set_wheel_status)// уст состояния шин авто.         
/*
первый указатель на авто.
второй параметр номер колесо.
третий  статус, 0 = починка.
*/
set_skin // уст скин педа.
remove_spec_ped // удалить спец педа.
[/code]




22
kenking спасибо большое за Ваш ответ.
насчет работы с patch::Set и patch::Get, пытался установить бомбу в авто, на CLEO это так.

 
Код: Text
  1. / Установить тип бомбы 0@ (car handle) 1@ (bomb stage)    
  2. gosub @text
  3. 05E7: 0@ = car 0@ struct
  4. 0@ += 0x1FE  // car bomb offset
  5. 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0  // store previous value
  6. 05F9: 1@ = 1@ AND 7  // keep only the first three bits from input param
  7. 05F9: 2@ = 2@ AND 0xF8  // exclude the first three bits in stored value
  8. 05FA: 2@ = 2@ OR 1@  // replace the first three bits of stored value with input param
  9. 05DF: write_memory 0@ size 1 value 2@ virtual_protect 0  // set to new value
  10. 05F6: ret 0
  11.  
  12.  
Немного проект забуксовал, виной я, мало опыта, добавил несколько функций.

 
Код: Text
  1.  show_text_gtx() вывести игровой текст.
  2.  camera_at_point()переместить камеру в координатах.
  3.  restore_camera() восстановить камеру.
  4.  is_wanted_level() проверить уровень розыска.
  5.  set_camera_position() уст камеру в координатах.
  6.  flash_hud() Мигание элементов HUD.
  7.  set_radio() уст радио.                
  8.  set_car_tires() проколоть шину.
  9.  
  10.   [/ccp]
  11. хотел немного изменить камеру, путем перемещения ее в цикле. не могу развернуть если томми повернулся.  [url]https://www.youtube.com/watch?v=3i_KD9zfKog[/url] работа с камерой очень нужна, для создания сцен миссии.
  12. сколько не бился, никак не получилось создать специального актера через скриптовые команды.
  13.  
  14. постоянно сталкиваюсь с кучей проблем, как сделать лучше то или другое, все часто хромает. когда всё постоянно идёт с большим трудностями, это психологически давит. Хочется хочется видеть результат больше, чем он есть на самом деле. Думаю, как сделать плагин более удобным, изобретаю костыли с велосипедами))))
  15. стараюсь найти способ смены скина педа.
  16.  
  17. все это время изучал новые методы SDK.
  18.         ped->BeingDraggedFromCar();     // вроде анимация выхода из авто.
  19. //ped->SetObjective(OBJECTIVE_GUARD_SPOT, pos); //охранное место  пед непонятно как охраняет.
  20.  
  21. Буду очень всем рад, кто напишет функции с описанием  их работы, добавляю  их в плагин.  Например, починка шин.

23
Новые функции.
Код: Javascript
  1. .addCFunction("ped_attack_car", ped_attack_car) // пед атакует авто.
  2.  
  3. .addCFunction("ped_frozen", ped_frozen)  // заморозить игpока.
  4. .addCFunction("hold_cellphone", hold_cellphone) // поднять телефон.
  5. .addCFunction("car_lastweapondamage", car_lastweapondamage)// номер оружие, которое нанесло урон авто.
  6. .addCFunction("car_currentgear", car_currentgear) // текущая передача авто.
  7.  
  8. .addCFunction("getcar_model", getcar_model) // получить модель авто.
  9. .addCFunction("setcarsiren", setcarsiren) // установить сирену для авто.
  10. .addCFunction("ped_car_as_driver", ped_car_as_driver) // пед садится в авто как водитель.
  11. .addCFunction("ped_car_as_passenger", ped_car_as_passenger) // пед садится в авто как пассажир.
  12.  
  13.  

нажмите клавишу "H" томми позвонить по телефону, появиться авто и 2 педа, они садят в авто 
вот сам скрипт.

Код: Javascript
  1. require("lualoader/mod")
  2.  
  3. function main()
  4. while lualoader == nil do
  5.  wait()-- задержка.
  6.  player = findplayer()-- получить игрока
  7.   if Keypress(VK_H) -- если клавиша H.
  8.  then   x,y,z =getcoordinates_on_y(player,5)-- получить координаты на 5 м впереди.
  9. Giveweaponped(player,600,"uzi")-- дать педу оружие.
  10. Hold_cellphone(player, 1)-- понять телефон.
  11. wait(1300)
  12. show_text_styled("BNK1_4",1000,2)
  13. play_voice("BNK1_4")
  14. Hold_cellphone(player, 0)-- положить телефон.
  15. mycar = Createcar(MODEL_INFERNUS,x,y,z) -- создать авто на 5 впереди.
  16.  
  17.  wait(12)-- задержка.
  18.   x,y,z =getcoordinates_on_y(player,10)-- получить координаты на 10 м впереди.
  19.  ped = Createped("HMYST",x,y,z)
  20. ped_car_as_driver(ped, mycar)-- пед садится в авто как водитель.
  21.  wait(12)-- задержка.
  22.   x,y,z =getcoordinates_on_y(player,15)-- получить координаты на 15 м впереди.
  23.  ped1 = Createped("HFOBE",x,y,z)
  24.  ped_car_as_passenger(ped1, mycar)-- пед садится в авто как пассажир.
  25.  
  26. wait(5300)
  27.  destroy()
  28.  end  
  29.  end
  30. end
  31.  
  32.  
видео https://www.youtube.com/watch?v=UvUD6oaJB-w&feature=youtu.be

добавлю новый функционал.
спасибо за ответ kenking, поправил, все работает. копаюсь в базе, разбираю функции,   всё идёт крайне медленно, занимает много времени.
Я сам недоволен  как работает lua в плагине, хочется лучше.  Вот бы посмотреть исходники moonloader.   Чтобы улучшить, у самого  маленькой опыт в программирование.  Например,  не знаю как выводить gtx записи. пед охраняет зону ped->SetObjective(OBJECTIVE_GUARD_SPOT, pos); //охранное место 0194
А на деле стоит на месте. ищу аналоги 0A8C: write_memory 0xC0BC15 size 1 value 1 virtual_protect 0 и 0A8D: $result = read_memory 1@ size 4 virtual_protect 0
 чтобы поработать с памятью, не могу актировать бомбу в машине, хотя делал все правильно.

      car->ActivateBombWhenEntered();
      car->ActivateBomb();*/


24
kenking благодарю Вас, что помогли мне с таймером, старался перенести в lua.

Удалось реализовать 3 типа таймера
Код: Javascript
  1. 1.  timer_donw(60,"R_TIME",1) последний параметр отвечает за уменьшения или увеличения его со временем.
  2.  
  3. 2. t =turn_default_timer(true,"TIMER:")--  первый параметр  включает, второй  какую надпись выводит перед  таймером.
  4. функция устроена так
  5. t ={turn,str_timer,1267,270, 1,1, 2.0, 2.0, 101, 193, 244}--
  6. print_front(t)-- вкл\выкл таймер, координаты, размер, цвет.
  7.  
  8. 3. countdown(8) от какого числа начинать  обратный отчёт, когда достигает 0, возвращает false,  использовать в цикле.
  9.  

Код: Javascript
  1. require("lualoader/mod")
  2.  
  3. function main()
  4. while lualoader == nil do
  5.  wait()-- задержка.
  6.  player = findplayer()-- получить игрока
  7.  if Keypress(VK_T) -- если клавиша T.
  8.  then
  9.  timer_donw(60,"R_TIME",1)-- Таймер на уменьшения
  10.  end
  11.  
  12.  if Keypress(VK_U) -- если клавиша U.
  13.  then
  14.  stop_timer("R_TIME")-- удалить таймер.
  15.  end
  16.  if Keypress(VK_H) -- если клавиша H.
  17.  then x,y,z =getcoordinates_on_y(player,10)-- получить координаты на 10 м впереди.
  18.   z = z-1
  19.   obj = Create_obj(350, x,y,z) -- создать объект(бочка).
  20.   printmessage("the bomb is planted", 2000,1)
  21.  while countdown(8) do wait()-- таймер на 8 секунд.
  22.      
  23. end
  24.  create_explosion(3,x,y,z ) --Создать взрыв на координатах.
  25. remove_obj(obj)
  26. end
  27.  
  28.  if Keypress(VK_G) -- если клавиша G.
  29. then printmessage("star timer", 2000,1)
  30. t =turn_default_timer(true,"TIMER:")
  31. end
  32.  if Keypress(VK_N) -- если клавиша N.
  33. then printmessage("stop timer", 2000,1)
  34. turn_default_timer(false,t)
  35.  
  36. end  
  37. end
  38. end
  39.  

Видео https://www.youtube.com/watch?v=W-GEgnW9gHU&feature=youtu.be

ох, все тяжелее работать над проектом, бывает мелкий баг, съедает кучу времени, из-за растущего объема, сложнее выносит изменения. сами функции имеют обертки для упрощения.  Хочется, чтобы тот кто будет писать скрипт, испытывай Как можно меньше  трудностей

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

25

Когда я прошел GTA Vice City, мне хотелось больше миссии, тогда денег не было на новые игры, а интернет был чем недосягаемым в 2003.
Мы часто обсуждаем, Какие новые миссии могли быть в игре. На CLEO их очень долго писать, бесило постоянные проверки, объём строк кода переваливал за 100.

Попробовал написать миссию для GTA San Andreas на moonloader

Код: Javascript
  1. [url]https://www.youtube.com/watch?v=0r0_bvHEWlc&featu=[/url]
  2. script_author("egor")
  3. require "lib.moonloader"
  4. func = require 'module'
  5. glob = require 'game.globals'
  6. model = require 'lib.game.models'
  7. local encoding = require 'encoding'
  8. encoding.default = 'CP1251'
  9. function step1()
  10. text = func.koder("езжай на маркер")
  11. printStringNow(text, 2000)— вывод текста
  12. wait(2000)
  13. while not locateCar3d(car, 2445.20,-1659.75,13.07, 6.0, 6.0, 3.0, true) do
  14. wait(0) end
  15. removeBlip(checkpoint)
  16. text = func.koder("убей неё")
  17. printStringNow(text, 2000)— вывод текста
  18. wait(500)
  19. ped = func.foe("VWFYWA2",28) — враг номер
  20. while not isCharDead(ped) do wait(0) end — пока жив пед пауза
  21. func.pass(100) — кол-во денег за победу
  22. end
  23.  
  24. function mission()
  25. car = createCar(model.CHEETAH, 2492.70, -1661.45, 13.10) — создать машину
  26. checkpoint = addBlipForCoord(2445.20,-1659.75,13.07) — 018A: 1@ = create_checkpoint_at 14@ 15@ 16@
  27. setCoordBlipAppearance(checkpoint, 2) — 08FB: set_checkpoint 1@ type_to 0
  28. step1()
  29. end
  30. function main()
  31. miss = 0
  32. creat = 0 — флаг создание сферы и иконки
  33. models = {model.CHEETAH,model.VWFYWA2,model.MICRO_UZI}— список моделей для миссии
  34. posx = 2497.49, posy = -1652.38, posz = 13.47 — координаты метки миссии
  35. icons = 40 — номер иконки миссии
  36. while true do
  37. wait(0)
  38. miss = func.check()
  39. if miss == 1
  40. then mission()
  41. end
  42. end
  43. end
  44.  
  45.  

Меньший объем кода достигается за счёт многопоточности, где происходили проверки.

Попробовал сделать миссию на lua для GTA Vice City. Это по сути однопоточная система, реальной многопоточности, есть сопрограммы.
введите чит-код "mission4" и начнется миссия.
Код: Javascript
  1. require("lualoader/mod")
  2. local road = {239.2, -1338.6, 10.6, -- 1
  3. 296.1, -997.9, 10.6, -- 2
  4. 490.5, -545.5, 10.6, -- 3
  5. 520.0, -81.6, 10.2, -- 4
  6. 526.5, 1264.8, 15.8 -- 5
  7. } open_doors = coroutine.create(function(car)
  8. while lualoader == nil do
  9.   coroutine.yield()
  10.   local health = getcarhealth(car)
  11.  if health < 800 and status == nil
  12.  then printmessage("open doors car", 3500,1)
  13.  opendoorcar(car, DRL) opendoorcar(car, DRR)
  14.  status = 1
  15.  for i = 1, 30 do x,y,z = getcarcoordinates_on_y(car,-3)
  16.   wait(600)  z = z -0.9 create_money_pickup(2000, x,y,z)
  17.   coroutine.yield()
  18.  end
  19.   else  coroutine.yield()
  20.  end
  21.  end
  22.  end
  23.  )
  24.  exit_foel = coroutine.create(function(car,ped)
  25. while lualoader == nil do  coroutine.yield()  
  26.   local health = getcarhealth(car)-- получить здоровье авто.
  27.  if health < 500
  28.  then printmessage("~r~i kill you", 2500,1)
  29.    Giveweaponped(ped,600,"buddyshot")-- дать педу оружие.
  30.  exitcar(ped)-- выход педа из авто.
  31.  Kill_ped_on_foot(ped, player)-- пед хочет убить игрока.
  32.  break
  33.  end
  34.  end
  35.  end
  36.  )
  37.  
  38. function main()
  39. while lualoader == nil do wait()
  40.  player = findplayer()-- получить игрока.
  41.  if  star_mission(player,"mission4")-- чит-код для активации миссии.
  42.  then fade(0,200) -- затенение, 200 время.
  43.  showtext("collection car", 500,1)-- вывод названия миссии.
  44.    Giveweaponped(player,600,"uzi")-- дать педу оружие.
  45.    wait(1900)-- задержка.
  46.    setpedcoordes(player, -212.4, -1433.0, 8.1)-- переместить игрока в координаты.
  47.    setpedangle(player, 220.0)-- уст угол педа.
  48.  mycar = Createcar(MODEL_PCJ600, 97.1, -1520.8, 10.0) -- создать авто.
  49.   setcarangle(mycar, 169)-- уст угол авто игрока.
  50.   putincar(player, mycar)--  поместить педа в авто.
  51.  
  52.  car = Createcar(MODEL_SECURICA, 86.4, -1590.9, 10.0, 265) -- создать авто.
  53.   setcarangle(car, 270) -- уст угол авто педа.
  54.   m = create_marker_car(car)-- создать маркер над авто.
  55.   ped = set_ped_in_car(car, "WMYSK" )-- уст педа водителя авто.
  56.  setcarspeed(car, 45) setdrivingstyle(car, 2) setcarstrong(car, 1)
  57.  
  58.  
  59.   fade(1,2600) --просветления, 2600 время.
  60.   printmessage("~r~kill driver and car!",4000,1)
  61.   newthread(checkmission, player) -- в новом потоке, постоянная проверка жив ли игрок?
  62.  while true == getflagmission() do wait()
  63.  
  64.  if follow_route(car, road) -- ехать по маршруту.
  65.  then  end_mission("mission failed!")--миссия провалена.
  66.  break
  67.  end
  68.  if 0 == getcarhealth(car) and 0 == getpedhealth(ped)-- если враг убит и машина уничтожена.
  69.  then miss(100) -- миссия выполнена дать 100$
  70.  break
  71.  end
  72.   coroutine.resume(exit_foel, car, ped) -- потока выхода педа из авто.
  73.   coroutine.resume(open_doors, car)-- выпадения денег.
  74.  end
  75. destroy()-- удалить все объекты
  76. end end
  77. end
  78. [url]https://www.youtube.com/watch?v=uoWVNks1WGk&feature=youtu.be[/url]
  79.  
  80.  
Миссия достаточно простая, по комментариям разобраться можно.
периодическое вызывается функция которую мы поместили в newthread она проверяет жив или арестован игрок.
Как она устроена на стороне с++.
Код: Javascript
  1. int newthread(lua_State* L) {// новый поток.
  2.         try {
  3.                 if (LUA_TFUNCTION == lua_type(L, 1)) {
  4.                         int stacksize = lua_gettop(L);
  5.                         //lua_pushinteger(L, stacksize);
  6.                         return lua_yield(L, stacksize);
  7.                 }
  8.                 else { throw "bad argument in function newthread"; }
  9.         }
  10.         catch (const char* x) { writelog(x); }
  11.         return 0;
  12. };
  13.                        
  14.     lua_pcall(L, 0, 0, 0);// запуск файла.
  15.     lua_State* L1 = lua_newthread(L);// создать новый поток.
  16.      lua_getglobal(L, "main"); counts++;// увеличить счетчик запущенных скриптов на 1.
  17.         if (LUA_TFUNCTION == lua_type(L, -1)) {
  18.                 luastate.push_back(L);// добавить указатель на lua состояния в вектор.
  19.                 lua_resume(L, NULL, 0); //Основной поток
  20.                 int args = lua_gettop(L);// получить аргументы для второго потока.
  21.                 lua_xmove(L, L1, args);
  22.                 args--;
  23.                 reversestack(L1); //инвертировать содержимое стека.
  24.                 while (LUA_OK != lua_status(L)) {// Пока основной поток не закончен.
  25.                         this_thread::sleep_for(chrono::milliseconds(1)); // задержка.
  26.                         if (LUA_TFUNCTION == lua_type(L1, -1) && LUA_YIELD == lua_status(L)) {
  27.  
  28.                                 for (int i = 1; i <= args; i++) { lua_pushvalue(L1, i); }// расстановка аргументов для вызова.
  29.                                 lua_resume(L1, L, args);
  30.                         }
  31.                         if (LUA_YIELD == lua_status(L1)) {
  32.                                 lua_sethook(L, (lua_Hook)hookFunc, LUA_MASKCOUNT, 9000); //вызов функции с заданной паузой.
  33.                                 lua_resume(L, L1, 0);// возобновить основной поток.
  34.                         }
  35.                         if (LUA_OK == lua_status(L1)) {// если второй поток завершен.
  36.                                 lua_sethook(L, (lua_Hook)hookFunc, LUA_MASKCOUNT, 0);// отключить хук.
  37.                                 lua_resume(L, NULL, 0);
  38.                         }
  39.                 }
  40.  
  41.  
К сожалению можно запускать только один дополнительный поток, не нашел способ Как сделать лучше.

Prographer Спасибо вам большое за ваше мнения, скорее lua, инструмент, чтобы изучить возможности sdk plugin

26

 Спасибо Вам за поддержку уважаемый Shagg_E. может кого-нибудь это заинтересует. устал от ограниченности CLEO.
Буду рад, если кому-то поможет моя разработка. не знаю как выставить изображения в сообщение на сайт.

Помню как-то хотел на CLEO написать гонку, но в скрипте нужно было писать много строк кода. Легко можно было ошибиться.
Как это обстоит на lua.
Сначала нам нужно записать координаты чекпоинтов в файл.

Когда находимся в нужной координате, нажимаем клавишу "L". Благодаря скрипту координата записывается в текстовой файл.

Код: Javascript
  1. require("lualoader/mod")
  2.  
  3. function main()
  4. while lualoader == nil do
  5.  wait()
  6.  player = findplayer()-- получить игрока
  7.  if Keypress(VK_L)
  8.  then x,y,z = getpedcoordes(player)
  9.  x = tonumber(string.format("%.1f", x))
  10.  y = tonumber(string.format("%.1f", y))
  11.  z = tonumber(string.format("%.1f", z))
  12.  cord = tostring(x)..", "..tostring(y)..", " .. tostring(z)..", "
  13.   file = io.open('cordinat.txt', 'a') -- открыть файл для записи
  14.   file:write(cord)    
  15.   file:close()
  16.   printmessage("write cordinat", 3000, 1)
  17.  wait(600)
  18.  end  
  19.  end  
  20. end
  21.  
  22.  

Теперь копируем всё из файла cordinat.txt в таблицу road.
Функция follow_route_for_corona_for_playercar помещаем в бесконечный цикл. Она принимает автомобиль и массив пути следования.
возвращает true,когда автомобиль достигнул последний точки маршрута. Сама функция находится в модулем mod.

Код: Javascript
  1.  
  2. require("lualoader/mod")-- функции упрощающие написания скрипта.
  3. local road = {480.0, -198.1, 10.3, --1
  4.  446.3, -372.3, 9.6, --2
  5.  363.4, -450.0, 9.4, --3
  6.  }
  7.  
  8. function main()
  9. while lualoader == nil do
  10.  wait()
  11.  player = findplayer()-- получить игрока
  12.  if Keypress(VK_H)
  13. then
  14.  x,y,z =getcoordinates_on_y(player,10)-- получить координаты на 5 м впереди от игрока.
  15.   mycar = Createcar(MODEL_SENTXS,x,y,z) -- создать авто на 5 впереди.
  16. putincar(player, mycar)-- переместить педа в авто
  17. wait(600)
  18.    while lualoader == nil do  wait()
  19.    if follow_route_for_corona_for_playercar(mycar, road)
  20.     then miss(100) -- дать 100$
  21.     break
  22.      end
  23.  
  24.  end
  25.  end
  26.  end
  27.  end
  28.  
Как работает функция putincar? Она принимает педа и авто, перемещая его в авто.

Код: Javascript
  1. int putincar(lua_State* L) {// переместить педа в авто.
  2.         try {
  3.                 if (LUA_TUSERDATA == lua_type(L, 2) && LUA_TUSERDATA == lua_type(L, -1)) {//число.
  4.  
  5.                         CPed* ped = (CPed*)Userdata::get<CPed>(L, 1, false);
  6.                         CVehicle* car = (CVehicle*)Userdata::get<CVehicle>(L, 2, false);
  7.  
  8.                         CPed* player = FindPlayerPed();// найти игрока  
  9.                         if (ped != player) {
  10.                                 Command<COMMAND_WARP_CHAR_INTO_CAR>(CPools::GetPedRef(ped), CPools::GetVehicleRef(car));
  11.                                 return 0;
  12.                         }
  13.                         else {
  14.                                 Command<COMMAND_WARP_PLAYER_INTO_CAR>(CWorld::PlayerInFocus, CPools::GetVehicleRef(car));
  15.                                 return 0;
  16.                         }
  17.                 }
  18.                 else { throw "bad argument in function putincar"; }
  19.         }
  20.         catch (const char* x) { writelog(x); }// записать ошибку в файл.
  21.         return 0;
  22. };
  23.  

Очень буду рад, если Вы мне подскажете как в данной функции обойтись без использования скриптовой команды?

Помогите мне понять как работает скриптовая команда Command<COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_STRING>(0,"R_TIME", 1);
На CLEO использовал ее так.
Код: Javascript
  1. while true
  2. wait 0 ms  
  3. 03C3: set_timer_with_text_to 16@ type 0 text 'R_TIME'  // ˜pem¬ ?ohk?:
  4. jump @1
  5.  
скрипт exapmle 2
Вот видео https://www.youtube.com/watch?v=MXaVkJihJyg&feature=youtu.be

27
Начал играть в 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.  


28
kenking спасибо очередной раз за Вашу неоцененную помощь,  таймер пока не перенес, хочется, чтобы нормально работало. тему создам, может прогресс ускорится. времени часто не хватает.

29
спасибо большое за Ваш ответ kenking. удалось реализовать управление авто следующим образом.
Код: C++
  1. int setcaraction(lua_State* L) {// установить поведение авто.
  2.         try {
  3.                 if (LUA_TUSERDATA == lua_type(L, -3)) {// указатель на авто.
  4.                         if (LUA_TNUMBER == lua_type(L, -2) && LUA_TNUMBER == lua_type(L, -1)) {
  5.                                 CVehicle* car = (CVehicle*)Userdata::get<CVehicle>(L, 1, false);// получить указатель на авто.
  6.                                 int style = Stack<int>::get(L, 2);// если число.
  7.                                 unsigned int t = Stack<int>::get(L, 3);// если число.
  8.                                 unsigned int time = t * 10;
  9.  
  10.                                 for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  11.                                         CVehicle* vehicle = CPools::ms_pVehiclePool->GetAt(i);
  12.                                         if (vehicle == car) {
  13.  
  14.                                                 if (style == 0) {
  15.                                                         Command<COMMAND_SET_CAR_TEMP_ACTION>(CPools::GetVehicleRef(vehicle), TEMPACT_NONE, time);
  16.                                                         return 0;
  17.                                                 }
  18.                                                 if (style == 1) {
  19.                                                         Command<COMMAND_SET_CAR_TEMP_ACTION>(CPools::GetVehicleRef(vehicle), TEMPACT_WAIT, time);
  20.                                                         return 0;
  21.                                                 }                                                                                                                                                                      
  22. .........................
  23.  

пытался написать подобие миссии "Водитель" вышло криво https://vk.com/gtabuilder?w=wall-56513456_524
не хватает таймера  гонки.  Vital в видео показывал так https://www.youtube.com/watch?v=YzGGZM_KyjQ&t=1256s
но в vice city он не работает на cleo.
хотелось узнать как сделать таймер на sdk, чтобы потом перенести в lua.
можно создать тему lualoader? чтобы выкладывать туда наработки?
как этот раздел http://forum.gtabuilder.ru/index.php?board=28.0
Скажите, пожалуйста, как помочь сайту материально?

Код: C++
  1. {$CLEO}
  2. 0000:    
  3. const
  4.  TEXT_X = 608.0 //timer X position (0.0–640.0)
  5.  TEXT_Y = 136.0 //timer Y position (0.0–448.0)
  6.  TEXT_R = 144 //timer red colour (0–255)
  7.  TEXT_G = 96 //timer green colour (0–255)
  8.  TEXT_B = 16 //timer blue colour (0–255)
  9.  TEXT_A = 255 //timer alpha (0–255)
  10.  TEXT_FONT = 3 //0 (Gothic),1 (Standard),2 (Menu),3 (Pricedown)
  11.  LETTER_H = 2.3 //letter height
  12.  LETTER_W = 0.6 //letter width
  13.  OUTLINE_R = 0 //outline red colour (0–255)
  14.  OUTLINE_G = 0 //outline green colour (0–255)
  15.  OUTLINE_B = 0 //outline blue colour (0–255)
  16.  OUTLINE_A = 200 //outline alpha (0–255)
  17.  OUTLINE_W = 1 //outline width (1 & 2 are optimal values)
  18. end // const
  19.                            
  20. :1
  21. while true
  22. wait 0 ms  
  23. 03F0: enable_text_draw 1
  24. 03E4: set_text_draw_align_right 1
  25. 0340: set_text_draw_RGBA TEXT_R TEXT_G TEXT_B TEXT_A
  26. 0349: set_text_draw_font TEXT_FONT
  27. 033F: set_text_draw_letter_size LETTER_W LETTER_H
  28. 045B: draw_text_2numbers TEXT_X TEXT_Y GXT 'TIME' numbers 0 0 //~1~:~1~
  29.   03F0: enable_text_draw 0  
  30.   end
  31. jump @1
  32.  




30
Благодарю вас kenking за помощь. плагин скоро  будет допилен))))))))))) надеюсь на это.

что-то у  меня  не вышло, заставить авто ехать назад, может  какого-то флага не  хватает. происходит вылет.

Код: Text
  1.  
  2. bool wait(unsigned int key) {
  3.         if (!KeyCheck::CheckWithDelay(key, 200)) { return true; }
  4.         else { return false; }
  5. }
  6. CVehicle* createcar(int modelID, float distance = 10.f) {// создать авто
  7.         char reference = 2;
  8.         CPed* player = FindPlayerPed();
  9.         CVector position = player->m_placement.pos;
  10.         position += player->m_placement.up * distance; // Вектор оси прямо от игрока умножаем на 10 метров и прибавляем к позиции.
  11.         CStreaming::RequestModel(modelID, 0); // ANGEL 166 ModelID
  12.         CStreaming::LoadAllRequestedModels(false);
  13.         CVehicle* v;
  14.         if (CModelInfo::IsCarModel(modelID))// если создаем авто.
  15.                 v = new CAutomobile(modelID, reference);
  16.         if (CModelInfo::IsBikeModel(modelID))
  17.                 v = new CBike(modelID, reference);
  18.         if (CModelInfo::IsBoatModel(modelID))
  19.                 v = new CBoat(modelID, reference);
  20.         CCarCtrl::JoinCarWithRoadSystem(v);// ии машина в системе.
  21.         v->m_nState = 4;
  22.         v->CVehicle::m_nCreatedBy = reference; // Если один то транспорт будет удален позже...
  23.         v->m_placement.SetRotate(0, 0, 3.5f);
  24.         v->m_placement.pos.x = position.x;
  25.         v->m_placement.pos.y = position.y;
  26.         v->m_placement.pos.z = position.z + v->GetDistanceFromCentreOfMassToBaseOfModel();
  27.         CWorld::Add(v);
  28.         return v;
  29. };
  30.  
  31. bool iscar(CPhysical* en) {
  32.         if (CModelInfo::ms_modelInfoPtrs[en->m_nModelIndex]->m_nType == MODEL_INFO_PED) {
  33.                 CMessages::AddMessageJumpQ(L"ped", 2000, 0);
  34.                 return false;
  35.         }
  36.  
  37.         if (CModelInfo::ms_modelInfoPtrs[en->m_nModelIndex]->m_nType == MODEL_INFO_VEHICLE){
  38.                 CMessages::AddMessageJumpQ(L"vehicle", 2000, 0);
  39.                 return false;
  40.         }
  41. };
  42. class Test {
  43. public:
  44.    
  45.     Test() {
  46.                 Events::gameProcessEvent += [] {
  47.                         CVehicle* car = nullptr;
  48.                         CPed* player = FindPlayerPed();// найти игрока
  49.                         if (!player) return;// проверка найден игрок
  50.                         KeyCheck::Update();
  51.                         if (KeyCheck::CheckWithDelay('N', 200)) {//если N нажата
  52.                                 if (wait('N')) return; {//если N нажата
  53.  
  54.                                 CPed* ped = nullptr;
  55.                                  car = createcar(MODEL_INFERNUS);
  56.                                 Command<COMMAND_REQUEST_MODEL>(MODEL_ARMY);
  57.                                 Command<COMMAND_LOAD_ALL_MODELS_NOW>(false);
  58.                                 if (Command<COMMAND_HAS_MODEL_LOADED>(MODEL_ARMY)) {
  59.                                                 Command<COMMAND_CREATE_CHAR_INSIDE_CAR>(CPools::GetVehicleRef(car), 4, MODEL_ARMY, &ped);
  60.                                                 //car->m_autoPilot.m_nCarMission = MISSION_NONE;
  61.                                         }
  62.                                 }
  63.                         }
  64.                         if (KeyCheck::CheckWithDelay('M', 200)) {//если M нажата
  65.                                 CMessages::AddMessageJumpQ(L"this is car", 10000, 0);
  66.                                         car->m_autoPilot.m_nAnimationId = TEMPACT_REVERSE;
  67.                                         car->m_autoPilot.m_nAnimationTime = 20000;
  68.                         }
  69.                 };
  70.         }
  71. } test;
  72.  
  73.  

Страницы: 1 [2] 3 4 ... 13