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

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 720
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Написание плагина. Настройка проекта
« Ответ #90 : Сентября 12, 2016, 07:30:27 pm »
Понятно, что отрисовать текстуру с поворотом в игре можно, что в Вайсе, что в СА.
Я имел ввиду, что отдельной функции для этого нету.
Ничего себе...сказывается, что опыта у меня пока маловато - я думал, что если есть опкод, то ничего особо самому писать не нужно(думал, что для каждого опкода есть функция)... просто пока ковырял примитивные опкоды  ;D

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #91 : Сентября 16, 2016, 12:34:55 pm »
1)
Ещё например, установка винила на авто.
С этим разобрался. Набросал пример:
Код: C++
  1. #include "plugin.h"
  2. #include "game_sa\common.h"
  3. #include "game_sa\CTimer.h"
  4. #include "game_sa\CGeneral.h"
  5. #include "game_sa\CModelInfo.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class Remap {
  10. public:
  11.     class RemapInfo {
  12.     public:
  13.         bool permitRemap;
  14.        
  15.         RemapInfo(CVehicle *vehicle) {
  16.             unsigned int random = CGeneral::GetRandomNumberInRange(0, 3);
  17.             if (random == 1)
  18.                 permitRemap = true;
  19.             else permitRemap = false;
  20.         }
  21.     };
  22.  
  23.     Remap() {
  24.         static VehicleExtendedData<RemapInfo> remInfo;
  25.         static unsigned int m_nLastTimeWhenAnyActionWasEnabled = 0;
  26.         static unsigned int randomRemap;
  27.         static unsigned int amountRemap;
  28.         static int currentRemap = -1;
  29.  
  30.         Events::vehicleRenderEvent += [](CVehicle *vehicle) {
  31.             if (vehicle) {
  32.                 RemapInfo &info = remInfo.Get(vehicle);
  33.                 if (info.permitRemap) {
  34.                     CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]);
  35.                     amountRemap = vehModel->GetNumRemaps();
  36.                     if (amountRemap > 0) {
  37.                         randomRemap = CGeneral::GetRandomNumberInRange(0, amountRemap);
  38.                         vehicle->SetRemap(randomRemap);
  39.                     }
  40.                     info.permitRemap = false;
  41.                 }
  42.             }
  43.         };
  44.  
  45.         Events::gameProcessEvent += [] {
  46.             CVehicle *plVehicle = FindPlayerVehicle(-1, false);
  47.             if (plVehicle) {
  48.                 if (CTimer::m_snTimeInMilliseconds >(m_nLastTimeWhenAnyActionWasEnabled + 1000) && KeyPressed(75)) {
  49.                     m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds;
  50.                     CVehicleModelInfo *plVehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[plVehicle->m_wModelIndex]);
  51.                     amountRemap = plVehModel->GetNumRemaps();
  52.                     if (amountRemap > 0) {
  53.                         if (currentRemap < static_cast<int>(amountRemap - 1))
  54.                             ++currentRemap;
  55.                         else currentRemap = -1;
  56.                         plVehicle->SetRemap(currentRemap);
  57.                     }
  58.                 }
  59.             }
  60.         };
  61.     }
  62. } remap;
  63.  

Работает, как запланировал. По самому коду есть какие-либо замечания?
Функция
Код: C++
  1. int GetNumRemaps();
описание есть, а определения нет (и другие функции из CVehicleModelInfo), добавил так:
Код: C++
  1. // Converted from thiscall int CVehicleModelInfo::GetNumRemaps(void) 0x4C86B0
  2. int CVehicleModelInfo::GetNumRemaps()
  3. {
  4.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C86B0)(this);
  5. }

2) Обнаружил интересную вещь - установить покрасочную работу на авто можно ещё так:
Код: C++
  1. vehicle->m_pRemapTexture = pMyTexture;
Получается этим способом можно обойти ограничение на количество покрасочных работ для модели.

Есть ли способ "заполучить" текстуру в RwTexture *pMyTexture;  (помимо способов:)
Код: C++
  1. pMyTexture = mySprite.m_pTexture;
  2. //и
  3. pMyTexture = RwD3D9DDSTextureRead("models\\image", 0);
