Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - kenking

Страницы: 1 ... 10 11 [12] 13 14 ... 16
166
Программирование / Re: Vice City Plugin SDK
« : Ноябрь 07, 2016, 08:16:09 am »
Разбор структур в каком плане, свои с нуля создавать или где-то в функциях, объявлять обращение к полям?
В уже имеющихся структурах, некоторые поля "не названы правильно". А некоторых структур нет вообще в базе. Так, что получается оба варианта.


167
Программирование / Re: Vice City Plugin SDK
« : Ноябрь 06, 2016, 09:33:29 am »
Спасибо kenking'у за работу над версией Vice City.
Благодаря твоим объяснениям, мало-помалу начинаю разбираться.  :) Вот я разбором структур пока не получается.  :(

168
Теперь есть, но какая-то ерунда получается. Я для gta3 решил структуры посмотреть. Вот, что вышло для CAutomobile
00000000 CAutomobile     struc ; (sizeof=0x58C, align=0x4, mappedto_6)
00000000 vehicle         db ?
00000001 gap1            db 79 dup(?)
00000050 byte50          db ?
00000051 byte51          db ?
00000052 byte52          db ?
00000053 byte53          db ?
00000054 gap54           db 8 dup(?)
0000005C word5C          dw ?
0000005E gap5E           db 362 dup(?)
000001C8 byte1C8         db ?
000001C9 gap1C9          db 91 dup(?)
00000224 dword224        dd ?
00000228 gap228          db 92 dup(?)
00000284 dword284        dd ?
00000288 dword288        dd ?
0000028C gap28C          db 20 dup(?)
000002A0 byte2A0         db ?
000002A1 gap2A1          db 223 dup(?)
00000380 dword380        dd ?
00000384 gap384          db 4 dup(?)
00000388 dword388        dd ?
0000038C dword38C        dd ?
00000390 gap390          db 4 dup(?)
00000394 dword394        dd ?
00000398 gap398          db 321 dup(?)
000004D9 byte4D9         db ?
000004DA                 db ? ; undefined
000004DB                 db ? ; undefined
000004DC dword4DC        dd ?
000004E0 word4E0         dw ?
000004E2 gap4E2          db 78 dup(?)
00000530 dword530        dd ?
00000534 gap534          db 68 dup(?)
00000578 float578        dd ?
0000057C float57C        dd ?
00000580 dword580        dd ?
00000584 dword584        dd ?
00000588 dword588        dd ?
0000058C CAutomobile     ends


m_aCarNodes     dd 20 dup(?) начинается реально с 0x37С
а здесь показывается 0000028C gap28C          db 20 dup(?)Как разбираться?

169
В новых версиях hex-rays есть удобная фишка - создание структуры "на лету". Кликаем ПКМ на переменной, которая хранит указатель на обьект класса и выбираем "Create new structure".
У меня нет такой позиции "Create new structure". Версия IDA Version 6.8.150423 (32-bit)


170
Там есть 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.  

171
Определил
Код: 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.  

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

172
Что-то я с этими экстрами запутался.  :(
В CVehicleModelInfo нет ms_compsToUse, есть
Код: C++
  1. // extras ids for next-spawned car
  2. // static char ms_compsUsed[2];
  3. static char *ms_compsUsed;

Сделал так

Код: C++
  1. static void SetTrailer(CVehicle *vehicle, unsigned int modelTrailer, unsigned int colour, unsigned int extra) {
  2.     CStreaming::RequestModel(modelTrailer, 0);
  3.     CStreaming::LoadAllRequestedModels(false);
  4.     if (CStreaming::ms_aInfoForModel[modelTrailer].m_loadState == LOADSTATE_LOADED) {
  5.         if (extra) {
  6.             CVehicleModelInfo::ms_compsUsed[0] = vehicle->m_anExtras[0];
  7.             CVehicleModelInfo::ms_compsUsed[1] = vehicle->m_anExtras[1];
  8.         }
  9.         CVehicle *trailer = nullptr;
  10.         if (CModelInfo::IsVehicleModelType(modelTrailer) == 11)
  11.             trailer = new CTrailer(modelTrailer, 1);
  12.         else
  13.             trailer = new CAutomobile(modelTrailer, 1, true);
  14.         if (trailer) {
  15.             trailer->SetPosn(0.0f, 0.0f, 0.0f);
  16.             trailer->m_nStatus = 4;
  17.             CWorld::Add(trailer);
  18.             trailer->SetTowLink(vehicle, true);
  19.             CTheScripts::ClearSpaceForMissionEntity(trailer->GetPosition(), trailer);
  20.             if (colour) {
  21.                 trailer->m_nPrimaryColor = vehicle->m_nPrimaryColor;
  22.                 trailer->m_nSecondaryColor = vehicle->m_nSecondaryColor;
  23.                 trailer->m_nTertiaryColor = vehicle->m_nTertiaryColor;
  24.                 trailer->m_nQuaternaryColor = vehicle->m_nQuaternaryColor;
  25.             }
  26.             if (CModelInfo::IsVehicleModelType(modelTrailer) == 11) {
  27.                 trailer->m_nFlags.bEngineOn = 1;
  28.                 trailer->m_nFlags.bIsLocked = 1;
  29.             }
  30.             else {
  31.                 trailer->m_nFlags.bEngineOn = 0;
  32.                 trailer->m_dwDoorLock = CARLOCK_LOCKED;
  33.             }
  34.  
  35.         }
  36.     }
  37. }


но студия ругается
Цитировать
1>------ Перестроение всех файлов начато: проект: TankerTruck, Конфигурация: Rel-XP Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2001: неразрешенный внешний символ ""public: static char * CVehicleModelInfo::ms_compsUsed" (?ms_compsUsed@CVehicleModelInfo@@2PADA)"
1>D:\Games\GTA San Andreas\scripts\TankerTruck.asi : fatal error LNK1120: неразрешенных внешних элементов: 1
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========


В показанных ранее примерах в этих строчках
Код: 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
Студия ругается, что идентификатор не определён и отсутствуют экземпляры шаблон функции...

173
По аналогии с опкодом 0506
Код: C++
  1. case COMMAND_SET_CAR_MODEL_COMPONENTS:
  2.     this->CollectParameters(3); // параметр №1 не используется
  3.     CVehicleModelInfo::ms_compsToUse[0] = ScriptParams[1].i;
  4.     CVehicleModelInfo::ms_compsToUse[1] = ScriptParams[2].i;
  5.     return OR_CONTINUE;
Подключать надо CRunningScript? Что-то не получается у меня. Добавь пожалуйста в тот код, что я показал.

Когда именно вылетает (на загрузке или в процессе игры)?
Файл открывается, данные считываются?
Да файл открывает и данные считываются. Но я имел ввиду не этот конкретно код, а в общем.
Вылетает в процессе игры.
Для клео скриптов были SCMLog и SCRLog Plugin для помощи в поиске ошибок при вылете игры. А в случае с плагинами, как находить из-за какого плагина был вылет и в каком месте кода ошибка?

По CVehicleModelInfo - вроде всё правильно у тебя
Сделал коммит.

Как будет время напиши пожалуйста детально, как ты переносишь всё в sdk. Хорошо бы, по-возможности, ты добавил в sdk для VC все нужные файлы .h и .cpp с подключениями, а я наполнял бы эти файлы по аналогии с sdk для SA. Ну а где будут непонятки, буду спрашивать. Хоть понемногу будет работа по VC продвигаться.

174
Набросал код для цепляния прицепов к тягачам в трафике.
Есть вопрос по экстрам.
Надо считать с тягача установленные экстры и потом на модель прицепа установить такие же. понял, что считать уже установленные экстры на транспорте можно так:
Код: C++
  1. vehicle->m_anExtras[0]
  2. vehicle->m_anExtras[1]

А вот как установить эти номера экстр на модель перед созданием транспорта не понял. Нашёл в CVehicleModelInfo это:
Код: C++
  1. // extras ids for next-spawned car
  2. // static char ms_compsUsed[2];
  3. static char *ms_compsUsed;

Но как применить не знаю. Просьба пояснить.

Ещё вопрос - как проверить в каком месте кода ошибка, если игра "вылетает"?

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.  
  9. #A,   B,   C,   D,   E,  F, G
  10.  
  11. trailer
  12. 403, 435, 450, 584, 591, 0, 0
  13. 485, 606, 607, 607, 606, 0, 0
  14. 514, 584, 584, 584, 584, 0, 0
  15. 515, 435, 450, 584, 591, 0, 0
  16. 525, 400, 401, 402, 404, 0, 0
  17. end

Код: 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.                 ; // здесь надо считать установленные экстры с vehicle
  71.                   // vehicle->m_anExtras[0]
  72.                   // vehicle->m_anExtras[1]
  73.                   // и на модель прицепа modelTrailer установить такие же экстры
  74.             }
  75.             CVehicle *trailer = nullptr;
  76.             if (CModelInfo::IsVehicleModelType(modelTrailer) == 11)
  77.                 trailer = new CTrailer(modelTrailer, 1);
  78.             else                    
  79.                 trailer = new CAutomobile(modelTrailer, 1, true);
  80.             if (trailer) {
  81.                 trailer->SetPosn(0.0f, 0.0f, 0.0f);
  82.                 trailer->m_nStatus = 4;
  83.                 CWorld::Add(trailer);
  84.                 trailer->SetTowLink(vehicle, true);
  85.                 CTheScripts::ClearSpaceForMissionEntity(trailer->GetPosition(), trailer);
  86.                 if (colour) {
  87.                     trailer->m_nPrimaryColor = vehicle->m_nPrimaryColor;
  88.                     trailer->m_nSecondaryColor = vehicle->m_nSecondaryColor;
  89.                     trailer->m_nTertiaryColor = vehicle->m_nTertiaryColor;
  90.                     trailer->m_nQuaternaryColor = vehicle->m_nQuaternaryColor;
  91.                 }
  92.                 if (CModelInfo::IsVehicleModelType(modelTrailer) == 11) {
  93.                     trailer->m_nFlags.bEngineOn = 1;
  94.                     trailer->m_nFlags.bIsLocked = 1;
  95.                 }
  96.                 else {
  97.                     trailer->m_nFlags.bEngineOn = 0;
  98.                     trailer->m_dwDoorLock = CARLOCK_LOCKED;
  99.                 }
  100.                    
  101.             }
  102.         }
  103.     }
  104.    
  105.     MyPlugin() {
  106.         ReadSettingsFile();
  107.         static unsigned int TrailerId;
  108.  
  109.         Events::gameProcessEvent += [] {
  110.             for (int i = 0; i < CPools::ms_pVehiclePool->m_Size; i++) {
  111.                 CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  112.                 if (vehicle) {
  113.                     if (CModelInfo::IsVehicleModelType(vehicle->m_wModelIndex) == 11
  114.                         && vehicle->m_nFlags.bIsLocked == 1 && !vehicle->m_pTractor) {
  115.                         vehicle->m_nFlags.bIsLocked = 0;
  116.                         if (!vehicle->IsVisible())
  117.                             vehicle->CanBeDeleted();
  118.                     }
  119.                     MyData *entryModel = GetDataInfoForModel(vehicle->m_wModelIndex);
  120.                     if (entryModel) {
  121.                         switch (CGeneral::GetRandomNumberInRange(0, 4)) {
  122.                         case 0: TrailerId = entryModel->TrailerIdOne; break;
  123.                         case 1: TrailerId = entryModel->TrailerIdTwo; break;
  124.                         case 2: TrailerId = entryModel->TrailerIdThree; break;
  125.                         case 3: TrailerId = entryModel->TrailerIdFour; break;
  126.                         }
  127.                         ModelInfo &info = modelInfo.Get(vehicle);
  128.                         if (info.enabledTrailer && vehicle->m_pDriver && !vehicle->m_pTrailer
  129.                             && (CModelInfo::IsVehicleModelType(TrailerId) == 11 || CModelInfo::IsVehicleModelType(TrailerId) == 0)) {
  130.                             vehicle->m_nFlags.bMadDriver = 0;
  131.                             SetTrailer(vehicle, TrailerId, entryModel->TrailerColours, entryModel->TrailerExtras);
  132.                         }
  133.                         info.enabledTrailer = false;
  134.                     }
  135.                 }
  136.             }
  137.         };
  138.  
  139.     }
  140. } myPlugin;
  141.  
  142. VehicleExtendedData<MyPlugin::ModelInfo> MyPlugin::modelInfo;

175
Спасибо за пояснения.
Определил все функции, что были объявлены в CVehicleModelInfo.h
и добавил ещё
Код: C++
  1. int GetNumDoors();

Просьба проверить верно ли я понял вышеизложенное
Код: C++
  1. #include "CVehicleModelInfo.h"
  2.  
  3. RwTexture *CVehicleModelInfo::ms_pRemapTexture = (RwTexture *)0xB4E47C;
  4. RwTexture *CVehicleModelInfo::ms_pLightsTexture = (RwTexture *)0xB4E68C;
  5. RwTexture *CVehicleModelInfo::ms_pLightsOnTexture = (RwTexture *)0xB4E690;
  6. unsigned char *CVehicleModelInfo::ms_currentCol = (unsigned char *)0xB4E3F0;
  7. CRGBA *CVehicleModelInfo::ms_vehicleColourTable = (CRGBA *)0xB4E480;
  8.  
  9. void CVehicleModelInfo::ShutdownLightTexture()
  10. {
  11.     ((void(__cdecl *)())0x4C7470)();
  12. }
  13.  
  14. RwTexture * CVehicleModelInfo::FindTextureCB(char const * name)
  15. {
  16.     return ((RwTexture* (__cdecl *)(char const*))0x4C7510)(name);
  17. }
  18.  
  19. void CVehicleModelInfo::UseCommonVehicleTexDicationary()
  20. {
  21.     ((void(__cdecl *)())0x4C75A0)();
  22. }
  23.  
  24. void CVehicleModelInfo::StopUsingCommonVehicleTexDicationary()
  25. {
  26.     ((void(__cdecl *)())0x4C75C0)();
  27. }
  28.  
  29. RpAtomic * CVehicleModelInfo::MoveObjectsCB(RwObject * object, void * data)
  30. {
  31.     return ((RpAtomic* (__cdecl *)(RwObject*, void*))0x4C7700)(object, data);
  32. }
  33.  
  34. RpAtomic * CVehicleModelInfo::HideDamagedAtomicCB(RpAtomic * atomic, void * data)
  35. {
  36.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7720)(atomic, data);
  37. }
  38.  
  39. RpAtomic * CVehicleModelInfo::HideAllComponentsAtomicCB(RpAtomic * atomic, void * data)
  40. {
  41.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7790)(atomic, data);
  42. }
  43.  
  44. RpMaterial * CVehicleModelInfo::HasAlphaMaterialCB(RpMaterial * material, void * data)
  45. {
  46.     return ((RpMaterial* (__cdecl *)(RpMaterial*, void*))0x4C77C0)(material, data);
  47. }
  48.  
  49. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB(RpAtomic * atomic, void * data)
  50. {
  51.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C77E0)(atomic, data);
  52. }
  53.  
  54. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB_RealHeli(RpAtomic * atomic, void * data)
  55. {
  56.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7870)(atomic, data);
  57. }
  58.  
  59. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB_Plane(RpAtomic * atomic, void * data)
  60. {
  61.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7930)(atomic, data);
  62. }
  63.  
  64. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB_Boat(RpAtomic * atomic, void * data)
  65. {
  66.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C79A0)(atomic, data);
  67. }
  68.  
  69. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic * atomic, void * data)
  70. {
  71.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7A30)(atomic, data);
  72. }
  73.  
  74. RpAtomic * CVehicleModelInfo::SetAtomicRendererCB_Train(RpAtomic * atomic, void * data)
  75. {
  76.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C7AA0)(atomic, data);
  77. }
  78.  
  79. void CVehicleModelInfo::SetAtomicRenderCallbacks()
  80. {
  81.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C7B10)(this);
  82. }
  83.  
  84. RwObject * CVehicleModelInfo::SetAtomicFlagCB(RwObject * object, void * data)
  85. {
  86.     return ((RwObject* (__cdecl *)(RwObject*, void*))0x4C7B90)(object, data);
  87. }
  88.  
  89. // Converted from stdcall RwObject* CVehicleModelInfo::ClearAtomicFlagCB(RwObject *object, void *data) 0x4C7BB0
  90. RwObject* CVehicleModelInfo::ClearAtomicFlagCB(RwObject* object, void* data)
  91. {
  92.     return ((RwObject* (__cdecl *)(RwObject*, void*))0x4C7BB0)(object, data);
  93. }
  94.  
  95. // Converted from thiscall void CVehicleModelInfo::SetVehicleComponentFlags(RwFrame *component, unsigned int flags) 0x4C7C10
  96. void CVehicleModelInfo::SetVehicleComponentFlags(RwFrame* component, unsigned int flags)
  97. {
  98.     ((void(__thiscall *)(CVehicleModelInfo*, RwFrame*, unsigned int))0x4C7C10)(this, component, flags);
  99. }
  100.  
  101. // Converted from thiscall void CVehicleModelInfo::GetWheelPosn(int wheel, CVector &outVec, bool local) 0x4C7D20
  102. void CVehicleModelInfo::GetWheelPosn(int wheel, CVector& outVec, bool local)
  103. {
  104.     ((void(__thiscall *)(CVehicleModelInfo*, CVector&, bool))0x4C7D20)(this, outVec, local);
  105. }
  106.  
  107. // Converted from thiscall bool CVehicleModelInfo::GetOriginalCompPosition(CVector &outVec, int component) 0x4C7DD0
  108. bool CVehicleModelInfo::GetOriginalCompPosition(CVector& outVec, int component)
  109. {
  110.     return ((bool(__thiscall *)(CVehicleModelInfo*, CVector&, int))0x4C7DD0)(this, outVec, component);
  111. }
  112.  
  113. // Converted from thiscall int CVehicleModelInfo::ChooseComponent(void) 0x4C8040
  114. int CVehicleModelInfo::ChooseComponent()
  115. {
  116.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C8040)(this);
  117. }
  118.  
  119. // Converted from thiscall int CVehicleModelInfo::ChooseSecondComponent(void) 0x4C8120
  120. int CVehicleModelInfo::ChooseSecondComponent()
  121. {
  122.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C8120)(this);
  123. }
  124.  
  125. // Converted from thiscall bool CVehicleModelInfo::IsUpgradeAvailable(VehicleUpgradePosn upgrade) 0x4C8200
  126. bool CVehicleModelInfo::IsUpgradeAvailable(VehicleUpgradePosn upgrade)
  127. {
  128.     return ((bool(__thiscall *)(CVehicleModelInfo*, VehicleUpgradePosn))0x4C8200)(this, upgrade);
  129. }
  130.  
  131. RpMaterial * CVehicleModelInfo::SetEditableMaterialsCB(RpMaterial * material, void * data)
  132. {
  133.     return ((RpMaterial* (__cdecl *)(RpMaterial*, void*))0x4C8220)(material, data);
  134. }
  135.  
  136. RpAtomic * CVehicleModelInfo::SetEditableMaterialsCB(RpAtomic * atomic, void * data)
  137. {
  138.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C83E0)(atomic, data);
  139. }
  140.  
  141. // Converted from stdcall void CVehicleModelInfo::SetEditableMaterials(RpClump *clump) 0x4C8430
  142. void CVehicleModelInfo::SetEditableMaterials(RpClump* clump)
  143. {
  144.     ((void(__cdecl *)(RpClump*))0x4C8430)(clump);
  145. }
  146.  
  147. // Converted from stdcall void CVehicleModelInfo::ResetEditableMaterials(RpClump *clump) 0x4C8460
  148. void CVehicleModelInfo::ResetEditableMaterials(RpClump* clump)
  149. {
  150.     ((void(__cdecl *)(RpClump*))0x4C8460)(clump);
  151. }
  152.  
  153. // Converted from thiscall void CVehicleModelInfo::SetVehicleColour(unsigned char prim, unsigned char sec, unsigned char tert, unsigned char quat) 0x4C84B0
  154. void CVehicleModelInfo::SetVehicleColour(unsigned char prim, unsigned char sec, unsigned char tert, unsigned char quat)
  155. {
  156.     ((void(__thiscall *)(CVehicleModelInfo*, unsigned char, unsigned char, unsigned char, unsigned char))0x4C84B0)(this, prim, sec, tert, quat);
  157. }
  158.  
  159. // Converted from thiscall void CVehicleModelInfo::ChooseVehicleColour(unsigned char &prim, unsigned char &sec, unsigned char &tert, unsigned char &quat, int variationShift) 0x4C8500
  160. void CVehicleModelInfo::ChooseVehicleColour(unsigned char& prim, unsigned char& sec, unsigned char& tert, unsigned char& quat, int variationShift)
  161. {
  162.     ((void(__thiscall *)(CVehicleModelInfo*, unsigned char&, unsigned char&, unsigned char&, unsigned char&, int))0x4C8500)(this, prim, sec, tert, quat, variationShift);
  163. }
  164.  
  165. // Converted from thiscall int CVehicleModelInfo::GetNumRemaps(void) 0x4C86B0
  166. int CVehicleModelInfo::GetNumRemaps()
  167. {
  168.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C86B0)(this);
  169. }
  170.  
  171. // Converted from thiscall void CVehicleModelInfo::AddRemap(int txd) 0x4C86D0
  172. void CVehicleModelInfo::AddRemap(int txd)
  173. {
  174.     ((void(__thiscall *)(CVehicleModelInfo*, int))0x4C86D0)(this, txd);
  175. }
  176.  
  177. // Converted from stdcall void CVehicleModelInfo::AddWheelUpgrade(int wheelSetNumber, int modelId) 0x4C8700
  178. void CVehicleModelInfo::AddWheelUpgrade(int wheelSetNumber, int modelId)
  179. {
  180.     ((void(__cdecl *)(int, int))0x4C8700)(wheelSetNumber, modelId);
  181. }
  182.  
  183. int CVehicleModelInfo::GetNumWheelUpgrades(int wheelSetNumber)
  184. {
  185.     return ((int(__cdecl *)(int))0x4C8740)(wheelSetNumber);
  186. }
  187.  
  188. void CVehicleModelInfo::GetWheelUpgrade(int wheelSetNumber, int wheelUpgradeNumber)
  189. {
  190.     ((void(__cdecl *)(int, int))0x4C8750)(wheelSetNumber, wheelUpgradeNumber);
  191. }
  192.  
  193. void CVehicleModelInfo::DeleteVehicleColourTextures()
  194. {
  195.     ((void(__cdecl *)())0x4C8770)();
  196. }
  197.  
  198. void CVehicleModelInfo::LoadEnvironmentMaps()
  199. {
  200.     ((void(__cdecl *)())0x4C8780)();
  201. }
  202.  
  203. void CVehicleModelInfo::ShutdownEnvironmentMaps()
  204. {
  205.     ((void(__cdecl *)())0x4C87D0)();
  206. }
  207.  
  208. RpMaterial* CVehicleModelInfo::GetMatFXEffectMaterialCB(RpMaterial* material, void* data)
  209. {
  210.     return ((RpMaterial* (__cdecl *)(RpMaterial*, void*))0x4C8810)(material, data);
  211. }
  212.  
  213. RpMaterial* CVehicleModelInfo::SetEnvironmentMapCB(RpMaterial* material, void* data)
  214. {
  215.     return ((RpMaterial* (__cdecl *)(RpMaterial*, void*))0x4C8840)(material, data);
  216. }
  217.  
  218. RpMaterial* CVehicleModelInfo::SetEnvMapCoeffCB(RpMaterial* material, void* data)
  219. {
  220.     return ((RpMaterial* (__cdecl *)(RpMaterial*, void*))0x4C88B0)(material, data);
  221. }
  222.  
  223. RpAtomic* CVehicleModelInfo::SetRenderPipelinesCB(RpAtomic* atomic, void* data)
  224. {
  225.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C88F4)(atomic, data);
  226. }
  227.  
  228. void CVehicleModelInfo::SetRenderPipelines()
  229. {
  230.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C8900)(this);
  231. }
  232.  
  233. char* CVehicleModelInfo::GetCustomCarPlateText()
  234. {
  235.     return ((char*(__thiscall *)(CVehicleModelInfo*))0x4C8970)(this);
  236. }
  237.  
  238. void CVehicleModelInfo::SetCustomCarPlateText(char* text)
  239. {
  240.     ((void(__thiscall *)(CVehicleModelInfo*, char*))0x4C8980)(this, text);
  241. }
  242.  
  243. int CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int modelId)
  244. {
  245.     return ((int(__cdecl *)(int))0x4C89B0)(modelId);
  246. }
  247.  
  248. void CVehicleModelInfo::ReduceMaterialsInVehicle()
  249. {
  250.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C8BD0)(this);
  251. }
  252.  
  253. void CVehicleModelInfo::SetupLightFlags(CVehicle* vehicle)
  254. {
  255.     ((void(__thiscall *)(CVehicleModelInfo*, CVehicle*))0x4C8C90)(this, vehicle);
  256. }
  257.  
  258. RwFrame* CVehicleModelInfo::CollapseFramesCB(RwFrame* frame, void* data)
  259. {
  260.     return ((RwFrame* (__cdecl *)(RwFrame*, void*))0x4C8E30)(frame, data);
  261. }
  262.  
  263. void CVehicleModelInfo::PreprocessHierarchy()
  264. {
  265.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C8E60)(this);
  266. }
  267.  
  268. RpAtomic* CVehicleModelInfo::SetEnvironmentMapAtomicCB(RpAtomic* atomic, void* data)
  269. {
  270.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C9410)(atomic, data);
  271. }
  272.  
  273. RpAtomic * CVehicleModelInfo::SetEnvMapCoeffAtomicCB(RpAtomic * atomic, void * data)
  274. {
  275.     return ((RpAtomic* (__cdecl *)(RpAtomic*, void*))0x4C9430)(atomic, data);
  276. }
  277.  
  278. void CVehicleModelInfo::SetCarCustomPlate()
  279. {
  280.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C9450)(this);
  281. }
  282.  
  283. void CVehicleModelInfo::DisableEnvMap()
  284. {
  285.     ((void(__thiscall *)(CVehicleModelInfo*))0x4C97E0)(this);
  286. }
  287.  
  288. void CVehicleModelInfo::SetEnvMapCoeff(float coeff)
  289. {
  290.     ((void(__thiscall *)(CVehicleModelInfo*, float))0x4C9800)(this, coeff);
  291. }
  292.  
  293. int CVehicleModelInfo::GetNumDoors()
  294. {
  295.     return ((int(__thiscall *)(CVehicleModelInfo*))0x4C73C0)(this);
  296. }

