Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Return a return PLUGIN_, kiedy używać ?


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 ToRRent

    Dirty Bomber

  • Power User

Reputacja: 227
Wszechwidzący

  • Postów:861
  • Steam:steam
  • Imię:Łukasz
  • Lokalizacja:Kraków
Offline

Napisano 30.08.2012 20:29

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
  • +
  • -
  • 0

ZdobywcyGier

YouTubeFacebook |  Twitch


#2 K!113r

    Czempion

  • Power User

Reputacja: 385
Wszechpomocny

  • Postów:865
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 30.08.2012 20:44

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.
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#3 Droso

    Dawniej HubertTM

  • Support Team

Reputacja: 1279
Godlike

  • Postów:2371
  • Steam:steam
  • Imię:Hubert
  • Lokalizacja:Tomaszów Mazowiecki
Offline

Napisano 30.08.2012 20:48

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

  • +
  • -
  • 0

Piszę pluginy pod: AMX MOD X oraz SOURCE MOD!

Na zlecenie i bez zlecenia zresztą też!


#4 speedkill

    Godlike

  • Przyjaciel

Reputacja: 1570
Godlike

  • Postów:2733
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Prudnik
Offline

Napisano 30.08.2012 20:57

https://forums.allie...ead.php?t=12504
  • +
  • -
  • 0

If you can dream it, you can do it.


#5 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1339
Godlike

  • Postów:3556
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 30.08.2012 20:59

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
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#6 ToRRent

    Dirty Bomber

  • Autor tematu
  • Power User

Reputacja: 227
Wszechwidzący

  • Postów:861
  • Steam:steam
  • Imię:Łukasz
  • Lokalizacja:Kraków
Offline

Napisano 30.08.2012 21:04

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
  • +
  • -
  • 0

ZdobywcyGier

YouTubeFacebook |  Twitch


#7 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 30.08.2012 21:07

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.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#8 ToRRent

    Dirty Bomber

  • Autor tematu
  • Power User

Reputacja: 227
Wszechwidzący

  • Postów:861
  • Steam:steam
  • Imię:Łukasz
  • Lokalizacja:Kraków
Offline

Napisano 30.08.2012 21:09

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

  • +
  • -
  • 0

ZdobywcyGier

YouTubeFacebook |  Twitch


#9 ToRRent

    Dirty Bomber

  • Autor tematu
  • Power User

Reputacja: 227
Wszechwidzący

  • Postów:861
  • Steam:steam
  • Imię:Łukasz
  • Lokalizacja:Kraków
Offline

Napisano 31.08.2012 12:07

public wywołujący błąd dodany post wyżej.
  • +
  • -
  • 0

ZdobywcyGier

YouTubeFacebook |  Twitch


#10 K!113r

    Czempion

  • Power User

Reputacja: 385
Wszechpomocny

  • Postów:865
  • GG:
  • Steam:steam
  • Imię:Mateusz
  • Lokalizacja:Piotrków Tryb.
Offline

Napisano 31.08.2012 14:29


#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 ?
  • +
  • -
  • 0

DarkGL to mój autorytet.

skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować skomplikować


#11 Jak się nazwać

    Wszechmogący

  • Power User

Reputacja: 170
Profesjonalista

  • Postów:617
  • Imię:a
  • Lokalizacja:a
Offline

Napisano 31.08.2012 14:55

=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
}

  • +
  • -
  • 0
Pisze na zamówienie statystyki pod nvault. GG: 15600964

#12 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 31.08.2012 22:51

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.

#13 ToRRent

    Dirty Bomber

  • Autor tematu
  • Power User

Reputacja: 227
Wszechwidzący

  • Postów:861
  • Steam:steam
  • Imię:Łukasz
  • Lokalizacja:Kraków
Offline

Napisano 01.09.2012 09:21

@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
  • +
  • -
  • 0

ZdobywcyGier

YouTubeFacebook |  Twitch





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych