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

Оффлайн kenking

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

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

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

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

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

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

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #291 : Август 28, 2019, 02:35:05 pm »
Kenking может можно обойти этот баг, без внесение изменений в файл.

Добавил несколько функций в lualoader.
У нас есть скриптовая функция ((Command<COMMAND_HAS_PICKUP_BEEN_COLLECTED>(s))), которая возвращает булевое значение подобран ли пикап? как-то работает некорректно. Может что-то напутал

Код: Text
  1.                                         CVector pos = player->m_placement.pos;
  2.                                         pos += player->m_placement.up * 10;
  3.                                         Command<COMMAND_REQUEST_MODEL>(335);
  4.                         Command<COMMAND_LOAD_ALL_MODELS_NOW>(false);
  5.                                 if (Command<COMMAND_HAS_MODEL_LOADED>(335)) {
  6.                                         Command<COMMAND_CREATE_PICKUP>(335, 3, pos.x, pos.y, pos.z, &s);
  7.                                         }
  8.  
  9.                                 }
  10.                         }      
  11.                         if (Command<COMMAND_HAS_PICKUP_BEEN_COLLECTED>(s)) {
  12.                                 CMessages::AddMessageJumpQ(L"message", 2000, false);
  13.                         }
  14.                 };
  15.  

Пытался написать гоночный чекпойнт, есть идея написать миссию гонку, вспомнил опкод 024F: create_corona_with_radius 2.0 type 9 lensflares 0 with_color 0 255 0 at 2490.4514 -1674.7673 13.3359. все равно нужно потом удалить чекпойнт.
Код: Text
  1. Command<COMMAND_DRAW_CORONA>(5.5, 6, 0, 0, 255, 0, pos.x, pos.y, pos.z);
  2.  

Так думаю как воспроизвести звуковой файл. На cleo было так
Код: Text
  1. wait 0  
  2. 03CF: load_wav 'FIN_1a' as 1
  3. wait 0
  4. if 03D0:  wav 1 loaded
  5. jf @sound
  6. 03D1: play_wav 1
  7. :intro5
  8. wait 0
  9. if 03D2:  wav 1 ended
  10. jf @Intro5
  11. 040D: unload_wav 1  
  12.  