например, из txd, который находится в gta3.img?

3)
Код: C++
  1. static void VehicleRemoveSphere(CVehicle *vehicle) {
  2.     CColData *colData = vehicle->GetColModel()->m_pColData;
  3.     for (unsigned int i = 0; i < colData->m_wNumSpheres; i++) {
  4.         if (colData->m_pSpheres[i].m_nFlags == 19) { // windscreen col sphere
  5.             colData->m_pSpheres[i].m_fRadius = 0.0f;
  6.             colData->m_pSpheres[i].m_vCenter = {0.0f, 0.0f, 0.0f};
  7.         }
  8.     }
  9. }
Интересная вещь!  :)
А для коллизии колёс как будет?
А можно как-то масштабировать тень модели?

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #92 : Сентября 18, 2016, 08:58:12 am »
В первом примере надо определить переменную entries.
Код: C++
  1. vector<SettingsTest::MyData> SettingsTest::entries;

Разобрался, спасибо!

Упс... оказывается не полностью разобрался.  :(
Подскажи пожалуйста, как таким же образом определить MyData *GetDataInfoForModel(unsigned int BaseModelId)
Код: C++
  1.     static void Test() {
  2.         CVehicle *vehicle = FindPlayerVehicle(-1, false);
  3.             if (vehicle) {
  4.                 CFont::SetScale(0.5f, 1.0f);
  5.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  6.                 CFont::SetAlignment(ALIGN_LEFT);
  7.                 CFont::SetOutlinePosition(1);
  8.                 CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  9.                 CFont::SetBackground(false, false);
  10.                 CFont::SetFontStyle(FONT_SUBTITLES);
  11.                 CFont::SetProp(true);
  12.                 CFont::SetWrapx(600.0f);
  13.                 static char str[32];
  14.                 MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  15.                 if (entryModel) {
  16.                     sprintf(str, "yes %.d %.2f", entryModel->baseModelId, entryModel->value);
  17.                     CFont::PrintString(5.0f, 355.0f, str);
  18.                 }
  19.                 else {
  20.                     sprintf(str, "no %.d", vehicle->m_wModelIndex);
  21.                     CFont::PrintString(5.0f, 355.0f, str);
  22.                 }
  23.             }
  24.     }
  25.  
  26.     ZR350() {
  27.         ReadSettingsFile();
  28.         Events::drawingEvent += Test;
  29.     }
В этой строчке
Код: C++
  1. MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
студия ругается, что не статическая ссылка на член должна указываться относительно заданного объекта. Если записать так
Код: C++
  1. static MyData *GetDataInfoForModel(unsigned int BaseModelId)
то код не срабатывает.
Вынес
struct MyData
vector<MyData> entries;
void ReadSettingsFile()
MyData *GetDataInfoForModel(unsigned int BaseModelId)
за пределы класса, тогда работает.
Это из примера, что ты показывал здесь http://forum.gtabuilder.ru/index.php?topic=337.msg2414#msg2414

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #93 : Сентября 19, 2016, 12:14:31 am »
По самому коду есть какие-либо замечания?
Вроде всё правильно.
Функция
Код: C++
  1. int GetNumRemaps();
описание есть, а определения нет (и другие функции из CVehicleModelInfo), добавил так:
Код: C++
  1. // Converted from thiscall int CVehicleModelInfo::GetNumRemaps(void) 0x4C86B0
  2. int CVehicleModelInfo::GetNumRemaps()
  3. {
  4.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C86B0)(this);
  5. }
Да, есть такое. CVehicleModelInfo не до конца доработан.
2) Обнаружил интересную вещь - установить покрасочную работу на авто можно ещё так:
Код: C++
  1. vehicle->m_pRemapTexture = pMyTexture;
Получается этим способом можно обойти ограничение на количество покрасочных работ для модели.
Можно. Но и сами текстуры надо будет куда-то добавлять (например, в txd авто).
Есть ли способ "заполучить" текстуру в RwTexture *pMyTexture;  (помимо способов:)
Код: C++
  1. pMyTexture = mySprite.m_pTexture;
  2. //и
  3. pMyTexture = RwD3D9DDSTextureRead("models\\image", 0);
