set_task wywoływanie funkcji o określonym czasie

Poradniki dotyczące scriptingu. Jeśli jesteś zainteresowany pisaniem własnych pluginów bądź chcesz nauczyć się pisać pluginy, koniecznie zajrzyj tutaj.
Post Reply
User avatar
marcon
Administrator
Administrator
Posts: 2417
Joined: 13-08-2009 19:24
Location: /root
Contact:

set_task wywoływanie funkcji o określonym czasie

Post by marcon »

Czasami potrzeba nam wywołać jakąś funkcję kilka sekund przed lub po jakimś wydarzeniu bądź też uruchamiać jakąś funkcję co kilka / kilkadziesiąt sekund. W takim wypadku koniecznym będzie zapoznanie się z funkcją set_task.

Podstawowa składnia

Code: Select all

set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 ) 


Opis poszczególnych parametrów

  1. Float:time jest to czas w sekundach, po jakim funkcja ma zostać wywołana. Należy pamiętać, że czas podajemy jako float. Co to oznacza ? Czas musi być zapisany w systemie dziesiętnym, z jednym miejscem po kropce. Mówiąc najprościej jeśli chcemy aby funkcja była wykonywana po upływie 10 sekund zamiast 10 podajemy 10.0
  2. const function[] nazwa funkcji jaką chcemy wywołać
  3. id jest to po prostu id. Należy pamiętać o tym aby każdy task ( zadanie ) miał unikalne id. Jeśli pozostawimy ten parametr pusty ( będzie on niezdefiniowany ) to automatycznie przybierze on wartość 0. Znając id taska można wykonać na nim dodatkowe operacje o czym opowiem w dalszej części artykułu.
  4. parameter[] tutaj możesz dodać dowolną liczbę dodatkowych parametrów ( ich liczbę umieszczasz w zmiennej len )
  5. len ilość elementów dodanych w parameter[]
  6. flags[] flaga, parametr ten określa sposób w jaki będzie wywoływany task
    • "a" powtarzaj zadanie określoną w zmiennej repeat liczbę razy.
    • "b" powtarzaj zadanie aż do zmiany mapy / wyłączenia serwera bądź aż do momentu "zabicia" taska
    • "c" wykonaj zadanie po czasie
    • "d" wykonaj zadanie przed czasem
  7. repeat liczba powtórzeń taska. Brana jest pod uwagę tylko jeśli tasa ma flagę "a"

Dodatkowe operacje

Jak już wcześniej wspomniałem znając id taska możemy wykonać na nim dodatkowe operacje :

Code: Select all

task_exists ( id = 0, outside = 0 ) // sprawdź czy task o danym id istnieje
change_task ( id = 0, Float:newTime=1.0, outside = 0 ) // zmień czas wykonania zadania
remove_task ( id = 0, outside = 0 ) // bezpowrotnie usuń task o danym id      


Pojawił się zatem dodatkowy parametr outside. Do czego on służy ? Jeśli ustawimy go na 1 będziemy mogli operować na taskach nie pochodzących od danego pluginu.

Przykłady

Jako przykład napiszmy plugin, który co 60 sekund od momentu startu mapy wypisuje wszystkim graczom jakąś wiadomość :

Code: Select all

/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "set_task test"
#define VERSION "1.0"
#define AUTHOR "marcon"

public plugin_init( )
{
    register_plugin( PLUGIN, VERSION, AUTHOR );
    
    set_task
( 60.0, "print", _, _, _, "b" );
}

public print( )
{
        client_print( 0, print_chat, "Wiadomosc" );
}
 


Gotowe ;) ID taska możemy również użyć np. do przekazania wywoływanej funkcji id gracza, u którego chcemy wywołać jakieś działanie. Przykład :

Code: Select all

/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "set_task test"
#define VERSION "1.0"
#define AUTHOR "marcon"

public plugin_init( )
{
    register_plugin( PLUGIN, VERSION, AUTHOR );
}

public client_authorized( id )
{
        set_task( 15.0, "print", id );
}

public print( id )
{
    new nick[ 32 ];

    get_user_name( id, nick, 31 );

    client_print( id, print_chat, "Witaj %s", nick );
}
 


Powyższy plugin po 15 sekundach powita gracza, który właśnie dołączył do gry :) Powitanie zostanie wyświetlone tylko i wyłącznie jemu.

Absolutny zakaz kopiowania !

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest