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

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


Сообщения - kenking

Страницы: [1] 2 3 ... 10
1
С наступающим Новым Годом! Всем всего хорошего!

2
 :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.  

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

4
Решил перенести пример создания транспорта для 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.  

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

6
Спасибо! Так значение сходится. Странно у меня 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. }

Верно?

7
В 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. }

8
Решил опробовать 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 ==========

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

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

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



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


11
Как оказалось я сам себя запутал. В клео я сделал для 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;

12
Когда-то Den_spb показывал код для SA, чтобы менять модель авто не создавая при этом новую:
03C0: 1@ = actor $PLAYER_ACTOR car
0A97: 2@ = car 1@ struct
0AA6: call_method 0x6D6A40 struct 2@ params 1 pop 0 %какой-либо ид машины из vehicles.dat%
Как писал Денис
Цитировать
Но метод работает только при следующих условиях:
1.Предварительно загружена новая модель.
2.Старая и новая модели однотипны (например, 4-дверное авто заменить на 2-дверное не получится, только 4-дверное на 4-дверное).

Там были проблемы с колёсами. Сейчас что-то вспомнил про это и подумал, что надо для авто вызывать CAutomobile::SetModelIndex, а для другого типа транспорта соответственно свой метод. Тогда никаких проблем нет. А если менять модель на ту же самую, то и загрузка модели не нужна. Способ хорошо подходит для просмотра и замены экстр на транспорте.

Вот код в виде клео скрипта для VC
{$CLEO .cs} // VC 1.0
6@ = -1

while true
wait 0
    if
      0256: player $PLAYER_CHAR defined
    then
        if and
          05EE: key_pressed 52 //  4
          Actor.Driving($PLAYER_ACTOR)
          84C9: not player $player_char driving_flying_vehicle
          847E: not player $player_char driving_a_motorbike
          84A8: not player $PLAYER_CHAR driving_boat
        then
            03C0: 0@ = actor $PLAYER_ACTOR car
            0441: 1@ = car 0@ model
            0506: set_car_model 1@ next_variation 6@ 6@
            05E7: 2@ = car 0@ struct
            05E3: call_method 0x59E590 struct 2@ params 1 pop 0 1@ // CAutomobile::SetModelIndex
            0085: 7@ = 6@
            7@ += 1
            01E3: show_text_1number_styled GXT 'NUMBER' number 7@ time 2000 style 4 
            if
              not 6@ >= 5
            then
                6@ += 1
            else
                6@ = -1
            end
            repeat
              wait 0
            until 85EE: not key_pressed 52 // 4
        end
    end
end 

Хотел перенести на основу plugin-sdk, но не вышло пока. Вот эти строчки не знаю, как реализовать
05E7: 2@ = car 0@ struct
05E3: call_method 0x59E590 struct 2@ params 1 pop 0 1@

13
Реализовал работу поворотников для GTA3, взяв за основу пример UniversalTurnlights для SA. Возникли затруднения с реализацией поворотников для авто в трафике, а именно с этой частью:
Код: C++
  1. static CVector2D GetCarPathLinkPosition(CCarPathLinkAddress &address) {
  2.         if (address.m_wAreaId != -1 && address.m_wCarPathLinkId != -1 && ThePaths.m_pPathNodes[address.m_wAreaId]) {
  3.             return CVector2D(static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.x) / 8.0f,
  4.                 static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.y) / 8.0f);
  5.         }
  6.         return CVector2D(0.0f, 0.0f);
  7.     }

Если ещё точнее, то с этим:
Код: C++
  1. ThePaths.m_pPathNodes и ThePaths.m_pNaviNodes

Кто-нибудь разбирал пути для GTA3?
Дмитрий, помнится ты когда-то начал перенос мода IVF для GTA3. До разбора этого момента дело дошло? Если разобрал, то добавь пожалуйста в sdk, как будет время.

14
Идеи / Re: Смена текстур транспорта
« : Октябрь 24, 2017, 03:51:03 pm »
Если в принципе это возможно, то надо продумать, как это лучше реализовать. Возможен такой вариант - допустим, нужные детали модели авто имеют текстуру remap, также в txd файле этой модели имеются текстуры remap1 (remap2, remap3 и remap4), в файле .dat записаны ID модели и количество сменных текстур remap, сверяем модели в трафике с моделью из .dat, находим материал (текстуру) remap, выбираем из имеющихся сменных текстур и заменяем? И наверно надо к структуре "прикрепить" какую-то переменную, чтобы отслеживать какая текстура используется? Так можно реализовать показанным выше примером или есть способ лучше? 

15
Программирование / Re: Vice City Plugin SDK
« : Октябрь 19, 2017, 06:37:14 pm »
Ура!!!!! Здорово!!!!!!!!!! Вот бы этому научиться.....
Здесь http://forum.gtabuilder.ru/index.php?topic=337.0 достаточно информации для этого.

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