176
Я все обьявления и определения (методов класса) генерировал автоматом.
Могу и тебе эту программу подогнать  :)
Было бы хорошо.  :)


UPD:
В CVehicleModelInfo.h некоторые функции объявлены как статические, например
Код: C++
  1. static void AddWheelUpgrade(int wheelSetNumber, int modelId);

при попытке определить такую функцию так
Код: C++
  1. // Converted from stdcall void CVehicleModelInfo::AddWheelUpgrade(int wheelSetNumber, int modelId) 0x4C8700
  2. void CVehicleModelInfo::AddWheelUpgrade(int wheelSetNumber, int modelId)
  3. {
  4.     ((void(__cdecl *)(CVehicleModelInfo*, int, int))0x4C8700)(this, wheelSetNumber, modelId);
  5. }

выходит "оператор this можно использовать только внутри не статической функции-члена"
Убрать static или как определять эту функцию?

И ещё просьба пояснить момент с определением __cdecl или __thiscall
IDA верно определяет этот момент или не всегда? Как самому в этом разобраться?

177
Если я правильно понял, то тогда для VC, например, будет так:

// CVehicle.h
Код: C++
  1. // component index in m_apModelNodes array
  2. void GetComponentWorldPosition(int componentId, CVector& posnOut);

// CVehicle.cpp
Код: C++
  1. // Converted from void CVehicle::GetComponentWorldPosition(int componentId,CVector &posnOut) 0x69CA40
  2. void CVehicle::GetComponentWorldPosition(int componentId, CVector& posnOut)
  3. {
  4.     ((void (__thiscall *)(CVehicle*, int, CVector&))(*(void ***)this)[19])(this, componentId, posnOut);
  5. }

