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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #165 : Сентябрь 13, 2017, 07:24:14 am »
Ранее был показан пример http://forum.gtabuilder.ru/index.php?topic=337.msg2337#msg2337, как  использовать VehicleExtendedData.
Код: C++
  1. class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)

Допустим я хочу реализовать работу дополнительных компонентов транспорта (дворники, руль, тормозные колодки, кузов самосвала, сдвижные двери микроавтобуса и т.д.) в плагине. Допустим мне нужно 50-100 компонентов и некоторое количество переменных, которые отслеживают состояние компонентов (открыт/закрыт, поднят/нет и т.д.) прикрепить подобным образом к структуре.

Есть ли какие-то ограничения по количеству, объёму этих данных, которые прикрепляются таким образом к структуре транспорта в одном плагине? А если подобных плагинов несколько? В общем суть вопроса - есть ли ограничения?

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #166 : Сентябрь 13, 2017, 08:22:39 pm »
Нет, ограничений нет.

Я бы сделал так:
Код: C++
  1. class ComponentBase {
  2.     CVehicle *myVehicle;
  3.     RwFrame *rwFrame;
  4.     // any other shared data ...
  5. public:
  6.     virtual void Update() = delete;
  7. };
  8.  
  9. class BrakePad : public ComponentBase {
  10.     // any data
  11. public:
  12.     void Update() {
  13.         // implementation
  14.     }
  15.  
  16.     BrakePad(CVehicle *_vehicle, RwFrame *_frame) : myVehicle(_vehicle), rwFrame(_frame) {}
  17. };
  18.  
  19. class DumpTipper : public ComponentBase {
  20.     // any data
  21. public:
  22.     void Update() {
  23.         // implementation
  24.     }
  25.  
  26.     // constructor and other methods
  27. };
  28.  
  29. // ... other component classes
  30.  
  31. class ComponentsExtension {
  32. public:
  33.     std::vector<ComponentBase *> components;
  34.  
  35.     ComponentsExtension(CVehicle *) {}
  36.  
  37.     ~ComponentsExtension() {
  38.         Clear();
  39.     }
  40.  
  41.     void Clear() {
  42.         for (auto &comp : ext.components) {
  43.               delete comp ;
  44.          }
  45.          components.clear();
  46.     }
  47.  
  48.     static void UpdateAllComponents(ComponentsExtension &ext) { // call this function in update flow
  49.          for (auto &comp : ext.components) {
  50.               comp->Update();
  51.          }
  52.     }
  53. };
  54.  
  55. // ...
  56.  
  57. extern VehicleExtendedData<ComponentsExtension> compsExt;
  58.  
  59. // ...
  60.  
  61. Events::vehicleRenderEvent.before += [](CVehicle *vehicle) { // or maybe some custom event?
  62.     ComponentsExtension::UpdateAllComponents(compsExt.Get(vehicle));
  63. }
  64.  
  65. // ...
  66.  
  67. Events::vehicleSetModelEvent += [](CVehicle *vehicle, int) {
  68.      ComponentsExtension &ext = compsExt.Get(vehicle);
  69.      if (ext.components.size() > 0)
  70.          ext.Clear();
  71.      RwFrame *breakPadFrame= CClumpModelInfo::FindFrameFromName(vehicle->m_pRwClump, "BrakePad");
  72.      if (breakPadFrame) {
  73.           ext.components.push_back(new BreakPad(vehicle, breakPadFrame);
  74.      }
  75.      // ...
  76. }
« Последнее редактирование: Сентябрь 13, 2017, 08:46:51 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #167 : Сентябрь 14, 2017, 02:56:40 pm »
Цитировать
Нет, ограничений нет.
Это хорошо.

Цитировать
Я бы сделал так:
Это для меня не совсем понятно.
Я начал делать, как в показанном ранее примере:

Код: C++
  1. #include <plugin_III.h>
  2. #include "game_III\CClumpModelInfo.h"
  3. #include "game_III\common.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class AdditionalComponents {
  8. public:
  9.     enum eWiperState {
  10.         STATE_LEFT,
  11.         STATE_RIGHT
  12.     };
  13.  
  14.     static eWiperState m_currentWiperState;
  15.     static float wiperAngle;
  16.  
  17.     class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)
  18.     public:
  19.         RwFrame *m_pBootSliding;
  20.         RwFrame *m_pSteerWheel;
  21.         RwFrame *m_pWiperOneR;
  22.         RwFrame *m_pWiperOneL;
  23.         bool wiperState;
  24.  
  25.         VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
  26.             m_pBootSliding = m_pSteerWheel = m_pWiperOneR = m_pWiperOneL = nullptr;  // устанавливаем все указатели в 0
  27.             wiperState = false;
  28.         }
  29.     };
  30.  
  31.     AdditionalComponents() {
  32.         static VehicleExtendedData<VehicleComponents> vehComps; // Создаем экземпляр нашего расширения. vehComps - это переменная, через которую мы будем
  33.                                                                 // обращаться к нашим данным (используя метод Get(CVehicle *транспорт) )
  34.  
  35.         Events::vehicleSetModelEvent += [](CVehicle *vehicle, int modelIndex) { // Выполняем нашу функцию, когда игра устанавливает модель транспорту
  36.             if (vehicle->m_pRwClump) { // Находим компоненты в иерархии и записываем их в наш класс
  37.                 vehComps.Get(vehicle).m_pBootSliding = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "boot_sliding");
  38.                 vehComps.Get(vehicle).m_pSteerWheel = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "steerwheel");
  39.                 vehComps.Get(vehicle).m_pWiperOneR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "wiper_or");
  40.                 vehComps.Get(vehicle).m_pWiperOneL = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "wiper_ol");
  41.             }
  42.             else {
  43.                 vehComps.Get(vehicle).m_pBootSliding = vehComps.Get(vehicle).m_pSteerWheel = vehComps.Get(vehicle).m_pWiperOneR = vehComps.Get(vehicle).m_pWiperOneL = nullptr;
  44.             }
  45.         };
  46.  
  47.         Events::gameProcessEvent += [] {
  48.             for (int i = 0; i < CPools::ms_pVehiclePool->m_nSize; i++) {
  49.                 CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  50.                 if (vehicle && vehicle->GetIsOnScreen() && vehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE) {
  51.                     CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle);
  52.                     if (vehComps.Get(vehicle).m_pBootSliding) {
  53.                         //
  54.                     }
  55.                     if (vehComps.Get(vehicle).m_pSteerWheel) {
  56.                         //
  57.                     }
  58.                     if (vehComps.Get(vehicle).m_pWiperOneR && vehComps.Get(vehicle).m_pWiperOneL) {
  59.                         //  
  60.                     }
  61.                 }
  62.             }
  63.  
  64.         };
  65.     }
  66. } AdditionalComponents;
  67.  
  68. AdditionalComponents::eWiperState AdditionalComponents::m_currentWiperState = STATE_LEFT;
  69. float AdditionalComponents::wiperAngle = 0.0f;
  70.  

