Jump to content
Sign in to follow this  
Ogen Dogen

Zerowy index w eventach AMXX

7 posts in this topic

Recommended Posts

Właściciel

Jest to poradnik dla skrypterów AMXX , więc czytając ten poradnik powinieneś wiedzieć / znać :

- Podstawy scriptingu AMXX

- Podstawy PAWN'a

- Wiedzieć do czego służy zerowy index

- Wiedzieć co to są eventy.

W niektórych eventach nie prawidłowo jest stosowany zerowy index , ponieważ wykonuje on również operacje na graczach , którzy jeszcze nie weszli do gry. Jego zastosowanie nie jest błędem formalny , jednak powoduje on zasypywanie nas error logami i oczywiście źle to oddziaływuje na serwer.

Przykładowy error log :

L 03/06/2013 - 17:02:38: [AMXX] Displaying debug trace (plugin "cskatowice.amxx")

L 03/06/2013 - 17:02:38: [AMXX] Run time error 4: index out of bounds

L 03/06/2013 - 17:02:38: [AMXX] [0] colorchat.inc::ColorChat (line 53)

L 03/06/2013 - 17:02:38: [AMXX] [1] cskatowice.sma::client_disconnect (line 986)

Z ostatniej linijki odczytujemy numer linijki w kodzie do którego się odnosi błąd i przechodzimy już do kodu. Załóżmy że chcemy zrobić powitanie na serwerze dla VIP'a jeszcze gdy się łączy. Do tego potrzebny nam jest event client_connect

public client_connect(id)
{
   if (access(id,ADMIN_LEVEL_A))
   {
        new nick[32];
        get_user_name(id,nick,31);
        ColorChat(0,GREEN,"VIP %s wbija na serwer !",nick);
   }
   return PLUGIN_HANDLED;
}

Taki zapis właśnie powoduje błąd. Dlatego najlepszym rozwiązaniem tutaj jest zapisanie sobie id gracza na którym wykonuje się event i przekazać go do drugiej zwykłej funkcji.

new pid;
public client_connect(id)
{
   if (access(id,ADMIN_LEVEL_A))
   {
       pid=id;
       new nick[32];
       get_user_name(id,nick,31);
       cskatowice(id);
   }
   return PLUGIN_HANDLED;
}

public cskatowice(id)
{
   newPlayers[32],Num;
   get_players(Players,Num);
   for(i=0; i<Num; i++)
   {
       new id=Players;
       if(pid!=id)ColorChat(id,GREEN,"VIP %s wbija na serwer",nick);
   }
   return PLUGIN_HANDLED;
}

Teraz opiszę zasadę działania tego cuda.

Podczas eventu sprawdzamy czy gracz ma flagę VIP'a. Jeśli tak to pobieramy nick , zapisujemy id danego gracza do zmiennej i przekazujemy dalej (jako id) do drugiej funkcji.

Przechodzimy dalej. Tutaj mamy pętle wykonującą operacje na wszystkich graczach.

Więc czym różni się od zerowego indexu ? Zerowy index wykonuje dana natywe na wszystkich graczach bez wyjątku (również HLTV) bądź niektóre na serwerze , który również jest graczem (o tym kiedy indziej).

A taka pętla pozwala nam na więcej instrukcji i natyw oraz wykluczenie niektórych graczy np. terrorystów i/lub HLTV. A kogo wykluczyliśmy w tej funkcji ?

Właśnie tego gracza , który wchodzi na serwer. Pokaże to jeszcze na przykładzie :

Załóżmy że gracz który się łączy ma id = 5

Zapisujemy je do zmiennej i w drugiej funkcji porównujemy ją z id które jest liczone od 1.

if (pid!=id)

Gdy zmienna jest różna od ID wyświetl informacje. Kroki pętli będą takie :

id = 1 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 2 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 3 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 4 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 5 -> Czy różne od 5 ? -> Nie. Nic nie rób.

Poradnik ma na celu pomóc w diagnostyce błędów. Mam nadzieję że dogłębnie napisałem jak pozbyć się tego typu error loga.

Share this post


Link to post
Share on other sites
Właściciel

