Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

[Pamoka]Unix Time Stamp


bebras

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3676 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Ši pamoka naudoja papildomas bibliotekas:

 

 

 

Unix Time Stamp

Kas tai yra? Tai yra nuostabus dalykas. Jo esmė labai paprasta: jis skaičiuoja kiek sekundžių praėjo nuo 1970 metų sausio 1 dienos.

Šis stebuklas naudojamas daugelyje programų, mes, pawn kalboje taipat galime jį daug kur panaudoti.

Dar vienas įdomus dalykas, jis nustos skaičiuoti 2038 metų sausio 19 diena. Kas nutiks tada? Milijonai , o gal ir milijardai programų visame pasaulyje nustos veikti!





O kadangi laiko iki to turime dar daug, grižkime į Pawn pasaulį.



Pirmas klausimas tikriausiai bus, kaip jį išgauti, ar ne? Tam yra labai paprasta funkcija "gettime();", ji gražina sekundžių skaičių nuo minėtos datos.
PVZ:

new string[70];

format(string,sizeof(string),"Nuo 1970 metų sausio 1 dienos praėjo %d sekundžių",gettime());

SendClientMessage(playerid,0xFF0000FF,string);

Pavizdys viršuje neatrodo labai naudingas, ar ne?

Kyla klausimas ką galima naudingesnio padaryti su Unix Time Stamp. O atsakymas paprastas - bausmes. Tokias kaip ban ar jail. Pavizdys:

 

CMD:ban(playerid,params[])

{
   new id, valandos;

   if(sscanf(params,"ud",id, valandos)) return SendClientMessage(playerid,0xFF0000FF,"Naudojimas /ban [zaidejo ID/Dalis vardo] [Laikas valandomis]");

   if(!IsPlayerConnected(id)) return SendClientMessage(playerid,0xFF0000FF,"Neteisingas žaidėjo ID");


   new banlaikas,Vardas[MAX_PLAYER_NAME],query[80];

   banlaikas = gettime() + valandos * 3600; // Valandas reikia paversti į sekundes. Viena valanda turi 3600 sekundes. 

   /* o dabar jau priklauso nuo Jūsų saugojimo sistemos
   Svarbiausia išsaugoti "banlaikas" kintamojo vertę. Mano pavyzdys naudoja MySQL R6
   */
   GetPlayerName(id,Vardas,sizeof(Vardas));

   format(query,sizeof(query),"INSERT INTO bausmes (Vardas, BausmesPabaiga) VALUES ('%s',%d)", Vardas,banlaikas);
   mysql_query(query);

   return 1;

}

Tai įrašys skaičių sekundžių kiek turi būti praėję sekundžių nuo 1970-jų kad žaidėjo bausmė baigtųsi.

Jeigu nesupratot,pavyzdys:

public OnPlayerConnect(playerid)
{
    new query[64];
    new Vardas[MAX_PLAYER_NAME], laikas;
    GetPlayerName(playerid,Vardas,sizeof(Vardas));

    // Vėlgi, ši pamoka naudoja MySQL. Jei naudojate kitą saugojimo būdą, naudokite jį.
    format(query,sizeof(query),"SELECT BausmesPabaiga FROM bausmes WHERE Vardas = '%s'",Vardas);
    mysql_query(query);
    mysql_store_result();
    if(mysql_num_rows() != 0) 
    {
       laikas= mysql_fetch_int();

       if(laikas <= gettime()) // Visas "stebuklas" čia. Jei DABARTINIS laikas yra mažesnis nei išsaugotas, reiškia laikas dar nepraėjo.
       { 
          SendClientMessage(playerid,0xFF0000FF,"Esate užblokuotas.");
          Kick(playerid);
       }
    }
    return 1;
}

Gal pavyzdys tiems kas nemoka MySQL ir nelabai aiškus, bet svarbiausia eilute pakomentavau, o šiaip nėra nieko kas trukdytų tai naudoti ir su kita saugojimo sistema.



MySQL konvertavimas

Visai neseniai dirbdamas prie slapto projekto atrodau tokį dalyką(MySQL pasaulyje jis plačiai žinomas), tai yra būdas konvertuoti Unix Timestamp į gražią datą kaip: "1970-03-16 21:57:40"
Tai galima padaryti siunčiant užklausą kurios formatas yra toks:


SELECT FROM_UNIXTIME(unix_timestamp)

Tai gražins gražiai suformatuota String tipo datą, kaip ją apdorosite priklauso nuo jūsų norų ir naudojamos MySQL versijos.
Jei norite išgauti jį kartu su įprasta užklausa tai galima padaryti:


SELECT *,FROM_UNIXTIME(unix_timestamp_stulpelis) FROM lentelė

Jei gaudami reikšmes naudojate stulpelių pavadinimus, galite nurodyti kokiam stulpely bus ta suformatuota data:

SELECT (FROM_UNIXTIME(unix_timestamp_stulpelis) AS kasnors) FROM lentele

Apibendrinimas:

Unix Time Stamp yra sekundžių skaičius praėjęs nuo 1970 sausio 1 dienos. SAMP';e jį galima naudoti banams, kalėjimo laikui, laikiniems VIP ir dar daugybei kitų dalykų..


Naudojimas trumpai:
 

  1. Išgauname dabartinį timestamp
  2. Pridedame prie jo kažkokio veiksmo/privilegijų trukmę sekundėmis
  3. Išsaugome jį(patartina ilgesniems veiksmas)
  4. Kas kažkiek laiko tikriname ar dabartinis timestamp yra didesnis nei išsaugotasis.

 

Paskutinis pamokos redagavimas: 2014.11.17

 

Redaguota , nario Justas Š.
Nuoroda į komentarą
Dalintis per kitą puslapį

  • Parašė po 3 savaičių...
  • Parašė po 3 savaičių...

Klaida: sscanf, žaidėjų vardams nuskaityti reikia naudoti parametrą "u", sscanf( params, "u", gid ), kadangi su juo galima įrašyti ir vardą ir ID, o rezultatas ID būna, todėl geriau.

Ne klaida. Bet ačiū už pastebėjimą. Veiktų ir taip tik negalėtų naudoti [Vardo dalis] :)
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3676 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...