например, из txd, который находится в gta3.img?
Есть функции поиска текстуры в txd.
Код: C++
  1. RwTexture* RwTexDictionaryFindNamedTexture(RwTexDictionary* dict, const RwChar* name); // поиск по имени, RenderWare.h
  2. RwTexture* RwTexDictionaryFindHashNamedTexture(RwTexDictionary* txd, unsigned int hash);  // поиск по хеш-ключу, common.h
Вторая функция добавлена в последнем коммите.
TXD можно достать из пула (если она загружена).
Ты хочешь загружать из дополнительного txd или из уже существующего?
А для коллизии колёс как будет?
А можно как-то масштабировать тень модели?
Колёса, вроде бы, это тоже сферы. Не уверен. Позже гляну.
Тень масштабировать можно, но это сложно. Надо каждую вершину перемещать.
Подскажи пожалуйста, как таким же образом определить MyData *GetDataInfoForModel(unsigned int BaseModelId)
Обьявляй всё как статические члены (static).
Статические переменные дополнительно определяй за пределами класса.
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: Написание плагина. Настройка проекта
« Ответ #94 : Сентября 19, 2016, 09:35:58 am »
Можно. Но и сами текстуры надо будет куда-то добавлять (например, в txd авто).
Да, в txd авто - это самый приемлемый вариант.

Есть функции поиска текстуры в txd.
Код: C++
  1. RwTexture* RwTexDictionaryFindNamedTexture(RwTexDictionary* dict, const RwChar* name); // поиск по имени, RenderWare.h
  2. RwTexture* RwTexDictionaryFindHashNamedTexture(RwTexDictionary* txd, unsigned int hash);  // поиск по хеш-ключу, common.h
Вторая функция добавлена в последнем коммите.
TXD можно достать из пула (если она загружена).
Ты хочешь загружать из дополнительного txd или из уже существующего?
Из существующего txd модели. У некоторых моделей есть по два набора покрасок (по четыре покрасочных работ в каждом наборе). Приходится ставить на выбор 4 из них. Если остальные 4 поместить в txd модели, доставать их оттуда и ставить таким образом
Код: C++
  1. vehicle->m_pRemapTexture = pMyTexture;
Можно пример, как достать текстуру (несколько текстур) из txd модели.

Обьявляй всё как статические члены (static).
Статические переменные дополнительно определяй за пределами класса.
Вот с объявлением 
Код: C++
  1. MyData *GetDataInfoForModel(unsigned int BaseModelId)
за пределами класса у меня как раз и непонятка возникла. Покажи пожалуйста.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #95 : Сентября 19, 2016, 07:42:13 pm »
Можно пример, как достать текстуру (несколько текстур) из txd модели.

Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CModelInfo.h"
  4. #include "game_sa\CTxdStore.h"
  5. #include "game_sa\CKeyGen.h"
  6. #include "game_sa\CSprite2d.h"
  7.  
  8. using namespace plugin;
  9.  
  10. class VehicleTexture {
  11. public:
  12.     static void Draw() {
  13.         CVehicle *veh = FindPlayerVehicle(-1, false);
  14.         if (veh && veh->m_wModelIndex == MODEL_BOBCAT) {
  15.             TxdDef *txd = CTxdStore::ms_pTxdPool->GetAt(CModelInfo::ms_modelInfoPtrs[veh->m_wModelIndex]->m_wTxdIndex);
  16.             if (txd) {
  17.                 RwTexture *texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("bobcat92logo128"));
  18.                 if (texture) {
  19.                     RwEngineInstance->dOpenDevice.fpRenderStateSet(rwRENDERSTATETEXTURERASTER, texture->raster);
  20.                     CSprite2d::DrawTxRect(CRect(RsGlobal.maximumWidth / 2 - 128, 200.0f, RsGlobal.maximumWidth / 2 + 128, 264.0f), CRGBA(255, 255, 255, 255));
  21.                 }
  22.             }
  23.         }
  24.     }
  25.  
  26.     VehicleTexture() {
  27.         Events::drawingEvent += Draw;
  28.     }
  29. } vehTexture;
Вот с объявлением 
Код: C++
  1. MyData *GetDataInfoForModel(unsigned int BaseModelId)
за пределами класса у меня как раз и непонятка возникла. Покажи пожалуйста.

Код: C++
  1. static MyData *GetDataInfoForModel(unsigned int BaseModelId)

UPD: Обновил код, т.к. могли возникнуть проблемы с порядком создания обьектов (главного класса и вектора).
Вот в такой вот ситуации
Код: C++
  1. class A {
  2.     static vector<int> vec; // статическая переменная-вектор - глобальная переменная
  3.  
  4.     A() { // Конструктор класса A
  5.         vec.push_back(5); // Добавляем элемент в вектор
  6.     }
  7. } a; // определяем обьект a класса A (вызывается конструктор A)
  8.  
  9. vector<int> vec; // определяем переменную vec (вызывается конструктор std::vector)
Получается, что мы обращаемся к переменной vec (из конструктора A), которая ещё не была "построена".

Вот такой пример, скомпилированный в студии, является более "правильным".
Код: C++
  1. class A {
  2.     static vector<int> vec; // статическая переменная-вектор - глобальная переменная
  3.  
  4.     A() { // Конструктор класса A
  5.         vec.push_back(5); // Добавляем элемент в вектор
  6.     }
  7. }
  8.  
  9. vector<int> vec; // определяем переменную vec (вызывается конструктор std::vector)
  10.  
  11. A a; // а теперь определяем обьект a класса A (вызывается конструктор A)

http://quirks.chat.ru/cpp/faq/#s10p11

Код: C++
  1. #include "plugin.h"
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include "game_sa\common.h"
  6. #include "game_sa\CFont.h"
  7.  
  8. using namespace plugin;
  9. using namespace std;
  10.  
  11. class ZR350 {
  12. public:
  13.     struct MyData {
  14.         unsigned int baseModelId;
  15.         float value;
  16.     };
  17.  
  18.     static vector<MyData>& GetDataVector() {
  19.         static vector<MyData> vec; // глобальная переменная vec, доступ к которой осуществляется вызовом GetDataVector()
  20.         return vec;
  21.     }
  22.  
  23.     static void ReadSettingsFile() {
  24.         std::ifstream stream("vehicle_advanced.dat");
  25.         for (std::string line; getline(stream, line); ) {
  26.             if (line[0] != ';' && line[0] != '#') {
  27.                 if (!line.compare("zr350")) {
  28.                     while (getline(stream, line) && line.compare("end")) {
  29.                         if (line[0] != ';' && line[0] != '#') {
  30.                             MyData entry;
  31.                             if (sscanf(line.c_str(), "%d, %f", &entry.baseModelId, &entry.value) == 2)
  32.                                 GetDataVector().push_back(entry); // теперь мы точно знаем, что обращаемся к уже построенному обьекту
  33.                             else
  34.                                 Error("Failed to scan line: %s", line.c_str());
  35.                         }
  36.                     }
  37.                 }
  38.             }
  39.         }
  40.     }
  41.  
  42.     static MyData *GetDataInfoForModel(unsigned int BaseModelId) {
  43.         for (unsigned int i = 0; i < GetDataVector().size(); i++) {
  44.             if (GetDataVector()[i].baseModelId == BaseModelId)
  45.                 return &GetDataVector()[i];
  46.         }
  47.         return nullptr;
  48.     }
  49.  
  50.     static void Test() {
  51.         CVehicle *vehicle = FindPlayerVehicle(-1, false);
  52.         if (vehicle) {
  53.             CFont::SetScale(0.5f, 1.0f);
  54.             CFont::SetColor(CRGBA(255, 255, 255, 255));
  55.             CFont::SetAlignment(ALIGN_LEFT);
  56.             CFont::SetOutlinePosition(1);
  57.             CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  58.             CFont::SetBackground(false, false);
  59.             CFont::SetFontStyle(FONT_SUBTITLES);
  60.             CFont::SetProp(true);
  61.             CFont::SetWrapx(600.0f);
  62.             static char str[32];
  63.             MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  64.             if (entryModel) {
  65.                 sprintf(str, "yes %d %.2f", entryModel->baseModelId, entryModel->value);
  66.                 CFont::PrintString(5.0f, 355.0f, str);
  67.             }
  68.             else {
  69.                 sprintf(str, "no %d", vehicle->m_wModelIndex);
  70.                 CFont::PrintString(5.0f, 355.0f, str);
  71.             }
  72.         }
  73.     }
  74.  
  75.     ZR350() {
  76.         ReadSettingsFile();
  77.         for (unsigned int i = 0; i < GetDataVector().size(); i++)
  78.             Error("Entry %d: %d - %.2f", i + 1, GetDataVector()[i].baseModelId, GetDataVector()[i].value);
  79.         Events::drawingEvent += Test;
  80.     }
  81. } test;
