Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

set_task - funkcje czasowe


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 Miczu

    Godlike

  • Przyjaciel

Reputacja: 657
Wszechmogący

  • Postów:2 862
Offline

Napisano 09.12.2008 11:08

*
Popularny

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
  • +
  • -
  • 18

#2 zryty

    Życzliwy

  • Użytkownik

Reputacja: 2
Nowy

  • Postów:24
  • Imię:Krzysiek
  • Lokalizacja:Polska
Offline

Napisano 06.09.2011 15:04

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ć.
  • +
  • -
  • 0

#3 G[o]Q

    I'm G[o]Q

  • Przyjaciel

Reputacja: 1 344
Godlike

  • Postów:3 563
  • Steam:steam
  • Imię:Krzysiek
  • Lokalizacja:C: / program Files / Valve / Cstrike / G[o]Q.dem
Offline

Napisano 06.09.2011 18:41

przeczytaj poradnik R3X'a o forwardach tam masz wyjasnione
  • +
  • -
  • 0
Manual ponad wszystko, konsola ponad manual :D :&

Chcesz wysłać do mnie PW ? użyj nazwy GoQ zamiast G[o]Q
Chcesz Kupić moduł płatności via Pukawka,Tserwery, Gamesol, Zabijaka do mojego sklepu? napisz PW cena to tylko 10 zł/sztuka

GG:6022845 (nie pomagam za free osobom ponizej rangi MoD) :D

#4 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 981
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 08.09.2011 07:12

W obrębie pluginu
  • +
  • -
  • 0

#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 28.12.2012 14:34

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?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 28.12.2012 14:46

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".


#7 Klakier

    Volenti non fit iniuria

  • Power User

Reputacja: 391
Wszechpomocny

  • Postów:878
  • GG:
  • Imię:Sebastian
  • Lokalizacja:Mogilno
Offline

Napisano 07.03.2013 11:52

A jak przenieść informacje o różnych typach danych ? Np. int i float ?
  • +
  • -
  • 0

Sell - System Klanów (wojny, top15 etc)

 

Kontakt GG: 7285018


#8 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

  • Postów:1 485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 07.03.2013 14:32

@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 ] );
}

  • +
  • -
  • 2

marwit-0.png


#9 the game

    Pomocny

  • Zbanowany

Reputacja: 4
Nowy

  • Postów:56
  • Lokalizacja:polska
Offline

Napisano 13.04.2013 13:54

nie polecam stosowanie tasków na zombie modzie, ponieważ sam mod zawiera ich strasznie dużo, lepszym rozwiązaniem jest get_gametime




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych