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

Timers czyli funkcje czasowe cz. 1 - CreateTimer()


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

#1 Harsay

    Harsayus pospolitus

  • Użytkownik

Reputacja: 88
Zaawansowany

  • Postów:274
  • Imię:Michał
  • Lokalizacja:Bydgoszcz
Offline

Napisano 23.08.2011 20:36

*
Popularny

Timers czyli funkcje czasowe cz. 1 - CreateTimer()


Wprowadzenie
Timer pozwala na wykonywanie funkcji po jakimś czasie. Jest to odpowiednik set_task z amxx.

Teraz zajmiemy się jedną podstawową funkcją.

CreateTimer() - Tworzy timer :) - a oto jego składnia
native Handle:CreateTimer(Float:interval, Timer:func, any:data=INVALID_HANDLE, flags=0);

interval - Czas podany w sekundach. np. 1.0 czyli 1 sekunda.
func - Nazwa funkcji która ma być wywołana po upływie czasu
data - wartość albo uchwyt
flags - Czyli poprostu flaga w tej części będziemy używać
  • TIMER_REPEAT - Timer będzie się powtarzał aż nie zostanie zwrócone Plugin_Stop

Jednorazowy timer
Jak sama nazwa wskazuje timer jednorazowy wykona funkcję jeden raz po określonym czasie. Tutaj macie przykład:
public OnPluginStart() 
{
	CreateTimer(5.0, DawajInfo) // tworzymy timer
}
 
public Action:DawajInfo(Handle:timer)
{
	PrintToServer("Testowa informacja w konsoli serwera wywolana przez timer")
}
W tym przykładzie gdy plugin zostanie uruchomiony to po 5 sekundach zostanie napisana informacja w konsoli serwera.

Powtarzający się timer
W tym przykładzie co 3 sekundy będzie powtarzana funkcja PrintMsg (dzięki flagi TIMER_REPEAT) aż do momentu gdy NumPrinted będzie miało wartość 5 i zwrócone zostanie Plugin_Stop a przy okazji wyświetli wiadomość w konsoli serwera :)
DajWiadomosc()
{
	CreateTimer(3.0, PrintMsg, _, TIMER_REPEAT)
}
 
public Action:PrintMsg(Handle:timer)
{
	static NumPrinted = 0
	if (NumPrinted++ >= 5)
	{
		PrintToServer("Wiadomosc!!!")
		NumPrinted = 0
 
		return Plugin_Stop
	}
 
	return Plugin_Continue
}

Nie jest to nic trudnego ale mam nadzieję że pomogłem :)

Użytkownik Harsay edytował ten post 23.08.2011 20:43

  • +
  • -
  • 6

#2 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 843
Czempion

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

Napisano 23.08.2011 20:38

Fajnie napisane, newbie na pewno pomoże :D

Użytkownik MarWit edytował ten post 23.08.2011 20:39

  • +
  • -
  • 1

marwit-0.png


#3 Cypis'

    Master

  • Przyjaciel

Reputacja: 1 162
Super Hero

  • Postów:965
  • GG:
  • Steam:steam
  • Lokalizacja:polska
Offline

Napisano 06.09.2011 19:39

jeszcze przydało by się jak usunać taska native KillTimer(timer) :P
np. używacie na przykładzie up@@

new task_print
DajWiadomosc()
{
    task_print = CreateTimer(3.0, PrintMsg, _, TIMER_REPEAT)
}

public Action:PrintMsg(Handle:timer)
{
    static NumPrinted = 0
    if (NumPrinted++ >= 5)
    {
        PrintToServer("Wiadomosc!!!")
        NumPrinted = 0

        KillTimer(task_print)
    }
}
lub

DajWiadomosc()
{
    CreateTimer(3.0, PrintMsg, _, TIMER_REPEAT)
}

public Action:PrintMsg(Handle:timer)
{
    static NumPrinted = 0
    if (NumPrinted++ >= 5)
    {
        PrintToServer("Wiadomosc!!!")
        NumPrinted = 0

        KillTimer(timer)
    }
}

P.S kod wygląda dobrze tylko nie sprawdzałem czy tak to działa :)

Użytkownik Cypis' edytował ten post 06.09.2011 19:40

  • +
  • -
  • 1

#4 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 19.11.2015 17:10

A jak przekazać parametry?


  • +
  • -
  • 0

#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

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

Napisano 19.11.2015 19:00

Wystarczy przeglądać pluginy, ale generalnie mniej więcej tak
new Handle:pack = CreateDataPack();
WritePackCell(pack, GetClientSerial(i));
WritePackFloat(pack, afkTime);
WritePackCell(pack, move_kick);
g_Players[i][EPTimer] = CreateTimer(Float:g_ConVars[ECWarningsFreq][ConVarValue], WarningFun, pack, TIMER_REPEAT);
a potem w metodzie
public Action:WarningFun(Handle:timer, Handle:pack) {
	decl client, Float:afkTime, move_kick;
	ResetPack(pack);
	client = GetClientFromSerial(ReadPackCell(pack));
	afkTime = ReadPackFloat(pack);
	move_kick = ReadPackCell(pack);
}
Czyli jak widać jest trzeci parametr w "CreateTimer", a potem w metodzie jako drugi. A jak chcesz tylko jedną wartość przekazać, to wtedy bezpośrednio go dajesz jako ten 3 parametr w "CreateTimer".
  • +
  • -
  • 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 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 19.11.2015 19:27

zauważyłem oczywiście, że jesst drugi parametr, ale nie chciało mi się wierzyć, że tylko jeden się da przekazać, dzięki za rozjaśnienie

 

w metodzie chyba drugi parametr powinien być typu any a nie Handle (kompilator się popluje?), ale nie jestem pewny

 

 

po przekazaniu niszczymy uchwyt?


Użytkownik grankee edytował ten post 19.11.2015 19:28

  • +
  • -
  • 0




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

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