←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Return a return PLUGIN_, kiedy używać ?

  • +
  • -
ToRRent - zdjęcie 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
Odpowiedz

  • +
  • -
K!113r - zdjęcie K!113r 30.08.2012

Też mnie to intryguje i miałem temat napisać xD

Wiem tyle że return; lub return PLUGIN_HANDLED; zatrzymuje wykonanie funkcji w miejscu gdzie jest wpisany return.
Odpowiedz

  • +
  • -
Droso - zdjęcie 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 :D Zawsze uzywam albo Han/Con. [chyba ze zwracam cos w natywie :D]
Użytkownik HubertTM edytował ten post 30.08.2012 20:53
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie 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
Odpowiedz

  • +
  • -
ToRRent - zdjęcie 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
Odpowiedz

  • +
  • -
sebul - zdjęcie 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.
Odpowiedz

  • +
  • -
ToRRent - zdjęcie 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
Odpowiedz

  • +
  • -
ToRRent - zdjęcie ToRRent 31.08.2012

public wywołujący błąd dodany post wyżej.
Odpowiedz

  • +
  • -
K!113r - zdjęcie 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 :D)
Czy "return;" nie zwraca nic czy zwraca 0 - czyli PLUGIN_CONTINUE ?
Odpowiedz

  • +
  • -
Jak się nazwać - zdjęcie 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

/* 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
}
Odpowiedz

Gość_21977_* 31.08.2012

Funkcja return bez względu na zwracaną wartość, przerywa wywołanie funkcji.
  • 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.
Innymi słowy,
  • 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
Ponadto warto zauważyć, że istotna jest kolejność pluginów w pliku plugins.ini
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.
Odpowiedz

  • +
  • -
ToRRent - zdjęcie ToRRent 01.09.2012

@benio101 to akurat wiem, lecz dalej nie uzyskałem poprawnej odpowiedzi na zadane przeze mnie pytania :D

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
Odpowiedz