Beiträge von UncleSub

    Kann an mehreren Dingen liegen, dass der Server so laggt.


    1. Der Server ist zu langsam.
    2. Du benutzt zu viele Timer.
    3. Dein Script ist generell ziemlich Ressourcenlastig.


    Den 2. und 3. Punkt kannst du nur ausbessern, indem du dein Script Ressourcenfreundlicher umscriptest. Du kannst z.B. mehrere Timer in einem zusammenfassen, falls beide den selber Intervall haben und die selben Parameter besitzen. (Nicht 10x einen 1 Sekunden Timer machen)


    dcmd_lohn(playerid,params[])
    {
    if(SpielerInfo[playerid][pLeader] <= 0) return KeineRechte //Das wird so nicht klappen.
    if(SpielerInfo[playerid][pLeader] == SpielerInfo[playerid][pFraktion])
    {
    new wert, string[128];
    if(sscanf(params,"i",wert)) return SendClientMessage(playerid,weis,"Benutzung: /{38D2F5}lohn{FFFFFF} [Wert]");
    format(string, sizeof(string), "UPDATE `TabellenName` SET `Lohn`='%i' WHERE `Fraktion`='%i'", wert, SpielerInfo[playerid][pFraktion]);
    mysql_query(string);
    }
    return 1;
    }


    Für TabellenName musst du den Namen der Tabelle, die du updaten willst angeben. Evtl. ist in deiner Datenbank auch die Spalte der Fraktion anders benannt, dann musst du dies auch abändern.

    Moin zusammen,


    ich habe in letzter Zeit ein seehr merkwürdiges Problem beim Erstellen von bestimmten Objekten. Und zwar werden die Objekte teilweise doppelt erstellt. Dieser Fehler tritt auf seitdem ich das entsprechende Objekt um 180 drehen wollte, da es dann in die richtige Richtung ausgerichtet ist.
    Das ganze kann man nur schwer erklären, aber diese Bilder sollten es erklären.


    Zuerst wenn das ganze Ingame erstellt wird, funktioniert es:



    Code:


    uBlitzer[i][ubObject] = CreateDynamicObject(18880, x, y, z-1.2, 0.0, 0.0, (rz-180));


    Dann, wenn die Objekte später geladen und erstellt werden, scheint es nicht mehr zu klappen:



    Code:


    uBlitzer[slot][ubObject] = CreateDynamicObject(18880, uBlitzer[slot][ubX], uBlitzer[slot][ubY], uBlitzer[slot][ubZ]-1.2, 0.0, 0.0, (uBlitzer[slot][ubAng]-180.0));


    Ich weiß echt nicht weiter und wäre über Hilfe erfreut.


    Mfg,
    UncleSub


    //Edit: Push und bearbeiten des Themas.
    //Edit 2: Beitrag wurde nicht gepusht

    Selbes Problem auch auf bei mir, jedoch tritt dies nur in Beiträgen auf:



    Ansonsten sagt er es wäre alles Safe:



    Ist die Frage ob dies eine (schwerwiegende- ) Sicherheitslücke ist, oder harmlos ist.

    Trage in der Datenbank überall wo "NULL" ist "0" ein und ändere in der Datenbank, dass NULL nicht allowed ist. (Bsp beim Createn: CREATE TABLE `Test`(`ID` INT NOT NULL,...) Kannst das aber auch nachträglich ändern.)

    Einfach oben im Script (Falls es da nicht schon ist)


    #include a_zones


    Dann später im Befehl:



    new zone[28];
    GetPlayer2DZone(playerid, zone, sizeof(zone));


    //Deine anderen Sachen
    //...
    format(msg,sizeof(msg),"*** [HQ]: %s %s hat einen Blitzer in %s aufgestellt mit einer Geschwindigkeit von: %d ***",FrakName(playerid),PlayerName(playerid),zone,speed);
    //Deine anderen Sachen

    Du hast bereits einen Denkfehler in deinem Ansatz. Du benutzt eine for-Schleife, in der du ein Query ausführst. Das ganze wird also mehrmals ausgeführt und es wird immer das selbe gemacht.
    Die Schleife kannst du dir Sparen. Du kannst eine Variable erstellen, die nach jedem Durchlauf der while Schleife um eins erhöht wird, oder die Daten, zum Erstellen des Autos vorher in Temporäre (Lokale) Variablen speichern, das Auto erstellen und die Daten dann unter dem Index der carid abspeichern.

    Du musst wirklich alle Daten eintragen, die auch in der Datenbank sind, ansonsten musst du quiet Sections nutzen. Denn in dem Data String sind die alle Daten aus einer Zeile enthalten. Mit den quiet Sections kannst du sscanf sagen, dass in dem String Daten sind, die er aber nicht "beachten" soll.


    Zitat von Y_Less


    The two new specifiers "{" and "}" are used for what are known as "quiet" strings. These are strings which are read and checked, but not saved. For example:


    sscanf("42 -100", "{i}i", var);


    Clearly there are two numbers and two "i", but only one return variable. This is because the first "i" is quiet so is not saved, but affects the return value. The code above makes "var" "-100".

    Kann ich das ganze irgendwie verkürzen, indem ich das alles in einen Query oder so mache?


    Natürlich! Das macht das ganze viel schneller und Ressourcenfreundlicher, da die mysql_get... Funktionen pro Aufruf ein Query senden. Da Pawn keine Multi-Threads unterstützt ( =mehrere Aufgaben gleichzeitig bearbeiten können) wartet der gesamte Server, bis die Ergebnisse der Querys da sind. Solange kann der Server nichts machen, auch keine Spieler-Synchronisation (Es kommt zu starken Laggs). Das ganze in einem Query zu machen ist schon mal viel besser, doch ein MySQL Plugin zu benutzen, das Threaded ist, ist noch besser.


    Für das Laden mit einem Query lege ich dir sscanf ans Herz. Ein Bsp. da mit:



    new data[350];
    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    while(mysql_fetch_row(data)) //Solange eine Zeile aus dem Ergebnis geladen werden kann
    {
    sscanf(data, "p<|>iii.....", vehs[i][model],...); //Musst du selber machen
    }


    Man kann mit sscanf sogar Daten direkt ins Enum laden lassen, wie das geht steht hier.


    Ich hoffe ich habe es einigermaßen verständlich erklärt. :)

    Könnte ich noch kurz eine Erklärung haben, warum das jetzt das Problem löst?
    War es jetzt nur wichtig, dass die playerid mit übermittelt wird, damit das Fenster dem richtigen Spieler angezeigt wird?


    Genau so ist es. SetTimer übermittelt keine Parameter, wohingegen SetTimerEx Parameter übergeben kann. Du hast in dem public für den Timer trotzdem einfach den Parameter "playerid" angegeben, obwohl diese nicht übermittelt wird. Diese Variable ist dann einfach immer 0, sprich es wird immer nur dem ersten Spieler angezeigt (ID 0).

    Ich empfehle dir das SQL Plugin von Dan... Ich verfolge schon seit längerer Zeit, den Entwicklungsverlauf dieses Plugins und nun ist das Plugin aus der Beta raus und stable.
    Dieses Plugin ist schneller als jedes andere mir bekannte MySQL Plugin. (Auch R7+) Außerdem ist die Handhabung sehr angenehm.

    Diese Schleife weg machen:


    for(new p = 0; p < MAX_PLAYERS; p++)


    Mit der Schleife wird alle 25 Sekunden eine Schleife durchgeführt, die standardmäßig 500 mal durchläuft. In dieser Schleife hast du dann eine MAX_VEHICLES Schleife. Also werden alle 25 Sekunden 500 mal von jedem Auto 1 Liter abgezogen.


    Edit:


    ich habe gerade noch ein return 1; hingesetzt da wo der tank abgezogen wird jetzt geht es bei dem ersten auto aber wen ich jetzt noch eins machen und den Motorstarte wird da nix abgezogen also nur bei dem ersten Fahrzeug ??


    Ein return in einer Schleife führt zum sofortigen beenden der Schleife. (Selbe Wirkung wie break) Also in Schleifen nur, wenn du auch willst, dass die Schleife stoppt, return's oder break verwenden.

    Du kannst auch Funktionen vom Incognito Streamer nutzen. (Siehe hier)


    Dieser bietet dir Funktionen für Areas (= Gebiete) und auch Callbacks, wenn ein Spieler eine solche Area betritt und/oder verlässt.


    Bsp.:



    new area;
    //In einer Funktion
    area = CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1); //Erstellt ein Rechteck; z.B. Hier einfach Koordinaten von einen GangZoneCreator eintragen
    //
    public OnPlayerEnterDynamicArea(playerid, areaid)
    {
    if(areaid == area)
    {
    //Spieler hat das Rechteck betreten.
    }
    return 1;
    }
    public OnPlayerLeaveDynamicArea(playerid, areaid)
    {
    if(areaid == area)
    {
    //Spieler hat das Rechteck verlassen.
    }
    return 1;
    }


    Dadurch kannst du dir Timer sparen. Ein Anwendungsbeispiel kannst du auch in meiner Blitzer Include sehen, dort verwende ich diese Funktionen.


    UncleSub