Jump to content

    Locked Zerowy index w eventach AMXX


    Recommended Posts

    • Cała zawartość 7
    • Temat został założony
    • Ostatnia odpowiedź

    Top Posters In This Topic

    Najpopularniejsze posty

    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

    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.

    Link to comment
    Share on other sites

    • 1 month later...
    Guest
    This topic is now closed to further replies.
     Share

    ×
    ×
    • Create New...
    You are viewing the forum as guest.
    You do not have access to some content and features!