←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Natywy "Wywołania"

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

Witam potrzebuję zrobić natywów wywołania na moje oko przypominają one natywy z coda chodzi dokładniej o register_class
potrzebuje zrobić coś takiego aby zarejestrować 4 zmienne 2 consty i 2 zwykłe następnie pobrać id zarejestrowanego pluginu i go wywołać.

Zrobiłem sobie takie coś
include:
native NU_register(const nazwa[], const opis[], mana, odpocznij);
I tu w głównym pluginie takie coś zaczerpnięte z coda ale zapewne jest to źle zrobione:
public ZarejestrujNazwy(plugin, params)
{
if(params != 4)
  return PLUGIN_CONTINUE;

get_string(1, nazwy_klas[ilosc_nazw], MAX_WIELKOSC_NAZWY);
get_string(2, opisy_klas[ilosc_nazw], MAX_WIELKOSC_OPISU);

czakra[ilosc_nazw] = get_param(3);
odpocznij[ilosc_nazw] = get_param(4);

return ilosc_nazw;
}
Do tego rejestruje mój plugin o to takim kodem
NU_register(nazwa, opis, mana, odpocznij);

I teraz moje pytanie grzmi jak zrobić takie coś w stylu wywołania np:
NU_Wywołaj(id, "Nazwa")
i jak zrobić aby przy takim wywołaniu czytało funkcje z danego publica.
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 24.04.2012

nie widzę tu rejestrowania natywu w plugin_natives

I teraz moje pytanie grzmi jak zrobić takie coś w stylu wywołania np:

NU_Wywołaj(id, "Nazwa")
i jak zrobić aby przy takim wywołaniu czytało funkcje z danego publica.

:huh:
zarejestruj kolejny natyw który będzie zwracał dane z tablic które ustawiasz w pierwszym natywie
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

Czyli mam stworzyć natywy do nazwy, opisu, many i odpoczynku ?
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

Tak, i każdy natyw musisz zarejestrować w funkcji plugin_natives()
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

No dobra gdy już to zrobiłem no to co dalej mam robić skoro nadal nie wiem jak pobrać i wykonać działanie drugiego pluginu gdzie użyłem zarejestrowania natywu
NU_register(nazwa, opis, mana, odpocznij);

czytałeś http://amxx.pl/topic/20034-natywy/ ?

Tak czytałem to 3 razy zanim napisałem na forum i nadal mi nie wychodzi.

Nie wiem czy mnie dobrze zrozumieliście chcę po prostu zarejestrować z innego pluginu daną rzecz, aby móc ją potem odtworzyć w mniej więcej takim wyglądzie
NU_Wywołaj(id, "Nazwa")
Nie chce tworzyć do każdego pluginu osobnego natywu.
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

DarkGL podał ci linka, przeczytaj cały temat a się wszystkiego dowiesz, nie ma co pisać dwa razy to samo.

Dobra, więc musisz utworzyć kilka tablic, które będą trzymały dane podawane przy rejestracji dodatkowego pluginu.

W pluginie, w którym wywołujesz natyw piszesz: "new ilosc=NU_register(...);"
Wynik, który zwróci plugin "dowodzący" będziesz miał w zmiennej ilosc.
Natomiast w funkcji, którą wykonuje natyw dopisujesz do tablic wszystkie dane, które przekazał drugi plugin oraz pasowałoby zwiększyć utworzoną wcześniej zmienną globalną, która będzie trzymała ilość np. klas.
Użytkownik Zapalka edytował ten post 24.04.2012 16:13
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

Kawałek mojego kodu
new const nazwa[] = "Nazwa";
new const opis[] = "Opis";
new mana = 40;		/// Potrzebna mana
new odpocznij = 6;	  /// Odpoczynek liczony 0,5sekundy w tym przypadku trwa 3 sekundy.
/////////////////////////////////////////////////////////
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
NU_register(nazwa, opis, mana, odpocznij);

gMaxPlayers = get_maxplayers();
}

No tu coś takiego mam no to domyślam się że w tym pluginie mam dobrze i teraz w głównym pluginie jak mam zrobić aby tamte wartości były przekazywane w takim formacie aby szło je odczytać po przez jakieś id czy coś bo normalnie to jest jedna wielka mieszanka która się będzie nadpisywać w przypadku zwykłego natywu (bynajmniej mi się tak zdaje)
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

No to pokaż jak masz zrobione teraz w tym drugim pluginie.
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

Rejestruje natyw.
public plugin_natives()
{
register_library("nu");
register_native("NU_registe", "Zarejestruj");
}
natyw

