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

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #135 : Октябрь 16, 2016, 10:39:21 am »
но студия ругается
Надо определить эти переменные в CVehicleModelInfo.cpp.

В показанных ранее примерах в этих строчках
Код: C++
  1. CallMethod<NoRet, 0x506EA0, unsigned int, int, float, float>(0xB6BC90, audioEventId, volume, speed);
  2. Call<NoRet, 0x486B00, CVector const&, CEntity *>(trailer->GetPosition(), trailer);

теперь подчёркиваются красным
Call<NoRet и CallMethod<NoRet
Студия ругается, что идентификатор не определён и отсутствуют экземпляры шаблон функции...
Вызов 0x486B00 уже можно заменить на
Код: C++
  1. CTheScripts::ClearSpaceForMissionEntity
А 0x506EA0 переделать так:
Код: C++
  1. CallMethod<0x506EA0>(0xB6BC90, audioEventId, volume, speed);
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: Написание плагина. Настройка проекта
« Ответ #136 : Октябрь 16, 2016, 03:20:02 pm »
Определил
Код: C++
  1. char *CVehicleModelInfo::ms_compsUsed = (char *)0xB4E478;
Но что-то не работает. Уже установленные экстры считываются верно, а вот установить на модель прицепа определённые экстры не получается. Они просто ставятся рандомно и с экстрами тягача не совпадают.
Пробовал вместо такой записи
Код: C++
  1. CVehicleModelInfo::ms_compsUsed[0] = vehicle->m_anExtras[0];
  2. CVehicleModelInfo::ms_compsUsed[1] = vehicle->m_anExtras[1];
записать так
Код: C++
  1. CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[modelTrailer]);
  2. vehModel->ms_compsUsed[0] = vehicle->m_anExtras[0];
  3. vehModel->ms_compsUsed[1] = vehicle->m_anExtras[1];
но результат тот же.

