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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #30 : Август 02, 2016, 10:18:05 am »
Не думаю, что ради этого стоит напрягаться - сейчас мало кто учитывает 1.1 - даже MVL работает лишь с 1.0
Я в клео скриптах учитываю. В библиотеке клео тоже учитывали это дело. Не думаю, что это большой напряг для того, кто разбирается в этом. Ну автору, конечно, решать.

UPD:
По коду открытия компонентов есть непонятка. Вот здесь:
if (automobile->m_damageManager.GetDoorStatus(doorId) != 3)Для VC и GTA3 значение 3 - это компонент отсутствует, т.е. он повредился и отвалился. Для SA такое состояние компонента будет 4. Однако при замене 3 на 4 плагин перестаёт работать, т.е. компоненты не открываются и не закрываются. Это как понимать?

Цитировать
Если ты знаешь значения этого перечисления - можешь их добавить в файле CDamageManager.h, и далее использовать их при вызове (напр. DOOR_FRONT_LEFT).
Добавил:
enum eDoors
{
BONNET = 0,
BOOT = 1,
DOOR_FRONT_LEFT = 2,
DOOR_FRONT_RIGHT = 3,
DOOR_REAR_LEFT = 4,
DOOR_REAR_RIGHT = 5
};

А также:
enum ePanels
{
WING_FRONT_LEFT = 0,
WING_FRONT_RIGHT = 1,
WINDSCREEN = 4,
BUMP_FRONT = 5,
BUMP_REAR = 6
};
« Последнее редактирование: Август 02, 2016, 11:49:58 am от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #31 : Август 02, 2016, 08:59:56 pm »
А есть ли в планах и для GTA3 плагин сделать?
Нет. Даже на plugin_vc у меня времени почти нет.
kenkingGitHub (никнейм kenking уже кто-то занял, наглость какая  ;D)
Кинул тебе инвайт.
Не думаю, что это большой напряг для того, кто разбирается в этом.
Я не скажу, что это очень сложно. Это просто требует времени. Много времени. Сейчас в plugin-sdk (SA) более 2700 адресов.
Поиск всех этих адресов в exe какой-либо другой версии может занять месяцы (с моим графиком). Я для себя вообще отбросил этот вариант.
Для VC и GTA3 значение 3 - это компонент отсутствует, т.е. он повредился и отвалился. Для SA такое состояние компонента будет 4. Однако при замене 3 на 4 плагин перестаёт работать, т.е. компоненты не открываются и не закрываются. Это как понимать?
Действительно, не работает.
UPD: разобрался, это ошибка в sdk. Дело в том, что есть 2 функции GetDoorStatus. Одна в качестве аргумента принимает перечисление eDoors, вторая - id компонента. В sdk эти функции были перепутаны. Уже исправил.
Добавил:
Как будет время - можешь попробовать сделать коммит.
« Последнее редактирование: Август 02, 2016, 09:19:13 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: Написание плагина. Настройка проекта
« Ответ #32 : Август 03, 2016, 07:45:50 am »
Цитировать
Нет. Даже на plugin_vc у меня времени почти нет.
Жаль, было бы хорошо собрать плагин для GTA3, VC и SA в один "инструмент". А если ещё сделать для IV и V - это была бы самая крутая вещь для скриптинга GTA.

Цитировать
Я не скажу, что это очень сложно. Это просто требует времени. Много времени. Сейчас в plugin-sdk (SA) более 2700 адресов.
Поиск всех этих адресов в exe какой-либо другой версии может занять месяцы (с моим графиком). Я для себя вообще отбросил этот вариант.
Да для SA это в общем-то без надобности. Я скрипты писал тоже только под exe 1.0. Да и остальные скриптёры тоже.

Цитировать
Действительно, не работает.
UPD: разобрался, это ошибка в sdk. Дело в том, что есть 2 функции GetDoorStatus. Одна в качестве аргумента принимает перечисление eDoors, вторая - id компонента. В sdk эти функции были перепутаны. Уже исправил.
Вот теперь всё отлично!

Как я понял, после каждого обновления надо пересобирать плагин?

В plugin-sdk файлы отмечены разными значками:

Что означают эти предупреждения и "кирпичи". Какие нужны действия?


Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #33 : Август 03, 2016, 05:53:33 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: Написание плагина. Настройка проекта
« Ответ #34 : Август 04, 2016, 11:56:28 am »
В в CDamageManager.h есть ещё "пустые" перечисления
tComponent
tComponentGroup
eWheels

Ну с eWheels вроде, как понятно - это 6 колёс, а остальные что означают? 

Цитировать
Красным отмечены файлы, которые ты изменил (и которые, по идее, нужно "закоммитить")
При сборке примеров у меня выходило сообщение компилятора:
Цитировать
Main.obj : найден .netmodule MSIL или модуль, откомпилированный с параметром /GL; перезапускается компоновка с параметром /LTCG; добавьте /LTCG в командную строку компоновки для повышения производительности компоновщика
В общем я добавил во все примеры. Также по незнанию, я начал было экспериментировать в этом решении. ??? "Откатил" всё назад. Теперь буду учиться в своём решении, а не в plugin-sdk.

Цитировать
Как будет время - можешь попробовать сделать коммит.
Вот и сделал... :(
« Последнее редактирование: Август 04, 2016, 04:07:39 pm от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #35 : Август 04, 2016, 06:25:16 pm »
В в CDamageManager.h есть ещё "пустые" перечисления
tComponent
tComponentGroup
eWheels

Ну с eWheels вроде, как понятно - это 6 колёс, а остальные что означают?
Тоже какие-то перечисления. Надо смотреть код функций
Код: C++
  1. bool GetComponentGroup(tComponent component, tComponentGroup* group, unsigned char* damageCompId);
  2. bool ApplyDamage(CAutomobile* car, tComponent component, float intensity, float arg3);
  3.  

Чтобы разобраться.

UPD: Нашел их у себя в базе, добавил.

Вот и сделал... :(
Ты о чём? Вроде всё правильно сделал.
« Последнее редактирование: Август 04, 2016, 06:48:14 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: Написание плагина. Настройка проекта
« Ответ #36 : Август 04, 2016, 07:08:30 pm »
Цитировать
Ты о чём? Вроде всё правильно сделал.
Да там https://github.com/DK22Pac/plugin-sdk/tree/master/examples теперь везде

Цитировать
CDamageManager: added enum ePanels and enum eDoors

ну так-то ничего страшного, теперь протестил, что да как делать при коммите, в следующий раз всё будет как надо.


Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #37 : Август 05, 2016, 06:22:26 pm »
Потихоньку разбираюсь. Есть вопросы:
1) Как от найденного компонента перейти к child, next, root, а также прочитать их названия (+ 172 // NodeName)?
2) Какой алгоритм добавления новой функции в плагин?
Допустим, я знаю такой адрес:
:007F0ED0     ; RwFrame *__cdecl RwFrameScale(RwFrame *frame, RwV3D *v, int combine)Как добавить в плагин? 
3) Планируешь ли добавить в примеры код IVF? Не устаю повторять - это лучший мод на эту тему, когда-либо сделанный для SA! Хорошо бы с комментариями добавить его в примеры (ну или выслать в ЛС, если можно). Кстати, (я про это писал уже на GCU форуме) в версии IVF 2.1 на прицепах поворотники не работают.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #38 : Август 05, 2016, 06:38:30 pm »
1) Как от найденного компонента перейти к child, next, root, а также прочитать их названия (+ 172 // NodeName)?
Если у тебя есть указатель на RwFrame, используй оператор -> для доступа к членам структуры:
Код: C++
  1. RwFrame *pNext = component->next;
Можешь посмотртеть структуру в файле rw\rwcore.h.

Для перебора всех child'ов есть специальная функция
Код: C++
  1. RwFrameForAllChildren(RwFrame* фрейм, RwFrameCallBack функция_коллбэк, void* данные_для_передачи_в_коллбэк);
2) Какой алгоритм добавления новой функции в плагин?
Допустим, я знаю такой адрес:
:007F0ED0     ; RwFrame *__cdecl RwFrameScale(RwFrame *frame, RwV3D *v, int combine)Как добавить в плагин? 
Эта функция уже есть в sdk.
Вообще, я добавил почти все функции RW, которые есть в exe.

Обычно, для добавления функции, нужно её обьявить (обычно в файле-хедере .h) и определить (обычно в .cpp файле).
Можешь посмотреть на примере той же RwFrameScale (в файлах RenderWare.h и RenderWare.cpp).

Большинство процедур в exe - это методы различных классов.
Для добавления таких процедур нужно также обьявить класс, членами которого являются методы.
Пример - посмотри, например, CMatrix.h и CMatrix.cpp.
3) Планируешь ли добавить в примеры код IVF? Не устаю повторять - это лучший мод на эту тему, когда-либо сделанный для SA! Хорошо бы с комментариями добавить его в примеры (ну или выслать в ЛС, если можно). Кстати, (я про это писал уже на GCU форуме) в версии IVF 2.1 на прицепах поворотники не работают.
Для начала нужно весь код IVF адаптировать под новый sdk. Тогда, возможно, выложу исходники на github.

UPD: Добавил файлы с функциями NodeName.
« Последнее редактирование: Август 05, 2016, 08:09:16 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: Написание плагина. Настройка проекта
« Ответ #39 : Август 05, 2016, 07:54:25 pm »
Цитировать
Эта функция уже есть в sdk.
Это я для примера. А как её правильно вызывать? Для клео ты мне тогда объяснял, теперь, что-то не пойму здесь как надо.

Цитировать
Если у тебя есть указатель на RwFrame, используй оператор -> для доступа к членам структуры:
А название компонента, как прочитать? В клео по смещению + 172 читалось имя компонента. Я делал скрипт для дверей автобусов, там в модель добавлялись вспомогательные компоненты и их названия были величины углов, на которые нужно вращать двери (у разных моделей разные значения), потом я считывал название этого компонента (child, next) и переводил из string в float, получал значение угла вращения.

Цитировать
Тогда, возможно, выложу исходники на github.
Было бы здорово!

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #40 : Август 05, 2016, 08:01:20 pm »
Дело в том, что имя компонента (NodeName) не является частью RenderWare - поэтому его нету в структуре RwFrame. Это "надстройка" от создателей GTA.
Для доступа к имени есть специальне фунеции, я их добавлю в скором времени (файлы NodeName.h, NodeName.cpp).
Ну и пример - вывод иерархии транспорта на экран.
Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\NodeName.h"
  4. #include "game_sa\CFont.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class VehicleHierarchy {
  9. public:
  10.     static RwFrame *DrawFrameHierarchyNames(RwFrame *frame, void *data) {
  11.         CVector2D *offset = reinterpret_cast<CVector2D *>(data);
  12.         // сначала выводим имя самого фрейма
  13.         char *name = GetFrameNodeName(frame);
  14.         CFont::PrintString(offset->x, offset->y, name[0] ? name : "<no_name>");
  15.         offset->y += 20.0f; //опускаемся ниже
  16.         // Теперь выводим имена всех дочерних компонентов
  17.         offset->x += 20.0f; // детей выводим правее
  18.         RwFrameForAllChildren(frame, DrawFrameHierarchyNames, offset); // для всех дочерних фреймов вызываем DrawFrameHierarchyNames. Таким образом, мы переберём всех детей, детей всех детей, и т.д. Это называется рекурсией.
  19.         offset->x -= 20.0f; // вывели всех детей
  20.         return frame;
  21.     }
  22.  
  23.     VehicleHierarchy() {
  24.         Events::drawingEvent += [] {
  25.             CVehicle *vehicle = FindPlayerVehicle(-1, false);
  26.             if (vehicle && vehicle->m_pRwObject) {
  27.                 // Настраивем вывод текста
  28.                 CFont::SetScale(0.5f, 1.0f);
  29.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  30.                 CFont::SetAlignment(ALIGN_LEFT);
  31.                 CFont::SetOutlinePosition(1);
  32.                 CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  33.                 CFont::SetBackground(false, false);
  34.                 CFont::SetFontStyle(FONT_SUBTITLES);
  35.                 CFont::SetProp(true);
  36.                 CFont::SetWrapx(600.0f);
  37.                 // Теперь выводим, начиная с корневого фрейма (vehicle->m_pRwObject->parent) (член "parent" имеет тип void*, поэтому приводим к RwFrame*.
  38.                 CVector2D offset = {10.0f, 10.0f}; // Начальные координаты
  39.                 DrawFrameHierarchyNames(reinterpret_cast<RwFrame *>(vehicle->m_pRwObject->parent), &offset);
  40.             }
  41.         };
  42.     }
  43. } vehicleHierarchy;
Вроде как всё очень просто, не так ли?

Ещё раз:
RwFrameForAllChildren(frame - родительский фрейм (доступ к детям которого надо получить
                                  DrawFrameHierarchyNames - функция (функция-коллбэк), которую надо выполнить для каждого ребёнка,
                                  offset - наши данные, которые будут переданы в функцию-коллбэк );
Можно расшифровать так:
Выполнить функцию DrawFrameHierarchyNames для всех детей frame, с данными offset. Данные offset (2д-вектор) в примере мы использовали для сохранения координат вывода - ведь нам нужно опускать текст после каждого компонента и двигать его вправо для детей. Мы передавали эти данные в функцию обработки каждого отдельного компонента.

UPD: Добавил файлы.

Цитировать
А как её правильно вызывать? Для клео ты мне тогда объяснял, теперь, что-то не пойму здесь как надо.

Когда напечатаешь имя функции в Visual Studio и откроешь скобку, увидишь список параметров:


Пример вызова
Код: C++
  1. RwV3d savedPosn = automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos;
  2. RwV3d scale = { 2.0f, 2.0f, 2.0f };
  3. RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LF]->modelling, &scale, rwCOMBINEREPLACE);
  4. automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos = savedPosn;

Ещё это почитать можно:
Рекурсия https://acmp.ru/article.asp?id_sec=1&id_text=1333
Тернарный оператор http://cppstudio.com/post/304/

Ещё один пример, показывает как использовать VehicleExtendedData.
Код: C++
  1. #include <plugin.h>
  2.  
  3. using namespace plugin;
  4.  
  5. class VehicleExtendedExample {
  6. public:
  7.     class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)
  8.     public:
  9.         RwFrame *m_pDoorLF;
  10.         RwFrame *m_pDoorRF;
  11.         RwFrame *m_pDoorLR;
  12.         RwFrame *m_pDoorRR;
  13.  
  14.         VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
  15.             m_pDoorLF = m_pDoorRF = m_pDoorLR = m_pDoorRR = nullptr; // устанавливаем все указатели в 0
  16.         }
  17.     };
  18.  
  19.     VehicleExtendedExample() {
  20.         static VehicleExtendedData<VehicleComponents> vehComps; // Создаем экземпляр нашего расширения. vehComps - это переменная, через которую мы будем
  21.                                                                 // обращаться к нашим данным (используя метод Get(CVehicle *транспорт) )
  22.  
  23.         Events::vehicleSetModelEvent += [](CVehicle *vehicle, int modelIndex) { // Выполняем нашу функцию, когда игра устанавливает модель транспорту
  24.             if (vehicle->m_pRwClump) { // Если создан графический обьект модели (RpClump)
  25.                 vehComps.Get(vehicle).m_pDoorLF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lf_dummy"); // Находим компоненты в иерархии
  26.                 vehComps.Get(vehicle).m_pDoorRF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rf_dummy"); // и записываем их в наш класс
  27.                 vehComps.Get(vehicle).m_pDoorLR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lr_dummy");
  28.                 vehComps.Get(vehicle).m_pDoorRR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rr_dummy");
  29.             }
  30.             else // иначе устанавливаём всё в 0
  31.                 vehComps.Get(vehicle).m_pDoorLF = vehComps.Get(vehicle).m_pDoorRF = vehComps.Get(vehicle).m_pDoorLR = vehComps.Get(vehicle).m_pDoorRR = nullptr;
  32.         };
  33.  
  34.         Events::vehicleRenderEvent += [](CVehicle *vehicle) { // Выполняем нашу функцию, когда игра рендерит транспорт
  35.             if (vehComps.Get(vehicle).m_pDoorLF)
  36.                 vehComps.Get(vehicle).m_pDoorLF->modelling.pos.z = 1.0f; // Сдвигаем компонент вверх
  37.             if (vehComps.Get(vehicle).m_pDoorRF)
  38.                 vehComps.Get(vehicle).m_pDoorRF->modelling.pos.z = 1.0f;
  39.             if (vehComps.Get(vehicle).m_pDoorLR)
  40.                 vehComps.Get(vehicle).m_pDoorLR->modelling.pos.z = 1.0f;
  41.             if (vehComps.Get(vehicle).m_pDoorRR)
  42.                 vehComps.Get(vehicle).m_pDoorRR->modelling.pos.z = 1.0f;
  43.         };
  44.     }
  45. } vehicleExtendedExample;
