Fraktions Car Bug

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!


    Folgendes Problem:
    Wenn ich ein Fraktionscar ertellen lasse, wird die chache ID nicht richtig ausgelesen, ich poste mal eben den Code:
    stock CreateFrakVehicle(frakid, model, color1, color2, Float:posX, Float:posY, Float:posZ, Float:posA)
    {
    new vehid = CreateVehicle(model, posX, posY, posZ, posA, color1, color2, -1);
    vInfo[vehid][besitzer]=-1;
    vInfo[vehid][fveh] = 1;
    vInfo[vehid][vehicleTank] = 100;
    vInfo[vehid][carkey1] = -1;
    vInfo[vehid][carkey2] = -1;
    fvInfo[vehid][fPosX] = posX;
    fvInfo[vehid][fPosY] = posY;
    fvInfo[vehid][fPosZ] = posZ;
    fvInfo[vehid][fPosA] = posA;
    fvInfo[vehid][fcolor1] = color1;
    fvInfo[vehid][fcolor2] = color2;
    fvInfo[vehid][fmodel] = model;
    fvInfo[vehid][fid] = frakid;
    vInfo[vehid][vdamage] = 1000.0;
    fvInfo[vehid][frank] = 1;
    new query[256];
    format(query, sizeof(query), "INSERT INTO fcars (fid, frank, fmodel, fcolor1, fcolor2, fvehicleTank, fPosX, fPosY, fPosZ, fPosA, fvdamage) VALUES ('%i', '%i', '%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f', '%f')", frakid, 1, model, color1, color2, 100, posX, posY, posZ, posA, 1000.0);
    mysql_function_query(dbhandle,query,true,"OnFrakVehicleCreate","i",vehid);
    new string[128];
    format(string, sizeof(string), ""cBlue"%s [%i]", fInfo[frakid][fshort], fvInfo[vehid][db_id]);
    SetVehicleNumberPlate(vehid, string);
    return vehid;
    }


    public OnFrakVehicleCreate(vehicleid)
    {
    fvInfo[vehicleid][db_id] = cache_insert_id(dbhandle); //Hier sollte die db_id gesetzt werden, das ganze funktioniert nur leider nicht.
    return 1;
    }


    Kann mir jemand sagen, wo der Fehler liegt?
    Ich benutze das MySQL Plugin R5 von BlueG


    //Edit: Vielleicht kann mir ja der nette Jeffry: helfen

  • Sicher, dass du das R5 verwendest? Das beinhaltet gar keine Cache Funktionen.


    Wird denn das Fahrzeug in der Datenbank erstellt?


    Im Serverlog steht R5


    Nein, allerdings verwende ich für meine Privatfahrzeuge einen ähnlichen query und fast die selbe Funktion, deswegen verstehe ich einfach nicht was falsch sein soll.
    Ein Mysql log wird auch nur beim Abspeichern ausgegeben

  • Dort funktioniert es?
    Poste bitte mal den Code wie du es da gemacht hast, damit wir vergleichen können.



    stock CreatePlayerVehicle(playerid, model, color1, color2, Float:posX, Float:posY, Float:posZ, Float:posA)
    {
    new vehid = CreateVehicle(model, posX, posY, posZ, posA, color1, color2, -1);
    vInfo[vehid][besitzer]=sInfo[playerid][db_id];
    vInfo[vehid][vmodelid] = model;
    vInfo[vehid][vcolor1] = color1;
    vInfo[vehid][vcolor2] = color2;
    vInfo[vehid][saveX] = posX;
    vInfo[vehid][saveY] = posY;
    vInfo[vehid][saveZ] = posZ;
    vInfo[vehid][saveA] = posA;
    vInfo[vehid][pveh] = 1;
    vInfo[vehid][vehicleTank] = 100;
    vInfo[vehid][carkey1] = -1;
    vInfo[vehid][carkey2] = -1;
    vInfo[vehid][id_x] = vehid;
    new query[256];
    format(query, sizeof(query), "INSERT INTO pcars (besitzer, color1, color2, modelid, saveX, saveY, saveZ, saveA, tank, damage, carkey1, carkey2) VALUES ('%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f', '%i', '1000.0', '-1', '-1')", sInfo[playerid][db_id], color1, color2, model, posX, posY, posZ, posA, vInfo[vehid][vehicleTank]);
    mysql_function_query(dbhandle,query,true,"OnPlayerVehicleCreate","i",vehid);
    new string[128];
    format(string, sizeof(string), ""cBlue""SERVERTAG" [%i]", vInfo[vehid][db_id]);
    SetVehicleNumberPlate(vehid, string);
    return vehid;
    }


    public OnPlayerVehicleCreate(vehicleid)
    {
    vInfo[vehicleid][db_id] = cache_insert_id(dbhandle);
    return 1;
    }

  • Das was mir auffällt ist, dass du einmal vInfo verwendest und einmal fvInfo. Bei deiner Funktion für die Fraktions-Fahrzeuge bringst du beide Varianten durcheinander.
    Außerdem greifst du beides mal mit der vehicleid auf den Index zu.


    Wie hast du denn vInfo und fvInfo deklariert?

  • Das was mir auffällt ist, dass du einmal vInfo verwendest und einmal fvInfo. Bei deiner Funktion für die Fraktions-Fahrzeuge bringst du beide Varianten durcheinander.
    Außerdem greifst du beides mal mit der vehicleid auf den Index zu.


    Wie hast du denn vInfo und fvInfo deklariert?


    enum vehicleInfo{
    adminveh,
    supveh,
    supobj1,
    supobj2,
    vehicleTank,
    besitzer,
    Float:saveX,
    Float:saveY,
    Float:saveZ,
    Float:saveA,
    Float:vdamage,
    vcolor1,
    vcolor2,
    spoiler,
    hood,
    roof,
    sideskirt,
    lamps,
    nitro,
    exhaust,
    wheels,
    stereo,
    hydraulics,
    frontbumper,
    rearbumper,
    ventright,
    ventleft,
    vmodelid,
    db_id,
    pveh,
    fveh,
    carkey1,
    carkey2,
    id_x
    };
    new vInfo[MAX_VEHICLES][vehicleInfo];


    enum frakvehInfo{
    db_id,
    fid,
    frank,
    Float:fPosX,
    Float:fPosY,
    Float:fPosZ,
    Float:fPosA,
    fmodel,
    fcolor1,
    fcolor2,
    };
    new fvInfo[MAX_FRAKVEH][frakvehInfo];

  • Ja, da hast du die Variablen durcheinander gebracht, und mit dem falschen Index auf die Fraktions-Fahrzeuge zugegriffen.


    Schreibe das enum so:
    enum frakvehInfo{
    db_id,
    fid,
    frank,
    Float:fPosX,
    Float:fPosY,
    Float:fPosZ,
    Float:fPosA,
    fmodel,
    fcolor1,
    fcolor2,
    e_vehID
    };
    new fvInfo[MAX_FRAKVEH][frakvehInfo];


    Die Funktion sieht dann so aus:
    stock CreateFrakVehicle(frakid, model, color1, color2, Float:posX, Float:posY, Float:posZ, Float:posA)
    {
    for(new i=0; i<MAX_FRAKVEH; i++)
    {
    if(fvInfo[i][e_vehID] == 0)
    {
    new vehid = CreateVehicle(model, posX, posY, posZ, posA, color1, color2, -1);
    fvInfo[i][e_vehID]=vehid;
    vInfo[vehid][besitzer]=-1;
    vInfo[vehid][fveh] = 1;
    vInfo[vehid][vehicleTank] = 100;
    vInfo[vehid][carkey1] = -1;
    vInfo[vehid][carkey2] = -1;
    fvInfo[i][fPosX] = posX;
    fvInfo[i][fPosY] = posY;
    fvInfo[i][fPosZ] = posZ;
    fvInfo[i][fPosA] = posA;
    fvInfo[i][fcolor1] = color1;
    fvInfo[i][fcolor2] = color2;
    fvInfo[i][fmodel] = model;
    fvInfo[i][fid] = frakid;
    vInfo[vehid][vdamage] = 1000.0;
    fvInfo[i][frank] = 1;
    new query[256];
    format(query, sizeof(query), "INSERT INTO fcars (fid, frank, fmodel, fcolor1, fcolor2, fvehicleTank, fPosX, fPosY, fPosZ, fPosA, fvdamage) VALUES ('%i', '%i', '%i', '%i', '%i', '%i', '%f', '%f', '%f', '%f', '%f')", frakid, 1, model, color1, color2, 100, posX, posY, posZ, posA, 1000.0);
    mysql_function_query(dbhandle,query,true,"OnFrakVehicleCreate","i",i);
    new string[128];
    format(string, sizeof(string), ""cBlue"%s [%i]", fInfo[frakid][fshort], fvInfo[i][db_id]);
    SetVehicleNumberPlate(vehid, string);
    return vehid;
    }
    }
    return -1;
    }


    Und das Callback sieht dann so aus:
    public OnFrakVehicleCreate(idx)
    {
    fvInfo[idx][db_id] = cache_insert_id(dbhandle); //Hier sollte die db_id gesetzt werden, das ganze funktioniert nur leider nicht.
    return 1;
    }


    Dann dürfte es klappen.

  • Vielen Dank! Funktioniert nun!
    //Edit:


    Noch etwas anderes Jeffry:


    Und zwar werden die Fahrzeug auch nicht richtig abgespeichert.
    Die Funktion dafür sieht folgendermaßen aus:
    stock SaveFrakVehicle(frakid)
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if(vInfo[i][fveh] == 0) continue;
    if(fvInfo[i][fid] == frakid)
    {
    new query[1000], Float:hp;
    GetVehicleHealth(i, hp);
    printf("%f",hp);
    format(query, sizeof(query), "UPDATE fcars SET fid='%i', frank='%i', fmodel='%i', fcolor1='%i', fcolor2='%i', fvehicleTank='%i', fPosX='%f', fPosY='%f', fPosZ='%f', fPosA='%f', fvdamage='%f' WHERE id='%i'",
    fvInfo[i][fid], fvInfo[i][frank], fvInfo[i][fmodel], fvInfo[i][fcolor1], fvInfo[i][fcolor2], vInfo[i][vehicleTank], fvInfo[i][fPosX], fvInfo[i][fPosY], fvInfo[i][fPosZ], fvInfo[i][fPosA], hp, fvInfo[i][db_id]);
    mysql_function_query(dbhandle,query,false,"","");
    vInfo[i][fveh] = 0;
    print(query);
    }
    else
    {
    continue;
    }
    }
    return 1;
    }


    Sie wird auch ordnungsgemäß aufgerufen, der Query stimmt auch (habe ihn printen lassen). Aber in der Datenbank werden die Werte einfach nicht geändert.


    So wird die Funktion aufgerufen

    public OnGameModeExit()
    {
    for(new j=0; j<MAX_FRAKS; j++)
    {
    SaveFrakVehicle(j);
    SaveFrak(j);
    }
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    PlayerKick(i);
    }
    mysql_close(dbhandle);
    print("<<< Datenbankverbindung geschlossen!");
    return 1;
    }