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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #195 : Ноябрь 24, 2017, 07:05:17 pm »
Спасибо! Так значение сходится. Странно у меня 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. }

Верно?

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #196 : Декабрь 05, 2017, 01:34:44 am »
Наверное да. Но в SA такая функция по-другому выглядит.
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: Написание плагина. Настройка проекта
« Ответ #197 : Декабрь 08, 2017, 04:55:42 pm »
Решил перенести пример создания транспорта для 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.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #198 : Декабрь 30, 2017, 05:02:57 pm »
 ;) Нашёл причину - в sdk я добавил CStreaming::ms_aInfoForModel с неправильным начальным адресом. Исправил.
И ещё обязательно
Код: C++
  1. vehicle->m_nState = 4;
иначе после создания авто сразу исчезает.

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #199 : Декабрь 30, 2017, 07:26:42 pm »
 :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.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #200 : Октябрь 16, 2018, 01:00:23 pm »
Решил заменить для 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 этой темы. Просьба подсказать в чём ошибка.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Написание плагина. Настройка проекта
« Ответ #201 : Октябрь 16, 2018, 02:11:00 pm »
Я нужные функции, которых нет в SDK, добавлял перед "using namespace plugin;" так:

Код: C++
  1. auto    StoreShadowToBeRenderedd = (void(__cdecl *)(unsigned char type, unsigned int texture, CVector* posn, float topX, float topY, float rightX, float rightY, short intensity, unsigned char red, unsigned char green, unsigned char blue, float zDistance, bool drawOnWater, float scale, int realTimeShadow, bool drawOnBuildings))0x56E6C0;
  2.  

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #202 : Октябрь 18, 2018, 11:43:07 am »
Обновил sdk. Пересобрал сам плагин. Подправил немного код своего плагина.
Код: C++
  1. #include "plugin.h"
  2.  
  3. unsigned int nGetRandomNumberInRange(int min, int max) {
  4.     ((unsigned int(__cdecl *)(int, int))0x54A4C0)(min, max);
  5. }
  6.  
  7. int nCountCompsInRule(signed int compRulesBits) {
  8.     ((int(__cdecl *)(signed int))0x520990)(compRulesBits);
  9. }
  10.  
  11. using namespace plugin;
  12.  
  13. int randomId, numberId, result;
  14.  
  15. class NewChooseComponent {
  16. public:
  17.     static int Choose(int type, signed int compRulesBits) {
  18.         switch (type) {
  19.         case 1:
  20.         case 2:
  21.             numberId = nCountCompsInRule(compRulesBits);
  22.             result = (compRulesBits >> 4 * nGetRandomNumberInRange(0, numberId)) & 0xF;
  23.             break;
  24.         case 3:
  25.             numberId = nCountCompsInRule(compRulesBits);
  26.             randomId = nGetRandomNumberInRange(-1, numberId);
  27.             if (randomId == -1) {
  28.                 result = -1;
  29.                 break;
  30.             }
  31.             result = (compRulesBits >> 4 * randomId) & 0xF;
  32.             break;
  33.         case 4:
  34.             result = nGetRandomNumberInRange(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.  

Теперь при сборке выходит другая ошибка:
Цитировать
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>plugin_iii.lib(Patch.obj) : error LNK2001: неразрешенный внешний символ ""int __cdecl plugin::GetGlobalAddress(int)" (?GetGlobalAddress@plugin@@YAHH@Z)"
1>D:\Games\Grand Theft Auto III\scripts\III_NewChooseComponent.III.asi : fatal error LNK1120: неразрешенных внешних элементов: 1
1>Сборка проекта "III_NewChooseComponent.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

UPDATE:
Спасибо DK за подсказку. Ошибка исчезла после обновление проекта. Готовый код плагина здесь https://github.com/kenkingGitHub/GTA-Projects/blob/master/NewChooseComponent/NewChooseComponent.cpp
« Последнее редактирование: Октябрь 18, 2018, 09:30:19 pm от kenking »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #203 : Октябрь 30, 2018, 09:36:21 pm »
Здравствуйте решил попробовать plugin-sdk. Очень крутая вещь, при глубоких знаниях с++, можно творит настоящие чудеса.
  Объясню свой вопрос для GTA San Andreas есть moonloder, на нем писать одно удовольствие, поменял немного в скрипте кое-что, просто перезагрузить скрипт не выходя из игры, такой пустяк экономить очень много  времени. Хотел у вас спросить про плагин который позволяет перегружать другой плагин налету,  не выходя  при этом из игры.  Это ускорит освоения написание плагинов. А то Выходи из игры, потом  снова заходи, потеря времени.

 вот мой первый плагин.

Код: C++
  1.  
  2. #include "plugin_vc.h"
  3. #include "common.h"
  4. #include "CTimer.h"
  5. #include "CStreaming.h"
  6. #include "CHud.h"
  7.  
  8. using namespace plugin;
  9.  
  10. class PlayerWeapon {
  11. public:
  12.     PlayerWeapon() {
  13.         static int keyPressTime = 0;
  14.         Events::gameProcessEvent += [] {
  15.             CPed *playa = FindPlayerPed();
  16.             if (playa && KeyPressed(VK_TAB) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
  17.                 keyPressTime = CTimer::m_snTimeInMilliseconds;
  18.                 CHud::SetHelpMessage("eee", true, false, false);
  19.  
  20.  
  21.             }
  22.         };
  23.     }
  24. } playerWeapon;
  25.  
  26.  

Скажите пожалуйста Будьте так добры, что-то не так всем Ясно понимаю, Почему  имя  оружие и его id. Не подходит для получения оружия.
Если Вас не затруднит, Скажите пожалуйста  какие id  писать?
Код: C++
  1. CStreaming::RequestModel(MODEL_M4, 2);
  2. CStreaming::LoadAllRequestedModels(false);
  3. playa->GiveWeapon(WEAPON_M4, 10, true);
  4. playa->SetCurrentWeapon(WEAPON_M4);
  5. CStreaming::SetModelIsDeletable(MODEL_M4);
  6.  


Исправил тег на cpp
« Последнее редактирование: Октябрь 31, 2018, 09:38:33 pm от Shagg_E »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #204 : Октябрь 31, 2018, 08:58:01 am »
Цитировать
Почему  имя  оружие и его id. Не подходит для получения оружия.
Если Вас не затруднит, Скажите пожалуйста  какие id  писать?
В каком смысле не подходят? Смотри перечисления
Код: C++
  1. eWeaponModel
  2. eWeaponType

Для кода в сообщениях используй [code=cpp

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #205 : Ноябрь 19, 2018, 11:59:15 pm »
Спасибо большое за ваш ответ уважаемый kenking. перечисления в смысле emum именованные константы? Прошу прощения, но разобраться в чём-то новом, бывает в начале очень трудно.  Главное как говорится, чтобы лед тронулся)))).  Сейчас, конечно за мои вопросы по cleo  мне стыдно. Теперь кажется всё Элементарно, чем тогда.

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #206 : Ноябрь 20, 2018, 08:32:33 am »
Цитировать
перечисления в смысле emum именованные константы?
Да, в смысле enum.

Цитировать
Сейчас, конечно за мои вопросы по cleo  мне стыдно. Теперь кажется всё Элементарно, чем тогда.
Лучше спросить и разобраться в вопросе, чем не спросить и дальше не знать ответа.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #207 : Ноябрь 23, 2018, 04:09:34 am »
Здравствуйте всем. Немного подтянул свои знания по c++. Приступил  к написанию  простого плагина  по выводу сообщение оно выводится, но хотел бы у вас спросить, как сделать чтобы оно какое-то время оставалось на экране,  а ни сразу исчезало?
Код: C++
  1. #include "plugin_vc.h"
  2. #include "common.h"
  3. #include "CTimer.h"
  4. #include "CStreaming.h"
  5. #include "CHud.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class msg {
  10. public:
  11.         msg() {
  12.                 static int keyPressTime = 0;
  13.                 Events::gameProcessEvent += [] {
  14.                         CPed *playa = FindPlayerPed();
  15.                         if (playa && KeyPressed(VK_TAB) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
  16.                                 keyPressTime = CTimer::m_snTimeInMilliseconds;
  17.                                 CHud::SetMessage("kj");
  18.                         }
  19.                 };
  20.         }
  21. } msg;
  22.  
« Последнее редактирование: Ноябрь 23, 2018, 04:39:06 am от egor230 »

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #208 : Ноябрь 23, 2018, 12:26:38 pm »
Код: C++
  1. #include "CMessages.h"
  2. CMessages::AddMessageJumpQ(L"kj", 5000, 0);

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Написание плагина. Настройка проекта
« Ответ #209 : Ноябрь 23, 2018, 07:57:18 pm »
Спасибо большое за ваш ответ уважаемый kenking.  Сообщения выводиться на экран  так CMessages::AddMessageJumpQ( "kj", 1000, 0);  после обновления.  Использую enum,  с ним  удобнее.
Код: C++
  1. if (playa && KeyPressed(key::M) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
  2. keyPressTime = CTimer::m_snTimeInMilliseconds;
  3. CMessages::AddMessageJumpQ( "model loaded", 1000, 0);
  4.  
Хотел у вас спросить как можно получить координаты игрока? Конечно  этот вопрос для Вас кажется банальным.  Просто я не нашел подробную документацию о sdk plugun.  Старался сам найти, но увы.  Хочется освоить  эту  крутую вещь, вижу ее огромный потенциал.

Хотел вывести координаты игрока на экран не получается, помогите, пожалуйста, советом.

Код: C++
  1. #include "plugin_vc.h"
  2. #include "common.h"
  3. #include "CTimer.h"
  4. #include "CStreaming.h"
  5. #include "CHud.h"
  6. #include "CMessages.h"
  7. using namespace plugin;
  8. enum key {
  9.         F1 = 112, F2 = 113, F3 = 114, F4 = 115,
  10.         F5 = 116, F6 = 117, F7 = 118, F8 = 119, F9 = 120, F10 = 121,
  11.         F11 = 122, F12 = 123, NUM_LOCK = 144, SCROLL_LOCK = 145,
  12.         SEMI_COLON = 186, EQUAL_SIGN = 187, COMMA = 188, DASH = 189,
  13.         PERIOD = 190, FORWARD_SLASH = 191, GRAVE_ACCENT = 192,
  14.         OPEN_BRACKET = 219, BACK_SLASH = 220, CLOSE_BRAKET = 221,
  15.         SINGLE_QUOTE = 222, BACKSPACE = 8, TAB = 9, ENTER = 13,
  16.         SHIFT = 16, CTRL = 17, ALT = 18, PAUSE_BREAK = 19,
  17.         CAPS_LOCK = 20, ESCAPE = 27,
  18.         PAGE_UP = 33, PAGE_DOWN = 34,
  19.         END = 35, HOME = 36, LEFT_ARROW = 37, UP_ARROW = 38,
  20.         RIGHT_ARROW = 39, DOWN_ARROW = 40, INSERT = 45, DELETE_ = 46,
  21.         _0 = 48, _1 = 49, _2 = 50, _3 = 51, _4 = 52, _5 = 53,
  22.         _6 = 54, _7 = 55, _8 = 56, _9 = 57, A = 65, B = 66, C = 67,
  23.         D = 68, E = 69, F = 70, G = 71, H = 72, I = 73, J = 74,
  24.         K = 75, L = 76, M = 77, N = 78, O = 79, P = 80, Q = 81, R = 82,
  25.         S = 83, T = 84, U = 85, V = 86, W = 87, X = 88, Y = 89, Z = 90,
  26.         LEFT_WINDOW = 91, RIGHT_WINDOW = 92, SELECT_KEY = 93,
  27.         NUMPAD0 = 96, NUMPAD1 = 97, NUMPAD2 = 98, NUMPAD3 = 99,
  28.         NUMPAD4 = 100, NUMPAD5 = 101, NUMPAD6 = 102, NUMPAD7 = 103,
  29.         NUMPAD8 = 104, NUMPAD9 = 105, MULTIPLY = 106, ADD = 107,
  30.         SUBTRACT = 109, DECIMAL_POINT = 110, DIVIDE = 111,
  31. };
  32. class msg {
  33. public:
  34.         msg() {
  35.                 static int keyPressTime = 0;
  36.                 Events::gameProcessEvent += [] {
  37.                         CPed *playa = FindPlayerPed();
  38.                         if (playa && KeyPressed(key::M) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
  39.                                 keyPressTime = CTimer::m_snTimeInMilliseconds;      
  40.                                 CVector position = FindPlayerPed(-1)->TransformFromObjectSpace(CVector(0.0f, 5.0f, 0.0f)); // получаем координаты по офсету от игрока ; get coords on offset from player
  41.  
  42.                                 CMessages::AddMessageJumpQ(position, 1000, 0);
  43.                                 //CHud::SetMessage("kj");
  44.                         }
  45.                 };
  46.         }
  47. } msg;
  48.  
  49.  
« Последнее редактирование: Ноябрь 23, 2018, 11:12:08 pm от egor230 »