public Zarejestruj(plugin, params)
{
if(params != 4)
return PLUGIN_CONTINUE;

get_string(1, nazwy_klas[ilosc_nazw], MAX_WIELKOSC_NAZWY);
get_string(2, opisy_klas[ilosc_nazw], MAX_WIELKOSC_OPISU);

czakra[ilosc_nazw] = get_param(3);
odpocznij[ilosc_nazw] = get_param(4);

return ilosc_nazw;
}


Co do tego publica zarejestruj jestem pewny że jest zły.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 24.04.2012

"ilosc_nazw" oczywiście masz gdzieś w globalnych zmiennych?
Musi być tak
public Zarejestruj(plugin, params)
{
if(params != 4)
return PLUGIN_CONTINUE;

get_string(1, nazwy_klas[ilosc_nazw], MAX_WIELKOSC_NAZWY);
get_string(2, opisy_klas[ilosc_nazw], MAX_WIELKOSC_OPISU);

czakra[ilosc_nazw] = get_param(3);
odpocznij[ilosc_nazw] = get_param(4);

return ilosc_nazw++;
}

czyli wpisy w tabeli będą się zaczynać od 0, albo tak
public Zarejestruj(plugin, params)
{
if(params != 4)
return PLUGIN_CONTINUE;

get_string(1, nazwy_klas[++ilosc_nazw], MAX_WIELKOSC_NAZWY);
get_string(2, opisy_klas[ilosc_nazw], MAX_WIELKOSC_OPISU);

czakra[ilosc_nazw] = get_param(3);
odpocznij[ilosc_nazw] = get_param(4);

return ilosc_nazw;
}

czyli wpisy będą się zaczynać od 1.
Do tego musisz dać jakiś warunek, co by nie dało się przepełnić tabel.
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

Zaraz prze testuje tylko mam pytanie jak teraz z tego odczytać dane ?
Odpowiedz

  • +
  • -
Fili:P - zdjęcie Fili:P 24.04.2012

Robisz natyw do każdej danej, np. get_user_mana itd.
przykład z achieventów:

public _ach_get_target(plugin, params)
{
if(params != 1)
{
return 0;
}
new ach_id = get_param(1);
return ArrayGetCell(AchTarget, ach_id);
}
public _ach_get_name(plugin, params)
{
if(params != 3)
{
return 0;
}
new ach_id = get_param(1);
new iAchName[64];
ArrayGetString(AchName, ach_id, iAchName, 63);
set_string(2, iAchName, get_param(3));
return 1;
}
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

Utwórz nowy natyw, w którym będziesz zwracał daną wartość, np. funkcja natywu: "public PobierzNazwe(id) return nazwy_klas[id];"
I w drugim pluginie tak: "new nazwa=PobierzNazwe(jakiesID);"
Jako id podstawiasz identyfikator klasy, który otrzymujesz przy rejestrowaniu danego pluginu.

#Edit

Fii mnie uprzedził :P
Użytkownik Zapalka edytował ten post 24.04.2012 16:58
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

czyli przykładowo coś takiego zadziała ?
public Native_KosztMana(plugin, params)
koszt_mana=params;

Jeżeli tak to użycie będzie
Native_KosztMana(1)
?
1 - to idenfikator
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

Nie.
Zrób to tak:
public Native_KosztMana(id)
return koszt_mana[id];


I użycie:
new koszt=Native_KosztMana(1);


Tylko przy rejestrowaniu natywu musisz dodać trzeci argument(style) i nadać mu wartość 1.
register_native("Native_KosztMana", "Native_KosztMana", 1);

Użytkownik Zapalka edytował ten post 24.04.2012 17:15
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

A czy w jakiś sposób zamiast id idzie wpisać nazwę z consta nazwa?
aby
Native_KosztMana(1);
zamienić na np
Native_KosztMana("Test");
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 24.04.2012

Wtedy musisz znaleźć id wybranego elementu. np.

public Native_PobierzID(nazwa[])
{
for(new i=0;i<ilosc_nazw;i++)
{
if(equal(nazwy_klas[i],nazwa))
return i;
}
return -1;
}


No i możesz wtedy zrobić tak:
Native_KosztMana(Native_PobierzID("Test"));
Odpowiedz

  • +
  • -
ELOS - zdjęcie ELOS 24.04.2012

A czy nie da się od razu tego wbudować w funkcje zarejestruj albo kosztmana aby nie przedłużać kodu ?

I teraz jeszcze jedno pytanie jak użyć np publica
public start(id)
{
	 //kod
}
W danym pluginie używając
Native_PobierzID("Test")
Odpowiedz

  • +
  • -
Zapalka - zdjęcie Zapalka 25.04.2012

Dodaj wykonanie start(id); do funkcji Native_PobierzID
Odpowiedz