←  Tutoriale

AMXX.pl: Support AMX Mod X i SourceMod

»

set_task - funkcje czasowe

  • +
  • -
Miczu - zdjęcie 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:

...
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 xD
Odpowiedz

  • +
  • -
zryty - zdjęcie 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ć.
Odpowiedz

  • +
  • -
G[o]Q - zdjęcie G[o]Q 06.09.2011

przeczytaj poradnik R3X'a o forwardach tam masz wyjasnione
Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 08.09.2011

W obrębie pluginu
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 28.12.2012

Mam pytanie co do tego przykładu
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?
Odpowiedz

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.
sebul (28.12.2012 15:03):
No to teraz poradnik jest już chyba "kompletny".
Odpowiedz

  • +
  • -
Klakier - zdjęcie Klakier 07.03.2013

A jak przenieść informacje o różnych typach danych ? Np. int i float ?
Odpowiedz

  • +
  • -
MarWit - zdjęcie 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 ] );
}
Odpowiedz

the game - zdjęcie 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
Odpowiedz