Код: C++
  1. #include "plugin.h"
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include "game_sa\CGeneral.h"
  6. #include "game_sa\CStreaming.h"
  7. #include "game_sa\CTrailer.h"
  8. #include "game_sa\CWorld.h"
  9. #include "game_sa\CTheScripts.h"
  10. #include "game_sa\CModelInfo.h"
  11.  
  12. using namespace plugin;
  13. using namespace std;
  14.  
  15. class MyPlugin {
  16. public:
  17.     class ModelInfo {
  18.     public:
  19.         bool enabledTrailer;
  20.         ModelInfo(CVehicle *vehicle) { enabledTrailer = true; }
  21.     };
  22.  
  23.     static VehicleExtendedData<ModelInfo> modelInfo;
  24.  
  25.     struct MyData {
  26.         unsigned int ModelId;
  27.         unsigned int TrailerIdOne;
  28.         unsigned int TrailerIdTwo;
  29.         unsigned int TrailerIdThree;
  30.         unsigned int TrailerIdFour;
  31.         unsigned int TrailerColours;
  32.         unsigned int TrailerExtras;
  33.     };
  34.  
  35.     static vector<MyData>& GetDataVector() {
  36.         static vector<MyData> vec;
  37.         return vec;
  38.     }
  39.  
  40.     static void ReadSettingsFile() {
  41.         ifstream stream("trailer.dat");
  42.         for (string line; getline(stream, line); ) {
  43.             if (line[0] != ';' && line[0] != '#') {
  44.                 if (!line.compare("trailer")) {
  45.                     while (getline(stream, line) && line.compare("end")) {
  46.                         if (line[0] != ';' && line[0] != '#') {
  47.                             MyData entry;
  48.                             if (sscanf(line.c_str(), "%d, %d, %d, %d, %d, %d, %d", &entry.ModelId, &entry.TrailerIdOne, &entry.TrailerIdTwo, &entry.TrailerIdThree, &entry.TrailerIdFour, &entry.TrailerColours, &entry.TrailerExtras) == 7)
  49.                                 GetDataVector().push_back(entry);
  50.                         }
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.     }
  56.  
  57.     static MyData *GetDataInfoForModel(unsigned int BaseModelId) {
  58.         for (unsigned int i = 0; i < GetDataVector().size(); i++) {
  59.             if (GetDataVector()[i].ModelId == BaseModelId)
  60.                 return &GetDataVector()[i];
  61.         }
  62.         return nullptr;
  63.     }
  64.  
  65.     static void SetTrailer(CVehicle *vehicle, unsigned int modelTrailer, unsigned int colour, unsigned int extra) {
  66.         CStreaming::RequestModel(modelTrailer, 0);
  67.         CStreaming::LoadAllRequestedModels(false);
  68.         if (CStreaming::ms_aInfoForModel[modelTrailer].m_loadState == LOADSTATE_LOADED) {
  69.             if (extra) {
  70.                 CVehicleModelInfo::ms_compsUsed[0] = vehicle->m_anExtras[0];
  71.                 CVehicleModelInfo::ms_compsUsed[1] = vehicle->m_anExtras[1];
  72.             }
  73.             CVehicle *trailer = nullptr;
  74.             if (CModelInfo::IsVehicleModelType(modelTrailer) == 11)
  75.                 trailer = new CTrailer(modelTrailer, 1);
  76.             else                    
  77.                 trailer = new CAutomobile(modelTrailer, 1, true);
  78.             if (trailer) {
  79.                 trailer->SetPosn(0.0f, 0.0f, 0.0f);
  80.                 trailer->m_nStatus = 4;
  81.                 CWorld::Add(trailer);
  82.                 trailer->SetTowLink(vehicle, true);
  83.                 CTheScripts::ClearSpaceForMissionEntity(trailer->GetPosition(), trailer);
  84.                 if (colour) {
  85.                     trailer->m_nPrimaryColor = vehicle->m_nPrimaryColor;
  86.                     trailer->m_nSecondaryColor = vehicle->m_nSecondaryColor;
  87.                     trailer->m_nTertiaryColor = vehicle->m_nTertiaryColor;
  88.                     trailer->m_nQuaternaryColor = vehicle->m_nQuaternaryColor;
  89.                 }
  90.                 if (CModelInfo::IsVehicleModelType(modelTrailer) == 11) {
  91.                     trailer->m_nFlags.bEngineOn = 1;
  92.                     trailer->m_nFlags.bIsLocked = 1;
  93.                 }
  94.                 else {
  95.                     trailer->m_nFlags.bEngineOn = 0;
  96.                     trailer->m_dwDoorLock = CARLOCK_LOCKED;
  97.                 }
  98.                    
  99.             }
  100.         }
  101.     }
  102.    
  103.     MyPlugin() {
  104.         ReadSettingsFile();
  105.         static unsigned int TrailerId;
  106.  
  107.         Events::gameProcessEvent += [] {
  108.             for (int i = 0; i < CPools::ms_pVehiclePool->m_Size; i++) {
  109.                 CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  110.                 if (vehicle) {
  111.                     if (CModelInfo::IsVehicleModelType(vehicle->m_wModelIndex) == 11
  112.                         && vehicle->m_nFlags.bIsLocked == 1 && !vehicle->m_pTractor) {
  113.                         vehicle->m_nFlags.bIsLocked = 0;
  114.                         if (!vehicle->IsVisible())
  115.                             vehicle->CanBeDeleted();
  116.                     }
  117.                     MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  118.                     if (entryModel) {
  119.                         switch (CGeneral::GetRandomNumberInRange(0, 4)) {
  120.                         case 0: TrailerId = entryModel->TrailerIdOne; break;
  121.                         case 1: TrailerId = entryModel->TrailerIdTwo; break;
  122.                         case 2: TrailerId = entryModel->TrailerIdThree; break;
  123.                         case 3: TrailerId = entryModel->TrailerIdFour; break;
  124.                         }
  125.                         ModelInfo &info = modelInfo.Get(vehicle);
  126.                         if (info.enabledTrailer && vehicle->m_pDriver && !vehicle->m_pTrailer
  127.                             && (CModelInfo::IsVehicleModelType(TrailerId) == 11 || CModelInfo::IsVehicleModelType(TrailerId) == 0)) {
  128.                             vehicle->m_nFlags.bMadDriver = 0;
  129.                             SetTrailer(vehicle, TrailerId, entryModel->TrailerColours, entryModel->TrailerExtras);
  130.                         }
  131.                         info.enabledTrailer = false;
  132.                     }
  133.                 }
  134.             }
  135.         };
  136.  
  137.     }
  138. } myPlugin;
  139.  
  140. VehicleExtendedData<MyPlugin::ModelInfo> MyPlugin::modelInfo;
  141.  

Что делать?  :(

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #137 : Октябрь 16, 2016, 05:02:06 pm »
Там есть 2 разные переменные, compsUsed и compsToUse.
Надо именно во второе записывать.
Код: C++
  1. 8A6458                             ; CVehicleModelInfo::ms_compsToUse

Код: C++
  1. static char *ms_compsToUse;

Код: C++
  1. char *CVehicleModelInfo::ms_compsToUse = (char *)0x8A6458;
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: Написание плагина. Настройка проекта
« Ответ #138 : Октябрь 16, 2016, 06:29:01 pm »
Там есть 2 разные переменные, compsUsed и compsToUse.
Надо именно во второе записывать.
Вот теперь всё отлично.  :) Спасибо!

UPD:
Дополнил код:

trailer.dat
Код: C++
  1. #A - Id tractor
  2. #B - Id trailer first variant
  3. #C - Id trailer second variant
  4. #D - Id trailer third variant  
  5. #E - Id trailer fourth variant
  6. #F - Colours of the trailer as at the tractor (0-no, 1-yes)
  7. #G - Extras at the trailer as at the tractor (0-no, 1-yes)
  8. #H - Trailer Constant (0-no, 1-yes)
  9.  
  10. #B,C,D,E - For trailers "towtruck" it is possible to write not only ID models, but also a model class.
  11. # 0-normal, 1-poorfamily, 2-richfamily, 3-executive, 4-worker (look a file vehicles.ide)
  12.  
  13. #A,   B,   C,   D,   E,  F, G, H
  14.  
  15. trailer
  16. 403, 435, 450, 584, 591, 0, 0, 0
  17. 485, 606, 607, 607, 606, 0, 0, 0
  18. 514, 584, 584, 584, 584, 0, 0, 1
  19. 515, 435, 450, 584, 591, 0, 0, 0
  20. 525, 400, 0,   1,   2,   0, 0, 1
  21. end

Код: C++
  1. #include <vector>
  2. #include <fstream>
  3. #include <string>
  4. #include "game_sa\CGeneral.h"
  5. #include "game_sa\CStreaming.h"
  6. #include "game_sa\CTrailer.h"
  7. #include "game_sa\CWorld.h"
  8. #include "game_sa\CTheScripts.h"
  9. #include "game_sa\CModelInfo.h"
  10. #include "game_sa\common.h"
  11.  
  12. using namespace plugin;
  13. using namespace std;
  14.  
  15. unsigned int normalModelIds[] = { 400, 418, 419, 440, 458, 466, 467, 475, 479, 482, 483, 489, 491, 496, 500, 505, 507,
  16. 518, 526, 529, 540, 543, 545, 546, 547, 550, 554, 580, 582, 585, 589, 600, 603, 604, 605 };
  17.  
  18. unsigned int poorfamilyModelIds[] = { 401, 404, 410, 412, 436, 439, 492, 516, 517, 527, 542, 549, 567, 575, 576 };
  19.  
  20. unsigned int richfamilyModelIds[] = { 405, 421, 426, 445, 474, 477, 535, 551, 558, 559, 560, 561, 562, 565, 566, 579, 587 };
  21.  
  22. unsigned int executiveModelIds[] = { 402, 409, 411, 415, 429, 434, 451, 480, 506, 533, 534, 536, 541, 555, 602 };
  23.  
  24. unsigned int workerModelIds[] = { 408, 413, 414, 422, 423, 455, 456, 478, 498, 499, 508, 524, 530, 578, 609 };
  25.  
  26. class MyPlugin {
  27. public:
  28.     class ModelInfo {
  29.     public:
  30.         bool enabledTrailer;
  31.         ModelInfo(CVehicle *vehicle) { enabledTrailer = true; }
  32.     };
  33.  
  34.     static VehicleExtendedData<ModelInfo> modelInfo;
  35.  
  36.     struct MyData {
  37.         unsigned int ModelId;
  38.         unsigned int TrailerIdOne;
  39.         unsigned int TrailerIdTwo;
  40.         unsigned int TrailerIdThree;
  41.         unsigned int TrailerIdFour;
  42.         unsigned int TrailerColours;
  43.         unsigned int TrailerExtras;
  44.         unsigned int TrailerConst;
  45.     };
  46.  
  47.     static vector<MyData>& GetDataVector() {
  48.         static vector<MyData> vec;
  49.         return vec;
  50.     }
  51.  
  52.     static void ReadSettingsFile() {
  53.         ifstream stream("trailer.dat");
  54.         for (string line; getline(stream, line); ) {
  55.             if (line[0] != ';' && line[0] != '#') {
  56.                 if (!line.compare("trailer")) {
  57.                     while (getline(stream, line) && line.compare("end")) {
  58.                         if (line[0] != ';' && line[0] != '#') {
  59.                             MyData entry;
  60.                             if (sscanf(line.c_str(), "%d, %d, %d, %d, %d, %d, %d, %d", &entry.ModelId, &entry.TrailerIdOne, &entry.TrailerIdTwo, &entry.TrailerIdThree, &entry.TrailerIdFour, &entry.TrailerColours, &entry.TrailerExtras, &entry.TrailerConst) == 8)
  61.                                 GetDataVector().push_back(entry);
  62.                         }
  63.                     }
  64.                 }
  65.             }
  66.         }
  67.     }
  68.  
  69.     static MyData *GetDataInfoForModel(unsigned int BaseModelId) {
  70.         for (unsigned int i = 0; i < GetDataVector().size(); i++) {
  71.             if (GetDataVector()[i].ModelId == BaseModelId)
  72.                 return &GetDataVector()[i];
  73.         }
  74.         return nullptr;
  75.     }
  76.  
  77.     static void SetTrailer(CVehicle *vehicle, unsigned int modelTrailer, unsigned int colour, unsigned int extra) {
  78.         CStreaming::RequestModel(modelTrailer, 0);
  79.         CStreaming::LoadAllRequestedModels(false);
  80.         if (CStreaming::ms_aInfoForModel[modelTrailer].m_loadState == LOADSTATE_LOADED) {
  81.             if (extra && vehicle) {
  82.                 CVehicleModelInfo::ms_compsToUse[0] = vehicle->m_anExtras[0];
  83.                 CVehicleModelInfo::ms_compsToUse[1] = vehicle->m_anExtras[1];
  84.             }
  85.             CVehicle *trailer = nullptr;
  86.             if (CModelInfo::IsVehicleModelType(modelTrailer) == 11)
  87.                 trailer = new CTrailer(modelTrailer, 1);
  88.             else
  89.                 trailer = new CAutomobile(modelTrailer, 1, true);
  90.             if (trailer) {
  91.                 trailer->SetPosn(0.0f, 0.0f, 0.0f);
  92.                 trailer->m_nStatus = 4;
  93.                 CWorld::Add(trailer);
  94.                 if (vehicle) {
  95.                     trailer->SetTowLink(vehicle, true);
  96.                     if (colour) {
  97.                         trailer->m_nPrimaryColor = vehicle->m_nPrimaryColor;
  98.                         trailer->m_nSecondaryColor = vehicle->m_nSecondaryColor;
  99.                         trailer->m_nTertiaryColor = vehicle->m_nTertiaryColor;
  100.                         trailer->m_nQuaternaryColor = vehicle->m_nQuaternaryColor;
  101.                     }
  102.                 }
  103.                 CTheScripts::ClearSpaceForMissionEntity(trailer->GetPosition(), trailer);
  104.                 if (CModelInfo::IsVehicleModelType(modelTrailer) == 11) {
  105.                     trailer->m_nFlags.bEngineOn = 1;
  106.                     trailer->m_nFlags.bIsLocked = 1;
  107.                 }
  108.                 else {
  109.                     trailer->m_nFlags.bEngineOn = 0;
  110.                     trailer->m_dwDoorLock = CARLOCK_LOCKED;
  111.                     CAutomobile *automobile = reinterpret_cast<CAutomobile *>(trailer);
  112.                     unsigned int perRandomDamage = CGeneral::GetRandomNumberInRange(0, 3);
  113.                     if(perRandomDamage == 2)
  114.                         automobile->SetTotalDamage(1);
  115.                     else if (perRandomDamage == 1)
  116.                         automobile->SetRandomDamage(1);
  117.                 }
  118.             }
  119.         }
  120.     }
  121.  
  122.     MyPlugin() {
  123.         ReadSettingsFile();
  124.         static unsigned int Id;
  125.         static unsigned int TrailerId;
  126.         static unsigned int currentVariant = 0;
  127.  
  128.         Events::gameProcessEvent += [] {
  129.             for (int i = 0; i < CPools::ms_pVehiclePool->m_Size; i++) {
  130.                 CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  131.                 if (vehicle) {
  132.                     if (vehicle->m_nFlags.bIsLocked == 1) {
  133.                         if (FindPlayerPed()) {
  134.                             if ((DistanceBetweenPoints(FindPlayerCoors(0), vehicle->GetPosition()) > 200.0f)) {
  135.                                 if (vehicle->m_pTrailer) {
  136.                                     vehicle->m_pTrailer->m_nFlags.bIsLocked = 0;
  137.                                     vehicle->m_pTrailer->CanBeDeleted();
  138.                                 }
  139.                                 vehicle->m_nFlags.bIsLocked = 0;
  140.                                 vehicle->CanBeDeleted();
  141.                             }
  142.                             else if (FindPlayerPed()->m_pVehicle == vehicle) {
  143.                                 if (vehicle->m_pTrailer)
  144.                                     vehicle->m_pTrailer->m_nFlags.bIsLocked = 0;
  145.                                 vehicle->m_nFlags.bIsLocked = 0;
  146.                             }
  147.                         }
  148.                     }
  149.                     MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  150.                     ModelInfo &info = modelInfo.Get(vehicle);
  151.                     if (entryModel && info.enabledTrailer) {
  152.                         if (!entryModel->TrailerConst) {
  153.                             if (currentVariant < 2)
  154.                                 currentVariant += 1;
  155.                             else
  156.                                 currentVariant = 0;
  157.                             if (currentVariant == 2)
  158.                                 info.enabledTrailer = false;
  159.                         }
  160.                         switch (CGeneral::GetRandomNumberInRange(0, 4)) {
  161.                         case 0: Id = entryModel->TrailerIdOne; break;
  162.                         case 1: Id = entryModel->TrailerIdTwo; break;
  163.                         case 2: Id = entryModel->TrailerIdThree; break;
  164.                         case 3: Id = entryModel->TrailerIdFour; break;
  165.                         }
  166.                         switch (Id) {
  167.                             CVehicleModelInfo *vehModel;
  168.                             bool enabledExit;
  169.                         case 0: {
  170.                             enabledExit = false;
  171.                             do {
  172.                                 TrailerId = normalModelIds[CGeneral::GetRandomNumberInRange(0, 35)];
  173.                                 vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[TrailerId]);
  174.                                 if (CModelInfo::IsVehicleModelType(TrailerId) == 0 && vehModel->m_nClass == 0)
  175.                                     enabledExit = true;
  176.                             } while (!enabledExit);
  177.                             break;
  178.                         }
  179.                         case 1: {
  180.                             enabledExit = false;
  181.                             do {
  182.                                 TrailerId = poorfamilyModelIds[CGeneral::GetRandomNumberInRange(0, 15)];
  183.                                 vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[TrailerId]);
  184.                                 if (CModelInfo::IsVehicleModelType(TrailerId) == 0 && vehModel->m_nClass == 1)
  185.                                     enabledExit = true;
  186.                             } while (!enabledExit);
  187.                             break;
  188.                         }
  189.                         case 2: {
  190.                             enabledExit = false;
  191.                             do {
  192.                                 TrailerId = richfamilyModelIds[CGeneral::GetRandomNumberInRange(0, 17)];
  193.                                 vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[TrailerId]);
  194.                                 if (CModelInfo::IsVehicleModelType(TrailerId) == 0 && vehModel->m_nClass == 2)
  195.                                     enabledExit = true;
  196.                             } while (!enabledExit);
  197.                             break;
  198.                         }
  199.                         case 3: {
  200.                             enabledExit = false;
  201.                             do {
  202.                                 TrailerId = executiveModelIds[CGeneral::GetRandomNumberInRange(0, 15)];
  203.                                 vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[TrailerId]);
  204.                                 if (CModelInfo::IsVehicleModelType(TrailerId) == 0 && vehModel->m_nClass == 3)
  205.                                     enabledExit = true;
  206.                             } while (!enabledExit);
  207.                             break;
  208.                         }
  209.                         case 4: {
  210.                             enabledExit = false;
  211.                             do {
  212.                                 TrailerId = workerModelIds[CGeneral::GetRandomNumberInRange(0, 15)];
  213.                                 vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[TrailerId]);
  214.                                 if (CModelInfo::IsVehicleModelType(TrailerId) == 0 && vehModel->m_nClass == 4)
  215.                                     enabledExit = true;
  216.                             } while (!enabledExit);
  217.                             break;
  218.                         }
  219.                         default: TrailerId = Id; break;
  220.                         }
  221.                         if (info.enabledTrailer && vehicle->m_pDriver && !vehicle->m_pTrailer
  222.                             && (CModelInfo::IsVehicleModelType(TrailerId) == 11 || CModelInfo::IsVehicleModelType(TrailerId) == 0)) {
  223.                             vehicle->m_nFlags.bMadDriver = 0;
  224.                             vehicle->m_nFlags.bIsLocked = 1;
  225.                             SetTrailer(vehicle, TrailerId, entryModel->TrailerColours, entryModel->TrailerExtras);
  226.                         }
  227.                     }
  228.                     info.enabledTrailer = false;
  229.                 }
  230.             }
  231.         };
  232.  
  233.     }
  234. } myPlugin;
  235.  
  236. VehicleExtendedData<MyPlugin::ModelInfo> MyPlugin::modelInfo;
  237.  
« Последнее редактирование: Октябрь 20, 2016, 03:24:00 pm от kenking »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #139 : Ноябрь 12, 2016, 10:57:11 am »
В VC и SA вот эти функции несколько различаются:
Код: C++
  1. static void PrintString(float x, float y, char *text);
  2. static void PrintString(float x, float y, unsigned short* text);

Как для VC будет вывод текста? (вот эти строчки для SA):
Код: C++
  1. char text[16];
  2. sprintf(text, "gear %d", vehicle->m_nCurrentGear);
  3. CFont::PrintString(5.0f, 5.0f, text);

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #140 : Ноябрь 12, 2016, 02:19:07 pm »
Там надо unsigned short поменять на wchar_t.
Обнови проект.

Код: C++
  1. wchar_t text[16];
  2. swprintf(text, L"gear %d", vehicle->m_nCurrentGear);
  3. CFont::PrintString(x, y, text);
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: Написание плагина. Настройка проекта
« Ответ #141 : Ноябрь 12, 2016, 05:41:05 pm »
Там надо unsigned short поменять на wchar_t.
Обнови проект.
Пришлось в настройках прописать _CRT_NON_CONFORMING_SWPRINTFS, иначе мой тестовый плагин не собирался.

А вот с этими строчками игра зависает.  >:(
Код: C++
  1. CFont::SetColor(CRGBA(255, 255, 255, 255));
  2. CFont::SetDropColor(CRGBA(0, 0, 0, 255));

Оффлайн FrogByte

  • Призрак
  • Сообщений: 13
  • Репутация: +7/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #142 : Ноябрь 12, 2016, 06:41:20 pm »
А вот с этими строчками игра зависает.  >:(
Код: C++
  1. CFont::SetColor(CRGBA(255, 255, 255, 255));
  2. CFont::SetDropColor(CRGBA(0, 0, 0, 255));

Тоже когда-то мучился с этим, оказывается тип параметра не сходится с тем, что из названия(в коде игры функция принимает указатель на CRGBA, а в названии просто CRGBA).

Так должно работать:
Код: C++
  1. // Converted from cdecl void CFont::SetDropColor(CRGBA color) 0x54FF30
  2. void CFont::SetDropColor(CRGBA color) {
  3.     plugin::Call<0x54FF30, CRGBA *>(&color);
  4. }

Код: C++
  1. // Converted from cdecl void CFont::SetBackgroundColor(CRGBA color) 0x5500A0
  2. void CFont::SetBackgroundColor(CRGBA color) {
  3.     plugin::Call<0x5500A0, CRGBA *>(&color);
  4. }

Код: C++
  1. // Converted from cdecl void CFont::SetColor(CRGBA color) 0x550170
  2. void CFont::SetColor(CRGBA color) {
  3.     plugin::Call<0x550170, CRGBA *>(&color);
  4. }
« Последнее редактирование: Ноябрь 12, 2016, 06:51:21 pm от FrogByte »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #143 : Ноябрь 13, 2016, 08:54:05 am »
Так должно работать
Ага так работает, спасибо.  ;)

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #144 : Ноябрь 16, 2016, 03:48:16 pm »
Для VC можно эти строчки записать "более правильно"?

Код: C++
  1. char *name = GetFrameNodeName(frame);
  2. wchar_t text[32];
  3. swprintf(text, L"%hs", name);
  4. CFont::PrintString(offset->x, offset->y, text);

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #145 : Ноябрь 16, 2016, 07:38:46 pm »
Код: C++
  1. wchar_t text[32];
  2. AsciiToUnicode(GetFrameNodeName(frame), text);
  3. CFont::PrintString(offset->x, offset->y, text);
Можно создать аналог функции GetFrameNodeName, который будет возвращать строку в Юникоде.
Или аналог PrintString, который будет принимать ASCII строку.
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: Написание плагина. Настройка проекта
« Ответ #146 : Апрель 14, 2017, 10:43:17 am »
Разобрал для GTA 3 CFont https://github.com/DK22Pac/plugin-sdk/commit/f957a26bb64cd1258c2c4837ab9b42b6d9b70e84

Где-то есть ошибка, поскольку цвет тексту устанавливал белый (пробовал ставить и другие цвета), но выводится всегда так (чёрным)


Код: C++
  1. #include "plugin_III.h"
  2. #include "game_III\common.h"
  3. #include "game_III\CFont.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class MyPlugin {
  8. public:
  9.     MyPlugin() {
  10.         Events::drawingEvent += [] {
  11.             CVehicle *vehicle = FindPlayerVehicle();
  12.             if (vehicle) {
  13.                 CFont::SetScale(0.5f, 1.0f);
  14.                 CFont::SetColor(CRGBA(255, 255, 255, 255));
  15.                 CFont::SetJustifyOn();
  16.                 CFont::SetFontStyle(1);
  17.                 CFont::SetPropOn();
  18.                 CFont::SetWrapx(600.0f);
  19.                
  20.                 wchar_t text[32];
  21.                 swprintf(text, L"Current Gear %d", vehicle->m_nCurrentGear);
  22.                 CFont::PrintString(10.0f, 10.0f, text);
  23.                 swprintf(text, L"Gas Pedal %.1f", vehicle->m_fGasPedal);
  24.                 CFont::PrintString(10.0f, 30.0f, text);
  25.                 swprintf(text, L"Break Pedal %.1f", vehicle->m_fBreakPedal);
  26.                 CFont::PrintString(10.0f, 50.0f, text);
  27.             }
  28.         };
  29.     }
  30. } myPlugin;

Просьба подсказать в чём ошибка.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Написание плагина. Настройка проекта
« Ответ #147 : Апрель 14, 2017, 04:06:52 pm »
Там есть косяк один древний, тебе надо выводить не 255, а чуть поменьше, тогда будет все в порядке.
Либо не 0. Короче, задавай что-то между 0 и 255 везде и в альфе тоже.
« Последнее редактирование: Апрель 14, 2017, 04:15:57 pm от mfisto »
I know everything and nothing...

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 73
  • Репутация: +2/-0
  • Я пытался
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #148 : Апрель 14, 2017, 09:45:26 pm »
Это даже не баг. Проблема в том, что этот шрифт - pager - черный всегда. Потому что это такая текстура.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичок
  • *****
  • Сообщений: 176
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Написание плагина. Настройка проекта
« Ответ #149 : Апрель 14, 2017, 10:27:39 pm »
Тогда, наверняка, из-за этого. Я просто знаю, что если задавать цвет 0 0 0 (либо 255 255 255, просто забыл что вернее) какому-то шрифту (либо всем) то, он вообще пропадает. Вообщем, в scm-кодинге у меня по крайней мере было так для тройки.
I know everything and nothing...