« Последнее редактирование: Август 06, 2016, 03:45:36 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: Написание плагина. Настройка проекта
« Ответ #41 : Август 06, 2016, 03:52:41 pm »
Дмитрий, ты волшебник.  ;)

Спасибо за очередные примеры и пояснения. Чем больше будет примеров, тем быстрей я освоюсь в написании плагинов. За ссылки на уроки тоже спасибо. Я сейчас читаю книгу
Прохоренок Н.А. Программирование на С++ в Visual Studio 2010 Express (2010) и дополнительный материал будет кстати.

По примерам:
с первым примером разобрался, всё нормально. Для теста написал небольшой код, глянь верно ли? Можно, что-то оптимизировать? Хотел ещё вывести скорость авто, но что-то не вышло, вот это CVector GetSpeed(CVector direction) оно или нет? С вектором не понял, как работать. Также не понятно, как вывести название транспорта. Пожалуйста пример.
#include <plugin.h>
#include "game_sa\common.h"
#include "game_sa\CFont.h"

using namespace plugin;

class VehicleGetPosition {
public:

VehicleGetPosition() {
Events::drawingEvent += [] {
CVehicle *vehicle = FindPlayerVehicle(-1, false);
if (vehicle) {
// Настраивем вывод текста
CFont::SetScale(0.5f, 1.0f);
CFont::SetColor(CRGBA(255, 255, 255, 255));
CFont::SetAlignment(ALIGN_LEFT);
CFont::SetOutlinePosition(1);
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
CFont::SetBackground(false, false);
CFont::SetFontStyle(FONT_SUBTITLES);
CFont::SetProp(true);
CFont::SetWrapx(600.0f);
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
float vhealth = vehicle->m_fHealth;
float vmass = vehicle->m_fMass;
CVector posn = vehicle->GetPosition();
char t_speed[16];
char t_health[16];
char t_vmass[16];
char t_posnx[16];
char t_posny[16];
char t_posnz[16];
sprintf(t_speed, "speed %.0f km/h", speed);
sprintf(t_health, "health %.0f \%\%", vhealth/10.0f);
sprintf(t_vmass, "massa %.1f kg", vmass);
sprintf(t_posnx, "posn x %.2f", posn.x);
sprintf(t_posny, "posn y %.2f", posn.y);
sprintf(t_posnz, "posn z %.2f", posn.z);
CFont::PrintString(5.0f, 5.0f, t_speed);
CFont::PrintString(5.0f, 25.0f, t_health);
CFont::PrintString(5.0f, 45.0f, t_vmass);
CFont::PrintString(5.0f, 65.0f, t_posnx);
CFont::PrintString(5.0f, 85.0f, t_posny);
CFont::PrintString(5.0f, 105.0f, t_posnz);
}
};
}
} vehicleGetPosition;


во втором примере пишет
Цитировать
namespase "plugin::Events" не содержит члена "vehicleSetModelEvent"

Цитировать
Пример вызова
Спасибо, теперь ясно. Но есть одно но - при RwMatrixScale если вращать компонент, например дверь, то она принимает стандартный размер. В клео я поэтому вызывал RwFrameScale - тогда компонент при вращении остаётся запланированного масштаба. По примеру попробовал вызвать RwFrameScale так:
RwFrameScale(automobile->m_aCarNodes[CAR_DOOR_LR], &scale, rwCOMBINEPRECONCAT);Не знаю правильно или нет, но компонент масштабируется, но при вращении опять становится стандартного размера. А при rwCOMBINEREPLACE так и вовсе оказывается в центре модели (как и при вращении с этим параметром после RwMatrixScale). В клео нормально работало, что я делаю не так?

UPD:
    RwV3d savedPosn = automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos;
    RwV3d scale = { 2.0f, 2.0f, 2.0f };
    RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LF]->modelling, &scale, rwCOMBINEREPLACE);
    automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos = savedPosn;
