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

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


Сообщения - kenking

Страницы: [1] 2 3 ... 10
1
Решил заменить для GTA3 функцию ChooseComponent на функцию аналогичную для SA, поскольку для GTA3 эта функция в укороченном варианте. С заменой функций на свои до сих пор не совсем разобрался. Написал такой код:
Код: C++
  1. #include "plugin.h"
  2.  
  3. using namespace plugin;
  4.  
  5. int randomId, v2, v4, result;
  6.  
  7. class NewChooseComponent {
  8. public:
  9.     static int __cdecl CountCompsInRule(signed int compRulesBits) {
  10.         return plugin::CallAndReturn<int, 0x520990, signed int>(compRulesBits);
  11.     }
  12.    
  13.     static unsigned int __cdecl GetRandomNumberInRange(int min, int max) {
  14.         return plugin::CallAndReturn<unsigned int, 0x54A4C0, int, int>(min, max);
  15.     }
  16.  
  17.     static int Choose(int type, signed int compRulesBits) {
  18.         switch (type) {
  19.         case 1:
  20.         case 2:
  21.             v2 = CountCompsInRule(compRulesBits);
  22.             result = (compRulesBits >> 4 * GetRandomNumberInRange(0, v2)) & 0xF;
  23.             break;
  24.         case 3:
  25.             v4 = CountCompsInRule(compRulesBits);
  26.             randomId = GetRandomNumberInRange(-1, v4);
  27.             if (randomId == -1) {
  28.                 result = -1;
  29.                 break;
  30.             }
  31.             result = (compRulesBits >> 4 * randomId) & 0xF;
  32.             break;
  33.         case 4:
  34.             result = GetRandomNumberInRange(0, 6);
  35.             break;
  36.         default:
  37.             result = -1;
  38.             break;
  39.         }
  40.         return result;
  41.     }
  42.  
  43.     NewChooseComponent() {
  44.         patch::RedirectJump(0x5209C0, Choose);
  45.     };
  46. } NewChooseComponents;
  47.  

Поскольку в sdk не добавлена функция CountCompsInRule и зачем-то убрали, добавленные ранее, функции
Код: C++
  1. // returns random float in range [min;max)
  2. static float GetRandomNumberInRange(float min, float max);
  3. // returns random int in range [min;max)
  4. static unsigned int GetRandomNumberInRange(int min, int max);
  5. // returns random int in range 0-32767
  6. static unsigned int GetRandomNumber();

попробовал добавить нужные функции непосредственно в код плагина. Не уверен, что сделал это верно. Просьба подсказать, хотя при сборке плагина показывается ошибка в другом месте:
Цитировать
1>------ Перестроение всех файлов начато: проект: III_NewChooseComponent, Конфигурация: GTA3 Release Win32 ------
1>D:\Programs\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\CL.exe /c /I"D:\Projects\plugin-sdk\plugin_iii\\" /I"D:\Projects\plugin-sdk\plugin_iii\game_iii\\" /I"D:\Projects\plugin-sdk\shared\\" /Zi /nologo /W3 /WX- /diagnostics:classic /sdl /O2 /Oi /Oy- /GL /D _NDEBUG /D _USING_V110_SDK71_ /D _CRT_SECURE_NO_WARNINGS /D _CRT_NON_CONFORMING_SWPRINTFS /D GTA3 /D "GTAGAME_NAME=\"3\"" /D "GTAGAME_ABBR=\"3\"" /D "GTAGAME_ABBRLOW=\"3\"" /D "GTAGAME_PROTAGONISTNAME=\"Claude\"" /D "GTAGAME_CITYNAME=\"Liberty City\"" /D PLUGIN_SGV_10EN /D _USING_V110_SDK71_ /D _WINDLL /D _MBCS /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++latest /Fo"D:\Projects\GTA-Projects\III_NewChooseComponent\.obj\GTA3\Release\\" /Fd"D:\Projects\GTA-Projects\III_NewChooseComponent\.obj\GTA3\Release\vc141.pdb" /Gd /TP /analyze- /errorReport:prompt /Zc:threadSafeInit- III_NewChooseComponent.cpp
1>III_NewChooseComponent.cpp
1>D:\Programs\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\link.exe /ERRORREPORT:PROMPT /OUT:"D:\Games\Grand Theft Auto III\scripts\III_NewChooseComponent.III.asi" /NOLOGO /LIBPATH:"D:\Projects\plugin-sdk\output\lib\\" plugin_iii.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /PDB:"D:\Games\Grand Theft Auto III\scripts\III_NewChooseComponent.III.pdb" /SUBSYSTEM:WINDOWS,"5.01" /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:\Games\Grand Theft Auto III\scripts\III_NewChooseComponent.III.lib" /MACHINE:X86 /SAFESEH /DLL "D:\Projects\GTA-Projects\III_NewChooseComponent\.obj\GTA3\Release\III_NewChooseComponent.obj"
1>III_NewChooseComponent.obj : error LNK2001: неразрешенный внешний символ ""public: static void __cdecl plugin::patch::RedirectJump(int,void *,bool)" (?RedirectJump@patch@plugin@@SAXHPAX_N@Z)"
1>D:\Games\Grand Theft Auto III\scripts\III_NewChooseComponent.III.asi : fatal error LNK1120: неразрешенных внешних элементов: 1
1>Сборка проекта "III_NewChooseComponent.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========


Что не так с RedirectJump? Делал по примеру SpawnTruckCheat в посте № 55 этой темы. Просьба подсказать в чём ошибка.

2
Скриптинг / Re: Прицепить звук к объекту.
« : Июль 13, 2018, 10:30:14 am »
По дыму - посмотри этот скрипт https://gta.com.ua/file_details.phtml?id=2821, может пригодится.

3
Общие вопросы / Re: Помощь с CLEO
« : Май 18, 2018, 09:44:25 am »
Смещение 0x1F0 - это m_fGasPedal значение float https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_vc/game_vc/CVehicle.h
показывает нажата ли педаль газа на транспорте. Перезаписью этого значения не заставишь двигаться транспорт.

4
Программирование / Re: Vice City Plugin SDK
« : Март 11, 2018, 11:47:31 am »
Сегодня обновился. Удалил полностью старый sdk, клонировал заново, удалил старые шаблоны, "почистил" студию от старых шаблонов. Сгенерировал проект. Собрал плагины.
Теперь VALIDATE_SIZE не работает?
В новых коммитах зачем-то удалены выравнивания структур. Например, для GTA3 возьмём класс CBulletInfo. Было:
Код: C++
  1. #pragma pack(push, 4)
  2. class CBulletInfo {
  3. public:
  4.     eWeaponType  m_nWeaponType;
  5.     CEntity     *m_pCreator;
  6.     unsigned int m_nDestroyTime;
  7.     bool         m_bExists;
  8.     CVector      m_vecPosition;
  9.     CVector      m_vecVelocity;
  10.     short        m_nDamage;
  11. };
  12. #pragma pack(pop)
  13. VALIDATE_SIZE(CBulletInfo, 0x2C);

Стало:
Код: C++
  1. class CBulletInfo {
  2. public:
  3.     eWeaponType  m_nWeaponType;
  4.     CEntity     *m_pCreator;
  5.     unsigned int m_nDestroyTime;
  6.     bool         m_bExists;
  7.     CVector      m_vecPosition;
  8.     CVector      m_vecVelocity;
  9.     short        m_nDamage;
  10. };
  11. VALIDATE_SIZE(CBulletInfo, 0x2C);

И при этом нет ошибки в размере класса!  :o Это как понимать?

5
С наступающим Новым Годом! Всем всего хорошего!

6
 :D Переделал код спаунера транспорта для GTA3 (без аудио)
Код: C++
  1. #include <string>
  2. #include "plugin_III.h"
  3. #include "extensions\KeyCheck.h"
  4. #include "game_III\common.h"
  5. #include "game_III\CModelInfo.h"
  6. #include "game_III\CTimer.h"
  7. #include "game_III\CFont.h"
  8. #include "game_III\CSprite2d.h"
  9. #include "game_III\CStreaming.h"
  10. #include "game_III\CBoat.h"
  11. #include "game_III\CWorld.h"
  12. #include "game_III\CTheScripts.h"
  13. #include "game_III\eVehicleModel.h"
  14.  
  15. using namespace plugin;
  16.  
  17. class MoreVehiclesSpawner {
  18. public:
  19.     static std::string typedBuffer;
  20.     static std::string errorMessage;
  21.     static std::string errorMessageBuffer;
  22.     static unsigned int errorMessageTimer;
  23.     static bool enabled;
  24.  
  25.     static CVehicle *SpawnVehicle(unsigned int modelIndex, CVector position, float orientation) {
  26.         unsigned char oldFlags = CStreaming::ms_aInfoForModel[modelIndex].m_nFlags;
  27.         CStreaming::RequestModel(modelIndex, GAME_REQUIRED);
  28.         CStreaming::LoadAllRequestedModels(false);
  29.         if (CStreaming::ms_aInfoForModel[modelIndex].m_nLoadState == LOADSTATE_LOADED) {
  30.             if (!(oldFlags & GAME_REQUIRED)) {
  31.                 CStreaming::SetModelIsDeletable(modelIndex);
  32.                 CStreaming::SetModelTxdIsDeletable(modelIndex);
  33.             }
  34.             CVehicle *vehicle = nullptr;
  35.             switch (reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[modelIndex])->m_nVehicleType) {
  36.             case VEHICLE_BOAT:
  37.                 vehicle = new CBoat(modelIndex, 1);
  38.                 break;
  39.             default:
  40.                 vehicle = new CAutomobile(modelIndex, 1);
  41.                 break;
  42.             }
  43.             if (vehicle) {
  44.                 // Размещаем транспорт в игровом мире
  45.                 vehicle->SetPosition(position);
  46.                 vehicle->SetOrientation(0.0f, 0.0f, orientation);
  47.                 vehicle->m_nState = 4;
  48.                 if (modelIndex == MODEL_RCBANDIT)
  49.                     vehicle->m_nDoorLock = CARLOCK_LOCKED;
  50.                 else
  51.                     vehicle->m_nDoorLock = CARLOCK_UNLOCKED;
  52.                 CWorld::Add(vehicle);
  53.                 CTheScripts::ClearSpaceForMissionEntity(position, vehicle);
  54.                 if (vehicle->m_nVehicleClass != VEHICLE_BOAT)
  55.                     reinterpret_cast<CAutomobile *>(vehicle)->PlaceOnRoadProperly();
  56.                 return vehicle;
  57.             }
  58.         }
  59.         return nullptr;
  60.     }
  61.  
  62.     static void Update() {
  63.         KeyCheck::Update(); // апдейтим состояния клавиш
  64.         if (FindPlayerPed()) {
  65.             if (KeyCheck::CheckJustDown(VK_TAB)) { // Если нажата Tab - включаем или выключаем консоль
  66.                 enabled = !enabled;
  67.                 typedBuffer.clear();
  68.                 errorMessageBuffer.clear();
  69.             }
  70.             if (enabled) {
  71.                 errorMessage.clear();
  72.                 if (KeyCheck::CheckWithDelay(VK_BACK, 200)) { // Если нажат Backspace - убираем последний символ в строке
  73.                     if (typedBuffer.size() > 0) {
  74.                         typedBuffer.pop_back();
  75.                     }
  76.                 }
  77.                 else {
  78.                     for (int i = 0; i <= 9; i++) {
  79.                         if (KeyCheck::CheckWithDelay(i + 48, 200)) {
  80.                             if (typedBuffer.size() == 4)
  81.                                 errorMessage = "Too many digits!";
  82.                             else {
  83.                                 typedBuffer.push_back(i + 48); // Добавляем символ в конец строки
  84.                             }
  85.                             break;
  86.                         }
  87.                     }
  88.                 }
  89.                 if (KeyCheck::CheckJustDown(45)) { // Если нажата Insert - спавним транспорт
  90.                     if (typedBuffer.size() > 0) {
  91.                         unsigned int modelId = std::stoi(typedBuffer);
  92.                         if (modelId < 5501) {
  93.                             int modelType = CModelInfo::IsVehicleModelType(modelId);
  94.                             if (modelType != -1) {
  95.                                 if (modelType == 0 || modelType == 1) {
  96.                                     CVehicle *vehicle = SpawnVehicle(modelId, FindPlayerPed()->TransformFromObjectSpace(CVector(0.0f, 5.0f, 0.0f)), FindPlayerPed()->m_fRotationCur + 1.5707964f);
  97.                                     errorMessageBuffer.clear(); // убираем надпись об ошибке (если она была на экране)
  98.                                 }
  99.                                 else
  100.                                     errorMessage = "Can't spawn a train, heli and plane model";
  101.                             }
  102.                             else
  103.                                 errorMessage = "This model is not a vehicle!";
  104.                         }
  105.                         else
  106.                             errorMessage = "ID is too big!";
  107.                     }
  108.                     else
  109.                         errorMessage = "Please enter model Id!";
  110.                 }
  111.             }
  112.         }
  113.         else
  114.             enabled = false;
  115.     }
  116.  
  117.     static void Render() {
  118.         if (enabled) {
  119.             CSprite2d::DrawRect(CRect(100.0f, 100.0f, 470.0f, 200.0f), CRGBA(0, 0, 0, 100));
  120.             CSprite2d::DrawRect(CRect(250.0f, 140.0f, 320.0f, 142.0f), CRGBA(255, 255, 255, 255));
  121.            
  122.             CFont::SetScale(0.8f, 1.9f);
  123.             CFont::SetColor(CRGBA(255, 255, 255, 255));
  124.             CFont::SetJustifyOn();
  125.             CFont::SetFontStyle(0);
  126.             CFont::SetPropOn();
  127.             CFont::SetWrapx(600.0f);
  128.             CFont::PrintString(105.0f, 105.0f, "Model ID:");
  129.             if (typedBuffer.size() > 0)
  130.                 CFont::PrintString(250.0f, 105.0f, const_cast<char*>(typedBuffer.c_str()));
  131.             if (errorMessage.size() > 0) {
  132.                 errorMessageBuffer = errorMessage;
  133.                 errorMessageTimer = CTimer::m_snTimeInMilliseconds;
  134.             }
  135.             if (errorMessageBuffer.size() > 0 && CTimer::m_snTimeInMilliseconds < (errorMessageTimer + 2000)) {
  136.                 CFont::SetColor(CRGBA(255, 0, 0, 255));
  137.                 CFont::PrintString(105.0f, 150.0f, const_cast<char*>(errorMessageBuffer.c_str()));
  138.             }
  139.         }
  140.     }
  141.  
  142.     MoreVehiclesSpawner() {
  143.         Events::gameProcessEvent += Update;
  144.         Events::drawingEvent += Render;
  145.     };
  146. } moreVehiclesSpawner;
  147.  
  148. std::string MoreVehiclesSpawner::typedBuffer;
  149. std::string MoreVehiclesSpawner::errorMessage;
  150. std::string MoreVehiclesSpawner::errorMessageBuffer;
  151. unsigned int MoreVehiclesSpawner::errorMessageTimer = 0;
  152. bool MoreVehiclesSpawner::enabled = false;
  153.  

