Benutzung TimeStamp

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo leute in diesem Tutorial will ich euch den Timestamp vorstellen , vor allem Beispiele wie man ihn sinnvoll in einem Gamemode benutzen kann.


    Zuerst mal was ist ein Timestamp(Zeitstempel) ?


    Ein Timestamp zu deutsch Zeitstempel genannt ist nichts anderes als ein Datum das was in einem bestimmten Format angegeben wird .
    Ja ok ein datum ? Super oder ^^ ... natürlich muss auch gesagt werden welches Datum ? Es wird bei bestimmten Ereignissen benutzt ein gutes Beispiel ist z.B: ein Textdokument auf euren PC
    hier habt ihr einen Zeitstempel wann das Dokument das letzte mal Bearbeitet worden ist , oder wann es erstellt worden ist u.s.w ....
    Ich hoffe ihr versteht was ich meine ;)


    Viele fragen euch sicher was euch so ein Timestamp hilft ... doch ich werde euch hier von einem bestimmten Timestamp erzählen
    Das ist der Unix-Timestamp(Unixzeit) , dieser Timestamp kennzeichnet den tag 1970 1.Januar 00:00 Uhr er wird in Sekunden angeben .
    Ihr fragt euch sicher wie das gemeint ist , ganz einfach es sind die Sekunden von 1970 bis jetzt .


    Wie kann man den Unix-Timestamp sinvoll in einem Gamemode nutzen ?


    Zuerst ein mal hier ein gutes Beispiel .
    Der Spieler X darf einmal pro "echte" stunde den befehl /selbstmord eingeben . Manche würden hierzu ein Timer nehmen .
    Aber wenn der Server off geht dann ist ende im gelände und der timer ist weg. Also können wir hier gemütlich den Timestamp nutzen
    Hier das beispiel:
    Zuerst brauchen wir mal ne timestamp funktion , wir nutzen wie gesagt die Unix Timestamp funktion .Jetzt fragen sich viele warum,
    ganz einfach weil diese sehr verbreitet ist und z.B: auch in php seinen einsatz findet(wenn ihr z.B ein gamemode mit euren ucp verwendet wollt und dem spieler anzeigen lassen wollt wann er das nächste mal /selbstmord benutzen kann)
    Hier die funktion (credits an mabako)


    stock mktime(hour,minute,second,day,month,year)
    {
    new timestamp2;


    timestamp2 = second + (minute * 60) + (hour * 3600);


    new days_of_month[12];


    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) {
    days_of_month = {31,29,31,30,31,30,31,31,30,31,30,31}; // Schaltjahr
    } else {
    days_of_month = {31,28,31,30,31,30,31,31,30,31,30,31}; // keins
    }
    new days_this_year = 0;
    days_this_year = day;
    if(month > 1) { // No January Calculation, because its always the 0 past months
    for(new i=0; i<month-1;i++) {
    days_this_year += days_of_month[i];
    }
    }
    timestamp2 += days_this_year * 86400;


    for(new j=1970;j<year;j++) {
    timestamp2 += 31536000;
    if ( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) timestamp2 += 86400; // Schaltjahr + 1 Tag
    }


    return timestamp2;
    }


    stock Now()
    {
    new hour,minute,second,year,month,day;
    gettime(hour, minute, second);
    getdate(year, month, day);
    return mktime(hour,minute,second,day,month,year);
    }


    also bekommen wir mit Now() den aktuellen Unix-Zeitstempel


    so jetzt brauchen wir ne Variable für den Spieler , das machen wir ganz oben


    mit new NextKill[MAX_PLAYERS];


    so und für den befehl nutze ich mal ocmd(danke kleiner_opa )


    ocmd:selbstmord(playerid,params[])
    {
    if(Now()<NextKill[playerid]) return SendClientMessage(playerid,COLOR,"Sie können nur alle 60Minuten /selbstmord machen!");//jetzt überprüfen wir ob NextKill größer als der der Aktuelle Zeitstempel ist , wenn ja sind die 60 minuten noch nicht um
    NextKill[playerid]=Now()+3600;//Hier zählen wir die 60Minuten dazu (in Sekunden natürlich)
    SetPlayerHealth(playerid,0);
    SendClientMessage(playerid,COLOR,"Du hast selbstmord begangen!");
    return 1;
    }


    Jetzt müsst ihr natürlich den NextKill wert irgendwo speichern , damit er noch vorhanden ist wenn der Spieler Off geht



    so das war ein beispiel von vielen !
    Man kann es auch z.B; bei einem Taxi fahrer machen wo man die "Abrechnung" in sekunden macht , oder bei einem WaffenTransport der nur einmal pro tag gehen soll u.s.w
    Der Vorteil ist ein Timestamp verbraucht keine Ressourcen ,man braucht dazu nur eine Variable im Gegensatz zu einem Timer der sehr viel Ressourcen braucht.


    Ich hoffe , dass ich euch hier den Timestamp gut erklärt habe und ihr ihn öfters nutzen werdet , ich bedanke mich auch bei php_exec der mir den Timestamp so gut und ausführlich gezeigt hat.

  • wenn gettime() schon einen Timestamp zurückgibt, dann würde es eig so reichen :



    stock Now()
    {
    new time[3];
    return gettime(time[0], time[1], time[2]);
    }


    Ansonsten nettes Tutorial.


    Nicht jeder, der sich für super hält, ist ein Superheld. :love:
    ------------------------------------------------------------------------------------------------

  • ne dann braucht man eigentlich kein Now(); mehr weil dann macht man statt dem Now(); ein gettime(); ich werde das heute mal ausprobieren ;)
    edit: habs probiert und ja es geht ^^

    Einmal editiert, zuletzt von zabus ()

  • *ausgrab* sry ich weiß ist alt...


    Habe mal ne Frage:
    Könnte ich damit jetzt alle Timer ersetzen ? Oder macht es nur bei Timern mit größeren Zeit Intervallen Sinn. Also wenn ich einen User für Stunden ins Prison Sperre ?


    Viele Grüße
    NMS aka Steven

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Es macht vor allem Sinn bei Dingen, die auch nach einem Restart gespeichert bleiben sollen. - Man kann einen Timestamp sehr viel einfacher in z.B. eine Userfile speichern als das komplette Datum, denn man muss nur eine Variable vom Typ integer / long speichern. Auch nützlich für ein Timeban-System - man speichert den Timestamp vom Zeitpunkt des Timebans und die Dauer in einer File, im 'OnPlayerConnect' fragt man die Differenz ab, falls diese kleiner als die Dauer ist, folgt ein Kick.


    Wichtig ist aber die Funktionsweise:
    Du musst genauso abfragen, ob die Differenz des gespeicherten Timestamp zu dem aktuellen Timestamp eine gewisse Größe beträgt.
    Es macht z.B. wenig Sinn für jeden User, der im Knast ist, einen Timer laufen zu lassen, es wäre sinnvoller, einen Timer mit 1-minütigem Intervall in einer Endlosschleife zu haben, der eine Funktion aufruft, welche z.B. die Differenz der Timestamps berechnet und mit der Zeit, die die Spieler absitzen müssen, vergleicht. Ist die Differenz mindestens zu groß wie die Zeit (in Sekunden), die diese absitzen müssen, werden sie befreit.
    Allerdings wäre bei diesem System ein Timestamp nicht die optimale Lösung, sinnvoller wäre es, wenn ein Timer die Variable (bsp) 'player[playerid][jailtime]' um jede Minute um 1 verringert.
    Beispiel:public jailtime()
    { for(new i=0; i<MAX_PLAYERS;i++) if(player[i][injail]==true && player[i][logged]==true) player[i][jailtime]-=1; }

    ~~~~~~~~ Obst Reallife ~~ 100% selfmade ~~~~~~~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~~~ SAMP ~ 35% ~ 01.04.10 ~ preAlpha (closed) ~~~
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~~~~~~~~ zur Zeit keine Weiterentwicklung ~~~~~~~~