Думал на sdk можно так? Подскажите, пожалуйста.
Код: Text
  1.                 Command<COMMAND_LOAD_MISSION_AUDIO>(152, &s);// = 0x3CF,
  2.                                         if (Command<COMMAND_HAS_MISSION_AUDIO_LOADED>(s)){;// = 0x3D0,
  3.                                         Command<COMMAND_PLAY_MISSION_AUDIO>(s);// = 0x3D1,
  4.                                         if (Command<COMMAND_HAS_MISSION_AUDIO_FINISHED>(s)) {// = 0x3D2,
  5.                                                 Command<COMMAND_CLEAR_MISSION_AUDIO>(s);//      040D: unload_wav 1
  6.                
  7.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #292 : Август 28, 2019, 06:58:25 pm »
Цитировать
может можно обойти этот баг, без внесение изменений в файл.
Это просто ошибка разработчиков. Без исправления этого флага не обойдёшься. В чём проблема заменить одну цифру?

Цитировать
которая возвращает булевое значение подобран ли пикап? как-то работает некорректно. Может что-то напутал
С пикапами я не работал. Посмотрел в main, эта проверка вроде для другого пикапа, созданного опкодом 0517

Цитировать
Пытался написать гоночный чекпойнт, есть идея написать миссию гонку
Думаю, что это тоже надо смотреть в main.

Цитировать
как воспроизвести звуковой файл
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\ScriptCommands.h"
  3. #include "eScriptCommands.h"
  4. #include "extensions\KeyCheck.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     enum eAudioState { STATE_LOAD, STATE_PLAY, STATE_CLEAR };
  11.     static eAudioState m_currentState;
  12.    
  13.     Test() {
  14.         Events::gameProcessEvent += [] {
  15.             switch (m_currentState) {
  16.             case STATE_LOAD:
  17.                 KeyCheck::Update();
  18.                 if (KeyCheck::CheckWithDelay('M', 2000)) {
  19.                     Command<COMMAND_LOAD_MISSION_AUDIO>(1, "FIN_1a");
  20.                     m_currentState = STATE_PLAY;
  21.                 }
  22.                 break;
  23.             case STATE_PLAY:
  24.                 if (Command<COMMAND_HAS_MISSION_AUDIO_LOADED>(1)) {
  25.                     Command<COMMAND_PLAY_MISSION_AUDIO>(1);
  26.                     m_currentState = STATE_CLEAR;
  27.                 }
  28.                 break;
  29.             case STATE_CLEAR:
  30.                 if (Command<COMMAND_HAS_MISSION_AUDIO_FINISHED>(1)) {
  31.                     Command<COMMAND_CLEAR_MISSION_AUDIO>(1);
  32.                     m_currentState = STATE_LOAD;
  33.                 }
  34.                 break;
  35.             }
  36.         };
  37.     }
  38. } test;
  39.  
  40. Test::eAudioState Test::m_currentState = STATE_LOAD;



Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #293 : Сентябрь 06, 2019, 11:00:42 am »
Спасибо за Ваш ответ  kenking. Вряд ли кто-то будет менять флаг в файле при использовании плагина. возможно, есть способ обойти его.

Благодарю Вас, что показали как воспроизводить реплики, добавил в lua.
Буду с пикапом и гоночными чекпойнтами  разобраться, ох, трудностей всегда хватает.


Потоки работают, но есть сильное ограничение, нельзя передать указатели на педа, авто и объект. Дело в том, что у запуска функции в новом потоке есть очень сильное ограничение. Мы не можем передать указатели, потому что между состояниями нельзя передавать объекты, которые занимают память. Я думал, как это ограничение обойти? Решил, указатель преобразовать в строку, передать в новый поток, потом эту строку передать в функцию, которая обратно конвертирует строку в числовой указатель и ищет её в пуле. Но, опять произошла проблема, адреса в пуле являются не разыминованные, в отличие от числового указателя. Поэтому поиск никогда не даёт результатов. Буду очень рад, если Вы подскажите как решить эту проблему.

Код: Text
  1.  
  2.                         string str  = lua_tostring(L, -1);
  3. for (auto ped : CPools::ms_pPedPool) {
  4.                                         int p = (int)ped;
  5.                                         std::string sped = to_string(p);
  6.                                         if (str == sped) {
  7.                                                 Stack<bool>::push(L, true); Stack<CPed*>::push(L, ped);// отправить в стек и получить из стека можно
  8.                                                 return 2;
  9.                                         }
  10.                                 }
  11.  
Решил вывести указатели в файл.
Передаем в функцию 10EA92A8

В пуле такие адреса.

Код: Text
  1. 0C47DE08
  2. 0C47EBB8
  3. 0C47F290
  4. 0C47F968
  5. 0C480040
  6. 0C480718
  7.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #294 : Сентябрь 07, 2019, 11:30:03 am »
Цитировать
Вряд ли кто-то будет менять флаг в файле при использовании плагина. возможно, есть способ обойти его.
Никто не играет со стандартными моделями давно. А в заменяемых моделях авторы указывают свои настройки, где это исправлено.   

Цитировать
Потоки работают, но есть сильное ограничение, нельзя передать указатели на педа, авто и объект. Дело в том, что у запуска функции в новом потоке есть очень сильное ограничение. Мы не можем передать указатели, потому что между состояниями нельзя передавать объекты, которые занимают память. Я думал, как это ограничение обойти? Решил, указатель преобразовать в строку, передать в новый поток, потом эту строку передать в функцию, которая обратно конвертирует строку в числовой указатель и ищет её в пуле. Но, опять произошла проблема, адреса в пуле являются не разыминованные, в отличие от числового указателя. Поэтому поиск никогда не даёт результатов. Буду очень рад, если Вы подскажите как решить эту проблему.
Вообще не понял, что ты хочешь сделать.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #295 : Сентябрь 29, 2019, 05:41:18 pm »
Спасибо за ответ  kenking. Теперь понятно. Как всегда много трудности при реализации такого проекта. Зато идет прокачка навыков. Не знал как в SDK сделать проверку на ввод с клавиатуры строки. Написал функцию для считывание символов при нажатии клавиш. Все работает https://vk.com/gtabuilder?w=wall-56513456_521.

Конечно, со времени что-то переписываю, например, при перезагрузке скрипта, удаляются все созданные объекты из памяти.
Хотел у Вас спросить, вчера обновил visual studio 2019 при этом изменилась цветовая палитра. С ней неприятно работать, можете скинуть конфиг с прежней цветовой палитрой.
Скажите как в sdk заставить стрелять ракетами и пулеметом вертолет hunter?

   

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #296 : Октябрь 01, 2019, 07:56:09 am »
Цитировать
вчера обновил visual studio 2019 при этом изменилась цветовая палитра. С ней неприятно работать, можете скинуть конфиг с прежней цветовой палитрой.
Настроить: Сервис->Параметры->Окружение->Общие->Цветовая тема
У меня 2017

Цитировать
как в sdk заставить стрелять ракетами и пулеметом вертолет hunter?
Не знаю, не изучал этот вопрос.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #297 : Октябрь 01, 2019, 05:56:04 pm »
kenking, Ох, Вы не поверите, сколько сил и времени потребовалось чтобы вернуть прежнюю цветовую палитру. Просто за год к ней привык, а другая просто режет глаза, и работать невозможно. Подскажите, мне, пожалуйста, способ сохранения информации данного типа. Мы имеем основные потоки, у каждого потока могут быть дополнительные потоки, чтобы было понятнее, у потока один есть дополнительные потоки А и B, и у потока 2 есть потоки С и D, как лучше все это сохранить? В какой структуре? Чтобы легко перебирать дополнительные потоки исходя из основного. Структура вроде похожа на матрицу. Вот ломаю голову как это все реализовать. Может Вы что-то подскажете? Чтобы ещё была хорошая итерация, быстрая добавление и удаление любого дополнительного потока.

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #298 : Октябрь 02, 2019, 01:46:49 pm »
К сожалению, подсказать не могу.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #299 : Октябрь 08, 2019, 04:51:48 am »
kenking, решил эту проблему через костыль. сейчас пилю миссию, заметил один нюанс, если установить водителя для авто через скриптовую команду Command<COMMAND_CREATE_CHAR_INSIDE_CAR>(CPools::GetVehicleRef(car), 10, MODEL_SWAT, &ped); он начинает ехать сам. ищу способ это отключить, буду очень рад подсказке.