Можно, как ты написал до этого:
RwV3d scale = { 2.0f, 2.0f, 2.0f };
RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LR]->modelling, &scale, rwCOMBINEPRECONCAT);
только combine поменять на rwCOMBINEPRECONCAT

Но всё равно в обоих вариантах после вращения масштабирование сбрасывается в стандарт.


UPD2:
Обновил sdk, пересобрал плагин, теперь
Цитировать
пример, показывает как использовать VehicleExtendedData.
работает.

А практически для чего например можно это использовать в плагине?

UPD3:Со скоростью "разобрался" так:
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
Верно?

« Последнее редактирование: Август 07, 2016, 09:29:20 am от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #42 : Август 07, 2016, 12:31:25 pm »
Со скоростью "разобрался" так:
Верно?

Да.
В опкоде 02E3 скорость считается вот так (длина вектора MoveForce умножается на 50):


PS Я поменял названия некоторых членов в CPhysical (коммит 99).

Также не понятно, как вывести название транспорта.

Находишь gxt-ключ названия в структуре модели транспорта (CVehicleModelInfo) и переводишь его в текст (CText::Get(char* ключ))

Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CFont.h"
  4. #include "game_sa\CModelInfo.h"
  5. #include "game_sa\CText.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class VehicleGetPosition {
  10. public:
  11.     VehicleGetPosition() {
  12.         Events::drawingEvent += [] {
  13.             CVehicle *vehicle = FindPlayerVehicle(-1, false);
  14.             if (vehicle) {
  15.                 // Настраивем вывод текста
  16.                 CFont::SetScale(0.5f, 1.0f);
  17.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  18.                 CFont::SetAlignment(ALIGN_LEFT);
  19.                 CFont::SetOutlinePosition(1);
  20.                 CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  21.                 CFont::SetBackground(false, false);
  22.                 CFont::SetFontStyle(FONT_SUBTITLES);
  23.                 CFont::SetProp(true);
  24.                 CFont::SetWrapx(600.0f);
  25.                 static char str[32];
  26.                 CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]);
  27.                 sprintf(str, "vehicle %s", TheText.Get(vehModel->m_szGameName));
  28.                 CFont::PrintString(5.0f, 25.0f, str);
  29.                 sprintf(str, "health %.0f%%", vehicle->m_fHealth / 10.0f);
  30.                 CFont::PrintString(5.0f, 45.0f, str);
  31.                 sprintf(str, "mass %.1f kg", vehicle->m_fMass);
  32.                 CFont::PrintString(5.0f, 65.0f, str);
  33.                 sprintf(str, "posn x %.2f", vehicle->GetPosition().x);
  34.                 CFont::PrintString(5.0f, 85.0f, str);
  35.                 sprintf(str, "posn y %.2f", vehicle->GetPosition().y);
  36.                 CFont::PrintString(5.0f, 105.0f, str);
  37.                 sprintf(str, "posn z %.2f", vehicle->GetPosition().z);
  38.                 CFont::PrintString(5.0f, 125.0f, str);
  39.                 sprintf(str, "speed %.2f", vehicle->m_vecMoveForce.Magnitude() * 50.0f);
  40.                 CFont::PrintString(5.0f, 145.0f, str);
  41.             }
  42.         };
  43.     }
  44. } vehicleGetPosition;

В клео я поэтому вызывал RwFrameScale - тогда компонент при вращении остаётся запланированного масштаба.

Можешь показать свой код в клео?

