Beiträge von Jeffry

    Das klappt dann so nicht, da du bei OnUserLogin ja die Daten aus der Tabelle "user" hast, und nicht die Daten aus "Houses".
    In OnUserLogin musst du ein neues SELECT Query machen, welches aus der Tabelle "Houses" das Haus ausliest, welches der Spieler besitzt.


    Dann kannst du in OnHouseLoad z.B. den Cache für das Hause des Spielers auslesen, dort hast du dann auch die Versicherungsdaten und die Haus ID.

    CMD:mapeditor(playerid, params[])
    {
    #pragma unused params
    static bool:s_mapedit;
    if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid, ROT, "Bitte benutze /rcon login um den Befehl benutzen zu können.");
    if(!s_mapedit) SRC("loadfs mapedit");
    else SRC("unloadfs mapedit");
    s_mapedit = !s_mapedit;
    return 1;
    }

    Selbst wenn ein Aufruf einer non-public Funktion etwas schneller ist, als der Aufruf eines publics, ist der Unterschied so minimal, dass man das selbst bei tausenden Aufrufen pro Minute niemals merken wird. Ebenfalls am Speicherverbrauch.
    Den Aufwand, da etwas zu verkomplizieren oder zu verbiegen, kannst du dir sparen, das macht keinen Sinn. Zudem wird es in den meisten Fällen auf Grund der Notwendigkeit gar nicht möglich sein.


    Nutze publics für Timer und Callbacks aus MySQL, und stock's (bzw. Funktionen generell, geht ja auch ohne stock) für simple Aufrufe.

    Ich beschreibe es dir mal in Stichpunkten, schaue ob du damit einen Code zusammen bekommst:

    • Schleife durch die Fahrzeuge des Spielers (wie beim Speichern)
    • Existentes Fahrzeug in String aufnehmen, pro Zeile (\n) eines
    • Dialog anzeigen
    • Bei Dialog-Klick: Nochmal Schleife durch die Fahrzeuge und counter so lange hochzählen lassen, bis identisch zu listitem (das listitem kann unter Umständen falsch sein, wenn in der Mitte ein Fahrzeug nicht existiert).
    • Den index aus der Schleife in P_Current setzen.


    Versuche, ob du das so umsetzen kannst. Den Code, bis dahin wo du ihn hast, falls es nicht vollständig klappt, kannst du dann natürlich posten.

    Beim Laden - nach CreateVehicle (wichtig):
    cache_get_value_name_int(i,"P_fuel",vehData[PCar[playerid][i][P_VID]][e_fuel]);



    jetzt müssen wir nur noch ein neuen Public erstellen für SavePlayerCars

    forward SavePlayerCars(playerid);
    public SavePlayerCars(playerid)
    {
    new query[512];
    for(new i = 0; i < sizeof(PCar[]); i++)
    {
    if(PCar[playerid][i][P_MID] == 0) continue;
    mysql_format(handle, query, sizeof(query), "UPDATE playercars SET P_fuel = '%d' WHERE P_dbID = '%d'", vehData[PCar[playerid][i][P_VID]][e_fuel], PCar[playerid][i][P_dbID]);
    mysql_pquery(handle, query);
    }
    return 1;
    }
    Weiter würde es dann so aussehen:
    forward SavePlayerCars(playerid);
    public SavePlayerCars(playerid)
    {
    new query[512];
    for(new i = 0; i < sizeof(PCar[]); i++)
    {
    if(PCar[playerid][i][P_MID] == 0) continue;
    mysql_format(handle, query, sizeof(query), "UPDATE playercars SET P_fuel = '%d', P_kilometer = '%d', P_oel = '%d' WHERE P_dbID = '%d'", vehData[PCar[playerid][i][P_VID]][e_fuel], variable_fuer_km, variable_fuer_oel, PCar[playerid][i][P_dbID]);
    mysql_pquery(handle, query);
    }
    return 1;
    }


    Ändere %d zu %f, falls die Fuel-Variable ein Float ist.

    Das kannst du mit format machen:
    ocmd:pn(playerid,params[])
    {
    new pID,text[128],string[145],name[MAX_PLAYER_NAME];
    if(sscanf(params,"is[128]",pID,text))return SendClientMessage(playerid,COLOR_RED, "INFO: /pn [playerid] [text]");
    GetPlayerName(pID, name, MAX_PLAYER_NAME);
    format(string, sizeof(string), "%s (%d): %s", name, playerid, text);
    SendClientMessage(pID,COLOR_YELLOW,string);
    return 1;
    }

    muss ich wirklich jedes mal, wenn ich auf die Info von dem Fahrzeug in dem man sitzt, zugreifen will, muss ich dann echt jedes mal die Schleife machen?:

    Nein, du müsstest den stock so schreiben:
    getCarID(playerid){
    new vID = GetPlayerVehicleID(playerid);
    for(new i = 0; i < sizeof(cInfo); i++){
    if(cInfo[i][id_x] == vID) return i;
    }
    return INVALID_VEHICLE_ID;
    }


    Dann wird dir der richtige Index zurück gegeben.
    Beachte, dass du dort wo du den stock nutzt auch abfrägst, ob der Wert nicht INVALID_VEHICLE_ID ist, bevor du es in einem Array-Index nutzt, sonst kommt es zu Fehlern, da du das Array dann sprengst.


    PS:
    Bitte beachte zukünftig, dass dieser Thread für kleine Scriptingfragen gedacht ist, und nicht für solch große Codes.

    Sondern halt wirklich flüssig. Mir würde als Funktion nur nen Timer einfallen ...

    Entweder mit einem Timer um die 40ms (=24+ Bilder pro Sekunde = Flüssig) oder über OnPlayerUpdate.


    OnPlayerUpdate entdeckt und frage mich wann die so aufgerufen wird ?

    Zwischen 10 und 30 mal pro Sekunde, je nach dem ob du dich bewegst oder nicht. Für deine Anforderung würde das durchaus Sinn machen, das hier einzubauen.


    Damit:

    Kann man die benutzen um eine Flüssige Geschwindigkeit anzuzeigen ?

    Ja.



    also ich würde mit nem Timer jede Millisekunde nen Public aufrufen, glaube aber, dass die Performance drunter leidet

    Das bitte nicht machen, das wären 1000 Bilder pro Sekunde, das ist viel zu viel.

    Daher hab ich noch die '' weggemacht und nun klappts haha

    Die '' am Wert verursachen in aller Regel kein Problem, heißt diese gehen auch bei Integern.
    Für Strings zum Beispiel sind sie aber zwingend notwendig. Daher ist die grundsätzliche Empfehlung, diese immer zu nutzen. Die `` würde ich wiederrum wirklich nur im Ausnahmefall nutzen, oder gar nicht (dann lieber die Spalte umbenennen).


    Kann aber natürlich jeder so halten wie er/sie das gerne mag - und natürlich wie es funktioniert.

    LOAD gehört zur SQL Syntax, daher der Fehler.
    Schreibe es so:
    mysql_format(handle, query, sizeof(query), "SELECT * FROM cars WHERE owner = '%i' AND `load` = '1'", pInfo[playerid][db_id]);


    LOAD wird damit sozusagen "escaped" und kann verwendet werden.