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

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #105 : Сентябрь 24, 2016, 06:35:27 pm »
У меня эта надпись была изначально, и не пропадала.
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: Написание плагина. Настройка проекта
« Ответ #106 : Сентябрь 24, 2016, 06:44:08 pm »
Я у меня её нет. Не пойму, что я делаю не так. :( Версия Visual Studio 2015 у меня Community. Версия Windows 7 максимальная SP1.

Можешь скинуть мне свой пустой проект?


UPD:

Да, покажи пожалуйста такие примеры для открытия и закрытия, например, капота авто функциями RwMatrixRotate/RwFrameRotate и методом CMatrix.
С вызовом RwMatrixRotate/RwFrameRotate  разобрался.

Просьба показать вызов методов CMatrix.
« Последнее редактирование: Сентябрь 25, 2016, 07:30:30 am от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #107 : Сентябрь 25, 2016, 12:31:54 pm »
Оказывается, у меня под XP запускается даже плагин, собранный с v140.

Версия студии у меня - Enterprise 2015.
Может, в Community есть какие-то ограничения...
« Последнее редактирование: Сентябрь 25, 2016, 02:18:34 pm от 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: Написание плагина. Настройка проекта
« Ответ #108 : Сентябрь 25, 2016, 05:31:30 pm »
Может и так, а может я просто с настройками что-то не так делаю. Скинь пожалуйста настроенный пустой проект, проверю, если будет также, как сейчас - значит дело в версии студии, если будет нормально - значит я, что-то с настройками напутал.

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #109 : Сентябрь 25, 2016, 05:41:50 pm »
Мне тут подсказали, что на WinXP может некорректно работать т.н. паттерн синглтон.
http://stackoverflow.com/a/32776479

Попробую что-то с этим сделать.
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: Написание плагина. Настройка проекта
« Ответ #110 : Сентябрь 25, 2016, 06:40:10 pm »
У тебя же плагин нормально собирается и работает. Значит это у меня, что-то не так или с настройками, или с самой студией. Кстати, в свойствах sdk plugin_sa и plugin_vc тулсет выставлен на XP, но в позиции целевая платформа надписи Windows нет.


Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #111 : Сентябрь 25, 2016, 08:24:37 pm »
У меня нормально работает только "пустой" плагин (с выводом сообщения). Собранные с sdk тоже не работают.

Просьба протестировать этот плагин на XP (это кар спаунер + сообщение при аттаче).

UP: Сделал новый шаблон проекта (для SA).
https://drive.google.com/uc?export=download&id=0B3pQzS44Fafddk85NlBpRl9ETW8
Все старые шаблоны удалить, папку Plugin-SDK разархивировать в
Documents\Visual Studio 2015\Templates\ProjectTemplatesЗаменить пути на свои в файле ProjectSA.vcxproj.
Шаблон будет доступен в категории Visual C++ -> Windows -> Plugin-SDK
Для сборки под XP выбрать режим Rel-XP.
« Последнее редактирование: Сентябрь 26, 2016, 12:48:24 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: Написание плагина. Настройка проекта
« Ответ #112 : Сентябрь 26, 2016, 11:14:12 am »
Просьба протестировать этот плагин на XP (это кар спаунер + сообщение при аттаче).
Ребята протестили. Теперь работает и на XP.
http://gta.com.ua/forum/index.php?showtopic=3382&p=2224761

Сделал новый шаблон проекта (для SA).

Для сборки под XP выбрать режим Rel-XP.
Собрал для теста два плагина с новым шаблоном. Проверил у родственников на компьютере с Windows XP SP2 - работают!  :D Спасибо!  ;)

Оффлайн kenking

  • Новичок
  • **
  • Сообщений: 237
  • Репутация: +16/-0
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #113 : Сентябрь 27, 2016, 12:56:01 pm »
Чуток ещё изменил код для "Neon". Добавил отключение неона при взрыве или перевёртывании транспорта. Проверку по времени перенёс из функции CanEnableNeonOnThisVehicle в функцию RenderNeonForVehicle для того, чтобы неон не только включался, но и выключался в нужное время.
Можно добавить этот пример в sdk examples?

Код: C++
  1. #include "plugin.h"
  2. #include "game_sa\CClock.h"
  3. #include "game_sa\CShadows.h"
  4. #include "game_sa\common.h"
  5. #include "KeyCheck.h"
  6. #include "game_sa\CModelInfo.h"
  7. #include "game_sa\CTimer.h"
  8.  
  9. #define TURN_ON_OFF_DELAY 500
  10.  
  11. using namespace plugin;
  12. using namespace std;
  13.  
  14. RwTexture *&pWhiteTex = *(RwTexture **)0xB4E3EC;
  15.  
  16. class NeonLights {
  17. public:
  18.     enum eNeonColor {
  19.         NEON_YELLOW, NEON_GREEN, NEON_RED, NEON_BLUE, NEON_PURPLE
  20.     };
  21.  
  22.     class Neon {
  23.     public:
  24.         unsigned char color;
  25.         bool activated;
  26.         bool processed;
  27.  
  28.         Neon(CVehicle *) { activated = processed = false; }
  29.  
  30.         void Enable(eNeonColor Color) {
  31.             color = Color;
  32.             activated = true;
  33.         }
  34.  
  35.         void Disable() { activated = false; }
  36.     };
  37.  
  38.     static VehicleExtendedData<Neon> VehNeon;
  39.  
  40.     static bool CanEnableNeonOnThisVehicle(CVehicle *vehicle) {
  41.         CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]);
  42.         return vehicle->m_pDriver
  43.             && (vehModel->m_nClass == 1 || vehModel->m_nClass == 2 || vehModel->m_nClass == 3)
  44.             && (vehicle->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE || vehicle->m_dwVehicleSubClass == VEHICLE_MTRUCK || vehicle->m_dwVehicleSubClass == VEHICLE_QUAD);
  45.     }
  46.  
  47.     static void ProcessNpcVehicle(CVehicle *vehicle) {
  48.         if (CanEnableNeonOnThisVehicle(vehicle) && !VehNeon.Get(vehicle).processed) {
  49.             VehNeon.Get(vehicle).processed = true;
  50.             if (rand() % 3 == 1) {
  51.                 VehNeon.Get(vehicle).activated = true;
  52.                 VehNeon.Get(vehicle).color = rand() % 5;
  53.             }
  54.         }
  55.     }
  56.  
  57.     static void ProcessVehicles() {
  58.         KeyCheck::Update();
  59.         CVehicle *playaVeh = FindPlayerVehicle(0, false);
  60.         if (playaVeh
  61.             && (playaVeh->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE
  62.                 || playaVeh->m_dwVehicleSubClass == VEHICLE_MTRUCK
  63.                 || playaVeh->m_dwVehicleSubClass == VEHICLE_QUAD)) {
  64.             if (KeyCheck::Check(VK_SHIFT)) {
  65.                 if (KeyCheck::CheckJustDown('1'))
  66.                     VehNeon.Get(playaVeh).Enable(NEON_YELLOW);
  67.                 else if (KeyCheck::CheckJustDown('2'))
  68.                     VehNeon.Get(playaVeh).Enable(NEON_GREEN);
  69.                 else if (KeyCheck::CheckJustDown('3'))
  70.                     VehNeon.Get(playaVeh).Enable(NEON_RED);
  71.                 else if (KeyCheck::CheckJustDown('4'))
  72.                     VehNeon.Get(playaVeh).Enable(NEON_BLUE);
  73.                 else if (KeyCheck::CheckJustDown('5'))
  74.                     VehNeon.Get(playaVeh).Enable(NEON_PURPLE);
  75.                 else if (KeyCheck::CheckJustDown('0'))
  76.                     VehNeon.Get(playaVeh).Disable();
  77.             }
  78.         }
  79.         for (int i = 0; i < CPools::ms_pVehiclePool->m_Size; i++) {
  80.             CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  81.             if (vehicle && vehicle != playaVeh)
  82.                 ProcessNpcVehicle(vehicle);
  83.         }
  84.     }
  85.  
  86.     static void RenderNeonForVehicle(CVehicle *vehicle) {
  87.         if (vehicle->m_fHealth < 1.0f || vehicle->IsUpsideDown())
  88.             VehNeon.Get(vehicle).Disable();
  89.         if (VehNeon.Get(vehicle).activated && CClock::GetIsTimeInRange(21, 6)) {
  90.             unsigned char r, g, b;
  91.             switch (VehNeon.Get(vehicle).color) {
  92.             case NEON_YELLOW: r = 255; g = 200; b = 0;    break;
  93.             case NEON_GREEN:  r = 0;   g = 255; b = 0;    break;
  94.             case NEON_RED:    r = 255; g = 0;   b = 0;    break;
  95.             case NEON_BLUE:   r = 0;   g = 0;   b = 255;  break;
  96.             case NEON_PURPLE: r = 255; g = 0;   b = 255;  break;
  97.             }
  98.             if (CTimer::m_snTimeInMilliseconds % (TURN_ON_OFF_DELAY + 250) < TURN_ON_OFF_DELAY) {
  99.                 CVector Pos = CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]->m_pColModel->m_boundBox.m_vSup;
  100.                 CVector center = vehicle->TransformFromObjectSpace(CVector(0.0f, 0.0f, 0.0f));
  101.                 CVector up = vehicle->TransformFromObjectSpace(CVector(0.0f, -Pos.y - 0.5f, 0.0f)) - center;
  102.                 CVector right = vehicle->TransformFromObjectSpace(CVector(Pos.x + 0.2f, 0.0f, 0.0f)) - center;
  103.                 CShadows::StoreShadowToBeRendered(2, pWhiteTex, &center, up.x, up.y, right.x, right.y, 255, r, g, b, 2.0f, false, 1.0f, 0, true);
  104.             }
  105.         }
  106.     }
  107.  
  108.     NeonLights() {
  109.         Events::gameProcessEvent += ProcessVehicles;
  110.         Events::vehicleRenderEvent += RenderNeonForVehicle;
  111.     }
  112. } neon;
  113.  
  114. VehicleExtendedData<NeonLights::Neon> NeonLights::VehNeon;


UPD:
Пример добавил.

Просьба показать вызов методов CMatrix.
Код: C++
  1. reinterpret_cast<CMatrix*>(&automobile->m_aCarNodes[CAR_MISC_A]->modelling)->SetRotateXOnly(angle);
Правильно?
« Последнее редактирование: Сентябрь 30, 2016, 01:14:18 pm от kenking »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #114 : Октябрь 02, 2016, 04:51:06 pm »
Чуть позже будут примеры.
И sdk обновлю.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #115 : Октябрь 07, 2016, 11:02:54 pm »
Проект обновил.

Код: C++
  1. CMatrix m(&automobile->m_aCarNodes[CAR_MISC_A]->modelling, false);
  2. m.SetRotateXOnly(angle);
  3. m.UpdateRW();
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: Написание плагина. Настройка проекта
« Ответ #116 : Октябрь 08, 2016, 11:01:17 am »
Спасибо.
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. }

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

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 707
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Написание плагина. Настройка проекта
« Ответ #117 : Октябрь 08, 2016, 02:57:40 pm »
Цитировать
[29]
Вот я тоже хотел узнать. Это разве не побайтовое смещение?
Прост я выдернул напрямую кусок псевдокода из IDA - он блокирует/разблокирует управление игроком. Всё работает, но что конкретно тут происходит - я не знаю:
Код: C++
  1. //вначале неким способом мы получаем __int16      *GetPadInt
  2. //потом следующие строчки служат для управления управлением, лол:
  3. GetPadInt[120] |= 0x20u; // Disable Player Controls
  4. GetPadInt[120] &= 0xFFDFu; // Enable Player Controls
  5. //что происходит на последних двух строчках^ - хз
Повторюсь - всё нормально работает, но надеюсь, что DK поможет разобраться, как это работает(а то в других случаях копирование псевдокода может не спасти ситуацию)

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #118 : Октябрь 08, 2016, 03:08:49 pm »
Это вызов метода из таблицы виртуальных методов (virtual table, "vtable").

http://dkhramov.dp.ua/Comp/VirtualMethods

А теперь - конкретнее:
void ***X = (void ***)thisприводим this (CVehicle *) к (void ***) (то же самое, что reinterpret_cast<void ***>(this))
void **Y = *XРазыменовываем указатель void *** ("читаем" значение по адресу (this + 0) - получаем указатель на таблицу виртуальных методов (void **, массив указателей на void *))
void *Z = Y[29]Получаем элемент с индексом 29 в этой таблице, получили указатель void *
auto F = ((float (__thiscall *)(CVehicle*, unsigned int))ZПриводим этот указатель к указателю на функцию нужного типа
F(this, door)И тут же вызываем эту функцию.

Код: C++
  1. void CallSimpleVirtualMethod(CVehicle *_this, unsigned int index) {
  2.     void ***pVtable = reinterpret_cast<void ***>(_this + 0); // указатель на виртуальную таблицу находится по смещению +0 в структуре CVehicle
  3.     void **vtable = *pVtable; // читаем значение, получаем адрес виртуальной таблицы
  4.     void *method_addr = vtable[index]; // читаем значение, получаем адрес метода
  5.     auto method = reinterpret_cast<float(__thiscall *)(CVehicle*)>(method_addr);
  6.     method(_this);
  7. }

В CLEO это выглядело бы так:
Код: C++
  1. 0@ = read_memory VEHICLE_STRUCT size 4 vp 0 // получили адрес виртуальной таблицы
  2. 1@ = 29 * 4 // смещение к нужному методу
  3. 0@ += 1@ // получаем адрес в таблице
  4. 0@ = read_memory 0@ size 4 vp 0 // получаем адрес метода
  5. call_method VEHICLE_STRUCT params 0 pop 0
« Последнее редактирование: Октябрь 08, 2016, 05:46:38 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Написание плагина. Настройка проекта
« Ответ #119 : Октябрь 08, 2016, 03:29:35 pm »
Вот я тоже хотел узнать. Это разве не побайтовое смещение?
Если у тебя массив char (размер = 1 байт) - то да, побайтовое.
Прост я выдернул напрямую кусок псевдокода из IDA - он блокирует/разблокирует управление игроком. Всё работает, но что конкретно тут происходит - я не знаю:
Код: C++
  1. //вначале неким способом мы получаем __int16      *GetPadInt
  2. //потом следующие строчки служат для управления управлением, лол:
Как именно ты получаешь
Цитировать
вначале неким способом мы получаем __int16   *GetPadInt
?
Вероятно, это структура CPad, которую ты почему-то представляешь как массив указателей на int16 (2-байтовый integer), и изменяешь значение
Цитировать
GetPadInt[120] // получить элемент с индексом 120 в массиве GetPadInt
,
т.е.
Код: C++
  1. pad + 240

//что происходит на последних двух строчках^ - хз
Код: C++
  1. unsigned short value = 0;
  2. value |= 0x20 - включить 5-ый бит (оператор OR)
  3. value &= 0xFFDF - отключить 5-ый бит (оператор AND)
Почему именно 5-ый бит - открывай калькулятор в режиме "Программист" и разбирайся  :)

PS В С++ есть такая штука, как битовые поля.
Код: C++
  1. struct my_16bit_value {
  2.     unsigned short _bits1 : 5; // биты 0 - 4
  3.     unsigned short bit_5 : 1; // бит 5
  4.     unsigned short _bits2 : 10; // биты 6 - 15
  5.  
  6.     my_16bit_value() { // обнуляем
  7.         _bits1 = 0;
  8.         bit_5 = false;
  9.         _bits2 = 0;
  10.     }
  11. };
  12.  
  13. my_16bit_value value;
  14. value.bit_5 = true; // включить 5-ый бит
  15. value.bit_5 = false; // отключить 5-ый бит

« Последнее редактирование: Октябрь 08, 2016, 03:58:39 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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