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

Оффлайн Shagg_E

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

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Дмитрий, во-первых, хочу сказать спасибо за проделанную работу по plugin-sdk, во-вторых, хочу сказать, что есть большое желание освоить написание плагинов для GTA. Года два назад я начал было, но инфы по написанию плагинов очень мало, написал один простой плагин и на этом как-то изучение остановилось. При написании клео скриптов мне в своё время очень помогли исходники скриптов Дениса. По ним-то я и научился писать высокоуровневый код, а начинал с написания в меточном стиле. Так вот к чему это я всё - хорошо бы здесь написать несколько простых примеров для SA, например, как создавать транспорт с определённой моделью в определённых координатах, работу с транспортом и компонентами транспорта и т.д. Хорошо бы, как сделано здесь http://ru-script.3dn.ru/publ/gta_iv/gta_iv/obzor_klassa_vehicles/35-1-0-177 - тот же код в примере клео скрипта. Заранее спасибо.

Кстати, плагин для VC не собирается. У меня отсутствует dxd8.h. Можно заменить строчку на dxd9.h или где взять dxd8.h 

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
kenking, уже поправил это (зависимость от d3d8) в VC, скачай репозиторий заново, или удали зависимость вручную (нужно убрать обьявление _D3D_INCLUDE в настройках проекта plugin_vc):

Plugin-sdk для VC пока что малофункционален, там даже нет классов CPed и CVehicle.

По работе с компонентами я сделаю примеры.

А пока что - такое видео.
https://www.youtube.com/watch?v=PVfC7YSOEQs
« Последнее редактирование: Июль 30, 2016, 12:46:57 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

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Цитировать
или удали зависимость вручную (нужно убрать обьявление _D3D_INCLUDE в настройках проекта plugin_vc):
Удалил. Плагин VC собрался. А пример VC_DXFont не идёт. Там же #include <d3dx8.h>

Цитировать
уже поправил это (зависимость от d3d8) в VC, скачай репозиторий заново
Скачал и новую версию. Здесь плагин VC не собирается. Вот



За пример в видео спасибо, но я имел ввиду создание транспорта в определённых координатах, с загрузкой модели
00A5: 0@ = create_car #PONY at 0.0 0.0 0.0

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Цитировать
А пример VC_DXFont не идёт. Там же #include <d3dx8.h>

Всё верно. Чтобы его собрать нужен DX8 SDK.
https://drive.google.com/uc?export=download&id=0B3pQzS44FafdajNJcy1Cb2haUkk
Включи обратно _D3D_INCLUDE в проекте plugin_vc, и настрой пути в Configuration Properties > VC++ Directories > Include Directories
http://i.imgur.com/n3DzDfe.png
Это же надо сделать и для проекта VC_DXFont, +изменить путь вот тут к своей папке
http://i.imgur.com/cmL3Qlb.png

Скачал и новую версию. Здесь плагин VC не собирается. ВотУже добавил эти файлы.

За пример в видео спасибо, но я имел ввиду создание транспорта в определённых координатах, с загрузкой моделиОпкод 00A5 вызывает функцию CCarCtrl::CreateCarForScript. Пока что её нету в sdk (класс CCarCtrl пока что добавлен только частично), но я добавлю.
« Последнее редактирование: Июль 30, 2016, 06:12:29 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

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Теперь при сборке VC_DXFont выходит:
1>------ Перестроение всех файлов начато: проект: VC_DXFont, Конфигурация: Release Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2001: неразрешенный внешний символ ""struct IDirect3DDevice8 * & _RwD3DDevice" (?_RwD3DDevice@@3AAPAUIDirect3DDevice8@@A)"
1>D:\Games\GTA Vice City 1.0\VC_DXFont.asi : fatal error LNK1120: неразрешенных внешних элементов: 1
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
kenking, plugin_vc пересобрал с _D3D_INCLUDE?

