Beiträge von Double-O-Seven

    Der TaskManager


    Hi.


    Immer wieder sehe ich Leute schreiben, dass es nicht gut sei, viele Timer zu haben und dass diese resourcenfressend seien.
    Das stimmt teilweise. Man kann 100 Timer haben, welche jede Sekunde eine Funktion ausführen. Das ist jedoch erst schlimm, wenn die einzelnen Funktionen selbst sehr viel ausführen müssen.


    Nehmen wir an, wir haben einige notwendige Timer, welche alle zusammen jede Sekunde einmal ausgeführt werden müssen. Oder wir haben eine Timer, der sehr viel auf einmal ausführen muss.


    Der Server beginnt nun womöglich zu laggen. Wo liegt denn das Problem? Das Problem ist offensichtlich, dass alle Timer aufeinmal ausgeführt werden sollen.
    Das ist etwa das gleiche wie wenn 10 Leute gleichzeitig durch eine Tür wollen. Das geht wohl kaum. Wenn sich diese Leute jedoch in eine Reihe stellen, kommen alle problemlos durch.


    Der TaskManager löst dieses Problem.


    Der TaskManager nimmt eine beliebige Anzahl Timer und wird diese dann regelmässig ausführen. Jedoch nicht alle aufeinmal, sondern er wird sie alle schön über das Zeitinterval verteilen. Somit kann der Server selbst immer wieder etwas ausführen und so den Lagg vermindern.


    Die Anwendung ist ganz einfach:

    NewTask<1000>("UpdateAllPlayers", "NVAntiCheat");
    NewTask<15000>("NeedsUpdate", "FuelUpdate", "ClockUpdate");


    Man ruft die Funktion NewTask auf, übergibt ein paar Funktionsnamen und gibt noch das Zeitinterval in den eckigen Klammern an.


    Im obigen Beispiel wird dann nach 500 MS UpdateAllPlayers aufgerufen, nach weiteren 500 MS NVAntiCheat, nach weiteren 500 MS erneut UpdateAllPlayers.
    Würde man einfach zweimal SetTimer aufrufen, würden alle 1000 MS UpdateAllPlayers und NVAntiCheat gleichzeitig ausgeführt werden...
    Also:

    Code
    500 ms -> UpdateAllPlayers
    1000 ms -> NVAntiCheat
    1500 ms -> UpdateAllPlayers
    2000 ms -> NVAntiCheat
    2500 ms -> UpdateAllPlayers
    etc...


    Anstatt

    Code
    1000 ms -> UpdateAllPlayers, NVAntiCheat
    2000 ms -> UpdateAllPlayers, NVAntiCheat
    etc...


    ACHTUNG
    TaskManager unterstützt nur Timer, welche KEINE Argumente nehmen und Timer, welche regelmässig ausgeführt werden.


    Download:
    TaskManager.inc
    ptr.inc (notwendig)

    @Chila:
    Ein Smart und ein Ferrari haben grundsätzlich auch die selben Features. Hättest du lieber den Ferrari.
    (Der Smart entspricht hier dem Godfather-Script.)


    @Verkäufer:
    Wieviele Zeilen hat dein Script?

    Und weil diese braven Leute, die weitaus jünger sind als 18 bestimmt nie P*rnos schauen, ist SA-MP.de die Website, wo sie sich hübsche, halbnackte Frauen ansehen. Verbieten wir die sexy Avatare! Am besten schenken wir ihnen auch noch gleich einen kostenlosen Keuschheitsgürtel, damit sie ja nicht auf böse Gedanken kommen.


    Bitte, so ein Verbot ist meiner Meinung nach kompletter Schwachsinn. Viele von den minderjährigen schauen bestimmt mehrmals die Woche diverse P*rnos. Da sind die sexy Avatare harmlos im Vergleich...

    Ahja, PVars, hab' ich's nicht vorher schon geschrieben? Es gibt einen Bug in SA-MP, bei dem die PVars zurückgesetzt oder wahrscheinlich sogar gelöscht werden, BEVOR die Spieler disconnecten. Also werden "falsche" Werte abgespeichert.


    Mach deinen eigenen Command, der zuerst alle Spieler kickt und dann den Server neustartet!



    // ZCMD
    COMMAND:gmx(playerid, params[])
    {
    if (!IsPlayerAdmin(playerid))
    return 0;

    SendClientMessageToAll(0xFF0000FF, "Server wird neugestartet!");
    for (new i = 0; i < MAX_PLAYERS; i++)
    Kick(i);
    SendRconCommand("gmx");
    return 1;
    }

    Beispiel:

    SQL
    create table Vehicle (
        ID integer auto_increment,
        Model integer,
        primary key (ID));
    
    select max(ID) from Vehicle;
    
    
    insert into Vehicle values (1, 412);
    insert into Vehicle(Model) values (522);


    Beim ersten Insert bestimmts du selbst die ID des Fahrzeuges.
    Beim zweiten Insert wird ID automatisch gewählt wegen auto_increment.

    stock RandomCode(len, buf, size = sizeof buf)
    {
    new
    symbols[] =
    {
    '1', '2', '3', 'a', 'b', 'c' // Weitere hinzufügen...
    };

    len = min(len, size - 1);
    for (new i = 0; i < len; i++)
    buf[i] = symbols[random(sizeof symbols)];
    buf[len] = '\0';
    }


    new string[16];
    RandomCode(10, string); // Generiert Sequenz von 10 zufälligen Zeichen.