« Последнее редактирование: Сентября 19, 2016, 09:36:21 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: Написание плагина. Настройка проекта
« Ответ #96 : Сентября 20, 2016, 03:54:46 pm »
Спасибо за очередные примеры и пояснения!

1)
Цитировать
Обновил код, т.к. могли возникнуть проблемы с порядком создания обьектов (главного класса и вектора).
Вот в такой вот ситуации
А если так, то будет нормально, правильно я понимаю?
Код: C++
  1. vector<int> vec; // определяем переменную vec (вызывается конструктор std::vector)
  2. class A {
  3.              
  4.     A() { // Конструктор класса A
  5.         vec.push_back(5); // Добавляем элемент в вектор
  6.     }
  7. } a; // определяем обьект a класса A (вызывается конструктор A)

2) При сборке какого-либо проекта с подключением
Код: C++
  1. #include "game_sa\CTxdStore.h"
проект собирается, но студия выдаёт предупреждение
Цитировать
>d:\projects\plugin-sdk\plugin_sa\game_sa\TxdDef.h(19): warning C4161: #pragma pack(pop...): число извлечений из стека превышает число занесений

3) С поддержкой Windows XP какой-либо проект нельзя собрать?

4) Если объединять примеры для zr350 и тягачей, то считывание с vehicle_advanced.dat надо делать так?
Код: C++
  1. #include "plugin.h"
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include <sstream>
  6. #include "game_sa\common.h"
  7. #include "game_sa\CFont.h"
  8.  
  9. using namespace plugin;
  10. using namespace std;
  11.  
  12. vector<unsigned int> truckIDs;
  13.  
  14. class ZR350 {
  15. public:
  16.     struct MyData {
  17.         unsigned int baseModelId;
  18.         float value;
  19.     };
  20.  
  21.     static vector<MyData>& GetDataVector() {
  22.         static vector<MyData> vec; // глобальная переменная vec, доступ к которой осуществляется вызовом GetDataVector()
  23.         return vec;
  24.     }
  25.  
  26.     static void ReadSettingsFile() {
  27.         ifstream stream("vehicle_advanced.dat");
  28.         for (string line; getline(stream, line); ) {
  29.             if (line[0] != ';' && line[0] != '#') {
  30.                 if (!line.compare("zr350")) {
  31.                     while (getline(stream, line) && line.compare("endzr350")) {
  32.                         if (line[0] != ';' && line[0] != '#') {
  33.                             MyData entry;
  34.                             if (sscanf(line.c_str(), "%d, %f", &entry.baseModelId, &entry.value) == 2)
  35.                                 GetDataVector().push_back(entry); // теперь мы точно знаем, что обращаемся к уже построенному обьекту
  36.                             else
  37.                                 Error("Failed to scan line: %s", line.c_str());
  38.                         }
  39.                     }
  40.                 }
  41.                 if (!line.compare("trucks")) {
  42.                     while (getline(stream, line) && line.compare("endtrucks")) {
  43.                         if (line[0] != ';' && line[0] != '#') {
  44.                             std::stringstream ss(line);
  45.                             int i;
  46.                             while (ss >> i) {
  47.                                 truckIDs.push_back(i);
  48.                                 if (ss.peek() == ',')
  49.                                     ss.ignore();
  50.                             }
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.         }
  56.     }
  57.  
  58.     static MyData *GetDataInfoForModel(unsigned int BaseModelId) {
  59.         for (unsigned int i = 0; i < GetDataVector().size(); i++) {
  60.             if (GetDataVector()[i].baseModelId == BaseModelId)
  61.                 return &GetDataVector()[i];
  62.         }
  63.         return nullptr;
  64.     }
  65.  
  66.     static bool IsTruckModel(unsigned int modelId) {
  67.         for (unsigned int i : truckIDs) {
  68.             if (i == modelId)
  69.                 return true;
  70.         }
  71.         return false;
  72.     }
  73.  
  74.     static void Test() {
  75.         CVehicle *vehicle = FindPlayerVehicle(-1, false);
  76.         if (vehicle) {
  77.             CFont::SetScale(0.5f, 1.0f);
  78.             CFont::SetColor(CRGBA(255, 255, 255, 255));
  79.             CFont::SetAlignment(ALIGN_LEFT);
  80.             CFont::SetOutlinePosition(1);
  81.             CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  82.             CFont::SetBackground(false, false);
  83.             CFont::SetFontStyle(FONT_SUBTITLES);
  84.             CFont::SetProp(true);
  85.             CFont::SetWrapx(600.0f);
  86.             static char str[32];
  87.             MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  88.             if (entryModel) {
  89.                 sprintf(str, "yes %d %.2f", entryModel->baseModelId, entryModel->value);
  90.                 CFont::PrintString(5.0f, 445.0f, str);
  91.             }
  92.             else {
  93.                 sprintf(str, "no %d", vehicle->m_wModelIndex);
  94.                 CFont::PrintString(5.0f, 445.0f, str);
  95.             }
  96.             if (IsTruckModel(vehicle->m_wModelIndex)) {
  97.                 sprintf(str, "yes truck %d", vehicle->m_wModelIndex);
  98.                 CFont::PrintString(205.0f, 445.0f, str);
  99.             }
  100.             else {
  101.                 sprintf(str, "no truck %d", vehicle->m_wModelIndex);
  102.                 CFont::PrintString(205.0f, 445.0f, str);
  103.             }
  104.         }
  105.     }
  106.  
  107.     ZR350() {
  108.         ReadSettingsFile();
  109.         for (unsigned int i = 0; i < GetDataVector().size(); i++)
  110.             Error("Entry %d: %d - %.2f", i + 1, GetDataVector()[i].baseModelId, GetDataVector()[i].value);
  111.         Events::drawingEvent += Test;
  112.     }
  113. } test;

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #97 : Сентября 20, 2016, 07:52:32 pm »
А если так, то будет нормально, правильно я понимаю?
Код: C++
  1. vector<int> vec; // определяем переменную vec (вызывается конструктор std::vector)
  2. class A {
  3.              
  4.     A() { // Конструктор класса A
  5.         vec.push_back(5); // Добавляем элемент в вектор
  6.     }
  7. } a; // определяем обьект a класса A (вызывается конструктор A)

Да. (обьект vec конструируется до обьекта a).

2) При сборке какого-либо проекта с подключением
Код: C++
  1. #include "game_sa\CTxdStore.h"
проект собирается, но студия выдаёт предупреждение
Цитировать
>d:\projects\plugin-sdk\plugin_sa\game_sa\TxdDef.h(19): warning C4161: #pragma pack(pop...): число извлечений из стека превышает число занесений


Надо убрать эту строчку (с #pragma pack). Будет в следующем коммите.

3) С поддержкой Windows XP какой-либо проект нельзя собрать?

Собирать с тулсетом для XP (v140_xp).
Если у тебя он не установлен, можно скачать и установить.


4) Если объединять примеры для zr350 и тягачей, то считывание с vehicle_advanced.dat надо делать так?


Код: C++
  1. #include "plugin.h"
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include <sstream>
  6. #include "game_sa\common.h"
  7. #include "game_sa\CFont.h"
  8.  
  9. using namespace plugin;
  10. using namespace std;
  11.  
  12. class ZR350 {
  13. public:
  14.     struct Zr350Info {
  15.         unsigned int baseModelId;
  16.         float value;
  17.     };
  18.  
  19.     static vector<Zr350Info>& GetZr350Infos() {
  20.         static vector<Zr350Info> zr350Infos;
  21.         return zr350Infos;
  22.     }
  23.  
  24.     static vector<unsigned int>& GetTruckIDs() {
  25.         static vector<unsigned int> truckIDs;
  26.         return truckIDs;
  27.     }
  28.  
  29.     static void ReadSettingsFile() {
  30.         ifstream stream("vehicle_advanced.dat");
  31.         for (string line; getline(stream, line); ) {
  32.             if (line[0] != ';' && line[0] != '#') {
  33.                 if (!line.compare("zr350")) {
  34.                     while (getline(stream, line) && line.compare("end")) {
  35.                         if (line[0] != ';' && line[0] != '#') {
  36.                             Zr350Info entry;
  37.                             if (sscanf(line.c_str(), "%d, %f", &entry.baseModelId, &entry.value) == 2)
  38.                                 GetZr350Infos().push_back(entry);
  39.                         }
  40.                     }
  41.                 } else if (!line.compare("trucks")) {
  42.                     while (getline(stream, line) && line.compare("end")) {
  43.                         if (line[0] != ';' && line[0] != '#') {
  44.                             std::stringstream ss(line);
  45.                             int i;
  46.                             while (ss >> i) {
  47.                                 GetTruckIDs().push_back(i);
  48.                                 if (ss.peek() == ',')
  49.                                     ss.ignore();
  50.                             }
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.         }
  56.     }
  57.  
  58.     static Zr350Info *GetZr350InfoForModel(unsigned int BaseModelId) {
  59.         for (unsigned int i = 0; i < GetZr350Infos().size(); i++) {
  60.             if (GetZr350Infos()[i].baseModelId == BaseModelId)
  61.                 return &GetZr350Infos()[i];
  62.         }
  63.         return nullptr;
  64.     }
  65.  
  66.     static bool GetIsModelTruck(unsigned int modelId) {
  67.         for (unsigned int i : GetTruckIDs()) {
  68.             if (i == modelId)
  69.                 return true;
  70.         }
  71.         return false;
  72.     }
  73.  
  74.     static void Test() {
  75.         CVehicle *vehicle = FindPlayerVehicle(-1, false);
  76.         if (vehicle) {
  77.             CFont::SetScale(0.5f, 1.0f);
  78.             CFont::SetColor(CRGBA(255, 255, 255, 255));
  79.             CFont::SetAlignment(ALIGN_LEFT);
  80.             CFont::SetOutlinePosition(1);
  81.             CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  82.             CFont::SetBackground(false, false);
  83.             CFont::SetFontStyle(FONT_SUBTITLES);
  84.             CFont::SetProp(true);
  85.             CFont::SetWrapx(600.0f);
  86.             static char str[32];
  87.             Zr350Info *entryModel = GetZr350InfoForModel(vehicle->m_wModelIndex);
  88.             if (entryModel) {
  89.                 sprintf(str, "yes %d %.2f", entryModel->baseModelId, entryModel->value);
  90.                 CFont::PrintString(5.0f, 445.0f, str);
  91.             }
  92.             else {
  93.                 sprintf(str, "no %d", vehicle->m_wModelIndex);
  94.                 CFont::PrintString(5.0f, 445.0f, str);
  95.             }
  96.             if (GetIsModelTruck(vehicle->m_wModelIndex)) {
  97.                 sprintf(str, "yes truck %d", vehicle->m_wModelIndex);
  98.                 CFont::PrintString(205.0f, 445.0f, str);
  99.             }
  100.             else {
  101.                 sprintf(str, "no truck %d", vehicle->m_wModelIndex);
  102.                 CFont::PrintString(205.0f, 445.0f, str);
  103.             }
  104.         }
  105.     }
  106.  
  107.     ZR350() {
  108.         ReadSettingsFile();
  109.         Events::drawingEvent += Test;
  110.     }
  111. } test;
« Последнее редактирование: Сентября 20, 2016, 09:00:17 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: Написание плагина. Настройка проекта
« Ответ #98 : Сентября 21, 2016, 05:47:32 pm »
Собирать с тулсетом для XP (v140_xp).
Если у тебя он не установлен, можно скачать и установить.

Я пробовал, но когда я выбираю режим Visual Studio 2015 - Windows XP (v140_xp), то в позиции целевая платформа надпись Windows исчезает.


при сборке выходит предупреждение
Цитировать
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets(1193,5): warning MSB8030: The linker switch "Minimum Required Version" requires "SubSystem" to be set.  Without "SubSystem", the "Minimum Required Version" would not be passed to linker and could prevent to the output binary from running on older Operating Systems.

и плагин на Windows XP не работает (ребята проверяли, у меня семёрка установлена).

Когда устанавливал студию, то инструменты для поддержки XP ставил. Сейчас специально обновил, всё тоже самое.
Не пойму в чём дело.  :(

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #99 : Сентября 21, 2016, 06:37:24 pm »
Попробуй поставить SubSystem на Windows.


Какая именно ошибка выходит на WinXP?
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: Написание плагина. Настройка проекта
« Ответ #100 : Сентября 22, 2016, 09:59:25 am »
Попробуй поставить SubSystem на Windows.

Поставил. Предупреждение при сборке проекта исчезло, но в позиции целевая платформа надпись Windows также исчезает.




Какая именно ошибка выходит на WinXP?
Плагин просто не работает, т.е. ничего не происходит. Я собирал для ребят твои примеры GPS и Универсальные поворотники. Скинул на тест эти же плагины, собранные по-новой. Протестируют, посмотрим какой будет результат. Но по-любому в целевой платформе надпись Windows так и не появилась.  :(


UPD:
Ребята протестировали, плагины на XP не работают.  >:(
« Последнее редактирование: Сентября 23, 2016, 07:33:18 am от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #101 : Сентября 23, 2016, 09:36:34 pm »
Пока искал, кое-что понял: если изменяешь какие-либо параметры в настройках (пути включения/библиотек, обьявления препроцессора) и уже потом меняешь тулсет на xp, то эти поля не будут модифицироваться. Т.е., как я понял, надо для начала выставить нужный тулсет, а только потом настраивать проект.
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: Написание плагина. Настройка проекта
« Ответ #102 : Сентября 24, 2016, 07:23:37 am »
Я пробовал так. Создал новый пустой проект. Выставил тулсет на xp и сразу в целевой платформе надпись Windows пропадает. Дальнейшая настройка проекта ничего в этой позиции не меняет. Пробовал и так - создал новый пустой проект. Выставил SubSystem на Windows. Потом поменял тулсет на xp. Всё тоже самое. Ерунда какая-то.
Ну что же, придётся писать, что плагины на XP не работают. Хотя пользователей с XP не так много осталось, но они есть.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #103 : Сентября 24, 2016, 04:18:36 pm »
У меня пустой проект с настройками для XP (тулсет, субсистема) нормально запускается (проверил на виртуальной машине с XP SP3).
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: Написание плагина. Настройка проекта
« Ответ #104 : Сентября 24, 2016, 04:35:28 pm »
У меня пустой проект с настройками для XP (тулсет, субсистема) нормально запускается (проверил на виртуальной машине с XP SP3).
А у тебя  в позиции целевая платформа надпись Windows при этом есть?

Также есть функции RwMatrixRotate/RwFrameRotate, которые вращают матрицу/фрейм вокруг оси (ось можно задать своим вектором).
Ну и ещё вариант - вращение методами CMatrix: RotateX,RotateY,RotateZ и другими (см. файл CMatrix.h) Eсли будет нужно, то покажу на примере.
Да, покажи пожалуйста такие примеры для открытия и закрытия, например, капота авто функциями RwMatrixRotate/RwFrameRotate и методом CMatrix.