Как определить для GTA3:
1) Включён или выключен двигатель на транспорте?
2) Как определить угол на который повернуто колесо (переднее левое и переднее правое) для установки такого же угла тормозной колодке?

И вопрос, который был написан в ЛС, всё ещё актуален.  :( 


Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Написание плагина. Настройка проекта
« Ответ #168 : Сентябрь 16, 2017, 02:19:39 pm »
по поводу двигателя: покопай опкод 02D4, я так для Vice делал.
I know everything and nothing...

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #169 : Сентябрь 17, 2017, 08:42:08 am »
по поводу двигателя: покопай опкод 02D4, я так для Vice делал.
Спасибо. Там получается так:
Код: C++
  1. if (vehicle->m_nVehicleFlags & 0x10)
  2.    // двигатель включен
  3. else
  4.    // выключен

Есть ещё вопрос в дополнение к оставшимся выше - если авто загнать в мастерскую с открытым компонентом, то после перекраски и ремонта компонент становится закрытым, но значение угла поворота automobile->m_aDoors[1].m_fAngle этого компонента остаётся от состояния открытого и не перезаписывается принудительно automobile->m_aDoors[1].m_fAngle = 0.0f;. Только после повторного открытия (на самом деле он начинает закрываться с с точки максимального открытого состояния, т.е. со значения automobile->m_aDoors[1].m_fAngle) этого компонента значение становится правильным. Как это исправить?


Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #170 : Сентябрь 25, 2017, 12:04:27 am »
Вопросы очень специфические - надо в базе искать и разбирать, готового ответа у меня нету.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #171 : Сентябрь 26, 2017, 05:59:24 pm »
Подскажите пожалуйста, как лучше реализовать возможность для пользователей назначать своё сочетание клавиш в текстовом файле для управление тем или иным действием в плагине. Набросал такой пример:
файл .dat
#A - key: dumper up_down, manhole open_closed
#B - key: dumper up,      manhole open
#C - key: dumper down,    manhole closed
#D - key: cement on/off
#E - 
#F -
#G -
#H -

#A,   B,   C,   D,   E,  F, G, H

keys
110, 104, 98,  46,
end

Код: C++
  1. #include "plugin_III.h"
  2. #include "game_III\CMessages.h"
  3. #include <vector>
  4. #include <string>
  5. #include <sstream>
  6. #include <fstream>
  7.  
  8. using namespace plugin;
  9.  
  10. std::vector<unsigned int> Key;
  11.  
  12. class MyPlugin {
  13. public:
  14.     static void ReadSettingsFile() {
  15.         std::ifstream stream("AdditionalComponents.dat");
  16.         for (std::string line; getline(stream, line); ) {
  17.             if (line[0] != ';' && line[0] != '#') {
  18.                 if (!line.compare("keys")) {
  19.                     while (line.compare("end") && getline(stream, line)) {
  20.                         if (line[0] != ';' && line[0] != '#') {
  21.                             std::stringstream ss(line);
  22.                             int i;
  23.                             while (ss >> i) {
  24.                                 Key.push_back(i);
  25.                                 if (ss.peek() == ',')
  26.                                     ss.ignore();
  27.                             }
  28.                         }
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.     }
  34.    
  35.     MyPlugin() {
  36.         ReadSettingsFile();
  37.  
  38.         Events::drawingEvent += [] {
  39.             if (KeyPressed(Key[0]))
  40.                 CMessages::AddMessageJumpQ(L"Key[0]", 2000, 0);
  41.             else if (KeyPressed(Key[1]))
  42.                 CMessages::AddMessageJumpQ(L"Key[1]", 2000, 0);
  43.         };
  44.     }
  45. } myPlugin;

Можно как-то улучшить? Оптимизировать? Или вообще по-другому это реализуется? Можно пример?
А если сделать с использованием .ini как это реализовать? Какой способ лучше?

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #172 : Октябрь 01, 2017, 01:09:56 am »
mycontrols.dat
Код: C
  1. KEY_OPEN_CLOSE  110   ; dumper up_down, manhole open_closed
  2. KEY_OPEN        104   ; dumper up,      manhole open
  3. KEY_CLOSE       98    ; dumper down,    manhole closed
  4. KEY_ON_OFF      46    ; cement on/off  

MySettings.h
Код: C++
  1. #pragma once
  2.  
  3. class MySettings {
  4. public:
  5.      MySettings();
  6.      
  7.      int keyOpenClose, keyOpen, keyClose, keyOnOff;
  8. };
  9.  
  10. extern MySettings settings;

MySettings.cpp
Код: C++
  1. #include "MySettings.h"
  2. #include plugin_header
  3.  
  4. MySettings settings;
  5.  
  6. MySettings::MySettings() {
  7.     plugin::config_file conf(PLUGIN_PATH("mycontrols.dat");
  8.    
  9.     keyOpenClose = conf["KEY_OPEN_CLOSE"].asInt(110);
  10.     keyOpen      = conf["KEY_OPEN"].asInt(104);
  11.     keyClose     = conf["KEY_CLOSE"].asInt(98);
  12.     keyOnOff     = conf["KEY_ON_OFF"].asInt(46);
  13. }

Main.cpp
Код: C++
  1. #include plugin_header
  2. #include "MySettings.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::gameProcessEvent += [] { // AddMessageJumpQ не рисует "напрямую" (в отличии от методов CFont), поэтому в drawing добавлять не надо
  10.             if (KeyPressed(settings.keyOpenClose))
  11.                 CMessages::AddMessageJumpQ(L"KEY_OPEN_CLOSE pressed", 2000, 0);
  12.         };
  13.     }
  14. } test;
« Последнее редактирование: Октябрь 02, 2017, 12:04:12 am от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #173 : Октябрь 01, 2017, 12:56:18 pm »
Спасибо!
Здесь добавил public: иначе в основном коде не было доступа к settings.keyOpenClose
Код: C++
  1. class MySettings {
  2. public:
  3. //......
  4.  

И ещё вопрос:
Код: C++
  1. #include "MySettings.h"
  2. #include plugin_header

подключение идёт в MySettings.cpp и в Main.cpp

Надо ли в этом случае в MySettings.cpp добавить перед этими строчками директиву #pragma once ?
Код: C++
  1. #pragma once
  2. #include "MySettings.h"
  3. #include plugin_header

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #174 : Октябрь 01, 2017, 08:46:41 pm »
Да.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #175 : Октябрь 11, 2017, 09:05:25 am »
Подскажите пожалуйста какой Event добавить в sdk, чтобы можно было выводить текстуру или текст в меню паузы игры?

update:
Нашёл, добавил в sdk для GTA3

Текст выводится, вот с текстурой проблема. С помощью CSprite2d не получается вывести.  >:(
« Последнее редактирование: Октябрь 12, 2017, 10:19:39 am от kenking »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #176 : Октябрь 13, 2017, 10:48:02 am »
Понадобилось в плагине для GTA3 найти координаты с офсетом относительно транспорта (и игрока).
Посмотрел в CLEO-SDK, как реализован соответствующий опкод
//0407=7,store_coords_to %5d% %6d% %7d% from_car %1d% with_offset %2d% %3d% %4d%

Затруднение возникло с последним аргументом в функции RwV3dTransformPoints
Код: C++
  1. RwV3d* RwV3dTransformPoints(RwV3d* pointsOut, const RwV3d* pointsIn, RwInt32 numPoints, const RwMatrix* matrix);

Покажите пожалуйста примеры вызова для координат относительно транспорта игрока и самого игрока. 

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #177 : Октябрь 15, 2017, 09:13:36 am »
Не знаю, где именно ты это заметил. В опкоде 0407 вызывается Multiply3x3.

А вообще, можно так сделать
Код: C++
  1. CVector result = matrix * offset;
« Последнее редактирование: Октябрь 15, 2017, 09:15:41 am от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #178 : Октябрь 15, 2017, 09:37:09 am »
Спасибо! Попробую.
Для GTA3 там же опкод под таким номером другой. Взял из III.CLEO-SDK
CustomOpcodes.cpp
Код: C++
  1. //0407=7,store_coords_to %5d% %6d% %7d% from_car %1d% with_offset %2d% %3d% %4d%
  2. eOpcodeResult CustomOpcodes::STORE_COORDS_FROM_CAR_WITH_OFFSET(CScript *script)
  3. {
  4.         script->Collect(4);
  5.         void* car = game.Pools.pfVehiclePoolGetStruct(*game.Pools.pVehiclePool, game.Scripts.Params[0].nVar);
  6.  
  7.         CVector offset;
  8.         offset.x = game.Scripts.Params[1].fVar;
  9.         offset.y = game.Scripts.Params[2].fVar;
  10.         offset.z = game.Scripts.Params[3].fVar;
  11.  
  12.         game.Misc.RwV3dTransformPoints(&offset, &offset, 1, (uintptr_t*)((uintptr_t)car + 4));
  13.  
  14.         game.Scripts.Params[0].fVar = offset.x;
  15.         game.Scripts.Params[1].fVar = offset.y;
  16.         game.Scripts.Params[2].fVar = offset.z;
  17.  
  18.         script->Store(3);
  19.         return OR_CONTINUE;
  20. }

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #179 : Октябрь 15, 2017, 10:02:48 am »
В CLEO и CLEO-SDK не используется plugin-sdk, зачем его брать за пример?
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv