[HILFE] Carsystem

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
  • Hallo Com.,


    Ich bin noch neu in der Scripting Welt und bin mit meinem Script schon soweit das ich ein Autosystem scripten muss.


    Nun, ich kann Ingame Autos erstellen und Sie werden auch in meiner Datenbank eingetragen.
    Und jetzt komme Ich nicht mehr weiter...


    Ich weiß nicht wie ich das Fahrzeug Spawne wenn ich mich wieder Einlogge etc.


    Zurzeit wird in der DB gespiechert: id, besitzer, modell, x-achse, y-achse, z-achse, r-achse



    Hier wird das Fahrzeug erstellt:
    createPlayerCar(playerid,modelid,Float:x,Float:y,Float:z,Float:r)
    {
    for(new i=0; i<sizeof(CarInfo); i++)
    {
    if(CarInfo[i][id_x]!=0)continue;
    CarInfo[i][besitzer]=PlayerInfo[playerid][p_id];
    CarInfo[i][c_x]=x;
    CarInfo[i][c_y]=y;
    CarInfo[i][c_z]=z;
    CarInfo[i][c_r]=r;
    CarInfo[i][model]=modelid;
    CarInfo[i][id_x] = CreateVehicle(modelid,x,y,z,r,-1,-1,-1);
    CarInfo[i][db_id]
    new string[128];
    format(string,sizeof(string),"Das Auto CarInfo[%i] wurde erstellt.",i);
    SendClientMessageToAll(CL_SERVER,string);
    saveCarToDB(playerid,i);
    return 1;
    }
    return 1;
    }


    Fahrzeug erstellen Befehl:
    ocmd:acveh(playerid,params[])
    {
    if(!isAdmin(playerid,4))return SendClientMessage(playerid,CL_RED,"[FEHLER]: {FFFFFF}Du bist nicht berechtigt diesen Befehl auszuführen!");
    new mID,pID;
    if(sscanf(params,"ui",pID,mID))return SendClientMessage(playerid,CL_ORANGE,"[BENUTZUNG]: {FFFFFF}/acveh [Player ID] [Vehicle ID]");
    if(mID<400||mID>611)return SendClientMessage(playerid,CL_RED,"[FEHLER]: {FFFFFF}Ungültige Eingabe!");
    new Float:xc,Float:yc,Float:zc,Float:rc;
    GetPlayerPos(pID,xc,yc,zc);
    GetPlayerFacingAngle(pID,rc);
    createPlayerCar(pID,mID,xc,yc,zc,rc);
    return 1;
    }


    OnPlayerDisconnect:
    for(new i=0; i <sizeof(CarInfo); i++)
    {
    if(CarInfo[i][id_x]==0)continue;
    if(CarInfo[i][besitzer]!=PlayerInfo[playerid][p_id])continue;
    new query[128];
    format(query,sizeof(query),"UPDATE user_fahrzeuge SET x='%f',y='%f',z='%f',r='%f' WHERE id='%i'",CarInfo[i][c_x],CarInfo[i][c_y],CarInfo[i][c_z],CarInfo[i][c_r],CarInfo[i][db_id]);
    mysql_pquery(handle, query);
    DestroyVehicle(CarInfo[i][id_x]);
    CarInfo[i][id_x]=0;
    }



    //edit.
    Auto in der Datenbank eintragen:
    saveCarToDB(playerid,carid)
    {
    new query[128];
    format(query,sizeof(query),"INSERT INTO user_fahrzeuge (besitzer,model,x,y,z,r) VALUES ('%i', '%i', '%f','%f','%f','%f')",PlayerInfo[playerid][p_id],CarInfo[carid][model],CarInfo[carid][c_x], CarInfo[carid][c_y], CarInfo[carid][c_z], CarInfo[carid][c_r]);
    mysql_pquery(handle, query);


    return 1;
    }
    Bitte helft mir...


    Danke im Voraus.
    Lg,
    John_Vendetta

  • Guck dir bitte das Autohaus System von MrMonat bei Youtube an dort sind alle Grundlagen erklärt die du benötigst.
    WEnn ich es dir nun schreibe verstehst du den sinn nicht wie es geschrieben wurde und was es bewirkt

  • Also das MySql Statement das du dafür benötigst würde so aussehen:

    Code
    format(sql, sizeof(sql), "SELECT * FROM user_fahrzeuge WHERE besitzer='%d'", PlayerInfo[playerid][p_id]);


    dann brauchst du nur alle Ergebnisse durchgehen und die Fahrzeuge spawnen. Wie das genau bei deinem MySql Plugin aussehen muss solltest du eig. wissen.

  • Guck dir bitte das Autohaus System von MrMonat bei Youtube an dort sind alle Grundlagen erklärt die du benötigst.
    WEnn ich es dir nun schreibe verstehst du den sinn nicht wie es geschrieben wurde und was es bewirkt

    Hab ich ja, aber er benutzt eine ältere MySql Version, er schreibt da andere mysql befehle hin z.B mysql_function_query(dbhandle,query,"true","carSavedToDB","i",carid);


    Diesen Befehl gibt es bei mir z.B nicht

  • wäre bei dir dann

    Code
    mysql_pquery(handle, query, "loadPlayerCars", "d", playerid);

    oder so Ähnlich.


    Welches MySql Plugin verwendest du? Bzw kannst du nicht einfach dort nachsehen wie die Befehle dann bei dir lauten müssten, sollte ja nicht so die Schwierigkeit sein.

  • Auf Nachfrage in PN hier die Erklärung dafür:


    Als erstes benötigst du ein Query beim Login des Spielers, das in etwa so aussieht (für deine Bezeichnungen anpassen):
    new query[128];
    format(query, sizeof(query), "SELECT * FROM user_fahrzeuge WHERE besitzer='%d'", PlayerInfo[playerid][p_id]);
    mysql_pquery(handle, query, "OnUserLoadCars", "d", playerid);


    Danach dann das OnUserLoadCars:
    forward OnUserLoadCars(playerid);
    public OnUserLoadCars(playerid)
    {
    //Query wurde ausgeführt und das Ergebnis im Cache gespeichert
    new rows, id;
    cache_get_row_count(rows);
    if(rows == 0)
    {
    //Der Spieler hat keine Fahrzeuge
    return 1;
    }
    else
    {
    //Es existiert ein Ergebnis, das heißt der Spieler hat Fahrzeuge
    //Wir lesen nun die Zeilen des Caches aus
    for(new i = 0; i < rows; i++)
    {
    id = GetFreeCarInfoID();
    if(id == -1) return 0; //Zu viele Fahrzeuge existieren
    //cache_get_value_name_int(i, "id", CarInfo[id][db_id]); //Wichtig, noch hinzufügen!
    cache_get_value_name_int(i, "model", CarInfo[id][model]);
    cache_get_value_name_float(i, "x", CarInfo[id][c_x]);
    cache_get_value_name_float(i, "y", CarInfo[id][c_y]);
    cache_get_value_name_float(i, "z", CarInfo[id][c_z]);
    cache_get_value_name_float(i, "r", CarInfo[id][c_r]);
    CarInfo[id][besitzer] = PlayerInfo[playerid][p_id];
    CarInfo[id][id_x] = CreateVehicle(CarInfo[id][model],CarInfo[id][c_x],CarInfo[id][c_y],CarInfo[id][c_z],CarInfo[id][c_r],-1,-1,-1);
    }
    }
    return 1;
    }


    Dazu dann noch den stock um einen leeren Index zu finden:
    stock GetFreeCarInfoID()
    {
    for(new i=0; i<sizeof(CarInfo); i++)
    {
    if(CarInfo[i][id_x] == 0) return i;
    }
    return -1;
    }



    Beim OnUserLoadCars habe ich dir eine Zeile auskommentiert, das solltest du beim Erstellen des Fahrzeugs noch hinzufügen, dass dort die DB ID zurück gegeben wird, dann kann diese hier auch geladen werden.
    Das ist dann auch wichtig, wenn du dem Spieler seine Fahrzeuge beim Logout speichern lässt.
    Ich sehe du hast das ja schon angefangen.


    Wie du beim INSERT an die ID kommst, kannst du hier herausfinden: [jTuT] MySQL R41-2 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)
    Gehe dort zum Punkt 6 (Register & Login System), wo OnUserRegister erklärt wird.

  • new query[128];format(query, sizeof(query), "SELECT * FROM user_fahrzeuge WHERE besitzer='%d'", PlayerInfo[playerid][p_id]);mysql_pquery(handle, query, "OnUserLoadCars", "d", playerid);


    Das unter OnUserLogin? ( Hab das Login & Register von dir falls das etwas bringt )


    //edit:


    Hab das bei OnPlayerRequestClass eingefügt:
    public OnPlayerRequestClass(playerid, classid){//Wenn der Spieler die Class-Selection betritt prüfe, ob er bereits eingeloggt istif(!PlayerInfo[playerid][pLoggedIn]){//Wenn nicht, dann prüfe ob der Spieler ein Konto hat//Dazu wird ein Query gesendet und ein neues Callback aufgerufen//%e steht für einen geprüften String (sollte anstatt %s in Queries verwendet werden)new query[128];new query2[128];mysql_format(handle, query, sizeof(query), "SELECT id FROM users WHERE name = '%e'", PlayerInfo[playerid][pName]);format(query2, sizeof(query2), "SELECT * FROM user_fahrzeuge WHERE besitzer='%d'", PlayerInfo[playerid][p_id]);mysql_pquery(handle, query2, "OnUserLoadCars", "d", playerid);//Das Query wird abgesendet und die playerid an OnUserCheck übergebenmysql_pquery(handle, query, "OnUserCheck", "d", playerid);}return 1;}


    Jetzt buggt das mit der Datenbank, es findet den Spieler nicht.


    //edit2:


    Hab jetzt alles gefixt, nun hab ich ein anderes Problem, ich möchte die Farben auch Speichern und hab das auch gemacht aber jetzt speichert er mir die Autos nicht.


    saveCarToDB(playerid,carid)
    {
    new query[128];
    format(query,sizeof(query),"INSERT INTO user_fahrzeuge (besitzer,model,x,y,z,r,farbe1,farbe2) VALUES ('%i','%i','%f','%f','%f','%f','%i','%i')",PlayerInfo[playerid][p_id],CarInfo[carid][model],CarInfo[carid][c_x], CarInfo[carid][c_y], CarInfo[carid][c_z], CarInfo[carid][c_r],CarInfo[carid][farbe1],CarInfo[carid][farbe2]);
    mysql_pquery(handle, query);
    return 1;
    }
    createPlayerCar(playerid,modelid,Float:x,Float:y,Float:z,Float:r,Color1,Color2)
    {
    for(new i=0; i<sizeof(CarInfo); i++)
    {
    if(CarInfo[i][id_x]!=0)continue;
    CarInfo[i][besitzer]=PlayerInfo[playerid][p_id];
    CarInfo[i][c_x]=x;
    CarInfo[i][c_y]=y;
    CarInfo[i][c_z]=z;
    CarInfo[i][c_r]=r;
    CarInfo[i][model]=modelid;
    CarInfo[i][id_x] = CreateVehicle(modelid,x,y,z,r,Color1,Color2,-1);
    CarInfo[i][db_id] = cache_insert_id();
    new string[128];
    format(string,sizeof(string),"Das Auto CarInfo[%i] wurde erstellt.",i);
    SendClientMessageToAll(CL_SERVER,string);
    saveCarToDB(playerid,i);
    return 1;
    }
    return 1;
    }




    @Jeffry

  • Würde einfach mal behaupten, dass die Länge von deinem query die 127 - Zeichenlänge überschreitet - erhöhe einfach die Größe von query z.B. auf 256 (in deinem Code Zeile 3). Sollte das nicht klappen, lass dir den formatierten Query einfach mal per printf ausgeben und führe ihn manuell (z.B. bei phpMyAdmin) aus und schau, welche Antwort dir der Server gibt.

  • Würde einfach mal behaupten, dass die Länge von deinem query die 127 - Zeichenlänge überschreitet - erhöhe einfach die Größe von query z.B. auf 256 (in deinem Code Zeile 3). Sollte das nicht klappen, lass dir den formatierten Query einfach mal per printf ausgeben und führe ihn manuell (z.B. bei phpMyAdmin) aus und schau, welche Antwort dir der Server gibt.

    Danke hat funktioniert!