PS прямо сейчас занимаюсь классом CCarCtrl, после покажу пример создания транспорта и манипулирования им.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Цитировать
plugin_vc пересобрал с _D3D_INCLUDE?
Да.

Цитировать
прямо сейчас занимаюсь классом CCarCtrl, после покажу пример создания транспорта и манипулирования им.
Жду с нетерпением. Спасибо, что подробно всё разъясняешь.


Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Да.
Попробуй именно пересобрать (не Build, а Rebuild).
А после этого пересобери VC_DXFont.

Пример по спавну авто и управлению компонентом уже добавил.
https://github.com/DK22Pac/plugin-sdk/blob/master/examples/SA_CreateCar/Main.cpp

Спрашивай если что-то не понятно.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн kenking

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Цитировать
Попробуй именно пересобрать (не Build, а Rebuild).
А после этого пересобери VC_DXFont.
Так и делал. Пересобрал ещё раз - тоже самое.

Цитировать
Пример по спавну авто и управлению компонентом уже добавил.
За пример с подробными комментариями огромное спасибо!

Цитировать
Спрашивай если что-то не понятно.
Как вращать компоненты (CMatrix__rotateAroundX, CMatrix__rotateAroundY, CMatrix__rotateAroundZ)? Попробовал так:
if (automobile->m_aCarNodes[CAR_DOOR_RR])
automobile->m_aCarNodes[CAR_DOOR_RR]->modelling.at.z += 1.57f;
и так:
if (automobile->m_aCarNodes[CAR_DOOR_RF])
automobile->m_aCarNodes[CAR_DOOR_RF]->modelling.up.z += 1.57f;
Вот что вышло:  ;D


Сделай пожалуйста пример вращения компонента в цикле на транспорте игрока.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Тут всё очень просто - метод CVehicle::SetComponentRotation(RwFrame* компонент, int ось, float угол(радианы), bool ресет_позиции_после_вращения).
Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CAutomobile.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class RotateDoorExample {
  8. public:
  9.     static float m_angle;
  10.  
  11.     RotateDoorExample() {
  12.         Events::gameProcessEvent.Add([] {
  13.             CVehicle *vehicle = FindPlayerVehicle(0, false); // Находим авто игрока (0 - это индекс игрока)
  14.             if (vehicle && vehicle->m_dwVehicleClass == VEHICLE_AUTOMOBILE) { // если транспорт найден и его тип - автомобиль
  15.                 m_angle += 0.01f; // прибавляем 0.01 каждый фрейм
  16.                 if (m_angle > (_RW_pi * 2.0f)) // 2 pi = ~ 6,28
  17.                     m_angle = 0.0f; // обнуляем если дошли до максимума
  18.                 CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle); // приводим тип, чтобы обращаться к транспорту как к CAutomobile (CAutomobile - дочерний класс CVehicle)
  19.                 // Этот массив компонентов (m_aCarNodes @0x648) - уникален для CAutomobile. Имея указатель на CVehicle,
  20.                 // мы не сможем к нему обратиться - поэтому и приводим тип, предварительно убедившись, что транспорт - автомобиль.
  21.                 // У CBike, CTrain - также есть свои таблицы компонентов.
  22.                 if (automobile->m_aCarNodes[CAR_DOOR_RF])
  23.                     automobile->SetComponentRotation(automobile->m_aCarNodes[CAR_DOOR_RF], 0, m_angle, true); // здесь 0 - это ось (0,1,2 - соотв. X,Y,Z)
  24.                 if (automobile->m_aCarNodes[CAR_DOOR_LF])
  25.                     automobile->SetComponentRotation(automobile->m_aCarNodes[CAR_DOOR_LF], 0, m_angle, true);
  26.             }
  27.         });
  28.     }
  29. } example;
  30.  
  31. float RotateDoorExample::m_angle = 0.0f; // начальное значение = 0.0
Также есть функции RwMatrixRotate/RwFrameRotate, которые вращают матрицу/фрейм вокруг оси (ось можно задать своим вектором).
Ну и ещё вариант - вращение методами CMatrix: RotateX,RotateY,RotateZ и другими (см. файл CMatrix.h) Eсли будет нужно, то покажу на примере.

