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

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #180 : Октябрь 15, 2017, 12:37:09 pm »
Не знал, как сделать и решил посмотреть, как реализовано там.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #181 : Октябрь 16, 2017, 09:53:14 am »
Устройство опкодов можно посмотреть в базе.
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: Написание плагина. Настройка проекта
« Ответ #182 : Ноябрь 03, 2017, 02:23:16 pm »
Реализовал работу поворотников для 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, как будет время.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #183 : Ноябрь 10, 2017, 04:42:56 am »
Нет. Надо в базе искать.
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: Написание плагина. Настройка проекта
« Ответ #184 : Ноябрь 12, 2017, 02:58:28 pm »
Когда-то 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@

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #185 : Ноябрь 13, 2017, 05:14:47 am »
Хотел перенести на основу plugin-sdk, но не вышло пока. Вот эти строчки не знаю, как реализовать
05E7: 2@ = car 0@ struct
05E3: call_method 0x59E590 struct 2@ params 1 pop 0 1@
Вроде это самое простое, у меня так, на plugin-sdk по аналогии.
Код: C++
  1. void CAutomobile::SetModelIndex(int id) {
  2.         ((void(__thiscall *)(CAutomobile *, int))0x59E590)(this, id);
  3. }
  4.  
  5. ((CAutomobile *)(PlayerPed->Vehicle))->SetModelIndex(149);

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #186 : Ноябрь 13, 2017, 10:41:03 am »
Вроде это самое простое, у меня так, на plugin-sdk по аналогии.
Нет. Это виртуальная функция. Вызывать надо из vtable.

kenking, в SDK ведь есть метод SetModelIndex, что тогда не так?
« Последнее редактирование: Ноябрь 13, 2017, 10:44:27 am от DK »
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: Написание плагина. Настройка проекта
« Ответ #187 : Ноябрь 13, 2017, 10:43:03 am »
Как оказалось я сам себя запутал. В клео я сделал для 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;

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #188 : Ноябрь 13, 2017, 02:54:09 pm »
Ещё один "сюрприз" - после добавления в sdk для GTA3 остальных функций CCoronas, в коде плагина выходит следующая ошибка



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


Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #189 : Ноябрь 14, 2017, 01:43:21 pm »
Компилятор не может определить, какую функцию вызывать.
Надо вручную указать, что 0, который ты передаешь - это unsigned char.
Код: C++
  1. static_cast<unsigned char>(0)
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: Написание плагина. Настройка проекта
« Ответ #190 : Ноябрь 15, 2017, 07:50:39 am »
Спасибо! Теперь нормально.

Оффлайн kenking

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

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

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #192 : Ноябрь 20, 2017, 06:04:29 pm »
В GTA3 неправильно обьявлен метод
Код: C++
  1. CVehicle* CPools::GetVehicleRef(CVehicle* vehicle)
Он должен возвращать int (хендл).

Функция ScriptCommand всегда возвращает bool (для опкодов-проверок).
Надо вызывать так
Код: C++
  1. float angleZ = 0.0f;
  2. ScriptCommand<GET_CAR_HEADING>(CPools::GetVehicleRef(vehicle), &angleZ);
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: Написание плагина. Настройка проекта
« Ответ #193 : Ноябрь 21, 2017, 09:34:05 am »
В 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. }

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #194 : Ноябрь 24, 2017, 04:16:33 pm »
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\ScriptCommands.h"
  3. #include "common.h"
  4. #include "CMessages.h"
  5.  
  6. using namespace plugin;
  7. using namespace plugin::test;
  8.  
  9. class Gta3CarAngle {
  10. public:
  11.     Gta3CarAngle() {
  12.         Events::gameProcessEvent += [] {
  13.             CVehicle *vehicle = FindPlayerVehicle();
  14.  
  15.             if (!vehicle)
  16.                 return;
  17.  
  18.             float angle = atan2(-vehicle->m_matrix.up.x, vehicle->m_matrix.up.y) * 57.295776f;
  19.             if (angle < 0.0f)
  20.                 angle += 360.0f;
  21.             if (angle > 360.0f)
  22.                 angle -= 360.0f;
  23.  
  24.             float angleCommand = 0.0f;
  25.             ScriptCommand<GET_CAR_HEADING>(CPools::GetVehicleRef(vehicle), &angleCommand);
  26.  
  27.             static char message[256];
  28.             snprintf(message, 256, "Angle: %g Angle (command): %g", angle, angleCommand);
  29.  
  30.             CMessages::AddMessageJumpQ(message, 200, false);
  31.         };
  32.     }
  33. } gta3CarAngle;
« Последнее редактирование: Ноябрь 24, 2017, 04:23:35 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv