Skocz do zawartości
  • Chmurka
  • Boróweczka
  • Jabłuszko
  • Limonka
  • Czekoladka
  • Węgielek
MAGNET

[Poradnik] Natywy/Forwardy

Polecane posty

Jeżeli spędziłeś już trochę czasu na programowaniu w pawnie, na pewno natknąłeś się na funkcje, które pobierają dane z innych pluginów, np. cod_get_user_class, które zwróci ID postaci, na której aktualnie gramy. Warto zauważyć, że owe informacje wychodzą bezpośrednio z silnika cod moda - następuje więc tutaj bezpośrednia wymiana informacji pomiędzy pluginami. W tym poradniku zajmiemy się po krótce tym zagadnieniem.

 

1. Funkcje natywne

Działanie "natywów" sprowadza się do zdalnego wywołania funkcji i ewentualnego zwrócenia rezultatu:

 

natyw.thumb.png.fbaf62ce8efbcd8a9bdc108b02cc3781.png

 

0 - Nasz plugin posiada funkcję natywną szarego pluginu

I - zlecamy wykonanie funkcji

II - szary plugin wykonuje polecenie

III - szary plugin zwraca otrzymany rezultat

IV - rezultat trafia do naszego pluginu

 

 

Teraz pokażę jak takiego natywa z szarego pluginu stworzyć. Przede wszystkim natywy dodajemy w takiej funkcji:

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)

Daje nam to pewność, że załadują się one w odpowiedniej chwili. 

 

Warto wspomnieć, że natywy możemy wczytywać pojedynczo, bądź jako biblioteka - tworzyć nasze własne pliki #include. W tym poradniku skupię się tylko na tej drugiej metodzie. Musimy więc najpierw zarejestrować naszą bibliotekę:

RegPluginLibrary("NaszaNazwa");

następnie dodajemy natywy w następujący sposób:

CreateNative("nazwa_natywu", Funkcja_Ktora_Ma_Sie_Wywolac);

na samym końcu zwracamy:

return APLRes_Success;

 

Teraz pora na Funkcja_Ktora_Ma_Sie_Wywolac. Natywy pozwalają nam również na bezproblemowe przekazywanie argumentów, jednak funkcja, o której przed chwilą wspomniałem, nie może po prostu tych argumentów przyjmować w nawiasach () - działa to w trochę inny sposób:

public int Funkcja_Ktora_Ma_Sie_Wykonac(Handle plugin, int numParams)
{
	int liczba = GetNativeCell(1);
	
	return liczba * 2;
}

po pierwsze, argumenty muszą być takie, jak wyżej - Handle plugin (uchwyt to NASZEGO pluginu), a także numParams (ilość parametrów, które przekazaliśmy)

Pobieranie argumentów odbywa się poprzez specjalne funkcje GetNative___ (polecam po prostu wpisać sobie "getnative" a także "setnative" w dokumentacji
Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami!). Każdorazowo pierwszy argument GetNative__ to numer argumentu z naszego wywołania (wyjątkowo numerujemy tutaj od 1!)

W przykładzie powyżej założyłem, że przekazany zostanie jedynie int, który zostanie przemnożony przez 2 i zwrócony.

 

Przykładowe zastosowanie:

Spoiler

/////////////// SZARY PLUGIN \\\\\\\\\\\\\\\\\\\
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
	RegPluginLibrary("GoCode");
	CreateNative("GC_PomnozPrzezDwa", FunkcjaMnozenia);
	return APLRes_Success;
}

public int FunkcjaMnozenia(Handle plugin, int numParams)
{
	int liczba = GetNativeCell(1);
	
	return liczba * 2;
}

//////////////// NASZ PLUGIN \\\\\\\\\\\\\\\\\\\

#include <GoCode>
  
public void JakasFunkcja(int client)
{
	int wynik = GC_PomnozPrzezDwa(5);
  	PrintToChat(client, "Wynik to %d", wynik); //wypisze 10
}

 

 

Pamiętajmy jednak, że ciągle nie stworzyliśmy biblioteki GoCode! Będzie ona wyglądać mniej więcej tak:

Spoiler

#if defined _GoCode_included_
  #endinput
#endif
#define _GoCode_included_

// mnozy otrzymana liczbe przez 2
native int GC_PomnozPrzezDwa(int liczba);

 

 

Tak przygotowany plik możemy zapisać jako GoCode.inc i wrzucić do naszego folderu include w kompilatorze. Koniec 🙂

 

2. Forwardy (coming soon)

 

  • Lubię to! 6

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×