Вот тут более сложный вариант, с возможностью вращения по трём осям с помощью кватерниона.
https://github.com/DK22Pac/plugin-sdk/blob/master/examples/SA_RotateDoor/Main.cpp
Вращение устанавливается методом
quat.Set(m_angle, 0.0f, 0.0f);где 3 параметра - вращение в радианах по осям y, z, x, соответственно.


По поводу VC_DXFont - в plugin_vc открой в студии файл game_vc/RenderWare.cpp и глянь, не закомменчена ли строка
LPDIRECT3DDEVICE8 &_RwD3DDevice = *(LPDIRECT3DDEVICE8 *)0x7897A8;как у меня на скрине
« Последнее редактирование: Июль 31, 2016, 11:31:32 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

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
Цитировать
По поводу VC_DXFont - в plugin_vc открой в студии файл game_vc/RenderWare.cpp и глянь, не закомменчена ли строка
Вот:


С примерами буду разбираться, спасибо.

Ещё вопросы:
1) При обновлении sdk как лучше обновить у себя? Достаточно ли будет копировать новые файлы с заменой старых и пересобрать плагин? Шаблон пересобирать надо или нет?
2) В SA_CreateCar CStreaming::RequestModel(modelId, 2); цифра 2 что означает?
а в SA_PedSpawner стоит 0
CStreaming::RequestModel(modelID, 0);
UPD:
Вот здесь
void CVehicle::OpenDoor(CPed* ped, int componentId, eDoors door, float doorOpenRatio, bool playSound)eDoors door - что ставить? В клео я ставил 0-5, а здесь пишет аргумент типа int несовместим с параметром типа "eDoors".
Вот код моего скрипта (для GTA3, но не суть), не пойму, как сделать такое в плагине (для SA). Цикл for в частности, как реализовать wait 0? Можно пример? Пожалуйста  ???

{$CLEO .cs}
05E5: 15@ = game_version
if
  15@ == 0
then
    6@ = 0x52E660
    7@ = 0x545930
    8@ = 0x52EF90
    9@ = 0x52E750
else
    if
      15@ == 1
    then 
        6@ = 0x52E8A0
        7@ = 0x545B30
        8@ = 0x52F1D0
        9@ = 0x52E990
    else
        05DC: end_custom_thread
    end   
end
var
   12@: float
end

while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if and
          $ONMISSION == 0
          Actor.Driving($PLAYER_ACTOR)
          80DE: not player $PLAYER_CHAR driving_vehicle_type #PREDATOR
          80DE: not player $PLAYER_CHAR driving_vehicle_type #SPEEDER
          80DE: not player $PLAYER_CHAR driving_vehicle_type #REEFER
          80DE: not player $PLAYER_CHAR driving_vehicle_type #GHOST
        then
            if
              05EE: key_pressed 219 // [
            then
                0@ = 17 // ComponentID
                1@ = 0  // eDoors
                gosub @open_component // капот
                repeat
                  wait 0
                until 85EE: not key_pressed 219 // [ 
            end
            if
              05EE: key_pressed 221 // ]
            then
                0@ = 18
                1@ = 1
                gosub @open_component // багажник
                repeat
                  wait 0
                until 85EE: not key_pressed 221 // ] 
            end
            if and
              05EE: key_pressed 186 // ;
              05EE: key_pressed 187 // =
            then
                0@ = 15
                1@ = 2
                gosub @open_component // левая передняя дверь
                repeat
                  wait 0
                until 85EE: not key_pressed 187 // = 
            end
            if and
              05EE: key_pressed 222 // '
              05EE: key_pressed 187 // =
            then
                0@ = 11
                1@ = 3
                gosub @open_component // правая передняя дверь
                repeat
                  wait 0
                until 85EE: not key_pressed 187 // = 
            end
            if and
              05EE: key_pressed 186 // ;
              05EE: key_pressed 189 // -
            then
                0@ = 16
                1@ = 4
                gosub @open_component // левая задняя дверь
                repeat
                  wait 0
                until 85EE: not key_pressed 189 // - 
            end
            if and
              05EE: key_pressed 222 // '
              05EE: key_pressed 189 // -
            then
                0@ = 12
                1@ = 5
                gosub @open_component // правая задняя дверь
                repeat
                  wait 0
                until 85EE: not key_pressed 189 // - 
            end
        end
    end
