MySQL: Autosystem / Tuningteile Speichern

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
  • Nabend zusammen.


    Voweg: ich bin ein absoluter Scriptneuling, befasse mich damit erst seit ca. 1 Woche. Habe mich anhand Tutorials auf Youtube rangetastet und bin nun dabei die übernommenen Systeme auf eigene Faust zu erweitern (um präzise zu werden, ich benutze das System von MrMonat's Tutorials).


    Zur Sache: ich benutze MySQL als Datenbank und möchte an Fahrzeugen angebrachtes Tuning speichern. Dafür habe ich für jeden 'Carmod-Typ' (also Spoiler, Felgen etc.) eine eigene Spalte in meiner 'Autos' MySQL Tabelle erstellt und die entsprechenden Variablen meinem AutoEnum hinzugefügt. Welches Tuning verbaut ist wollte ich dann entweder bei OnVehicleMod oder OnEnterExitModShop (Funktioniert das bei beiden?) auslesen, das ganze per GetVehicleComponentInSlot.


    Hier der Code, den ich mir dafür überlegt habe:



    Tuning auslesen & speichern
    public OnVehicleMod(playerid, vehicleid, componentid)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][id_x]==0)continue;
    if(cInfo[i][besitzer]!=sInfo[playerid][db_id])continue;
    cInfo[i][c_spoiler] = GetVehicleComponentInSlot(cInfo[i][id_x],CARMODTYPE_SPOILER);
    new query[128];
    format(query,sizeof(query),"UPDATE autos SET c_spoiler='%i' WHERE id='%i'",cInfo[i][c_spoiler]);
    mysql_function_query(dbhandle,query,false,"","");
    }
    return 1;
    }


    Leider haut das nicht hin. Wichtig zu erwähnen ist aber, dass das ganze rückwärts bereits einwandfrei funktioniert! D.h., wenn ich in meiner MySQL Datenbank die Spalte "c_spoiler" mit der entsprechenden Komponenten ID fülle und ins Spiel gehe, wird das Auto tatsächlich mit dem korrekten Tuningteil geladen. Es funktioniert nur nicht das Auslesen und Speichern der Teile in die Datenbank.


    Hier nochmal der Code, den ich fürs Laden verwende, falls relevant:


    Tuning laden
    public OnPlayerCarsLoad(playerid)
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeCarID();
    cInfo[id][model]=cache_get_field_content_int(i,"model",dbhandle);
    cInfo[id][carcol1]=cache_get_field_content_int(i,"carcol1",dbhandle);
    cInfo[id][carcol2]=cache_get_field_content_int(i,"carcol2",dbhandle);
    cInfo[id][c_spoiler]=cache_get_field_content_int(i,"c_spoiler",dbhandle);
    cInfo[id][c_hood]=cache_get_field_content_int(i,"c_hood",dbhandle);
    cInfo[id][c_roof]=cache_get_field_content_int(i,"c_roof",dbhandle);
    cInfo[id][c_side]=cache_get_field_content_int(i,"c_side",dbhandle);
    cInfo[id][c_lamps]=cache_get_field_content_int(i,"c_lamps",dbhandle);
    cInfo[id][c_nitro]=cache_get_field_content_int(i,"c_nitro",dbhandle);
    cInfo[id][c_exhaust]=cache_get_field_content_int(i,"c_exhaust",dbhandle);
    cInfo[id][c_wheels]=cache_get_field_content_int(i,"c_wheels",dbhandle);
    cInfo[id][c_stereo]=cache_get_field_content_int(i,"c_stereo",dbhandle);
    cInfo[id][c_hydraulics]=cache_get_field_content_int(i,"c_hydraulics",dbhandle);
    cInfo[id][c_fbump]=cache_get_field_content_int(i,"c_fbump",dbhandle);
    cInfo[id][c_rbump]=cache_get_field_content_int(i,"c_rbump",dbhandle);
    cInfo[id][c_ventleft]=cache_get_field_content_int(i,"c_ventleft",dbhandle);
    cInfo[id][c_ventright]=cache_get_field_content_int(i,"c_ventright",dbhandle);
    cInfo[id][besitzer]=cache_get_field_content_int(i,"besitzer",dbhandle);
    cInfo[id][c_x]=cache_get_field_content_float(i,"x",dbhandle);
    cInfo[id][c_y]=cache_get_field_content_float(i,"y",dbhandle);
    cInfo[id][c_z]=cache_get_field_content_float(i,"z",dbhandle);
    cInfo[id][c_r]=cache_get_field_content_float(i,"r",dbhandle);
    cInfo[id][db_id]=cache_get_field_content_int(i,"id",dbhandle);
    cInfo[id][id_x]=CreateVehicle(cInfo[id][model],cInfo[id][c_x],cInfo[id][c_y],cInfo[id][c_z],cInfo[id][c_r],cInfo[id][carcol1],cInfo[id][carcol2],-1);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_spoiler]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_hood]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_roof]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_side]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_lamps]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_nitro]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_exhaust]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_wheels]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_stereo]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_hydraulics]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_fbump]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_rbump]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_ventleft]);
    AddVehicleComponent(cInfo[id][id_x],cInfo[id][c_ventright]);
    tank[cInfo[i][id_x]]=cache_get_field_content_int(i,"c_tank",dbhandle);
    }
    return 1;
    }


    Wenn es ein total banaler Fehler oder Quatsch von mir ist, bitte ich um Nachsicht. Danke im Voraus! ^^

  • Willkommen auf Breadfish!


    Du hattest bei dem query den zweiten Parameter vergessen, ich schätze mal das ist "i".
    public OnVehicleMod(playerid, vehicleid, componentid)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][id_x] != vehicleid)continue;
    cInfo[i][c_spoiler] = GetVehicleComponentInSlot(cInfo[i][id_x],CARMODTYPE_SPOILER);
    new query[128];
    format(query,sizeof(query),"UPDATE autos SET c_spoiler='%i' WHERE id='%i'",cInfo[i][c_spoiler], i);
    mysql_function_query(dbhandle,query,false,"","");
    }
    return 1;
    }


    Die if-Abfragen habe ich dir auch angepasst, das ist besser so.

  • Danke erstmal für die schnelle Antwort und fürs Willkommenheißen! :D


    Stimmt, da scheint was zu fehlen, denn ich habe es zum Beispiel vor kurzem hinbekommen die Farben (1 und 2) der Autos zu speichern, mit folgendem Code, der ja an sich nach dem gleichen Schema funktioniert:


    Farben speichern
    public OnVehicleRespray(playerid, vehicleid, color1, color2)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][id_x]==0)continue;
    if(cInfo[i][besitzer]!=sInfo[playerid][db_id])continue;
    GetVehicleColor(cInfo[i][id_x],cInfo[i][carcol1],cInfo[i][carcol2]);
    new query[256];
    format(query,sizeof(query),"UPDATE autos SET carcol1='%i',carcol2='%i' WHERE id='%i'",cInfo[i][carcol1],cInfo[i][carcol2],cInfo[i][db_id]);
    mysql_function_query(dbhandle,query,false,"","");
    }
    return 1;
    }


    Das 'i' was du meintest, ist dann wohl das cInfo[db_id]?


    Trotz allem habe ich deine Korrektur gerade vorgenommen, leider tut sich immer noch nichts. Noch ratloser als zuvor. :(

  • Klappt es, wenn du es so schreibst?
    Möglicherweise funktioniert die andere Funktion nicht sofort.


    public OnVehicleMod(playerid, vehicleid, componentid)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][id_x] != vehicleid)continue;
    if(GetVehicleComponentType(componentid) == CARMODTYPE_SPOILER) cInfo[i][c_spoiler] = componentid;
    new query[128];
    format(query,sizeof(query),"UPDATE autos SET c_spoiler='%i' WHERE id='%i'",cInfo[i][c_spoiler], cInfo[i][db_id]);
    mysql_function_query(dbhandle,query,false,"","");
    }
    return 1;
    }

  • Vom Prinzip her war dein Code richtig, nur musst du dir bei der Arbeit mit SA-MP immer bewusst sein: Das ist SA-MP, und SA-MP besteht praktisch nur aus Fehlern. (Mehr oder weniger xD)


    Die Sync ist kompletter Schrott, und ich tippe stark drauf, dass es hier ebenfalls so ist. Du tunst das Fahrzeug, und fragst gleichzeitig ab, ob es die Tuning ID hat:
    GetVehicleComponentInSlot(cInfo[i][id_x],CARMODTYPE_SPOILER);
    bzw, welche Tuning ID es in diesem Slot hat.


    So, jetzt ist es so, dass in der kurzen Zeit der Spoiler noch nicht am Fahrzeug dran ist, sprich es wird 0 ausgegeben (Latenz zwischen Spieler und Server).


    Bei GetVehicleComponentType ist die Latenz egal, da es nur den Slot eines Items ausgibt, da muss der Spieler nicht mit einbezogen werden.



    Das ist wie, wenn du SetPlayerPos machst, und eine Zeile drunter mit GetPlayerPos die Position ausgeben lässt, dann bekommst du die Position, die der Spieler vor SetPlayerPos hatte.

  • Das ist ja spannend. Da hätte ich mir ja noch ewig den Kopf zermartern können, auf sowas kommt mal als Scriptneuling natürlich nicht direkt. Jetzt weiß ich bescheid.


    Inzwischen sitze ich zwar schon wieder vor einem neuen Problem, aber davon verschone ich euch erst mal. :D Danke für deine Hilfe!