Beiträge von Templer

    Wiedermal Hallöle Leute ^^,


    Vorwort:

    Schon wieder der Templer mit seiner gleichen Include vorstellung, aber nunja ich kann einfach keine Zeit dafür aufbringen nun schöne Bilder zu posten, außerdem ist es auch eher in die Programmierung gedacht und nicht für Spieler am Server ^^, ich stelle euch vor das:

    TimerSys Include by Templer
    (for Samp 0.1 or higher) //auch wenn es blöd klingt :P

    Dieses Include ersetzt die Bugghaften SetTimer und SetTimerEx. Aus diesem Grund bugghaft, weil diese Funktionen bei falschen Verwendung bzw. bei richtiger Verwendung meisten (betreffend Strings) Ihren Geist aufgeben und nur sinnlos an CPU Lastung bringen oder wie zum Beispiel dem Herrn Kollegen Hagi Probleme bereiten. Vorerst wollte ich es dem Hagi im Thread Posten, war aber jedoch noch unglücklich über das System betreffend ein paar Fehler. Dieses System (sollte es halt, hab ich noch nicht getestet) die Server von CPU Auslastung schützen, indem nur ein einziger Timer läuft. Dieser Timer überprüft ledeglich nur, ob Timer mit meinem Include eingestellt wurden ^^. Funktionieren tut das Abrufen per CallLocalFunction bzw. CallRemoteFunction, was anpassbar ist am Script oben. Die Standartkonfiguration ist nicht empfehlenswert, aber zu beachten ist, dass ihr mit dem Überprüfungstimer nicht zu niedrig geht bzw. wirklich nur soviel Einstellt wieviel Ihr braucht (Nähere Information unten...). Die Idee kam mir damals hoch, als ich sowas suchte und bei Einstein seinen ProTimer gehört habe. Leider sind alle Mirrors kaputt gewesen und ich war total gekränkt. (Nichtmal Erfahren wie seine Methode funktioniert hat ;( ) Nun ich belasse es mal beim traurig sein und wünsche euch Viel Spaß damit ^^.


    Verwendung:

    SetFastTimer(startname[], time, repeat = 0, endtimer = 0)

    • startname[] ... Der Name von der public Funktion welche aufgerufen werden soll.
    • time ... Zeit in ms, wie oft er sich wiederholen soll.
    • repeat ... 0 (= Nur einmalige Ausführung); 1 (= Wiederholende Ausführung) OPTIONAL
    • endtimer ... Zeit in ms wann der Timer aufhören soll, bei zum Beispiel sich wiederholenden Timern OPTIONAL

    SetFastTimerEx(startname[], time, repeat = 0, const params[], {Float,_}:...)

    • startname[] ... Der Name von der public Funktion welche aufgerufen werden soll.
    • time ... Zeit in ms, wie oft er sich wiederholen soll.
    • repeat ... 0 (= Nur einmalige Ausführung); 1 (= Wiederholende Ausführung) OPTIONAL
    • params[] ... Die Formatierung von jeder angegebenen Tag/Format.
    • {Float,_}:... Variablen/Tags die angegeben werden. Siehe Beispiel von SetTimerEx und unten.
    • endtimer ... Zeit in ms wann der Timer aufhören soll, bei zum Beispiel sich wiederholenden Timern OPTIONAL

    KillFastTimer(timerid) //*Verändert ab v1.1*

    • timerid ... Die ID vom Timer, welche erstellt wurde.


    Funktionen:

    • Verbesserte Technologie, als die normalen Standart Funktionen SetTimer / SetTimerEx.
    • Automatische Optimierungen der Timer bei Bedarf.
    • Unterstützung mehrerer "kurzen" Timer ohne Belastung des Servers.
    • Einfache Anwendung und Installation. Plug & Play
    • Leichthabende Konfiguration von eigener Vorstellung.
    • Ressourcenschonend wie möglich geschrieben (Nach eigener Erfahrung).
    • Einfache Systematik mit übersichtlichen Definitionen zum selber Verstehen.
    • Lächerliche Ausführung von CallLocalFunction und CallRemoteFunction 8)
    • Keine Plugins oder Funktionen notwendig.

    Beispiele:
    Ich zeige euch nun hier ein paar Beispiele von SetFastTimer, SetFastTimerEx und KillFastTimer, wir nehmen an, dass diese Funktion existiert:


    forward Funktionstest();
    public Funktionstest()
    {
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
    {
    SendClientMessage(playerid, 0xFFFFFFAA, "Stirbt der Bauer im Oktober, braucht er im Winter keinen Pullover!");
    }
    return 1;
    }


    Dann rufen wir diese Funktion zum einen einmalig auf ohne Wiederholung nach sagen wir 3 Sekunden:
    SetFastTimer("Funktionstest", 3000, 0);
    ... Wenn er sich wiederholen soll, einfach so:
    SetFastTimer("Funktionstest", 3000, 1);
    ... und wenn die Funktion sich wiederholen soll für 10 Sekunden, dann so:
    SetFastTimer("Funktionstest", 3000, 1, 10000);


    Denn wie oben zu sehen ist, gibt es den optionalen Parameter endtimer.


    Nun sagen wir, die gleiche Funktion jedoch Spieler bezogen:
    forward Funktionstest(playerid);
    public Funktionstest(playerid)
    {
    SendClientMessage(playerid, 0xFFFFFFAA, "Stirbt der Bauer im Oktober, braucht er im Winter keinen Pullover!");
    return 1;
    }
    Dann rufen wir diese Funktion zum einen einmalig auf ohne Wiederholung nach sagen wir 3 Sekunden:
    SetFastTimerEx("Funktionstest", 3000, 0, "d", playerid);
    ... Wenn er sich wiederholen soll, einfach so:
    SetFastTimerEx("Funktionstest", 3000, 1, "d", playerid);
    ... und wenn die Funktion sich wiederholen soll für 10 Sekunden, dann so:
    SetFastTimerEx("Funktionstest", 3000, 1, "d", playerid, 10000);


    Beim letzten kann es unmöglich erscheinen, aber diese Funktion endtimer existiert auch dort ^^.


    Nun kommen wir dazu, einen Timer zu töten und dies geht nun einfach, indem wir die ID vom Timer in eine Variable ablagern und diese wie gewohnt töten.
    new FunTimer;
    FunTimer = SetFastTimer("Funktionstest", 3000, 1, "d", playerid);
    KillFastTimer(FunTimer);
    Diese Variante funktioniert genauso bei SetFastTimerEx auch und natürlich auch, wenn endzeit-Parameter bei beiden definiert wurde. Natürlich bringt sich das Töten von Timern nichts, wenn es sich nicht wiederholt.
    Ansonsten bei weiteren Fragen einfach Posten ^^.


    Installation:

    • Öffne dein GameMode mit PWNo
    • Füge oben im Script unter #include folgendes dazu: #include <timersys>
    • Ersetze vorhande Timer durch SetFastTimer oder
      füge in deinem GameMode oben folgendes hinzu:
      #define SetTimer SetFastTimer
      #define SetTimerEx SetFastTimerEx
      #define KillTimer KillFastTimer
      ACHTUNG: KillTimer benötigt normalerweise die TimerID. Meine Version benötigt nur den Namen um Variablen zu sparen. Siehe Beschreibung oben.Seit Version 1.1 funktioniert die Methode standartmäßig mit der TimerID. Siehe Beispiele oben!
    • Kompiliere dein GameMode mit PWNo
    • Starte deinen Testserver


    Credits:
    /* TimerSys Include by Templer
    (for SAMP 0.3 / or higher)
    Dieses Script darf von jedermann verändert und benutzt werden!
    Mir ist es sogar egal, wenn Ihr was von hier für euren Vorteil rauskopiert!
    Was jedoch nicht Geduldet wird, dass das Copyright entfernt wird vom Script!


    Credits:
    -Double-O-Seven : Für das Zeigen wie Include und GM am besten kommunizieren!
    -Samp-Team : Die es überhaupt ermöglicht haben sowas Programmierbar für GTA zu machen!
    -Hagi: Er mich darauf aufmerksam machte, dass KillFastTimer einige Bugs bereitstellte in der ersten Version*/

    Download:


    TimerSys v1.0 Pastebin-Link
    TimerSys v1.0 Download-Link


    TimerSys v1.1 Pastebin-Link
    TimerSys v1.1 Download-Link
    (Nebenbei gemerkt ist es auch als Dateianhang hier im Forum verfügbar, sollte es zu DownloadProblemen von den Hosts kommen)


    Changelog v1.1:

    • Falsche TimerID Sortierung bei KillFastTimer behoben.
    • Kleine Code Optimierungen die das Script sinnlos um ein paar ms gebremst haben.
    • KillFastTimer erfordert nichtmehr Timernamen sondern die TimerID vom Timer.
    • SetFastTimer / SetFastTimerEx geben nun die Timer ID zurück.
    • Hagi zu Credits hinzugefügt, da er diese oben genannten Bugs gemeldet hat.


    Für weitere Fragen oder Anregungen könnt Ihr natürlich unten posten ... ;)


    Mfg Templer


    //Edit:
    -Neue Version hinzugefügt und Co...

    forward AdminTimer();


    public OnGameModeInit()
    {
    SetTimer("AdminTimer", 2500, 1); //2,5 Sekunden reichen vollkommen.
    //Restlicher Code
    }


    public AdminTimer()
    {
    for(new playerid = 0; playerid != MAX_PLAYERS; playerid++)
    {
    if(GetPlayerScore(playerid) == 50) continue;
    if(IsPlayerInRangeOfPoint(playerid, radius, X, Y, Z))
    {
    //Code was passieren soll, wenn Spieler unter Score 50 drinnen ist.
    }
    }
    }

    Er hats falsch gepostet:
    /* SA-MP Object Functions
    *
    * (c) Copyright 2005-2009, SA-MP Team
    *
    */


    #if defined _objects_included
    #endinput
    #endif
    #define _objects_included
    #pragma library objects


    // Objects


    native CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);
    native SetObjectPos(objectid, Float:X, Float:Y, Float:Z);
    native GetObjectPos(objectid, &Float:X, &Float:Y, &Float:Z);
    native SetObjectRot(objectid, Float:RotX, Float:RotY, Float:RotZ);
    native GetObjectRot(objectid, &Float:RotX, &Float:RotY, &Float:RotZ);
    native IsValidObject(objectid);
    native DestroyObject(objectid);
    native MoveObject(objectid, Float:X, Float:Y, Float:Z, Floatpeed);
    native StopObject(objectid);
    native CreatePlayerObject(playerid, modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ,Float:DrawDistance = 300.0);
    native SetPlayerObjectPos(playerid, objectid, Float:X, Float:Y, Float:Z);
    native GetPlayerObjectPos(playerid, objectid, &Float:X, &Float:Y, &Float:Z);
    native SetPlayerObjectRot(playerid, objectid, Float:RotX, Float:RotY, Float:RotZ);
    native GetPlayerObjectRot(playerid, objectid, &Float:RotX, &Float:RotY, &Float:RotZ);
    native IsValidPlayerObject(playerid, objectid);
    native DestroyPlayerObject(playerid, objectid);
    native MovePlayerObject(playerid, objectid, Float:X, Float:Y, Float:Z, Floatpeed);
    native StopPlayerObject(playerid, objectid);
    native AttachObjectToPlayer(objectid, playerid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);
    native AttachPlayerObjectToPlayer(objectplayer, objectid, attachplayer, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);


    Nebenan gemerkt, welchen Streamer nützt du? Wenn es ein Plugin ist, musst du einen anderen nützen der 0.3b tauglich ist. Wenn es ein FS / Include ist, dann passt die Lösung

    Aber so nebenbei, schon gemerkt das PAWN bei einem kleinem Fehler sofort abstürzt? ^^
    Compiliert mal es so:
    new Buchstaben[27][] ={
    {"A"},//diese
    {"B"},
    {"C"},
    {"D"},
    {"E"},
    {"F"},
    {"G"},
    {"H"},
    {"I"},
    {"J"},
    {"K"},
    {"L"},
    {"M"},
    {"N"},
    {"O"},
    {"P"},
    {"Q"},
    {"R"},
    {"S"},
    {"T"},
    {"U"},
    {"V"},
    {"W"},
    {"X"},
    {"Y"},
    {"Z"}
    };


    und er stürzt sofort ab ^^ Nur weil er es nicht schafft bei Multidimensionalen Arrays den Fehler zu erkennen.

    Du müsstest nur folgende zwei Sachen in der Include a_objects.inc ändern:


    native CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);
    native CreatePlayerObject(playerid, modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ, Float:DrawDistance = 300.0);

    ZKX, entweder du hast dich nun selbst erniedrigt oder kannst nicht lesen ^^ Ich habe diesen Code mit einem return abblocken lassen, wenn Spieler nicht eingeloggt ist (siehe obigen Posts), aber er meint das es nicht geht...

    public OnPlayerRequestClass(playerid, classid)
    {
    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"%s.datei",pname);
    if(Spieler[playerid][Eingeloggt] < 1)
    {
    if(fexist(accFormat))
    {
    SetPlayerCameraPos(playerid,1334.1407,-1885.0770,194.1379);
    SetPlayerCameraLookAt(playerid, 1528.7094,-1553.2479,67.2109);
    ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Bitte logge dich ein","Weiter","Abbrechen");
    }
    else
    {
    SetPlayerCameraPos(playerid,2041.2831,-2717.3804,94.2059);
    SetPlayerCameraLookAt(playerid, 1856.8364,-2562.0042,13.5469);
    ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Weiter","Abbrechen");
    }
    return 1; //Dieses return blockiert nun den kommenden Scriptblock.
    }
    SetPlayerPos(playerid, 1-1983.5542,665.4218,46.5683);
    SetPlayerCameraPos(playerid, -1977.6497,665.9248,46.5683);
    SetPlayerCameraLookAt(playerid, -1983.5542,665.4218,46.5683);
    SetPlayerFacingAngle(playerid,270.0000);
    return 1;
    }

    Ok ich kommentiere dir nun den Scriptteil... Kommentare sind nach // zu sehen. Nun solltest du es sehen, was ich meine..
    public OnPlayerRequestClass(playerid, classid) //Gut, aufgerufen wenn einer in Skinauswahl kommt/ist.
    {
    new pname[MAX_PLAYERS],accFormat[128]; //Schöne Arrays for Spieler-/Dateinamen
    GetPlayerName(playerid,pname,sizeof pname); //Findet Spielernamen heraus
    format(accFormat,sizeof accFormat,"%s.datei",pname); //formatiert Dateinamen zum auslesen
    if(Spieler[playerid][Eingeloggt] < 1) //Ob Spieler eingeloggt ist, aber wenn nicht ...
    {
    if(fexist(accFormat)) //... überprüfe ob Account vorhanden ist, ansonsten...
    {
    SetPlayerCameraPos(playerid,1334.1407,-1885.0770,194.1379); //Setzt die SpielerKamera auf die Koordinaten für bereits registrierte Spieler.
    SetPlayerCameraLookAt(playerid, 1528.7094,-1553.2479,67.2109); //Der Punkt für die SpielerKamera wohin sie schauen soll für bereits registrierte Spieler.
    ShowPlayerDialog(playerid,DIALOG_LOGIN,1,"Login","Bitte logge dich ein","Weiter","Abbrechen"); //LoginDialog für Spieler zeigen
    }
    else //...zwinge Ihn neu zum registrieren.
    {
    SetPlayerCameraPos(playerid,2041.2831,-2717.3804,94.2059); //Setzt die SpielerKamera auf die Koordinaten für neue Spieler.
    SetPlayerCameraLookAt(playerid, 1856.8364,-2562.0042,13.5469); //Der Punkt für die SpielerKamera wohin sie schauen soll für neue Spieler.
    ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Weiter","Abbrechen"); //Registrierungsdialog für Spieler zeigen.
    }
    }
    SetPlayerPos(playerid, 1-1983.5542,665.4218,46.5683); //Setzt Spieler Koordinate auf Punkt, egal ob Registriert oder Neu.
    SetPlayerCameraPos(playerid, -1977.6497,665.9248,46.5683); //Setzt SpielerKamera Neu für Spieler, egal ob Registriert oder Neu.
    SetPlayerCameraLookAt(playerid, -1983.5542,665.4218,46.5683); //Setzt Punkt für Spielerkamera neu für Spieler, egal ob Registriert oder Neu.
    SetPlayerFacingAngle(playerid,270.0000); //Richtet die Ausrichtung vom Skin, wohin der Skin schauen soll.
    return 1;
    }

    forward UpdateUserFile();


    public OnGameModeInit()
    {
    SetTimer("UpdateUserFile", 600000, 1); //Alle 10min Funktion aufrufen
    }


    public UpdateUserFile()
    {
    for(new playerid = 0; playerid != MAX_PLAYERS; playerid++)
    {
    //Der Code zum abspeichern der Daten
    //Die SpielerID ist 'playerid'
    }
    return true;
    }

    Hier bitte, du hast die Werte noch nicht ausgelesen gehabt, ich habs dir mal direkt gemacht ^^:
    public OnPlayerSpawn(playerid)
    {
    new pname[MAX_PLAYERS],accFormat[128];
    GetPlayerName(playerid,pname,sizeof pname);
    format(accFormat,sizeof accFormat,"%s.datei",pname);
    if(dini_Isset(accFormat,"lastx"))
    {
    SetPlayerPos(playerid,dini_Float(accFormat,"lastx"), dini_Float(accFormat,"lasty"), dini_Float(accFormat,"lastz"));
    }
    if(dini_Isset(accFormat,"skin"))
    {
    SetPlayerSkin(playerid,dini_Int(accFormat, "skin"));
    }
    //Restlicher Code ...
    }