Autohaus, Auto soll erstellt werden

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Da müsste der Code meines Erachtens nach so aussehen:
    ocmd:parken(playerid,params[])
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");
    new Float:x,Float:y,Float:z,Float:r,v;
    v = GetPlayerVehicleID(playerid);
    GetVehiclePos(v,x,y,z); //Nicht GetPlayerPos
    GetVehicleZAngle(v,r);
    for(new d = 0; d < sizeof(PCar[]); d++)
    {
    if(PCar[playerid][d][P_VID] == v) //In der Schleife abfragen, in welchem Fahrzeug der Spieler ist. Abfrage auf seine Fahrzeuge, nicht auf die Autohausfahrzeuge
    {
    PCar[playerid][d][P_X] = x;
    PCar[playerid][d][P_Y] = y;
    PCar[playerid][d][P_Z] = z;
    PCar[playerid][d][P_R] = r;
    new q[256];
    //Das Query muss UPDATE nutzen, nicht INSERT. Das Fahrzeug existiert in der Datenbank ja schon.
    mysql_format(db, q, sizeof(q), "UPDATE personalcars SET P_X = '%f', P_Y = '%f', P_Z = '%f', P_R = '%f' WHERE id = '%d'",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_ID]);
    mysql_pquery(db,q);
    SendClientMessage(playerid,-1,"{c45461}Fahrzeug erfolgreich geparkt.");
    return 1; //Um die Schleife und den Befehl zu beenden, damit untenstehende Nachricht nicht gesendet wird
    }
    }
    //Wird nur ausgegeben, wenn kein Fahrzeug des Spielers.
    SendClientMessage(playerid,-1,"{c45461}Du hast keinen Autoschlüssel für dieses Fahrzeug und kannst es nicht parken.");
    return 1;
    }


    Das ganze mit den Autohausauto-Arrays macht keinen Sinn, da das Fahrzeug ja bereits gekauft ist und nicht mehr im Autohaus steht. Daher darfst du darauf auch nicht mehr abfragen, sondern musst das Array des Spielers prüfen.


    Passe das UPDATE Query bitte so an, wie deine Variablen und Spaltennamen heißen.


    Im Code habe ich noch Erklärungen hinzugefügt.

  • Das sind alles solche dummen Fehler, sorry.



    Zitat von Jeffry

    Passe das UPDATE Query bitte so an, wie deine Variablen und Spaltennamen heißen.

    Code
    mysql_format(db, q, sizeof(q), "UPDATE personalcars SET P_X = '%f', P_Y = '%f', P_Z = '%f', P_R = '%f', P_ID = '%d' WHERE id = '%d'",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_ID]);
    			mysql_pquery(db,q);

    So?


    Dazu noch was ist mit Tuningteilen? Das wird schwer oder? Muss ich ja alles abfragen und Speichern aber wie?


    In der Datenbank wird P_ID als -1 gespeichert das ist so nicht richtig oder? (Nach dem Autohauskauf)

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • So?

    Du hast nur das P_ID aufgenommen und sonst nichts. Damit ist die WHERE Bedingung leer, das passt nicht.



    In der Datenbank wird P_ID als -1 gespeichert das ist so nicht richtig oder? (Nach dem Autohauskauf)

    Die ID mit Auto Increment wird benötigt. Diese muss in der WHERE Bedingung stehen und muss beim Kauf mit cache_insert_id gelesen werden, das hatten wir zuvor ja schon.

  • Code
    mysql_format(db, q, sizeof(q), "UPDATE personalcars SET P_X = '%f', P_Y = '%f', P_Z = '%f', P_R = '%f' WHERE P_dbID = '%d'",PCar[playerid][d][P_X],PCar[playerid][d][P_Y],PCar[playerid][d][P_Z],PCar[playerid][d][P_R],PCar[playerid][d][P_dbID]);
    			mysql_pquery(db,q);

    Also so richtig, wie ich verstanden habe dbid ist Auto increment


    Ich meinte mit der Frage das P_ID als -1 nach dem Kauf gespeichert wird warum das so ist?

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Ich glaube P_ID sollte nur die dbID sein
    aber ich habe ja


    Code
    PCar[playerid][d][P_ID] = cache_insert_id();


    das verstehe ich ja nicht.


    Dazu wenn ich nicht im Fahrzeug bin und /parken schreiben kommt das es erfolgreich geparkt wurde und das es mir nicht gehört.




    würde das so gehen?

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Dann musst du dort P_dbID schreiben, wenn du dort diese Variable nutzt.
    Wofür deine Variablen stehen, musst du wissen.



    Zwecks der Meldung:
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");
    zu:
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid,-1,"{c45461}Du bist kein Fahrer eines Fahrzeugs.");



    Zu dem Code:
    Nein. Mache bitte erst mal das eine fertig, bevor du parallel noch etwas anfängst. Dann kommt nur alles durcheinander und es treten Folgefehler bzw. abhängige Fehler in anderen Code-Abschnitten auf, wenn wir hier kreuz und quer Anpassungen machen.

  • Alles läuft, nur verstehe ich ja nicht die Sache mit P_ID. Die ist ja nur -1, die brauch ich ja nicht oder?

    Die brauchst du nicht, du hast ja dafür "P_dbID" erstellt.
    Entferne diese aus der Tabelle und auch aus deinem Code. Achte aber darauf, an den entsprechenden Stellen das P_ID zu P_dbID zu ändern, sonst gibt es wieder Probleme.


    Teste anschließend dein System einmal komplett durch und prüfe nach jedem Schritt die Werte in der Datenbank.
    Autokauf -> Speichern -> Parken -> Server verlassen -> Server betreten -> Auto laden -> etc (was du sonst noch hast).
    Geht das alles ohne Probleme?


    Wenn ja, dann können wir mit dem "Löschen" weitermachen, dazu musst du aber erklären, was das machen soll und wann es das machen soll.
    Wenn nein, poste den Code und beschreibe das Problem genau, welches auftritt.

  • Problem jetzt, Auto wird nicht erstellt.


    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Genau das habe ich vorher schon mal gefragt wie das funktioniert, da ich das nicht verstanden habe wo kommt es hin und wie?
    Da hat man mich glaube ich nicht verstanden Post 30#

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Doch, ich habe das in Post #33 auch aufgeführt, das hast du aber bisher noch nicht gemacht.

    Dort fehlt noch die Zuordnung zu dem das Fahrzeug gehört.
    Wenn du eine "user" Tabelle hast, dann bietet es sich an, dass du die ID des Spielers in dieser Fahrzeug-Tabelle als "Besitzer-ID" einträgst.


    Das Fahrzeug muss dem Spieler ja auch zugeordnet werden, woher soll man aus der Datenbank heraus sonst wissen, wem es gehört?


    Außerdem hast du die Anpassung mit P_ID und P_dbID noch nicht gemacht. In deinem Lade-Code steht nämlich immernoch die P_ID drin.



    Du musst schon die Dinge machen, die ich dir sage, sonst reden wir aneinander vorbei, da ich von Dingen ausgehe, die du gar nicht hast.

  • Ups, mein Fehler habe sie da vergessen raus zunehmen. Gesagt getan.
    Habe glaube ich was übersehen was ist mit der p_dbID die bleibt doch = der ID in der user Tabelle.


    Die P_dbID ist genauso wie die in der user Tabelle? Haben wir so gemacht, oder nicht?
    PCar[playerid][d][P_dbID] = pInfo[playerid][db_id];


    Diese Sache mit SELECT ist mir halt ein großes Rätzel was ich ja nicht verstehe.

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Du bringst das alles durcheinander.


    Wenn du die P_dbID als Auto Increment hast, dann darfst du dieser natürlich nicht die db_id des Spielers zuweisen, sondern musst dafür, wie bereits gesagt, eine neue Spalte anlegen, zum Beispiel P_BesitzerID. Und dann auch dieser Variable die db_id zuweisen.


    Wie schon vorhin gesagt, du musst wissen, wofür die Variablen stehen. Wenn dir das nicht klar ist, benenne dieser sprechender, anstatt nur mit xID. Durcheinander bringen darfst du die Werte und Variablen nicht, sonst klappt es nicht und du verstehst es auch nicht.



    Diese Sache mit SELECT ist mir halt ein großes Rätzel was ich ja nicht verstehe.

    SELECT * FROM tabelle WHERE P_BesitzerID = %d


    Das geht aber wie gesagt nur, wenn du auch eine Spalte für den Besitzer hast, was du ja bisher noch nicht gemacht hast.

  • Oke also richtig ist es,
    P_dbID ist die ganz normale Datenbank ID die automatisch 1,2,3,4,5... Zählt nach der Regenfolge der Spalten
    P_uID ist dann die ID aus der user Tabelle

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Ja, so kannst du es machen.


    Dann sieht der Code so aus:
    forward LoadPlayerCars(playerid);
    public LoadPlayerCars(playerid)
    {
    new rows;
    cache_get_row_count(rows);
    for(new i = 0; i < rows; i++)
    {
    cache_get_value_name_int(i, "dbID", PCar[playerid][i][P_dbID]); //Nutze dbID! Habe es geändert.
    cache_get_value_name_float(i,"P_X",PCar[playerid][i][P_X]);
    cache_get_value_name_float(i,"P_Y",PCar[playerid][i][P_Y]);
    cache_get_value_name_float(i,"P_Z",PCar[playerid][i][P_Z]);
    cache_get_value_name_float(i,"p_R",PCar[playerid][i][P_R]);
    cache_get_value_name_int(i,"P_C1",PCar[playerid][i][P_C1]);
    cache_get_value_name_int(i,"P_C2",PCar[playerid][i][P_C2]);
    cache_get_value_name_int(i,"P_MID",PCar[playerid][i][P_MID]);
    PCar[playerid][i][P_VID] = CreateVehicle(PCar[playerid][i][P_MID],PCar[playerid][i][P_X] , PCar[playerid][i][P_Y], PCar[playerid][i][P_Z], PCar[playerid][i][P_R], PCar[playerid][i][P_C1], PCar[playerid][i][P_C2], -1);
    }
    return 1;
    }


    Und das Query (z.B. nach erfolgreichem Login):
    mysql_format(handle, query, sizeof(query), "SELECT * FROM playercars WHERE P_uID = '%d'", pInfo[playerid][db_id]);
    mysql_pquery(handle, query, "LoadPlayerCars", "d", playerid);
    playercars = Tabellenname. Eventuell anpassen.