Poprzedni tutorial napisany w tym temacie przez R3X był nieco pomieszany i moim zdaniem skupiał sie na niepotrzebnych elementach.
Czym są natywy?
Kluczowym elementem programowania jest API, którym w AMXXie są natywy.
Natywy to sposób komunikacji pomiędzy dwoma pluginami.
Pluginy podzielę na dwa typy:
- Plugin źródłowy - ten, w którym tworzymy natywy i ich działanie
- Plugin docelowy - ten, w którym będziemy używać natywów
Dzięki natywom możemy z pluginu źródłowego pobrać dane w pluginie docelowym lub je dowolnie modyfikować.
Przykładem idealnie odwzorowującym zasadę działania natywów jest exp mod.
Plugin exp moda może mieć w sobie zmienne pokroju
- userExp - zmienna, która przechowuje ilość expa, którą dany gracz posiada
- userLevel - zmienna, która przechowuje poziom gracza
Co jeśli chcemy wiedzieć jaki poziom ma gracz, lub ile ma expa?
Nie ma najmniejszego problemu w pluginie exp moda - w końcu mamy zmienne userExp i userLevel, ale co jeśli chcemy wiedzieć ile gracz ma expa i potrzebujemy tych danych w innym pluginie?
Z odpowiedzią przychodzą natywy - jak już wcześniej wspomniałem, pozwalają nam na komunikacje między pluginami.
Jak wykorzystać natywy?
Mimo, że w tutorialu rexa wydawało się to bardzo skomplikowane, natywy są bardzo proste w swojej zasadzie działania.
Prosty przykład, jak pobrać jakąś wartość z innego pluginu:
Plugin źródłowy:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" new const jakasWartosc = 7; public plugin_init() { register_plugin("x", "v0.1", AUTHOR); } // Natywy musza byc rejestrowane w plugin_natives za pomocą register_native. public plugin_natives() { // Rejestracja natywu o nazwie "pobierzWartosc", który wykona funkcję "publicNatywuPobierzWartosc". register_native("pobierzWartosc", "publicNatywuPobierzWartosc"); } // Co się wykona, kiedy w innym pluginie zostanie użyte pobierzWartosc. public publicNatywuPobierzWartosc() { return jakasWartosc; }
Plugin docelowy:
#include <amxmodx> #define AUTHOR "aSior - amxx.pl/user/60210-asiorr/" native pobierzWartosc(); public plugin_init() { register_plugin("x", "v0.1", AUTHOR); new wartosc = pobierzWartosc(); log_amx("Wartosc = %i", wartosc); // "Wartosc = 7" }
Pliki .inc
Pliki z roszerzeniem 'inc' to nic innego jak pliki tekstowe, które zawierają zbiór natywów (i nie tylko).
Jak wygląda plik .inc w pluginie dodającym nową walutę:
#if defined _moneySystem_included #endinput #endif #define _moneySystem_included native SetMoney(id, value); native GetMoney(id); native AddMoney(id, value);
Po krótce: pliki .inc są używane po to, żeby za każdym razem nie pisać 15 linijek z "native SetMoney(id, value);" i całą resztą natywów.
Na co pozwalają natywy
Dzięki nim wiemy jaki gracz ma poziom, exp, ile ma AP, JBPacków czy jaką ma klasę. To tylko powierzchowne przykłady, a natywy mogą zostać wykorzystane na tak wiele sposobów, że kiedy je lepiej poznamy, otwierają nam się drzwi na tak wiele opcji zaprogramowania pluginu, że ogranicza nas już tylko wyobraźnia.
Co dalej?
Jeśli dopiero nauczyłeś się czym są natywy - idź spróbuj sam. Oczywiście po przeczytaniu tego nie masz prawa zrozumieć wszystkiego ot tak, ale z drugiej strony nikt nie będzie Cię trzymał za rączkę.
Podrzucam parę tematów, z których można wyciągnąć informacje o tym, jak natywy zostały użyte w praktyce:
Po przeczytaniu różnych kodów nadejdzie czas na zapoznanie się z takimi rzeczami jak:
- Style natywów
- Typy danych zwracane przez natywy
- Formatowanie napisów / działanie na tablicach w natywach
Do podglądu zostawiam również stronę dokumentacji: register_native.