PlayerTimer-System

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,
    Ich hatte grade mal 20 Minuten Zeit und hab eine kleine Include geschrieben.
    Die Include erstellt "Player-Timer".
    Ich verwende diese Methode schon seid geraumer Zeit und hab sie nun für euch in Include-Form gepackt.


    Diese führen für einen Spieler nach einer bestimmten Zeit eine Aktion aus.
    Damit kann man den Spieler z.B. nach 5 Sekunden Kicken.
    Der Vorteil bei diesem System ist, dass alles über einen Timer läuft.
    Man spart sich somit Timer für unnötige Funktionen.

    Ein wichtiger Nachteil:
    Es kann wird vorkommen dass der Timer zufrüh ausgelöst wird.
    Ihr solltet diese Timerfunktion nur dann benutzen, wenn es über längere Zeiträume geht oder Differenzen von bis zu 999ms nicht weiter Schlimm sind!



    Die Include hat 2 und einen Callback Funktionen:


    CreateTimer(playerid,time (In Sekunden),definition);
    // Erstellt den Player-Timer
    // returnt die Timer-ID


    StopTimer(timerid);
    // Stopt den Timer mit der angegebenen ID wieder
    // return 1 Wenn Erfolgreich und 0 Wenn nicht Erfolgreich



    public OnPlayerTimerEnd(playerid,definition)
    {
    return 1;
    }



    Kleines Beispiel wie es aussehen könnte:
    define KICKTIMER 0


    // Irgendwo im Script..
    kicktimer[playerid] = CreateTimer(playerid,5,KICKTIMER); //Wir erstellen einen einen Timer der nach 5 Sekunden unseren Callback aufruft, die Definition "KICKTIMER" wird mitgeben..


    // Callback..
    public OnPlayerTimerEnd(playerid,definition)
    {
    if(definition == KICKTIMER) // Fragt ab ob die mitgegebene Definition "KICKTIMER" ist..
    {
    Kick(playerid); // Kickt den Spieler
    }
    return 1;
    }


    //Um den Timer zu stoppen:
    StopTimer(kicktimer[playerid]);


    Download: http://pastebin.com/Zc26kLJY
    Ihr dürft alles damit machen ausser es als eures ausgeben.
    Vielleicht konnte ich damit ein paar von euch ja einen Gefallen tun :)




    MfG Firerfan
    //EDIT 1: Nachteil hinzugefügt

    Einmal editiert, zuletzt von Firerfan ()

  • Nun ja, ist klein aber fein ^^.
    Wofür ist des? "define KICKTIMER 0"

  • Sehe ich da was falsch oder fehlt ganz oben #include <a_samp> ?</a_samp>

    Da es ein Include ist, denke ich das jeder das Include <a_samp> schon in seinem "Haupt-Skript" hat ^^.

  • Ich hätte das ja über OnPlayerUpdate und GetTime gemacht, denn die SA:MP Timer sind leider sehr ungenau

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Nun ja, ist klein aber fein ^^.
    Wofür ist des? "define KICKTIMER 0"

    Du hast einmal die Timer-ID die benötigt wird um den Timer zu töten und die von der Include benötigt wird um ihn zu identifizieren.
    "#define KICKTIMER 0" wäre in diesem Fall ein Beispiel um einen.. Ich nenn es jetzt mal Typen für den Timer zu erstellen.


    Ähnlich wie bei einer Model-ID wird dem jedem Timer somit ein Typ zugewiesen.
    An diesem Typ kannst du nachher festlegen, was passieren soll ;)



    @Rest:
    Das ist ne Include..
    Solange der Mensch der die Include benutzen will sie nicht vor der samp-include includet ist alles in Ordnung ;)
    Habs ja auch getestet und verwende diese Methode nun selber um mein Script kleiner zu halten.



    Goldkiller:
    Der Vorteil ist z.B. dass ich für einen Timer zum Spieler-Freezen, kicken, Message Senden oder dergleichen nicht neben evtl. schon 4-5 Timern für jeden Spieler nochmal einer Parallelläuft. Dazu kommt noch die Übersichtlichkeit. Ich persönliche finde es übersichtlicher alle SpielerTimer-Aktionen in einem Callback zu haben.



    @BlackAce:
    Würde eine Solche Abfrage den Server nicht bei vielen Spielern enormer belasten als ein Timer?





    //EDIT: Rechtschreibung

  • Würde eine Solche Abfrage den Server nicht bei vielen Spielern enormer belasten als ein Timer?


    nein, natürlich solange du nicht das mit einer CallRemote/LocalFunctio versuchst zu hooken,
    denn die kostet etxra zeit.


    Nimm dir ein Beispiel hierdran
    http://forum.sa-mp.com/showthread.php?t=166016 -> http://pastebin.com/KHtzcWVf

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski


  • nein, natürlich solange du nicht das mit einer CallRemote/LocalFunctio versuchst zu hooken,
    denn die kostet etxra zeit.


    Nimm dir ein Beispiel hierdran
    http://forum.sa-mp.com/showthread.php?t=166016 -> http://pastebin.com/KHtzcWVf

    Okay, das wäre mal eine Interessante Sache.
    Aber sag mir bitte warum Timer in SA-MP auf Millisekunden genau arbeiten müssen?
    Das wäre was mich interessieren würde. Ob ich jetzt alle 1000 Millisekunden ein Anticheat-Check mache oder alle 1002 Millisekunden :D
    PS: Danke für den Link zur der Include ;)

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Bist du dir sicher, dass dein Include eine gute Alternative ist ?
    Bei einer Sekunde ist selbst der Weg über den normalen Timer genauer....


    (Angaben nach : natürlich in ms | INC = Sein Include | NO INC = Normale Timer Funktion)


    ##edit
    Zu BlackAce unter mir: Ob ein Timer jetzt (Siehe Bild) nach 80ms losgeht (obwohl er nach 1s losgehen sollte) oder nach 1100ms ist ein Unterschied :D

    MfG.
    Me

  • Aber sag mir bitte warum Timer in SA-MP auf Millisekunden genau arbeiten müssen?


    Sagte ich nicht, aber eine differenz bis zu 500 ms bei nur einer Sekunde haben die Teilweise schon ;)


    Das ist Teilweise sehr unvorteilhaft, wenn man das hochrechnet oder den Timer häufiger benutzt :thumbup:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Bist du dir sicher, dass dein Include eine gute Alternative ist ?
    Bei einer Sekunde ist selbst der Weg über den normalen Timer genauer....


    (Angaben nach : natürlich in ms | INC = Sein Include | NO INC = Normale Timer Funktion)

    MfG.
    Me

    Dieses System über eine Sekunde laufen zu lassen ist natürlich unvorteilhaft..
    Ich habe auch nie behauptet das es Effizienter oder genauer ist ;)
    Grund ist ja, dass der Timer weiter läuft während Du irgendwann mitten drinn die Funktion aufrufst.


    @BlackAce: Danke für diesen Hinweis, mir ist das bis jetzt noch nicht aufgefallen.
    Ich werde die Include erstmal für meine eigenen Verhältnise umgestalten und je nach dem ob es Effizienter ist oder nicht releasen.