Strona główna
Witaj, nieznajomy!

Tworzenie pluginów w C++ - Konfiguracja środowiska

Ten poradnik obejmuje tylko zagadnienia z poprawnego skonfigurowania środowiska pod tworzenie pluginów/skryptów ASI dla Script Hook V. W SDK znajdują się przykładowe pliki projektów, ale tutaj opiszę jak wszystko ustawić przy tworzeniu zupełnie nowego projektu. Do samego tworzenia pluginów/skryptów jest oczywiście wymagana znajomość C++. Istnieją wrappery umożliwiające pisanie skryptów w językach C# i LUA, ale o tym w innych poradnikach.

Potrzebne oprogramowanie


  • Visual Studio Community 2013 - darmowa, w pełni wyposażona wersja Visual Studio, popularnego środowiska programistycznego od Microsoftu. Pobieranie dostępne bez rejestracji, instaluje się dosyć długo. Jeżeli posiadasz starszą lub nowszą wersję Visual Studio ze wsparciem dla C++, to możesz z niej skorzystać. Inne wersje nie różnią się w tym zakresie, w którym będziesz wykorzystywał to środowisko do tworzenia pluginów ASI.
  • ]Script Hook V SDK - najnowsza wersja SDK do Script Hook V (link do pobrania na dole, "Download SDK").


Instalacja Visual Studio Community 2013

Instalator będzie musiał pobrać wszystkie niezbędne pliki, nawet do kilku GB. Jeżeli nie potrzebujesz wszystkich standardowych rozszerzeń do tego środowiska, to na potrzeby tworzenia pluginów do GTA V wystarczy "Microsoft Foundation Classes for C++".

/public/images/tutorials/gtav_cpp_intro/visualstudio_install


Utworzenie nowego projektu


  1. Wybierz File -> New Project.
  2. W nowym okienku wejdź do sekcji Templates -> Visual C++ -> General i wybierz "Empty Project".
  3. Niżej wprowadź nazwę swojego projektu i ścieżkę, gdzie będzie przechowywany.

/public/images/tutorials/gtav_cpp_intro/visualstudio_new_project


Dodanie platformy docelowej: x64

Domyślnie projekty tworzone są na platformę Win32 - czyli pod architekturą 32-bitową. Tworzony plugin ASI musi być kompilowany tylko dla architektury 64-bitowej.


  1. Z menu wybierz Build -> Configuration Manager.
  2. Nową platformę możesz ustawić dla konkretnej konfiguracji, np. Debug, ale najlepiej zrobić to od razu dla wszystkich konfiguracji - wybierz odpowiednią pozycję z listy "Active solution Configuration"
  3. Z listy rozwijanej "Active solution platform" wybierz <New>.
  4. Jako nazwę platformy podaj x64 i kliknij OK. Możesz przekopiować ustawienia z domyślnej platformy Win32, ale nie będą się one niczym różnić, jeśli od utworzenia projektu nie modyfikowałeś żadnych parametrów.
  5. Upewnij się, że w głównym okienku "Configuration Manager" w tabelce jest wybrana platforma "x64" dla konfiguracji, z której będziesz korzystać.


/public/images/tutorials/gtav_cpp_intro/visualstudio_configuration_manager


/public/images/tutorials/gtav_cpp_intro/visualstudio_platform_x64


Dołączenie bibliotek i plików nagłówkowych

Czas dołączyć najistotniejszy element - Script Hooka V. Podpiąć musimy bibliotekę ScriptHookV.lib zawierającą implementację całej funkcjonalności zdefiniowanej w plikach nagłówkowych .h. Katalog z plikami nagłówkowymi dodamy do "include directories", aby można było wygodnie dołączać pliki bez potrzeby wprowadzania relatywnej ścieżki.


  1. Kliknij prawym przyciskiem myszy na nazwie projektu (projektu, a nie solution) i wybierz "Properties".
  2. Dla wygody, edytuj ustawienia dla wszystkich konfiguracji wybierając "All Configurations" na górze.
  3. W sekcji "Configuration properties -> VC++ Directories" przy "Include Directories" dodaj ścieżkę do katalogu "inc" w Script Hook V SDK. Np.
  4. Kod:
    C:\Users\MakG\Downloads\ScriptHookV_SDK_1.0.393.2\inc

  5. W sekcji "Configuration properties -> Linker -> General" dodaj przy "Additional Library Directories" ścieżkę do katalogu "lib" w Script Hook V SDK. Np.
  6. Kod:
    C:\Users\MakG\Downloads\ScriptHookV_SDK_1.0.393.2\lib

  7. W sekcji "Configuration properties -> Linker -> Input" przy "Additional Dependencies" dodaj nazwę pliku biblioteki - "ScriptHookV.lib". Zwróć uwagę na rozszerzenie, chodzi o plik .lib, nie o .dll.
  8. Zmień rodzaj pliku wyjściowego w sekcji "Configuration properties -> General". Ustaw "Target Extension" na ".asi", a "Configuration Type" na "Dynamic Library (dll)".


/public/images/tutorials/gtav_cpp_intro/visualstudio_config1


/public/images/tutorials/gtav_cpp_intro/visualstudio_config2


/public/images/tutorials/gtav_cpp_intro/visualstudio_config3


/public/images/tutorials/gtav_cpp_intro/visualstudio_config4


Struktura projektu i szablon

Projekt warto podzielić przynajmniej na dwa pliki, nawet w przypadku drobnych modów.

Kod:
main.cpp
script.cpp
script.h


Plik główny main.cpp będzie zwykle zawierał zawsze to samo - zarejestrowanie skryptu, do którego uchwyt znajduje się w pliku script.cpp, zarejestrowanie uchwytu do obsługi wejścia klawiatury/gamepada i opcjonalnie uchwyt do funkcjonalności DirectX. Jeżeli nie masz potrzeby rozszerzania pliku main.cpp o nowe metody, to najlepiej dołączyć plik nagłówkowy main.h bezpośrednio ze Script Hook V SDK. Po dodaniu "Include Directories" w poprzednim kroku można to zrobić bez podawania ścieżki - #include "main.h".

Plik script.cpp będzie zawierał właściwy kod, musi zawierać przynajmniej jedną metodę, do której odwołuje się funkcja rejestrująca skrypt w main.cpp. Poza tym zupełna dowolność, najlepiej rozbić funkcjonalności modu na więcej plików.

main.cpp
Kod:
#include "main.h"
#include "script.h"
#include "keyboard.h"

BOOL APIENTRY DllMain(HMODULE hInstance, DWORD reason, LPVOID lpReserved)
{
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
        scriptRegister(hInstance, ScriptMain);
        keyboardHandlerRegister(OnKeyboardMessage);
        break;
    case DLL_PROCESS_DETACH:
        scriptUnregister(hInstance);
        keyboardHandlerUnregister(OnKeyboardMessage);
        break;
    }
    return TRUE;
}


script.cpp
Kod:
#include <stdlib>
#include "script.h"

void main()
{
    // Kod, np. inicjalizacje obiektów, ustawienie startowych właściwości gracza, środowiska itd.
    
    while (true)
    {
        // Kod wymagający uruchomienia w pętli, np. wyświetlanie menu

        WAIT(0);
    }
}

void ScriptMain()
{
    srand(GetTickCount());
    main();
}


script.h
Kod:
#pragma once

#include "natives.h"
#include "types.h"
#include "enums.h"

#include "main.h"

void ScriptMain();
Dodane przez: MakG
Created & Powered by MakG
Wszelkie prawa zastrzeżone