178
Это вызов метода из таблицы виртуальных методов (virtual table, "vtable").

А так можно записать?
Код: C++
  1. // Converted from float CVehicle::GetDooorAngleOpenRatio(uint door) 0x871EF4
  2. float CVehicle::GetDooorAngleOpenRatio(unsigned int door)
  3. {
  4.     return ((float (__thiscall *)(CVehicle*, unsigned int))0x871EF4)(this, door);
  5. }


179
Спасибо.
1) Добавил в sdk пример установки винила на транспорт https://github.com/DK22Pac/plugin-sdk/tree/master/examples/SA_VehicleRemap.

2) Хотел для VC разобрать некоторые аналогичные SA функции, но есть вопрос. В CVehicle.cpp в некоторых функциях вместо адреса exe стоит число в квадратных скобках. Здесь, например, [29]:
Код: C++
  1. // Converted from float CVehicle::GetDooorAngleOpenRatio(uint door) 0x871EF4
  2. float CVehicle::GetDooorAngleOpenRatio(unsigned int door)
  3. {
  4.    return ((float (__thiscall *)(CVehicle*, unsigned int))(*(void ***)this)[29])(this, door);
  5. }

Просьба пояснить этот момент. 

180
Идеи / Re: Vice City Normal Maps
« : Сентябрь 28, 2016, 05:09:12 pm »
Это теперь к Кенкингу будет правильней акцентировать..
Я кое-чему научился уже, благодаря помощи DK, но с таким вопросом ко мне обращаться ещё рано. Это всё же к DK.  :)

Страницы: 1 ... 10 11 [12] 13 14 ... 16