set_task - funkcje czasowe
Miczu
09.12.2008
Często bywa tak, że chcemy by jakaś akcja w cs'ie odbyła się z pewnym opóźnieniem lub trwała jakiś czas. Najbardziej podstawowym sposobem by to wykonać, jest użycie funkcji set_task - jest ona podstawową funkcja amxx'a.
Konstrukcja tej funkcji ma postać:
set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 )
Omówie teraz poszczególne parametry:
time (typ float - zmienno przecinkowy) - tu podajemy czas w sekundach po jakim ma być wywołana funkcja. Może to być liczba znana już przed kompilacją (np 10.0 - zawsze dajemy wartość po przecinku, nawet jak jest to liczba całkowita). Może to też być zdeklarowana zmienna typu float o dowolnej wartości (choć rozsądek podpowiada by to były liczby nie ujemne ;> )
function[] - jak nam zdradza oznaczenie ' [] ' zmienna ta zbudowana jest z ciągu znakowego. Ciąg ten musi być nazwą funkcji w naszym plugu.
id - zmienna id oznacza nr identyfikacyjny naszego task'a. Jeśli jej nie zdeklarujemy (tj. użyjmy taska tylko z 2 parametrami), to id będzie miało wartość 0. Istotną rzeczą, jak też często pomijaną przez programistów jest zadbanie by nasz task miał jedyną w swoim rodzaju nr. id.
Znajomość id taska daje nam dostęp do następujących funkcji:
task_exists ( id = 0, outside = 0 ) - sprawdzanie czy task o podanym id istnieje
change_task ( id = 0, Float:newTime=1.0, outside = 0 ) - zmienianie czasu wywołania taska
remove_task ( id = 0, outside = 0 ) - usuwa taska o podanym id - funkcja nie zostaje wywołana a dane zawarte w tasku zostają utracone.
outside - gdy wartość jest równa 1 to są też brane taski z poza naszego pluga.
parameter - tutaj możemy przechowywać dowolnie wiele danych dla wywołanej danym taskiem funkcji. Parameter działą razem ze zmienną len w której jest zawarta informacja o ilości elementów w zmiennej parameter.
przykład:
Jesli przekazujemy tylko jedna informacje typu int, to możemy użyć zmiennej id do przekazania informacji:
flags - tu są przechowywane flagi typu wykonywanego tasku - gdy nie jest on zdefiniowany to task jest wykonywany 1 raz po określonym czasie od momentu wywołania. Mamy do dyspozycji flagi:
"a" - powtarza funkcje określoną liczbę razy (zmienna repeat ) - po wywołaniu funkcji zostaje jakoby zrobiony nowy task z takim samym opóźnieniem.
"b" - bardzo podobna do flagi z "a" tylko z 1 wyjątkiem - task będzie zapętlany aż do zmiany mapy lub do usunięcia taska.
"c" - wykonywana po czasie "timeleft"
"d" - wykonywana przed czasem "timeleft"
PS. Jak znajde troche czasu i będę na swoim PC, to postaram się rozwinąć topic.
PS2. W taki oto sposób udało mi sie nie zanudzić na śmierć między wykładami
Konstrukcja tej funkcji ma postać:
set_task ( Float:time, const function[], id = 0, parameter[]="", len = 0, flags[]="", repeat = 0 )
Omówie teraz poszczególne parametry:
time (typ float - zmienno przecinkowy) - tu podajemy czas w sekundach po jakim ma być wywołana funkcja. Może to być liczba znana już przed kompilacją (np 10.0 - zawsze dajemy wartość po przecinku, nawet jak jest to liczba całkowita). Może to też być zdeklarowana zmienna typu float o dowolnej wartości (choć rozsądek podpowiada by to były liczby nie ujemne ;> )
function[] - jak nam zdradza oznaczenie ' [] ' zmienna ta zbudowana jest z ciągu znakowego. Ciąg ten musi być nazwą funkcji w naszym plugu.
id - zmienna id oznacza nr identyfikacyjny naszego task'a. Jeśli jej nie zdeklarujemy (tj. użyjmy taska tylko z 2 parametrami), to id będzie miało wartość 0. Istotną rzeczą, jak też często pomijaną przez programistów jest zadbanie by nasz task miał jedyną w swoim rodzaju nr. id.
Znajomość id taska daje nam dostęp do następujących funkcji:
task_exists ( id = 0, outside = 0 ) - sprawdzanie czy task o podanym id istnieje
change_task ( id = 0, Float:newTime=1.0, outside = 0 ) - zmienianie czasu wywołania taska
remove_task ( id = 0, outside = 0 ) - usuwa taska o podanym id - funkcja nie zostaje wywołana a dane zawarte w tasku zostają utracone.
outside - gdy wartość jest równa 1 to są też brane taski z poza naszego pluga.
parameter - tutaj możemy przechowywać dowolnie wiele danych dla wywołanej danym taskiem funkcji. Parameter działą razem ze zmienną len w której jest zawarta informacja o ilości elementów w zmiennej parameter.
przykład:
... new data[3] data[0] = id data[1] = vid data[2] = dmg set_task ( 5.0, "DoIt", 666, data, 3 ) ... public DoIt(data[]) { new id = data[0] new vid = data[1] new dmg = data[2] }
Jesli przekazujemy tylko jedna informacje typu int, to możemy użyć zmiennej id do przekazania informacji:
... set_task ( 5.0, "KillIt", id ) ... public KillIt(id) { user_silentkill ( id) }
flags - tu są przechowywane flagi typu wykonywanego tasku - gdy nie jest on zdefiniowany to task jest wykonywany 1 raz po określonym czasie od momentu wywołania. Mamy do dyspozycji flagi:
"a" - powtarza funkcje określoną liczbę razy (zmienna repeat ) - po wywołaniu funkcji zostaje jakoby zrobiony nowy task z takim samym opóźnieniem.
"b" - bardzo podobna do flagi z "a" tylko z 1 wyjątkiem - task będzie zapętlany aż do zmiany mapy lub do usunięcia taska.
"c" - wykonywana po czasie "timeleft"
"d" - wykonywana przed czasem "timeleft"
PS. Jak znajde troche czasu i będę na swoim PC, to postaram się rozwinąć topic.
PS2. W taki oto sposób udało mi sie nie zanudzić na śmierć między wykładami

zryty
06.09.2011
id - zmienna id oznacza nr identyfikacyjny naszego task'a. Jeśli jej nie zdeklarujemy (tj. użyjmy taska tylko z 2 parametrami), to id będzie miało wartość 0. Istotną rzeczą, jak też często pomijaną przez programistów jest zadbanie by nasz task miał jedyną w swoim rodzaju nr. id.
Unikalne id w obrębie pluginu czy wszystkich wtyczek? Bo widzę, że tam parametr outside się pojawił i id mogły by kolidować.
sebul
28.12.2012
Mam pytanie co do tego przykładu
Jeśli chcemy w funkcji "DoIt" wyciągnąć id taska, to w którym miejscu podajemy te id?
czy może tak
Zawsze robiłem w tej pierwszej kolejności i raczej wszystko działa, ale ciekawi mnie, czy jest w ogóle jakaś różnica?
new data[3]
data[0] = id
data[1] = vid
data[2] = dmg
set_task ( 5.0, "DoIt", 666, data, 3 )
...
public DoIt(data[])
{
new id = data[0]
new vid = data[1]
new dmg = data[2]
}
Jeśli chcemy w funkcji "DoIt" wyciągnąć id taska, to w którym miejscu podajemy te id?
public DoIt(data[], idtaska)
{
new id = data[0]
new vid = data[1]
new dmg = data[2]
}
czy może tak
public DoIt(idtaska, data[])
{
new id = data[0]
new vid = data[1]
new dmg = data[2]
}
Zawsze robiłem w tej pierwszej kolejności i raczej wszystko działa, ale ciekawi mnie, czy jest w ogóle jakaś różnica?
Gość_21977_* 28.12.2012
id jest drugim, także opcjonalnym parametrem (AmxModX.org/Advanced_Scripting_(AMX_Mod_X)#Tasks)
Przykład użycia przez Bugsy`ego dla "Hello World" taska.
Przykład użycia przez Bugsy`ego dla "Hello World" taska.
MarWit
07.03.2013
@UP,
enum xDataStruct { szString[ 64 ], Float: fFloat, iInt, Handle: hHandle }
new xData[ xDataStruct ] = { "STRING", 42.0, 42, Handle: 0 } ;
set_task( 0.1, "fooBar", 42, xData, xDataStruct );
(...)
public fooBar( any: xData, iTask )
{
enum xDataStruct { szString[ 64 ], Float: fFloat, iInt, Handle: hHandle }
log_amx( "%s %f %i %i", xData[ szString ], xData[ fFloat ], xData[ iInt ], xData[ hHandle ] );
}
the game
13.04.2013
nie polecam stosowanie tasków na zombie modzie, ponieważ sam mod zawiera ich strasznie dużo, lepszym rozwiązaniem jest get_gametime