Jest to poradnik dla skrypterów AMXX , więc czytając ten poradnik powinieneś wiedzieć / znać :

- Podstawy scriptingu AMXX

- Podstawy PAWN'a

- Wiedzieć do czego służy zerowy index

- Wiedzieć co to są eventy.

W niektórych eventach nie prawidłowo jest stosowany zerowy index , ponieważ wykonuje on również operacje na graczach , którzy jeszcze nie weszli do gry. Jego zastosowanie nie jest błędem formalny , jednak powoduje on zasypywanie nas error logami i oczywiście źle to oddziaływuje na serwer.

Przykładowy error log :

L 03/06/2013 - 17:02:38: [AMXX] Displaying debug trace (plugin "cskatowice.amxx")

L 03/06/2013 - 17:02:38: [AMXX] Run time error 4: index out of bounds

L 03/06/2013 - 17:02:38: [AMXX] [0] colorchat.inc::ColorChat (line 53)

L 03/06/2013 - 17:02:38: [AMXX] [1] cskatowice.sma::client_disconnect (line 986)

Z ostatniej linijki odczytujemy numer linijki w kodzie do którego się odnosi błąd i przechodzimy już do kodu. Załóżmy że chcemy zrobić powitanie na serwerze dla VIP'a jeszcze gdy się łączy. Do tego potrzebny nam jest event client_connect

public client_connect(id)
{
   if (access(id,ADMIN_LEVEL_A))
   {
        new nick[32];
        get_user_name(id,nick,31);
        ColorChat(0,GREEN,"VIP %s wbija na serwer !",nick);
   }
   return PLUGIN_HANDLED;
}

Taki zapis właśnie powoduje błąd. Dlatego najlepszym rozwiązaniem tutaj jest zapisanie sobie id gracza na którym wykonuje się event i przekazać go do drugiej zwykłej funkcji.

new pid;
public client_connect(id)
{
   if (access(id,ADMIN_LEVEL_A))
   {
       pid=id;
       new nick[32];
       get_user_name(id,nick,31);
       cskatowice(id);
   }
   return PLUGIN_HANDLED;
}

public cskatowice(id)
{
   newPlayers[32],Num;
   get_players(Players,Num);
   for(i=0; i<Num; i++)
   {
       new id=Players;
       if(pid!=id)ColorChat(id,GREEN,"VIP %s wbija na serwer",nick);
   }
   return PLUGIN_HANDLED;
}

Teraz opiszę zasadę działania tego cuda.

Podczas eventu sprawdzamy czy gracz ma flagę VIP'a. Jeśli tak to pobieramy nick , zapisujemy id danego gracza do zmiennej i przekazujemy dalej (jako id) do drugiej funkcji.

Przechodzimy dalej. Tutaj mamy pętle wykonującą operacje na wszystkich graczach.

Więc czym różni się od zerowego indexu ? Zerowy index wykonuje dana natywe na wszystkich graczach bez wyjątku (również HLTV) bądź niektóre na serwerze , który również jest graczem (o tym kiedy indziej).

A taka pętla pozwala nam na więcej instrukcji i natyw oraz wykluczenie niektórych graczy np. terrorystów i/lub HLTV. A kogo wykluczyliśmy w tej funkcji ?

Właśnie tego gracza , który wchodzi na serwer. Pokaże to jeszcze na przykładzie :

Załóżmy że gracz który się łączy ma id = 5

Zapisujemy je do zmiennej i w drugiej funkcji porównujemy ją z id które jest liczone od 1.

if (pid!=id)

Gdy zmienna jest różna od ID wyświetl informacje. Kroki pętli będą takie :

id = 1 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 2 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 3 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 4 -> Czy różne od 5 ? -> Tak , wyświetl.

id = 5 -> Czy różne od 5 ? -> Nie. Nic nie rób.

Poradnik ma na celu pomóc w diagnostyce błędów. Mam nadzieję że dogłębnie napisałem jak pozbyć się tego typu error loga.

Share this post


Link to post
Share on other sites
Właściciel

najz

Share this post


Link to post
Share on other sites
Właściciel

najz

Share this post


Link to post
Share on other sites

gitara ;p

Share this post


Link to post
Share on other sites

gitara ;p

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...