Beiträge von Douq

    SetTimerEx() kann global nicht verwendet werden, sondern nur innerhalb einer Funktion. textid existiert nirgends, sprich wurde nicht definiert. Das musst du eben mit dem Namen der Variable ändern, in welcher die textdrawID enthalten ist.

    Wie lasse ich die Fahrzeuge jetzt laden?


    public OnPlayerDisconnect(playerid, reason){ for(new i=0; i<sizeof(cInfo); i++) { if(cInfo[i][id_x]==0)continue; if(cInfo[i][besitzer]!=PlayerInfo[playerid][p_id])continue; new query[128]; format(query,sizeof(query),"UPDATE autos SET x='%f',y='%f',z='%f',r='%f' WHERE id='%i'",cInfo[i][c_x],cInfo[i][c_y],cInfo[i][c_z],cInfo[i][c_r],cInfo[i][db_id]); } if(IsPlayerNPC(playerid)) return 1; aduty[playerid]=false; KillTimer(Payday[playerid]); SaveUserStats(playerid); return 1;}


    Bin ziemlich neu im Gebiet MySQL und ich weiß nicht wie ich die Query ausführen soll :/

    Das Tutorial von Jeffry kann dir da sicherlich behilflich sein:
    [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5

    Möchtest du es speichern oder in die Datenbank einpflegen? Weil durch den Query wird kein Datensatz aktualisiert, sondern ein neuer erstellt. Sonst nutze einfach mal den debug Modus und schau, welche Fehlermeldung dir zurückgegeben wird. Zusätzlich kannst du dir mal den Query per printf() ausgeben lassen und diesen manuell ausführen (bspw per phpMyAdmin).

    Vergiss sämtliche Änderungen, die dir vorgeschlagen worden, folgendes ist dein Problem:


    1.


    Code
    VALUES ('%i','%i','%f('),'%f','%f')


    Siehst du den Fehler? Du hast ein Hochkomma vergessen (habe es durch die Klammer ersetzt) Das muss hinzugefügt werden.


    2.


    Code
    format(query,sizeof(query),"INSERT INTO autos (besitzer,model,x,y,z,r) VALUES ('%i','%i','%f,'%f','%f')",PlayerInfo[playerid][p_id],cInfo[carid][model],cInfo[carid][c_x],cInfo[carid][c_y],cInfo[carid][c_z],cInfo[carid][c_r]);

    Du möchtest 6 Spalten einem Wert zu weisen beim neuen Datensatz, übergibst aber nur 5 Werte? Innerhalb der Klammer VALUES() befinden sich nämlich nur 5 Werte statt 6.


    Auch würde ich die Länge von 127+1 vom Query erhöhen, da kannst du schnell an dein Limit kommen.

    Code
    fInfo[i ][f_x] = cache_get_value_name_float(i, "X", fInfo[i][f_x]);

    cache_get_value_name* gibt bei Erfolg 1 und bei einem Fehler 0 zurück. Dadurch ergibt sich dein Fehler -> entferne die Zuweisung.



    Code
    cache_get_value_name_float(i, "X", fInfo[i][f_x]);

    So wäre es richtig. Der Inhalt der Spalte wird per Referenz an die jeweilige Variable übergeben.

    Scheinbar hast du dann eine andere Tabellenstruktur, als auf deinem PC. Der Fehler ist (wahrscheinlich) dadurch begründet, dass du die genannten Spalten als 'NOT NULL' definiert hast, sprich sie müssen einen Wert beinhalten. Da du aber scheinbar bei deinem Query bei diesen Spalten keinen Wert zu weist, erscheint dieser Fehler und der Query kann nicht erfolgreich ausgeführt bzw. der Datensatz nicht erstellt werden.


    Du hast nun zwei Möglichkeiten:

    • Erlauben, dass die genannten Spalten (siehe Fehler) NULL enthalten dürfen ODER
    • du gibst einen default Wert an. Ein Default Wert ist ein Wert einer Spalte, den er automatisch erhält, wenn ein neuer Datensatz erstellt wird und kein anderer Wert durch den Query angegeben wird (um es einfach zu erklären).

    Wenn du jetzt nur von Variablen ausgehst, kannst du diese per SetPVar* und GetPVar() untereinander austauschen. Ob es sinnig ist, ist eine andere Frage.


    E: Und, falls das die nächste Frage sein sollte: Funktionen kannst du per CallRemoteFunction() aufrufen.

    Was ist denn jetzt genau dein Problem? Ein Haus auszuwählen, deren ID zwischen 489-600 liegt? Dann kannst du es folgend machen:



    Code
    new housenumber = 489 + random(112);

    random() gibt dir eine Zahl zwischen 0 - MAX-1 zurück, sprich in diesem Fall eine Zahl zwischen 0 - 111. Da durch die Addition immer mindestens der Wert 489 gegeben ist, und zusätzlich maximal 111 dazuaddiert werden, ergibt sich der ID Bereich 489 - 600.

    Unter OnPlayerConnect


    payday_timer[playerid] = SetTimerEx("PayDayZeit", 60000, true, "d", playerid);


    Im Grunde.
    Die Variable zuvor als Array deklarieren

    Aber nicht vergessen, den Timer unter OnPlayerDisconnect() wieder zu killen, sonst reduziert sich der Intervall bis zum PayDay immer um 50%. Außerdem empfehle ich den Timer erst zu starten, wenn der Spieler eingeloggt ist -> sonst kann der Spieler während des LogIns einen PayDay kriegen o.ä.

    Also wenn er scheinbar die Seitenteile erfolgreich ran setzen kann, aber du sie nicht siehst, scheint es ja so als würden sie wieder entfernt werden.


    Wird das Fahrzeug zwischenzeitlich respawnt?
    Oder hast du eventuell ein Anti-Tuning drin, dass eventuell AddVehicleComponent nicht berücksichtigt?