Skocz do zawartości

    Zamknięty Zerowy index w eventach AMXX


    Ogen Dogen
     Udostępnij

    Rekomendowane odpowiedzi

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

    Top użytkownicy w tym temacie

    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

    Hej! Nie widzisz zawartości tego postu?
    Zaloguj się lub Zarejestruj nowe konto, aby korzystać ze wszystkich dostępnych funkcji!
    Odnośnik do komentarza
    Udostępnij na innych stronach

    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.

    Odnośnik do komentarza
    Udostępnij na innych stronach

    Hej! Nie widzisz zawartości tego postu?
    Zaloguj się lub Zarejestruj nowe konto, aby korzystać ze wszystkich dostępnych funkcji!
    Odnośnik do komentarza
    Udostępnij na innych stronach

    Hej! Nie widzisz zawartości tego postu?
    Zaloguj się lub Zarejestruj nowe konto, aby korzystać ze wszystkich dostępnych funkcji!
    Odnośnik do komentarza
    Udostępnij na innych stronach

    Hej! Nie widzisz zawartości tego postu?
    Zaloguj się lub Zarejestruj nowe konto, aby korzystać ze wszystkich dostępnych funkcji!
    Odnośnik do komentarza
    Udostępnij na innych stronach

    Hej! Nie widzisz zawartości tego postu?
    Zaloguj się lub Zarejestruj nowe konto, aby korzystać ze wszystkich dostępnych funkcji!
    Odnośnik do komentarza
    Udostępnij na innych stronach

    • 1 miesiąc później...
    Gość
    Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
     Udostępnij

    ×
    ×
    • Dodaj nową pozycję...
    Przeglądasz forum jako gość.
    Nie posiadasz dostępu do niektórych treści i funkcji!