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

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
В этой статье я опишу создание плагина для GTA. Основное внимание уделю созданию и настройке проекта.
Я использую Visual Studio 2017. В открытом доступе есть Community версия этого продукта. Впрочем, найти Pro или Enterprise версию тоже не сложно.
Ах, да... Что требуется от вас:
-Наличие игры
-Умение писать код (если вы до этого не занимались скриптингом - возможно, лучше стоит начать с него)
-Базовые знания C/C++ (хотя, можно и без этого, как я в своё время  :P)
-Желание познавать и... время.


Напомню, что ASI-плагин - это динамическая библиотека с расширением .asi, которая подгружается (ASI-Loader'ом) и прикрепляется к процессу игры.
Итак, поехали.

Инструкция
« Последнее редактирование: Октябрь 28, 2017, 01:58:02 am от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Класс! Скорее всего, как будет возможность - перейду с VS 2010 на 2015, ибо первый у меня глючит.

Хотелось бы туториал по вызову перед стартом игры окна с выбором одного из 3х пунктов.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Shaggy, для этого нужно использовать кастомный ASI-Loader (он загружает библиотеки при загрузке приложения).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Это уже есть, и я даже реализовал(спс Sector-у и xanser-у) то, что мне нужно(подмена имен загружаемых файлов и пара мелочей), всё работает, однако через ini, а хотелось бы научиться создавать окно с выбором пункта, ибо в ini у меня всего лишь один пункт настройки(глупо создавать ini ради одной, пускай и самой важной настройки) и вообще - по многим причинам нужно именно окно, а не ini.
Нужно окно по типу такого.
« Последнее редактирование: Май 03, 2016, 11:57:10 am от Shaggy »

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Shaggy, ты имеешь ввиду окно Windows или настройку как пункт в меню?
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 522
  • Репутация: +59/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
А я бы хотел полноценное окно для самой игры. Мне кажется widescreen вайсу не подходит и приходится использовать олдскульный квадратный экран, да и удобно было бы следить за происходящим в системном трее.

DK можно уточнить? Раньше плагин подключался в виде функции в такой конструкции:
Код: C++
  1. BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
  2. {
  3.         switch (ul_reason_for_call)
  4.         {
  5.         case DLL_PROCESS_ATTACH:
  6.                 LoadViceCityPlugin();
  7.                 break;
  8.         case DLL_PROCESS_DETACH:
  9.                 break;
  10.         }
  11.         return TRUE;
  12. }

В твоем варианте это все уже не нужно и достаточно создать экземпляр класса, что автоматически вызовет конструктор и по пути все пропатчит?

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Shaggy, конкретно по этому не планировал делать туториал. Но можно глянуть, как это сделано в примерах RenderWare. Наверняка там MFC используется.
xanser, да. Так тоже можно. А если надо что-то сделать при детаче - нужно писать это в деструктор.
Код: C++
  1. class MyPlugin{
  2. public:
  3.     MyPlugin(){
  4.         // on attach
  5.     }
  6.  
  7.     ~MyPlugin(){
  8.         // on detach
  9.     }
  10. };
  11.  
  12. MyPlugin myPlugin; // создали экземпляр класса в глобальном пространстве (глобальный обьект)
Цитировать
Объявление функции в глобальной области видимости вводит глобальную функцию, а объявление переменной – глобальный объект. Глобальный объект существует на протяжении всего времени выполнения программы. Время жизни глобального объекта начинается с момента запуска программы и заканчивается с ее завершением.
Т.е. обьект будет создан при аттаче dll (будет вызван конструктор), а разрушен - при детаче (будет вызван деструктор).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 514
  • Репутация: +33/-0
    • Просмотр профиля
xanser, да потому-что объект будет создан, так сказать компилятором и уничтожен тоже, иначе говоря компилятор позаботиться обо всем сам, в данном случае.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Вынесено в шапку.
« Последнее редактирование: Сентябрь 17, 2016, 04:44:54 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

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Создал шаблон для Vice City.
Правда, там идёт привязка к несуществующему plugin_vc.
https://github.com/DK22Pac/plugin-sdk/tree/master/extra/VS%20templates
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Круто! Жаль, у меня 2010, но я постараюсь за лето на 2015 пересесть)

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Я уже пишу плагины для VC c новым sdk  :P
Код: C++
  1. #include <plugin_vc.h>
  2. #include <d3dx8.h>
  3. #include <game_vc\RenderWare.h>
  4.  
  5. using namespace plugin;
  6.  
  7. class DXFont {
  8. public:
  9.     static ID3DXFont *m_pD3DXFont;
  10.  
  11.     static void InitFont() {
  12.         HFONT hFont = CreateFont(48, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
  13.             CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS, "arial");
  14.         if (FAILED(D3DXCreateFont(_RwD3DDevice, hFont, &m_pD3DXFont)))
  15.             Error("Failed to create D3DX font!");
  16.     }
  17.  
  18.     static void DestroyFont() {
  19.         if (m_pD3DXFont) {
  20.             m_pD3DXFont->Release();
  21.             m_pD3DXFont = NULL;
  22.         }
  23.     }
  24.  
  25.     static void Draw() {
  26.         if (m_pD3DXFont) {
  27.             RECT rect;
  28.             rect.left = 0;
  29.             rect.top = 0;
  30.             rect.bottom = RsGlobal.maximumHeight;
  31.             rect.right = RsGlobal.maximumWidth;
  32.             m_pD3DXFont->DrawTextA("D3DXFont example for GTA Vice City", -1, &rect, DT_CENTER|DT_VCENTER,
  33.                 D3DCOLOR_RGBA(255, 255, 0, 255));
  34.         }
  35.     }
  36.  
  37.     DXFont() {
  38.         m_pD3DXFont = NULL;
  39.         Events::drawingEvent += Draw;
  40.         Events::initRwEvent += InitFont;
  41.         Events::shutdownRwEvent += DestroyFont;
  42.         Events::d3dLostEvent += DestroyFont;
  43.         Events::d3dResetEvent += InitFont;
  44.     }
  45. } dxFont;
  46.  
  47. ID3DXFont *DXFont::m_pD3DXFont;
« Последнее редактирование: Июнь 19, 2016, 03:46:10 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 536
  • Репутация: +19/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Шикарно! Таким макаром, наверное можно и стандартные тексты выдавать windows-шрифтами!
Жаль правда, что с rwd3d9 конфликтует: при активированном в global.ini UseD3D8to9=1 иногда на пару секунд происходит нечто:


Закономерностей не заметил - просто изредка на секунду-другую весь GUI слетает и творится ад. Небо же начинает сохранять "следы" динамических объектов(видно на скринах). Если выставить UseD3D8to9=0 - такого не наблюдается. Очевидно, идет какой-то конфликт из-за того, что оба плагина(Ultimate asi loader с rwd3d9 и этот плагин с текстом) юзают какие-то функции dxd8
« Последнее редактирование: Июнь 19, 2016, 05:39:14 pm от Shagg_E »

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 233
  • Репутация: +323/-0
    • dk22pac
    • Просмотр профиля
Наверное, для d3d8tod3d9 стоит использовать DX9 sdk.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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