end

:open_component
if
  Actor.Driving($PLAYER_ACTOR)
then 
    03C0: 10@ = actor $PLAYER_ACTOR car
    05E7: 10@ = car 10@ struct
    0085: 11@ = 10@
    05E4: call_function_method 6@ struct 11@ num_params 1 pop 0 0@ {1..19} 2@ // IsComponentPresent
    if
      2@ == 1
    then
        0085: 3@ = 10@
        3@ += 0x288 // CDamageManager
        05E4: call_function_method 7@ struct 3@ num_params 1 pop 0 1@ {0..5} 4@ // GetDoorStatus
        if
          4@ <> 3
        then
            05E4: call_function_method 8@ struct 10@ num_params 1 pop 0 1@ {0..5} 5@ // IsDoorFullyOpen
            if
              5@ == 0
            then
                for 12@ = 0.0 TO 1.0 step 0.1
                   05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor
                   wait 0
                end
            else
                for 12@ = 1.0 DOWNTO 0.0 step 0.1
                   05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor
                   wait 0
                end
            end
        end 
    end 
end
return         
« Последнее редактирование: Август 01, 2016, 05:22:25 pm от kenking »

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Вот:

Ты что-то не так сделал.
Открой настройки plugin_vc, должно быть определение _D3D_INCLUDE вот тут:
http://i.imgur.com/WyptPrQ.png
У тебя проект plugin_vc сейчас скомпилирован без переменной _RwD3DDevice. Поэтому при попытке компилировать VC_DXFont ты получаешь ошибку с сообщением, что переменная не найдена.

1) При обновлении sdk как лучше обновить у себя? Достаточно ли будет копировать новые файлы с заменой старых и пересобрать плагин? Шаблон пересобирать надо или нет?

Можно и так. Скопировать, заменить, пересобрать plugin-sdk, пересобрать свои проекты. Шаблон менять не надо, если он не изменялся в репозитории.
Но я бы советовал использовать специальные утилиты для обновления/изменения:
Git for Windows
TortoiseGit

Как с этим работать:
Скачать Git, установить, скачать TortoiseGit, установить. После этого в контекстном меню Windows появятся новые элементы.
Открыть страницу plugin-sdk на github, нажать кнопку "Clone or Download", скопировать ссылку:


Зайти в папку своих проектов (если там уже есть папка plugin-sdk - удалить её), нажать ПКМ, далее "Git Clone":


Если ссылка правильно скопировалась, то программа сама всё настроит:


Нажать "ОК", после загрузки - "Close".

Теперь у тебя будет папка-репозитарий plugin-sdk.  :P


Как с ней работать:
Нажать ПКМ на папке (plugin-sdk), далее выбрать "Git Sync...":


Если надо обновить (перед этой процедурой желательно закрыть студию):
Нажимаешь кл. Pull

После апдейтинга, ты увидишь список "коммитов", которые были загружены:

Нажать Close.

Если ты внес изменения (например, добавил какую-то функцию, класс, что-то поправил, или даже добавил свой пример) и хочешь внести их в репозиторий:
Создать аккаунт на github.
Сообщить мне свой никнейм (мне нужно будет добавить его в список редакторов).

Нажать кл. Commit

Далее в окне "коммита" дать ему какое-то название (обычно описание изменений) и выбрать все файлы, которые ты изменял (по дефолту, новодобобавленные файлы не отмаечаются автоматом):

Нажать Commit & Push (на кнопке Commit есть справа стрелка, открывающая доп. опции), после отправки нажать Close.

2) В SA_CreateCar CStreaming::RequestModel(modelId, 2); цифра 2 что означает?
а в SA_PedSpawner стоит 0
CStreaming::RequestModel(modelID, 0);

Это флаги загрузки и стриминга модели. Честно скажу - сам пока что не очень разобрался, как правильно их использовать. Примерно я их наименовал так:
enum eStreamingFlags {
    GAME_REQUIRED = 0x2, // Модель нужна игре?  (Сохранять в памяти, пока не будет вызвана SetModelIsDeletable, дальше - пусть игра сама решает, когда удалить модель)
    MISSION_REQUIRED = 0x4, // Модель нужна миссии? (Сохранять в памяти, пока не будет вызвана SetMissionDoesntRequireModel, дальше - пусть игра сама решает, когда удалить модель)
    KEEP_IN_MEMORY = 0x8, // Сохранять в памяти, пока мы сами не выгрузим модель (RemoveModel)
    PRIORITY_REQUEST = 0x10 // Особый приоритет загруки (в функции LoadAllRequestedModels есть параметр на загрузку только таких моделей)
};
Эти описания - примерные, я их только вчера составил, и не было времени всё проверить. Раньше этого перечисления я вообще нигде не находил :)
Вот здесь
void CVehicle::OpenDoor(CPed* ped, int componentId, eDoors door, float doorOpenRatio, bool playSound)eDoors door - что ставить? В клео я ставил 0-5, а здесь пишет аргумент типа int несовместим с параметром типа "eDoors".

Типы, которые начинаются с "e" - это enumerations (перечисления).
Тип eDoors обьявлен, но он пустой (в CDamageManager.h):

Если ты знаешь значения этого перечисления - можешь их добавить в файле CDamageManager.h, и далее использовать их при вызове (напр. DOOR_FRONT_LEFT).
Если нужно использовать integer вместо enum - нужно привести тип:
static_cast<eDoors>(5)
Вот код моего скрипта (для GTA3, но не суть), не пойму, как сделать такое в плагине (для SA). Цикл for в частности, как реализовать wait 0? Можно пример? Пожалуйста  ???

Wait вообще не нужен (есть аналог в виде Sleep(), но использовать его где-либо не желательно). Ты же внедряешь свой код в код игры. Сделаешь где-то задержку - и игра тоже её сделает.
Тебе нужно мыслить по-другому - ты "вклиниваешься" в процесс каждый фрейм. Твой код (функция) будет вызываться один раз за фрейм - допустим, где-то в CGame::Process (если используется gameProcessEvent). Что делать в такой ситуации? Тут есть несколько вариантов. Самое простое - разделить код на отдельные процессы (состояния) и создать переменную, которая будет хранить id поточного процесса (состояния) (и которой будем переключать процессы (состояния))
Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CAutomobile.h"
  4. #include "game_sa\CTimer.h"
  5. #include "game_sa\CMessages.h"
  6.  
  7. using namespace plugin;
  8.  
  9. class OpenDoorExample {
  10. public:
  11.     enum eOpenDoorState {
  12.         STATE_OPENING, // сейчас мы что-то открываем
  13.         STATE_CLOSING, // закрываем
  14.         STATE_WAITING  // ждём указаний
  15.     };
  16.  
  17.     static eOpenDoorState m_currentState; // наш статус
  18.     static CAutomobile *m_pCurrentCar; // авто, с которым сейчас что-то делаем
  19.     static float m_openingState; // статус открытия/закрытия
  20.     static int m_currentComponentId;
  21.     static eDoors m_currentDoorId;
  22.     static unsigned int m_nLastTimeWhenAnyActionWasEnabled;
  23.  
  24.     static void OpenComponent(CAutomobile *automobile, int componentId, eDoors doorId) {
  25.         if (automobile->IsComponentPresent(componentId)) {
  26.             if (automobile->m_damageManager.GetDoorStatus(doorId) != 3) { // 3 - это тоже член какого-то перечисления, напр. STATUS_DAMAGED
  27.                 m_pCurrentCar = automobile; // сохраняем все данные в переменные, чтобы потом заюзать при обработке STATE_OPENING/STATE_CLOSING (см. функцию Process)
  28.                 m_currentComponentId = componentId;
  29.                 m_currentDoorId = doorId;
  30.                 if (!automobile->IsDoorFullyOpen(doorId)) {
  31.                     m_currentState = STATE_OPENING; // переключаем статус
  32.                     m_openingState = 0.0f; // и ресетим статус открытия
  33.                 }
  34.                 else {
  35.                     m_currentState = STATE_CLOSING; // переключаем статус
  36.                     m_openingState = 1.0f; // и ресетим статус открытия
  37.                 }
  38.                 m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds; // запоминаем время
  39.             }
  40.         }
  41.     }
  42.  
  43.     static void Process() { // Обрабатываем поточное состояние - ждём нажатия клавиши ИЛИ открываем ИЛИ закрываем компонент
  44.         switch (m_currentState) {
  45.         case STATE_OPENING: // Что-то открываем. Обрати внимание, что ранее мы записали поточное авто и ид компонентов в статические переменные класса (по сути, это глобальные переменные)
  46.             m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, m_openingState, true);
  47.             m_openingState += 0.05f;
  48.             if (m_openingState > 1.0f) { // Если полностью открыли
  49.                 m_currentState = STATE_WAITING; // Переключаем статус на "ожидание"
  50.                 m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, 1.0f, true); // Полностью открываем
  51.             }
  52.             break;
  53.         case STATE_CLOSING: // Что-то закрываем
  54.             m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, m_openingState, true);
  55.             m_openingState -= 0.05f;
  56.             if (m_openingState < 0.0f) { // Если полностью закрыли
  57.                 m_currentState = STATE_WAITING; // Переключаем статус на "ожидание"
  58.                 m_pCurrentCar->OpenDoor(0, m_currentComponentId, m_currentDoorId, 0.0f, true); // Полностью закрываем
  59.             }
  60.             break;
  61.         case STATE_WAITING:
  62.             if (CTimer::m_snTimeInMilliseconds > (m_nLastTimeWhenAnyActionWasEnabled + 500)) { // если прошло 500 мс с того времени, как мы начали открывать/закрывать что-то
  63.                 CVehicle *vehicle = FindPlayerVehicle(0, false);
  64.                 if (vehicle && vehicle->m_dwVehicleClass == VEHICLE_AUTOMOBILE) {
  65.                     CAutomobile *automobile = reinterpret_cast<CAutomobile *>(vehicle); // опять же, приведение типов. Т.к. мы будет юзать damageManager, нам нужно убедиться, что транспорт - это автомобиль (CAutomobile)
  66.                     if (KeyPressed(219)) // [
  67.                         OpenComponent(automobile, CAR_BONNET, static_cast<eDoors>(0)); // капот
  68.                     else if (KeyPressed(221)) // ]
  69.                         OpenComponent(automobile, CAR_BOOT, static_cast<eDoors>(1)); // багажник
  70.                     else if (KeyPressed(186) && KeyPressed(187)) // ; =
  71.                         OpenComponent(automobile, CAR_DOOR_LF, static_cast<eDoors>(2)); // левая передняя дверь
  72.                     else if (KeyPressed(222) && KeyPressed(187)) // ' =
  73.                         OpenComponent(automobile, CAR_DOOR_RF, static_cast<eDoors>(3)); // правая передняя дверь
  74.                     else if (KeyPressed(186) && KeyPressed(189)) // ; -
  75.                         OpenComponent(automobile, CAR_DOOR_LR, static_cast<eDoors>(4)); // левая задняя дверь
  76.                     else if (KeyPressed(222) && KeyPressed(189)) // ' -
  77.                         OpenComponent(automobile, CAR_DOOR_RR, static_cast<eDoors>(5)); // правая задняя дверь
  78.                 }
  79.             }
  80.         }
  81.  
  82.         switch (m_currentState) { // Для наглядности выведем поточный статус на экран
  83.         case STATE_OPENING:
  84.             CMessages::AddMessageJumpQ("State: OPENING", 100, 0, false);
  85.             break;
  86.         case STATE_CLOSING:
  87.             CMessages::AddMessageJumpQ("State: CLOSING", 100, 0, false);
  88.             break;
  89.         case STATE_WAITING:
  90.             CMessages::AddMessageJumpQ("State: WAITING", 100, 0, false);
  91.             break;
  92.         }
  93.     }
  94.  
  95.     OpenDoorExample() {
  96.         Events::gameProcessEvent.Add(Process);
  97.     }
  98. } example;
  99.  
  100. OpenDoorExample::eOpenDoorState OpenDoorExample::m_currentState = STATE_WAITING;
  101. CAutomobile *OpenDoorExample::m_pCurrentCar;
  102. float OpenDoorExample::m_openingState;
  103. int OpenDoorExample::m_currentComponentId;
  104. eDoors OpenDoorExample::m_currentDoorId;
  105. unsigned int OpenDoorExample::m_nLastTimeWhenAnyActionWasEnabled = 0;
