Автор Тема: Написание плагина. Настройка проекта  (Прочитано 30768 раз)

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 213
  • Репутация: +13/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #285 : Июль 27, 2019, 10:41:56 am »
Флаг миссии устанавливается так:
Код: C++
  1. CTheScripts::ScriptSpace[CTheScripts::OnAMissionFlag] = 1
Переменная CTheScripts::OnAMissionFlag для VC в sdk пока не добавлена
Пока можно так:
Код: C++
  1. #include "plugin.h"
  2. #include "CTheScripts.h"
  3. #include "extensions\KeyCheck.h"
  4.  
  5. unsigned int &OnAMissionFlag = *(unsigned int *)0x978748;
  6.  
  7. using namespace plugin;
  8.  
  9. class Test {
  10. public:
  11.     Test() {
  12.         Events::drawingEvent += [] {
  13.             gamefont::Print({
  14.                 Format("OnAMissionFlag = %d", CTheScripts::ScriptSpace[OnAMissionFlag])
  15.             }, 10, 200, 1, FONT_DEFAULT, 0.75f, 0.75f, color::Orange);
  16.            
  17.             CPed *player = FindPlayerPed();
  18.             if (player) {
  19.                 KeyCheck::Update();
  20.                 if (KeyCheck::CheckWithDelay('M', 1000)) {
  21.                     if (CTheScripts::ScriptSpace[OnAMissionFlag])
  22.                         CTheScripts::ScriptSpace[OnAMissionFlag] = 0;
  23.                     else
  24.                         CTheScripts::ScriptSpace[OnAMissionFlag] = 1;
  25.                 }
  26.             }
  27.         };
  28.     }
  29. } test;
Цитировать
как проверить флаг миссии? И установить его, что миссия запущена.
Перед запуском своей миссии проверяешь значение CTheScripts::ScriptSpace[OnAMissionFlag], если оно равно 0, никакая миссия в данным момент не запущена. Запускаешь свою миссию, устанавливаешь значение CTheScripts::ScriptSpace[OnAMissionFlag] в 1. Миссия запущена. Когда миссия заканчивается, ставишь CTheScripts::ScriptSpace[OnAMissionFlag] в 0.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 146
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #286 : Август 01, 2019, 08:45:47 am »
спасибо Вам большое уважаемый kenking. Что Вы помогли мне разобраться с флагами миссий. их добавил в lua.  Смог написать первую  простую миссию  https://www.youtube.com/watch?v=z6BFxEsu4W4 https://vk.com/gtabuilder?w=wall-56513456_515

конечно, все уже неплохо для начало. но нужна многопоточность, что упростить этот процесс. будем работать.
Скажите, пожалуйста, с помощью какой функции можно открыть двери и капот, багажник. помню в cleo писали типа.

Код: C++
  1. :left_front_door
  2. 05E7: 10@ = car 10@ struct
  3. 0085: 11@ = 10@
  4. 05E4: call_function_method 6@ struct 11@ num_params 1 pop 0 0@ {1..19} 2@ // IsComponentPresent
  5. if
  6. 2@ == 1
  7. then
  8. 0085: 3@ = 10@
  9. 3@ += 0x2A0 // CDamageManager
  10. 05E4: call_function_method 7@ struct 3@ num_params 1 pop 0 1@ {0..5} 4@ // GetComponnetStatus
  11. if
  12. 4@ <> 3
  13. then
  14. for 12@ = 0.0 TO 1.0 step 0.1
  15. 05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
  16. wait 0
  17. end
  18. 05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
  19. end
  20. end
  21. return
  22.  

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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 213
  • Репутация: +13/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #287 : Август 01, 2019, 12:10:13 pm »
Цитировать
Скажите, пожалуйста, с помощью какой функции можно открыть двери и капот, багажник.
1) Скрипт вот https://gta.com.ua/file_details.phtml?id=2832
2) В этой теме DK показывал код такого плагина для SA. Я переписал для VC https://github.com/kenkingGitHub/GTA-Projects/blob/master/VC_OpenComponent/VC_OpenComponent.cpp
(там только под более раннюю версию sdk, #include надо заменить)

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 146
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #288 : Август 13, 2019, 11:21:00 am »
Здравствуйте,  уважаемый kenking. Спасибо за ссылки.  Компоненты авто( капот,  багажник, двери) работаю.  Думаю, как это встроит в lua.
 Только в одной строке  выдает ошибку, ее пришлось закомментировать
Код: C++
  1.  
  2.                 //if (automobile->stDamage.GetDoorStatus(doorId) != DAMSTATE_NOTPRESENT) {
  3.                                 DoorEvent& event = VehDoors.Get(automobile).events[doorId];
  4.                                 if (event.m_type == DOOR_EVENT_OPEN)
  5.                                         event.m_type = DOOR_EVENT_CLOSE; // Если последнее событие - открытие, то закрываем
  6.                                 else
  7.                                         event.m_type = DOOR_EVENT_OPEN; // Если последнее событие закрытие - то открываем
  8.                                 event.m_active = true; // Включаем обработку
  9.                                 m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds;
  10.                         //}
  11.  

хотя функция есть  // Converted from thiscall uint CDamageManager::GetDoorStatus(eDoors door) 0x5A9810
unsigned int CDamageManager::GetDoorStatus(eDoors door) {
    return plugin::CallMethodAndReturn<unsigned int, 0x5A9810, CDamageManager *, eDoors>(this, door);
} здесь https://github.com/DK22Pac/plugin-sdk/blob/b4b8841561d4d8742b0e15a16d5096e1b56b31c2/plugin_vc/game_vc/CDamageManager.cpp

Может ее неправильно подключил. заново собрал sdk, обновил. он прогрессирует.

добавил в свой lua плагин пару новых функций, благодаря SDK Plugin.



Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 146
  • Репутация: +5/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #289 : Август 18, 2019, 11:49:01 am »
Здравствуйте, всем. Удалось реализовать  открытия дверей автомобиля в lualoader. только у авто модели MODEL_ENFORCER капот открывается в обратную сторону MODEL_ENFORCER https://www.youtube.com/watch?v=Lb5UNBe_QtQ&t=2s ,https://vk.com/gtabuilder?w=wall-56513456_517

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

 
Код: Text
  1. const float ACTION_TIME_STEP = 0.05f;
  2. const unsigned int TIME_FOR_KEYPRESS = 500;
  3. struct Doorse {
  4.         static int componentByDoorId[6]; // Таблица перевода eDoors в Id компонента
  5.         static int m_nLastTimeWhenAnyActionWasEnabled; // Последнее время запуска события
  6.         enum eDoorEventType { // Тип события
  7.                 DOOR_EVENT_OPEN, DOOR_EVENT_CLOSE
  8.         };
  9.  
  10.         struct DoorEvent { // Класс события
  11.                 bool m_active;  eDoorEventType m_type;  float m_openingState;
  12.  
  13.                 DoorEvent() { m_active = false; m_type = DOOR_EVENT_CLOSE; }
  14.         };
  15.  
  16.         struct VehicleDoors {
  17.                 DoorEvent events[6]; // События для всех 6 дверей
  18.                 VehicleDoors(CVehicle*) {}
  19.         };
  20. };
  21. struct DoorsExample {
  22.         static int componentByDoorId[6]; // Таблица перевода eDoors в Id компонента
  23.         static int m_nLastTimeWhenAnyActionWasEnabled; // Последнее время запуска события
  24.  
  25.         enum eDoorEventType { // Тип события
  26.                 DOOR_EVENT_OPEN, DOOR_EVENT_CLOSE
  27.         };
  28.  
  29.         struct DoorEvent { // Класс события
  30.                 bool m_active;  eDoorEventType m_type;  float m_openingState;
  31.                 DoorEvent() { m_active = false; m_type = DOOR_EVENT_CLOSE; }
  32.         };
  33.  
  34.         struct VehicleDoors {
  35.                 DoorEvent events[6]; // События для всех 6 дверей
  36.                 VehicleDoors(CVehicle*) {}
  37.         };
  38.  
  39.         static VehicleExtendedData<VehicleDoors> VehDoors; // Наше расширение
  40.  
  41.         static void EnableDoorEvent(CAutomobile* automobile, eDoors doorId) { // Включить событие двери
  42.                 if (automobile->IsComponentPresent(componentByDoorId[doorId])) {
  43.                         CDamageManager* p;
  44.                         if (p->GetDoorStatus(doorId) != DAMSTATE_NOTPRESENT) {
  45.                                 DoorEvent& event = VehDoors.Get(automobile).events[doorId];
  46.                                 if (event.m_type == DOOR_EVENT_OPEN)
  47.                                         event.m_type = DOOR_EVENT_CLOSE; // Если последнее событие - открытие, то закрываем
  48.                                 else
  49.                                         event.m_type = DOOR_EVENT_OPEN; // Если последнее событие закрытие - то открываем
  50.                                 event.m_active = true; // Включаем обработку
  51.                                 m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds;
  52.                         }
  53.                 }
  54.         };
  55.  
  56.         static void ProcessDoors(CVehicle* vehicle) { // Обработка событий для конкретного авто
  57.                 if (vehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE) {
  58.                         CAutomobile* automobile = reinterpret_cast<CAutomobile*>(vehicle);
  59.                         for (unsigned int i = 0; i < 6; i++) { // Обрабатываем все события
  60.                                 eDoors doorId = static_cast<eDoors>(i);
  61.                                 DoorEvent& event = VehDoors.Get(automobile).events[doorId];
  62.                                 if (event.m_active) { // Если событие активно
  63.                                         if (event.m_type == DOOR_EVENT_OPEN) {
  64.                                                 event.m_openingState += ACTION_TIME_STEP;
  65.                                                 if (event.m_openingState > 1.0f) { // Если полностью открыли
  66.                                                         event.m_active = false; // Отключаем обработку
  67.                                                         automobile->OpenDoor(componentByDoorId[doorId], doorId, 1.0f); // Полностью открываем
  68.                                                         event.m_openingState = 1.0f;
  69.                                                 }
  70.                                                 else
  71.                                                         automobile->OpenDoor(componentByDoorId[doorId], doorId, event.m_openingState);
  72.                                         }
  73.                                         else {
  74.                                                 event.m_openingState -= ACTION_TIME_STEP;
  75.                                                 if (event.m_openingState < 0.0f) { // Если полностью открыли
  76.                                                         event.m_active = false; // Отключаем обработку
  77.                                                         automobile->OpenDoor(componentByDoorId[doorId], doorId, 0.0f); // Полностью открываем
  78.                                                         event.m_openingState = 0.0f;
  79.                                                 }
  80.                                                 else
  81.                                                         automobile->OpenDoor(componentByDoorId[doorId], doorId, event.m_openingState);
  82.                                         }
  83.                                 }
  84.                         }
  85.                 }
  86.         };
  87. };
  88. int DoorsExample::componentByDoorId[6] = { CAR_BONNET, CAR_BOOT, CAR_DOOR_LF, CAR_DOOR_RF, CAR_DOOR_LR, CAR_DOOR_RR };
  89. int DoorsExample::m_nLastTimeWhenAnyActionWasEnabled = 0;
  90. VehicleExtendedData<DoorsExample::VehicleDoors> DoorsExample::VehDoors;
  91. class Message {//имя класса
  92. public: Message() {
  93.         Events::gameProcessEvent += [] {//обработчик событий игры
  94.                 Events::vehicleRenderEvent += DoorsExample::ProcessDoors; // Тут обрабатываем события, а также выключаем их
  95.                 CPed* player = FindPlayerPed();// найти игрока.
  96.                 if (!player) return;// проверка найден игрок
  97.                 static unsigned int time = 0;// обнулить таймер
  98.  
  99.                 if (reload == false) {
  100.                         if (CTimer::m_snTimeInMilliseconds - time > 500) {
  101.                                 this_thread::sleep_for(chrono::milliseconds(600));// задержка
  102.                                 time = 0;// обнулить таймер
  103.                                 reload = true;// флаг, что уже запущен поток.
  104.                         }
  105.                         thread th(second, std::ref(reload)); th.detach();// независимый поток.        
  106.                 };
  107.  
  108.         };
  109. }
  110. } message;
  111. int opendoorcar(lua_State* L) { // открыть дверь авто.
  112.         try {
  113.                 if (LUA_TUSERDATA == lua_type(L, -2) && LUA_TNUMBER == lua_type(L, -1)) {// указатель на авто.
  114.                         CVehicle* b = (CVehicle*)Userdata::get<CVehicle>(L, 1, false);// получить указатель на авто.
  115.                         CAutomobile* automobile = reinterpret_cast<CAutomobile*>(b); // опять же, приведение типов. Т.к. мы будет юзать damageManager, нам нужно убедиться, что транспорт - это автомобиль (CAutomobile)
  116.                        
  117.                         int door = Stack<int>::get(L, 2);
  118.                         switch (door)           {
  119.                         case 0: {DoorsExample::EnableDoorEvent(automobile, BONNET); // 0 капот
  120.                                 break;   }
  121.                         case 1: {DoorsExample::EnableDoorEvent(automobile, BOOT); // 1 багажник
  122.                                 break;   }
  123.                 case 2:  { DoorsExample::EnableDoorEvent(automobile, DOOR_FRONT_LEFT); // 2 левая передняя дверь
  124.                         break;   }
  125.                 case 3: {DoorsExample::EnableDoorEvent(automobile, DOOR_FRONT_RIGHT); // 3 правая передняя дверь
  126.                         break;   }
  127.                 case 4: {DoorsExample::EnableDoorEvent(automobile, DOOR_REAR_LEFT); // 4 левая задняя дверь
  128.                         break;   }
  129.                         case 5: {DoorsExample::EnableDoorEvent(automobile, DOOR_REAR_RIGHT); // 5 правая задняя дверь
  130.                         break; }
  131.                  default:{}
  132.                         }
  133.                         return 0;
  134.                 }
  135.                 else { throw "bad argument in function opendoorcar option of the vehicle"; }
  136.         }
  137.         catch (const char* x) { writelog(x); }
  138.         return 0;
  139. };
  140.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 213
  • Репутация: +13/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #290 : Август 18, 2019, 03:08:20 pm »
Цитировать
только у авто модели MODEL_ENFORCER капот открывается в обратную сторону MODEL_ENFORCER
На модели влаг выставлен неверно. В файле handling.cfg найди строчку ENFORCER и замени 3 цифру с конца 27 на 23