PS Для вывода кода C++ используй
[code=cpp][/code
« Последнее редактирование: Август 07, 2016, 12:59:12 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: Написание плагина. Настройка проекта
« Ответ #43 : Август 07, 2016, 02:25:54 pm »
Цитировать
Можешь показать свой код в клео?

Я немного ввел тебя в заблуждение, прошу прощения. Дело в том, что при вызове RwFrameScale я масштабировал все компоненты в том числе и chassis_dummy в который вложены подвижные компоненты (двери, капот и багажник). Так вот в этом случае масштаб сохраняется при вращении этих компонентов, а если вызывать RwFrameScale отдельно для вращающегося компонента, то при вращении масшаб сбрасывается в стандартный. Вывод - для таких компонентов надо масштабировать parent. Вот код клео:
{$CLEO .cs}
20@ = 0.5 // X
21@ = 0.5 // Y
22@ = 0.5 // Z

while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if and
          Actor.Driving($PLAYER_ACTOR)
          0AB0: key_pressed 53
        then
            03C0: 0@ = actor $PLAYER_ACTOR car
            0A97: 0@ = car 0@ struct
            0A8E: 0@ = 0@ + 0x18
            0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
            0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "chassis_dummy" _rwObject 0@ _store_to 1@
            if
              1@ > 0
            then
                0AA5: call {RwFrameScale} 0x7F0ED0 num_params 3 pop 3 _combine 1 _v 20@v _frame 1@
            end
            repeat
              wait 0
            until 8AB0: not key_pressed 53
        end
    end
end       



Как правильно вызвать RwFrameScale в плагине?
Код: C++
  1. RwFrameScale(automobile->m_aCarNodes[CAR_CHASSIS], &scale, rwCOMBINEPRECONCAT);
Тот вариант, что я написал похоже неверный, поскольку вложенные компоненты не масштабируются вместе с CAR_CHASSIS, как в случае с клео. Происходит ровно тоже, что при вызове RwMatrixScale.



Цитировать
Находишь gxt-ключ названия в структуре модели транспорта (CVehicleModelInfo) и переводишь его в текст (CText::Get(char* ключ))
Спасибо.

UPD:В базе есть такой адрес:
.text:0043A570     _cheatSpawnTankerTruck proc nearВ sdk ты его не добавил? Я во всяком случае в CCheat его не нашёл. Ведь по-идеи он там должен быть? Или в других файлах? Попробовал туда добавить так:
Код: C++
  1. #include "CCheat.h"
  2.  
  3. char *CCheat::m_CheatString = (char *)0x969110;
  4.  
  5. CVehicle *CCheat::VehicleCheat(int vehicleId) {
  6.     return ((CVehicle *(__cdecl *)(int))0x43A0B0)(vehicleId);
  7. }
  8.  
  9. CVehicle *CCheat::TankerTruck() {
  10.         return ((CVehicle *(__cdecl *)())0x43A570)();
  11. }
Код: C++
  1. #pragma once
  2. #include "plbase/PluginBase_SA.h"
  3.  
  4. class PLUGIN_API CCheat {
  5. public:
  6.     // static char m_CheatString[30]
  7.     static char *m_CheatString;
  8.  
  9.     static class CVehicle *VehicleCheat(int vehicleId);
  10.         static class CVehicle *TankerTruck();
  11. };

Верно ли?
Ну по крайне мере вызывается правильно, бензовоз с прицепом спунятся.

Давно задаюсь вопросом - можно ли переписать эту функцию так, чтобы считывать пары ID тягача и ID прицепа из текстового файла (ну в крайнем случае в сам плагин набрать это сочетание, ну лучше считывать из текстового файла) и потом аналогичным образом спаунить другие тягачи с прицепами, ведь нормального спаунера авто с прицепами так и не сделали.

UPD2:
 :D Вот:

Код: C++
  1. if (automobile->m_aCarNodes[CAR_CHASSIS]) {
  2.    if (automobile->m_aCarNodes[CAR_DOOR_LF])
  3.       RwFrameAddChild(automobile->m_aCarNodes[CAR_CHASSIS], automobile->m_aCarNodes[CAR_DOOR_LF]);
  4.                
  5.    RwV3d scale = { 0.5f, 0.5f, 0.5f };
  6.    RwFrameScale(automobile->m_aCarNodes[CAR_CHASSIS], &scale, rwCOMBINEREPLACE);
  7. }
« Последнее редактирование: Август 08, 2016, 12:44:20 pm от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #44 : Август 08, 2016, 07:35:51 pm »
CCheat я особо не разбирал.
В sdk была только функция VehicleChear для спавна авто.
Давно задаюсь вопросом - можно ли переписать эту функцию так, чтобы считывать пары ID тягача и ID прицепа из текстового файла (ну в крайнем случае в сам плагин набрать это сочетание, ну лучше считывать из текстового файла) и потом аналогичным образом спаунить другие тягачи с прицепами, ведь нормального спаунера авто с прицепами так и не сделали.
Можно полноситью заменить оригинальную функцию своей.
Покажу пример, как доделаю полностью иерархию клаасов CVehicle, включая CTrailer.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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