7
 ;) Нашёл причину - в sdk я добавил CStreaming::ms_aInfoForModel с неправильным начальным адресом. Исправил.
И ещё обязательно
Код: C++
  1. vehicle->m_nState = 4;
иначе после создания авто сразу исчезает.

8
Решил перенести пример создания транспорта для SA на GTA III, но транспорт не создаётся. Выяснил, что модель не загружается, причём с любым выставленным флагом. Подскажите пожалуйста, что не так? Код:
Код: C++
  1. #include "plugin_III.h"
  2. #include "game_III\common.h"
  3. #include "game_III\CStreaming.h"
  4. #include "game_III\CModelInfo.h"
  5. #include "game_III\CBoat.h"
  6. #include "game_III\CWorld.h"
  7. #include "game_III\CTheScripts.h"
  8. #include "game_III\CTimer.h"
  9. #include "game_III\CMessages.h"
  10.  
  11. using namespace plugin;
  12.  
  13. class CreateCarExample {
  14. public:
  15.     static unsigned int m_nLastSpawnedTime;
  16.  
  17.     static void SetPosition(CVehicle * vehicle, CVector &pos) {
  18.         vehicle->m_matrix.pos = pos;
  19.     }
  20.  
  21.     static void SetOrientation(CVehicle * vehicle, float x, float y, float z) {
  22.         CVector pos = vehicle->m_matrix.pos;
  23.         vehicle->m_matrix.SetRotate(x, y, z);
  24.         vehicle->m_matrix.pos = pos;
  25.     }
  26.  
  27.     static CVehicle *SpawnVehicle(unsigned int modelIndex, CVector position, float orientation) {
  28.         unsigned char oldFlags = CStreaming::ms_aInfoForModel[modelIndex].m_nFlags;
  29.         CStreaming::RequestModel(modelIndex, GAME_REQUIRED);
  30.         CStreaming::LoadAllRequestedModels(false);
  31.         if (CStreaming::ms_aInfoForModel[modelIndex].m_nLoadState == LOADSTATE_LOADED) {
  32.             CMessages::AddMessageJumpQ(L"model loaded", 1000, 0);
  33.             if (!(oldFlags & GAME_REQUIRED)) {
  34.                 CStreaming::SetModelIsDeletable(modelIndex);
  35.                 CStreaming::SetModelTxdIsDeletable(modelIndex);
  36.             }
  37.             CVehicle *vehicle = nullptr;
  38.             switch (reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[modelIndex])->m_nVehicleType) {
  39.             case VEHICLE_BOAT:
  40.                 vehicle = new CBoat(modelIndex, 1);
  41.                 break;
  42.             default:
  43.                 vehicle = new CAutomobile(modelIndex, 1);
  44.                 break;
  45.             }
  46.             if (vehicle) {
  47.                 SetPosition(vehicle, position);
  48.                 SetOrientation(vehicle, 0.0f, 0.0f, orientation);
  49.                 vehicle->m_nDoorLock = CARLOCK_UNLOCKED;
  50.                 CWorld::Add(vehicle);
  51.                 CTheScripts::ClearSpaceForMissionEntity(position, vehicle);
  52.                 if (vehicle->m_nVehicleClass != VEHICLE_BOAT)
  53.                     reinterpret_cast<CAutomobile *>(vehicle)->PlaceOnRoadProperly();
  54.                 return vehicle;
  55.             }
  56.         }
  57.         return nullptr;
  58.     }
  59.  
  60.     static void ProcessSpawn() {
  61.         if (KeyPressed(VK_TAB) && CTimer::m_snTimeInMilliseconds > (m_nLastSpawnedTime + 1000)) {
  62.             CPed *player = FindPlayerPed();
  63.             if (player) {
  64.                 //CVector position = FindPlayerPed()->TransformFromObjectSpace(CVector(0.0f, 5.0f, 0.0f));
  65.                 CVector offset = { 0.0f, 5.0f, 0.0f };
  66.                 CVector position = player->m_matrix * offset;
  67.                 CAutomobile *automobile = reinterpret_cast<CAutomobile *>(SpawnVehicle(91, position, FindPlayerPed()->m_fRotationCur + 1.5707964f));
  68.                 if (automobile) {
  69.                     m_nLastSpawnedTime = CTimer::m_snTimeInMilliseconds;
  70.                     CMessages::AddMessageJumpQ(L"vehicle create", 1000, 0);
  71.                 }
  72.             }
  73.         }
  74.     }
  75.  
  76.     CreateCarExample() {
  77.         Events::gameProcessEvent.Add(ProcessSpawn);
  78.     }
  79. } example;
  80.  
  81. unsigned int CreateCarExample::m_nLastSpawnedTime = 0;
  82.  

9
Вот и я "подтянулся".  ;)

10
Спасибо! Так значение сходится. Странно у меня IDA показывает именно >=
case 0x174u:
      CRunningScript::CollectParameters(a1, (CRunningScript *)(a1 + 16), (unsigned int *)1, v163);
      v115 = (CVehicle *)CPool_CVehicle_CAutomobile_GetAt(CPools::ms_pVehiclePool, ScriptParams);
      v116 = atan2(
               *(float *)&v115->physical.entity.m_placement.matrix.matrix.top.y,
               -*(float *)&v115->physical.entity.m_placement.matrix.matrix.top.x);
      *(float *)&v205 = flt_5EEDE0 * v116 * flt_5EEDE4;
      if ( *(float *)&v205 >= (double)flt_5EEDDC )
        *(float *)&v205 = *(float *)&v205 + flt_5EEDE8;
      if ( *(float *)&v205 > (double)flt_5EEDE8 )
        *(float *)&v205 = *(float *)&v205 - flt_5EEDE8;
      ScriptParams = v205;
      CRunningScript::StoreParameters((CRunningScript *)(v4 + 16), (unsigned int *)1, v169);
      result = 0;
      break;

Если я хочу добавить в sdk функцию, которой нет для GTA3, вот эту
Код: C++
  1. thiscall float CPlaceable::GetHeading(void);

то надо добавить в CPlaceable.h
Код: C++
  1. inline float GetHeading() {
  2.     float angle = atan2(-this->m_matrix.up.x, this->m_matrix.up.y) * 57.295776f;
  3.     if (angle < 0.0f)
  4.         angle += 360.0f;
  5.     if (angle > 360.0f)
  6.         angle -= 360.0f;
  7.     return angle;              
  8. }

Верно?

11
В GTA3 неправильно обьявлен метод
Код: C++
  1. CVehicle* CPools::GetVehicleRef(CVehicle* vehicle)
Он должен возвращать int (хендл).
Упс... там для CObject и CPed по-ходу тоже было неправильно. Исправил. https://github.com/DK22Pac/plugin-sdk/commit/fd30dab12f942bad5cf997244e5e128718858d11
Надеюсь, что теперь правильно.

Надо вызывать так
Код: C++
  1. float angleZ = 0.0f;
  2. ScriptCommand<GET_CAR_HEADING>(CPools::GetVehicleRef(vehicle), &angleZ);
Спасибо. Теперь работает.

Попробовал разобрать этот опкод, но что-то значение получается другое. В чём ошибка?

Код: C++
  1. CVehicle *vehicle = FindPlayerVehicle();
  2. if (vehicle) {
  3.     float ang = atan2(vehicle->m_matrix.up.y, -vehicle->m_matrix.up.x);
  4.     float ang2 = 180.0f * ang * 0.31830987f;
  5.     if (ang2 >= 0.0f)
  6.         ang2 = ang2 + 360.0f;
  7.     if (ang2 > 360.0f)
  8.          ang2 = ang2 - 360.0f;
  9. }

12
Решил опробовать ScriptCommand
Код: C++
  1. Events::processScriptsEvent += [] {
  2.     CVehicle *vehicle = FindPlayerVehicle();
  3.     if (vehicle)
  4.         float angleZ = ScriptCommand<GET_CAR_HEADING>(CPools::GetVehicleRef(vehicle));
  5. };
Но не тут-то было...  :(

Цитировать
1>III_test_sdk.cpp
1>D:\Projects\plugin-sdk\plugin_III\extensions\ScriptCommands.h(60): error C2664: "void plugin::test::ScriptCode::operator <<(unsigned int *)": невозможно преобразовать аргумент 1 из "CVehicle *" в "char"
1>D:\Projects\plugin-sdk\plugin_III\extensions\ScriptCommands.h(60): note: Не существует контекста, в котором такое преобразование возможно
1>D:\Projects\plugin-sdk\plugin_III\extensions\ScriptCommands.h(84): note: см. ссылку на создание экземпляров функции шаблон при компиляции "void plugin::test::ScriptCode::Pack<CVehicle*>(T)"
1>        with
1>        [
1>            T=CVehicle *
1>        ]
1>III_test_sdk.cpp(21): note: см. ссылку на создание экземпляров функции шаблон при компиляции "bool plugin::test::ScriptCommand<plugin::test::GET_CAR_HEADING,CVehicle*>(CVehicle *)"
1>Сборка проекта "III_test.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

Попытка установить угол транспорту окончилась также. Что делаю не так?

13
Спасибо! Теперь нормально.

14
Ещё один "сюрприз" - после добавления в sdk для GTA3 остальных функций CCoronas, в коде плагина выходит следующая ошибка



Как исправить?


15
Как оказалось я сам себя запутал. В клео я сделал для VC. В плагин переносил для GTA3. А в sdk для GTA3 я неверно сделал таблицу виртуальных методов для CEntity. Это исправил. Сейчас метод работает. НО при выходе из игры, игра зависает (если использовать этот метод) и потом выходит ошибка. В VC тоже самое. Причём в VC не всегда. Вроде бы, если другой такой модели в трафике нет при выходе из игры, то всё нормально, иначе зависание. Может это и совпадение.

Код для GTA3
Код: C++
  1. #include "plugin_III.h"
  2. #include "game_III\common.h"
  3. #include "extensions\KeyCheck.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class MyPlugin {
  8. public:
  9.  
  10.     MyPlugin() {
  11.         Events::gameProcessEvent += [] {
  12.             CVehicle *vehicle = FindPlayerVehicle();
  13.             if (vehicle && vehicle->m_nVehicleClass == VEHICLE_AUTOMOBILE) {
  14.                 CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle);
  15.                 KeyCheck::Update();
  16.                 if (KeyCheck::CheckWithDelay(53, 1000))
  17.                     automobile->SetModelIndex(automobile->m_nModelIndex);
  18.             }
  19.         };
  20.     }
  21. } myPlugin;

Страницы: [1] 2 3 ... 10