Jump to content

Cum sa creezi un timer


InceMan

Recommended Posts

Cum sa creezi un timer.



M-am gandit sa creez un tutorial pentru incepatori, care, cred eu ii va ajuta foarte multe pe viitor.

Pentru inceput sa va explic din ce este compus SetTimer:

Code:
SetTimer("message", 1000, false);

* message = numele publicului care il declanseaza o data cu terminarea timpului.
* 1000 = reprezinta cat timp trebuie sa se 'scurga' pentru a actiona publicul "message".
ATENTIE! Timpul se masoara in milisecunde NU secunde! 1 secunda = 1000 milisecunde.
* false = in acest caz, false inseamna ca timerul nu se repeta, daca era true, publicul "message" se declansa de fiecare data cand timerul termina numaratoarea.


Pana aici nu cred ca exista nelamuriri. Sa trecem mai departe cu tipurile de timere!

1. Timerul care se creeaza odata cu pornirea serverului fara a fi declansat de o comanda de catre player. Sa va explic cum il creăm.

Pentru inceput , il definim pentru a-l putea distruge.

Code:
new NumeTimer;

ATENTIE! Sa nu adaugati [MAX_PLAYERS] pentru ca timerul nu se creeaza asupra unui player.


Pasul urmator, il adaugam in OnGameModeInit:

Code:
NumeTimer = SetTimer("message", 4000, false);

Iar daca vrem sa se repete:
Code:
NumeTimer = SetTimer("message", 4000, true);

ATENTIE! La fieacre 4 secunde se actioneaza publicul "message"!


Urmatorul pas este de a creea publicul "message":

Code:
forward message();
public message()
{
//Actiune dvs. , in acest caz pun doar un simplu SendClientMessage();
foreach(Player, i)
SendClientMessage(i,-1,"Timer Actionat!");
}
return 1;
}

Sa va explic ce am facut aici, dupa cum vedeti am facut un loop, care sa trimita la toti playerii textul "Timer Actionat!", daca vreti si voi sa faceti acelasi lucru, va recomand sa descarcati include'ul foreach.


Si ultima parte, distrugerea acestuia:
Code:
KillTimer(NumeTimer);

Aceasta functie, va fi pusa la OnGameModeExit!



2. Timerul care nu se repeta si este actionat fie de OnPlayerConnect , fie de o comanda.

Pasul 1. Il definim pentru a-l putea distruge la un moment dat!

Code:
new NumeTimer2[MAX_PLAYERS];


Pasul 2. Il cream, aici va voi arata 2 variante.

Daca vrem sa se declanseze cand playerul se connecteaza , adaugam la OnPlayerConnect:
Code:
NumeTimer2[playerid] = SetTimerEx("ActiuneTimer", 5000, false, "i", playerid);

Aici este cazul cand nu se repeta, deoarece are 'false', publicul "ActiuneTimer", in cazul nostru se actioneaza dupa 5 secunde de la connectarea playerului.

Iar daca vrem sa il facem sa se actioneze prin comanda, pur si simplu, adaugam in interiorii comenzii:
Code:
NumeTimer2[playerid] = SetTimerEx("ActiuneTimer", 5000, false, "i", playerid);


Pasul 3. Crearea publicului "ActiuneTimer":

Code:
forward ActiuneTimer(playerid);
public ActiuneTimer(playerid)
{
SendClientMessage(playerid,-1,"Tocmai s-a declasat timerul!");
return 1;
}


Pasul 4. Distrugerea acestuia, chiar daca timerul nu se repeta, deoarece playerul poate iesi in timp ce timerul ruleaza(optional).

Adaugam la OnPlayerDisconnect:
Code:
KillTimer(NumeTimer2[playerid]);



3. Timerul ce se repeta si este actionat fie de OnPlayerConnect, fie de o comanda.

Pasul 1. Este acelasi lucru ca cel de la timerul care nu se repeta.

Pasul 2. Il cream:

Daca vrem sa se declanseze cand playerul se connecteaza si sa se repete pana cand iese, adaugam la OnPlayerConnect:
Code:
NumeTimer2[playerid] = SetTimerEx("ActiuneTimer", 5000, true, "i", playerid);

Aici este cazul cand se repeta, deoarece are 'true', publicul "ActiuneTimer", in cazul nostru se actioneaza dupa fiecare 5 secunde de la connectarea playerului.

Iar daca vrem sa il facem sa se actioneze prin comanda, pur si simplu, adaugam in interiorul comenzii:
Code:
NumeTimer2[playerid] = SetTimerEx("ActiuneTimer", 5000, true, "i", playerid);

Si din acel moment timerul se repeta la fiecare 5 secunde, pana cand este distrus.

Pasul 3. Crearea publicului "ActiuneTimer":

Code:
forward ActiuneTimer(playerid);
public ActiuneTimer(playerid)
{
SendClientMessage(playerid,-1,"Timerul este setat sa se repete!");
return 1;
}



Pasul 4. Distrugerea acestuia: 

1. Adaugam la OnPlayerDisconnect in caz ca timerul inca ruleaza:
Code:
KillTimer(NumeTimer2[playerid]);


2. Putem distruge timerul in ce etapa doriti, cu conditia sa nu fie pus undeva unde sa il distruga de enșpe mii de ori , cand el a fost distrus.

Ex: Daca timerul este setat sa actioneze cat playerul este in viata, adaugam SetTimerEx, la OnPlayerSpawn si KillTimer la OnPlayerDeath.

------------------------------------------------------------------------------------------------------

ATENTIE!

Ce am pus eu NumeTimer si NumeTimer2 sunt doar exemple, voi le puteti numi si altfel, cu conditia sa respectati ce am scris mai sus.
NU trebuie sa existe 2 timere cu aceasi definitie, adica 2 timere de genu: 
NumeTimer = SetTimerEx(...false);
NumeTimer = SetTimerEx(...true);
Repet! Timerele masoara timpul in MILISECUNDE nu secunde! Cum faceti din secunde/minute/ore in milisecunde? Simplu, http://www.calculateme.com/Time -> seconds to miliseconds.


Sper ca am fost destul de explicit, succes!

Edited by Geani
  • Upvote 1

FiveGame  Lands

Pawno Developer, Mapping , Scripter

Since 2016

Link to comment
Share on other sites

#define SECOUNDS(%0) (1000 * %0)
#define MINUTES(%0) (1000 * 60 * %0)
  
// Usage Set Timer
SetTimer(funcname[], SECOUNDS(5), true);
SetTimer(funcname[], MINUTES(5), true);

// Usage Y_Timers
timer TimerName[SECOUNDS(5)]() {
	return true;
}

ptimer TimerName[SECOUNDS(5)](playerid) {
	return true;
}

 

Link to comment
Share on other sites

CMD:work(playerid, params[])
{
	if(PlayerInfo[playerid][pJob] == 0) return SCM(playerid, COLOR_LIGHTRED, "You don't have a job!");
	if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid, COLOR_LIGHTRED, "Error: You need to login first.");
	if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_WHITE, "You can't use this command when you are in a car.");
	{
	if(PlayerInfo[playerid][pJob] == 5)
	{
    if(PlayerToPoint(5.0,playerid, 2097.3145,-1806.6183,13.5534)) 
	{
		if(PizzaCar[playerid] == 0)
		{
				PizzaCar[playerid] = 1;
       			PizzaCar[playerid] = AddStaticVehicle(448,2093.5256,-1806.4095,13.1497,89.0327,3,6);
				DisablePlayerCheckpoint(playerid);
				Gas[PizzaCar[playerid]] = 100;
				PutPlayerInVehicleEx(playerid, PizzaCar[playerid], 0); 
		}
		else return SendClientMessage(playerid, COLOR_WHITE, "{FFFFCC}Nu poti spawna mai multe scootere!");
	}
	SetPlayerCheckpoint(playerid,2093.5256,-1806.4095,13.1497, 7.0);
	SCM(playerid, -1, "(Job) Urmeaza checkpoint-ul pentru a putea folosi /work!");
	CP[playerid] = 43;
	}
	if(PlayerInfo[playerid][pJob] == 14)
	{
	if(PlayerToPoint(5.0,playerid, -83.0274,-1127.3881,1.6843)) 
	{
		if(TruckCar[playerid] == 0)
		{
				TruckCar[playerid] = 1;
       			TruckCar[playerid] = AddStaticVehicle(403,-83.0274,-1127.3881,1.6843,64.3507,223,223);
				PutPlayerInVehicleEx(playerid, TruckCar[playerid], 0); 
				Gas[TruckCar[playerid]] = 100;
				PutPlayerInVehicleEx(playerid, TruckCar[playerid], 0); 
		}
		else return SendClientMessage(playerid, COLOR_WHITE, "{FFFFCC}Nu poti spawna mai multe camioane!");
		}
		SetPlayerCheckpoint(playerid,-83.0274,-1127.3881,1.6843, 7.0);
		SCM(playerid, -1, "(Job) Urmeaza checkpoint-ul pentru a putea folosi /work!");
		CP[playerid] = 43;
		}
	}
	return 1;
}

Vreau sa adaug un timer , ca atunci cand se da jos din masina la 30 de secunde sa se distruga masina, help pls!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.