[Tutorial] Cum sa creezi un timer.
#1

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:

pawn Код:
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.

pawn Код:
new NumeTimer;
ATENTIE! Sa nu adaugati [MAX_PLAYERS] pentru ca timerul nu se creeaza asupra unui player.


Pasul urmator, il adaugam in OnGameModeInit:

pawn Код:
NumeTimer = SetTimer("message", 4000, false);
Iar daca vrem sa se repete:
pawn Код:
NumeTimer = SetTimer("message", 4000, true);
ATENTIE! La fieacre 4 secunde se actioneaza publicul "message"!


Urmatorul pas este de a creea publicul "message":

pawn Код:
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:
pawn Код:
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!

pawn Код:
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:
pawn Код:
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:
pawn Код:
NumeTimer2[playerid] = SetTimerEx("ActiuneTimer", 5000, false, "i", playerid);
Pasul 3. Crearea publicului "ActiuneTimer":

pawn Код:
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:
pawn Код:
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:
pawn Код:
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:
pawn Код:
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":

pawn Код:
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:
pawn Код:
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, www.gugăl.ro -> seconds to miliseconds.


Sper ca am fost destul de explicit, succes!
Reply
#2

Frumos explicat,dar ai cateva greseli gramaticale,in rest e ok
Reply
#3

Detalii...
Il mai citesc inca o data, si repar si greselile, dar nu cred ca am cuvinte gen "cruiaza tiumeru" etc.
Reply
#4

"va" se scrie intotdeauna legat.
Reply
#5

Cum spuneam... detalii minore. :]
Dar oricum, mersi pentru spiritul de observatie.
Reply
#6

interesant.era bine daca il faceai si tu cand eram si eu incepator,dar acum te-ai trezit)))).
Reply
#7

Quote:
Originally Posted by SounDD
Посмотреть сообщение
"va" se scrie intotdeauna legat.
Se poate scrie si cu cratima, in cazul perfectului compus.
Reply
#8

frumos tutorial, I like !
Reply
#9

Quote:
Originally Posted by gabitzu4ever
Посмотреть сообщение
frumos tutorial, I like !
Multumesc, ma voi gandi si la alte tutoriale, care noua ni se par usoare dar celor care sunt la inceput , grele.
Reply
#10

un gamemode de exemplu?)))
Reply
#11

Quote:
Originally Posted by SounDD
Посмотреть сообщение
"va" se scrie intotdeauna legat.
Gramatica V-A adus numai necazuri.
(se poate inlocui cu "voua a")
Reply
#12

Quote:
Originally Posted by gigicu01
Посмотреть сообщение
un gamemode de exemplu?)))
Pentru a face un gamemode nu ai nevoie de un tutorial, ai nevoie de cunostinte acumulate pe parcurs.
Reply
#13

intocmai.Si acele cunostinte=in mare parte tutoriale:P.Mai mult wiki dar na,nu toti stau sa citeasca pe wiki.
Reply
#14

foarte bine, bine explicate
Reply
#15

Quote:
Originally Posted by gigicu01
Посмотреть сообщение
interesant.era bine daca il faceai si tu cand eram si eu incepator,dar acum te-ai trezit)))).
S-a trezit la timp pentru mine :} hue hue hue
Mersi mult.
Reply
#16

Frumos.Sa o tii tot asa
Reply
#17

Cum ma folosesc de un timer la o comanda care sa fie accesata doar la un anumit timp?
Reply
#18

Quote:
Originally Posted by SiNNeD47
Посмотреть сообщение
Cum ma folosesc de un timer la o comanda care sa fie accesata doar la un anumit timp?
Am facut aici un model asa simplu. Practic faci o variabila pt fiecare player care sa aibe valoarea 0 sau 1.

De fiecare data cand un player foloseste comanda, variabila aia ia valoarea 1 si timerul porneste.
Cand timerul se termina, variabila ia din nou valoarea zero.
Practic inainte sa dai instructiunile comenzii, trebuie sa verifici valoarea acelei variabile.

PHP код:
new index[MAX_PLAYERS] = 0;
forward blockcommand();
public 
OnPlayerCommandText(playeridcmdtext[])
{
    if(!
strcmp(cmdtext"/help"true))
    {
        if(
index[playerid] == 0//verifici daca variabila are 0
        
{
            
//pui aici ce sa faca comanda
            
index[playerid] = 1//pui valoarea 1 la index la sfarsit. cand comanda va fi data din nou, va reiesi ca indexul este 1, deci comanda va fi blocata.
            
SetTimer("blockcommand"45000false); //setezi timerul sa inceapa. Eu l-am pus la 45 de secunde
        
}
        else 
//daca variabila nu are valoarea zero
        
{
            
SendClientMessage(playerid, -1"trebuie sa mai treaca timp"); // trimiti un mesaj in care ii spui playerului ca nu poate folosi comanda.
           
return 1;
        }
    }
}
 
public 
blockcommand() 
{
    
index[playerid] = 0//cand timerul termina de numarat, indexul trebuie sa ia valoarea 0.

Reply
#19

frumos explicat
Reply
#20

Cam nefolositor pentru cei avansati, dar este ok, incearca sa postezi mappinguri sau filescript-uri o sa prinda mai bine.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)