Не стал делать проверку нажатия/отжатия клавиши, чтобы не усложнять  :D
Заметь, что и в твоём скрипте, и в этом примере есть небольшая проблема - это выполнение действий над авто в цикле, без доп. проверки на существование этого авто. Чисто теоретически - пока обрабатывается открытие/закрытие, с авто может что-то случиться :) Но это уже мелочи.
Можно было бы вообще разделить процессы открытия/закрытия и обработки клавиш (чтобы эти процессы выполнялись одновременно). Но для базовой реализации подойдёт и так.

По for и другим циклам лучше найти какой-то урок/туториал по C++ (например этот)
« Последнее редактирование: Август 01, 2016, 10:20:41 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

  • Новичек
  • **
  • Сообщений: 143
  • Репутация: +5/-0
    • Просмотр профиля
С plugin_vc и VC_DXFont разобрался, спасибо.
Как я понял, и для SA, и для VC плагины идут только под версию exe 1.0. Ну для SA то ладно, а для VC хорошо бы и версию 1.1 учитывать.
А есть ли в планах и для GTA3 плагин сделать?

Цитировать
Но я бы советовал использовать специальные утилиты для обновления/изменения:
Git for Windows
TortoiseGit
Скачал, установил.

Цитировать
Создать аккаунт на github.
Сообщить мне свой никнейм (мне нужно будет добавить его в список редакторов).
kenkingGitHub (никнейм kenking уже кто-то занял, наглость какая  ;D)

Цитировать
Тебе нужно мыслить по-другому - ты "вклиниваешься" в процесс каждый фрейм.
Буду пробовать, после клео как-то непривычно. Ещё раз большое спасибо за подробные пояснения!

Цитировать
Заметь, что и в твоём скрипте, и в этом примере есть небольшая проблема - это выполнение действий над авто в цикле, без доп. проверки на существование этого авто. Чисто теоретически - пока обрабатывается открытие/закрытие, с авто может что-то случиться
Есть такое дело. Я проверку там в общем-то сознательно не поставил, потому как при написании такого скрипта для VC во время процесса открывания/закрывания компонента специально взрывал авто и вылета не было, поскольку авто сразу не удаляется. Ну так-то проверку лучше ставить, согласен.
« Последнее редактирование: Август 02, 2016, 10:13:07 am от kenking »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
для VC хорошо бы и версию 1.1 учитывать
Не думаю, что ради этого стоит напрягаться - сейчас мало кто учитывает 1.1: даже MVL работает лишь с 1.0
« Последнее редактирование: Август 02, 2016, 10:14:00 am от Shagg_E »