Return a return PLUGIN_, kiedy używać ?
ToRRent
30.08.2012
Od dlugiego czasu nurtuje mnie to pytanie, kiedy przy sprawdzaniu warunkow mam pisac samo return; a kiedy mam pisac return cos; np. PLUGIN_CONTINUE ? Czy to ma zwiazek z publicami / forwardami ?
Czy wlasnie przez zly return moge miec bledy "run time error 3: stack error" ?
Wysłane z Samsunga Galaxy GT-I5510
Czy wlasnie przez zly return moge miec bledy "run time error 3: stack error" ?
Wysłane z Samsunga Galaxy GT-I5510
K!113r
30.08.2012
Też mnie to intryguje i miałem temat napisać
Wiem tyle że return; lub return PLUGIN_HANDLED; zatrzymuje wykonanie funkcji w miejscu gdzie jest wpisany return.
Wiem tyle że return; lub return PLUGIN_HANDLED; zatrzymuje wykonanie funkcji w miejscu gdzie jest wpisany return.
Droso
30.08.2012
Opisze swoje myślenie:
HANDLED - jak chcesz zablokować coś w grze [nie chodzi o funkcje] chodzi o np. kupowanie broni, bo jakbyś wstawił CONTINUE to się wywoła.
CONTINUE - wywołuje jak chce zablokować wywołanie funkcji. [np. gracz jest nie zywy, wiec blokuje to CONTINUE
HANDLED - blokowanie eventów silnika
CONTINUE - blokowanie wywołania funkcji, ale nie blokuje wydarzeń. [wywołujesz najczęściej w warunkach gdzie sprawdzasz gracza [zywotnosc etc.]]
Możesz także zwrócić samo return, ale chyba działanie jest takie same(?) [podobne(?)] jak CONTINUE.
Możliwe, że to ostatnio zdanie to głupota Zawsze uzywam albo Han/Con. [chyba ze zwracam cos w natywie :D]
Użytkownik HubertTM edytował ten post 30.08.2012 20:53
HANDLED - jak chcesz zablokować coś w grze [nie chodzi o funkcje] chodzi o np. kupowanie broni, bo jakbyś wstawił CONTINUE to się wywoła.
CONTINUE - wywołuje jak chce zablokować wywołanie funkcji. [np. gracz jest nie zywy, wiec blokuje to CONTINUE
HANDLED - blokowanie eventów silnika
CONTINUE - blokowanie wywołania funkcji, ale nie blokuje wydarzeń. [wywołujesz najczęściej w warunkach gdzie sprawdzasz gracza [zywotnosc etc.]]
Możesz także zwrócić samo return, ale chyba działanie jest takie same(?) [podobne(?)] jak CONTINUE.
Możliwe, że to ostatnio zdanie to głupota Zawsze uzywam albo Han/Con. [chyba ze zwracam cos w natywie :D]
Użytkownik HubertTM edytował ten post 30.08.2012 20:53
G[o]Q
30.08.2012
return to return a PLUGIN_HANDLED I CONTINUE to makrodefinicje i silnik jest tak napisany że HANDLED przerywa działania silnika zaś CONTINUE nie robi nic za wyjscie z funkcji odpowiada sam return
ToRRent
30.08.2012
No ok, odpowiedzieliscie na pierwsze pytanie ale dalej nie wiem kiedy uzywac samo return a kiedy return z makrodefinicja jak to stwierdzil GoQ bo public w ktorym mam blad "stack error" nie wyglada na pierwszy rzut oka by sie zapetlala w nieskonczonosc, stad patrzac na to ze zrobilem if(is_user_connected(id)) return; zastanawialem sie czy to na prawde jest roznica miedzi samym return a PLUGIN_CONTINUE
Wysłane z Samsunga Galaxy GT-I5510
Wysłane z Samsunga Galaxy GT-I5510
sebul
30.08.2012
Pokaż kod, to będzie wiadomo, co jest nie tak. W każdym razie, jeśli używasz w jakiejś funkcji samo return (wyjście z funkcji), to nie możesz w takiej funkcji już zwracać czegokolwiek.
ToRRent
30.08.2012
public WybuchInit(id) { if(!is_user_connected(id)) return PLUGIN_CONTINUE; wybuchnie[id] = false new Float:fOrigin[3], iOrigin[3]; entity_get_vector( id, EV_VEC_origin, fOrigin); iOrigin[0] = floatround(fOrigin[0]); iOrigin[1] = floatround(fOrigin[1]); iOrigin[2] = floatround(fOrigin[2]); message_begin(MSG_BROADCAST,SVC_TEMPENTITY, iOrigin); write_byte(TE_EXPLOSION); write_coord(iOrigin[0]); write_coord(iOrigin[1]); write_coord(iOrigin[2]); write_short(sprite_blast); write_byte(32); write_byte(20); write_byte(0); message_end(); new entlist[MAX + 1]; new numfound = find_sphere_class(id, "player", 400.0 , entlist, 32); for (new i=0; i < numfound; i++) { new pid = entlist[i]; if (is_user_alive(pid) && get_user_team(id) != get_user_team(pid) && is_user_connected(pid)) UTIL_Kill(id, pid, float(get_user_health(pid)), DMG_BULLET) } user_silentkill(id); return PLUGIN_CONTINUE; }
Użytkownik =ToRRent= edytował ten post 31.08.2012 12:03
K!113r
31.08.2012
#define PLUGIN_CONTINUE 0 /* Results returned by public functions */
#define PLUGIN_HANDLED 1 /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2 /* to use in client_command(), continue all plugins but stop the command */
(przepraszam że to ciągnę, ale jak już jest temat to skorzystam )
Czy "return;" nie zwraca nic czy zwraca 0 - czyli PLUGIN_CONTINUE ?
Jak się nazwać
31.08.2012
=ToRRent=
W twoim kodzie wystarczy samo return ale różnicy to żadniej nie robi.
No to prosty przykład podam z użyciem HANDLED i CONTINUE
W twoim kodzie wystarczy samo return ale różnicy to żadniej nie robi.
No to prosty przykład podam z użyciem HANDLED i CONTINUE
/* Script generated by Pawn Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "New Plugin"
#define AUTHOR "Unknown"
#define VERSION "1.0"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say Admin!", "Admin");
}
public Admin(id)
{
if(get_user_flags(id) & ADMIN_BAN) //jezeli jestesmy adminem to:
return PLUGIN_HANDLED; // zwracamy HANDLED wiec blokujemy komende co skutkuje tym ze nie pojawi sie na say-u
return PLUGIN_CONTINUE; // pawn jest tak napisany ze jezeli zwracamy cos w funkcji to na koncu tez musiby cos zwrocic
//czyli skoro nie jestesmy adminem to napis zostanie normalnie wyswietlony
}
Gość_21977_* 31.08.2012
Funkcja return bez względu na zwracaną wartość, przerywa wywołanie funkcji.
Mając przykładowo takie pluginy:
Pierwszy plugin całkowicie blokuje say (PLUGIN_HANDLED), drugi natomiast blokuje jedynie brzydkie słowa (PLUGIN_HANDLED),
karząc śmiercią, pozostałe zaś przepuszczając (pozwalając na ich wypowiedzenie) (PLUGIN_CONTINUE).
Jeśli pierwszy plugin będzie u góry, to najpierw zostanie wysłana wartość PLUGIN_HANDLED, która drugiemu pluginowi
nie pozwoli ukarać śmiercią w przypadku brzydkich słów (wcześniej została zwrócona wartość PLUGIN_HANDLED).
Jeśli pluginy byłyby w odwrotnej kolejności, to brzydkie słowa
zostałyby nagrodzone śmiercią, a cały say i tak zablokowany.
To był przykład na istotę kolejności dodawanych pluginów w plugins.ini w powiązaniu z tematyką wątku.
- PLUGIN_CONTINUE zwracasz, by po prostu zakończyć działanie funkcji.
Zwrócenie tej wartości nic ponad przerwaniem wywołania funkcji, nie zmienia. - PLUGIN_HANDLED zwracasz, by uniemożliwić dalsze wykonanie danej komendy,
danego zdarzenia czy innego hooka. Przerwany hook nie objawi się ani w grze
ani w żadnym z kolejnych wywołań hooka, także w innych pluginach. - PLUGIN_HANDLED_MAIN zwracasz, by uniemożliwić dalsze wykonanie danej komendy,
danego zdarzenia czy innego hooka jedynie w silniku gry podczas, gdy każde kolejne
wywołanie hooka, także przez inne pluginy, będzie dalej możliwe do wykonania.
- PLUGIN_CONTINUE nie robi nic,
- PLUGIN_HANDLED przerywa dalsze działanie i dla silnika i dla innych pluginów
- PLUGIN_HANDLED_MAIN przerywa działanie tylko dla silnika, nie dla innych pluginów
Mając przykładowo takie pluginy:
#include <amxmodx>
public plugin_init(){
register_plugin("no say", "0.1", "test");
register_clcmd("say","say");
}
public say(id){
return PLUGIN_HANDLED;
}
#include <amxmodx>
public plugin_init(){
register_plugin("clean say", "0.1", "test");
register_clcmd("say","say");
}
public say(id){
new Speech[192];
read_args(Speech,191);
remove_quotes(Speech);
if(is_user_alive(id) && equali(Speech, "brzydkie_slowo")){
user_kill(id);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
Pierwszy plugin całkowicie blokuje say (PLUGIN_HANDLED), drugi natomiast blokuje jedynie brzydkie słowa (PLUGIN_HANDLED),
karząc śmiercią, pozostałe zaś przepuszczając (pozwalając na ich wypowiedzenie) (PLUGIN_CONTINUE).
Jeśli pierwszy plugin będzie u góry, to najpierw zostanie wysłana wartość PLUGIN_HANDLED, która drugiemu pluginowi
nie pozwoli ukarać śmiercią w przypadku brzydkich słów (wcześniej została zwrócona wartość PLUGIN_HANDLED).
Jeśli pluginy byłyby w odwrotnej kolejności, to brzydkie słowa
zostałyby nagrodzone śmiercią, a cały say i tak zablokowany.
To był przykład na istotę kolejności dodawanych pluginów w plugins.ini w powiązaniu z tematyką wątku.
ToRRent
01.09.2012
@benio101 to akurat wiem, lecz dalej nie uzyskałem poprawnej odpowiedzi na zadane przeze mnie pytania
I na to wychodzi że wina jest po stronie amxx 1.8.1 bo nikt nic nie pisze że public który podałem zawiera błędy
I na to wychodzi że wina jest po stronie amxx 1.8.1 bo nikt nic nie pisze że public który podałem zawiera błędy