Fahrzeuge aus MySQL

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 leute..


    ich hab ein Problem, wo ich nicht weiss, weshalb das kommt..


    In der MySQL-Tabelle befinden sich 64 Fahrzeuge. Die werden allerdings nicht alle ausgelesen.


    Also, ich hab ganz oben



    #undef MAX_VEHICLES
    #define MAX_VEHICLES 100


    d.h. wenn er alle Fahrzeuge geladen hat, bleiben 36 ids von MAX_VEHICLES übrig.


    wenn der Server gestartet wird, wird eine Funktion aufgerufen:

    MySQLGetVehicles("bicycles");
    //... noch 7 weitere davon


    Und hier die Funktion:



    stock MySQLGetVehicles(group[])
    {
    MySQLCheck();
    new data[256];
    mysql_query("SELECT * FROM vehicles");
    mysql_store_result();
    while(mysql_fetch_row_data())
    {
    mysql_fetch_field("vGroup",data);
    if(!strcmp(group,data,true))
    {
    for(new v=0;v<MAX_VEHICLES;v++)
    {
    if(!Vehicle[v][vID])
    {
    mysql_fetch_field("vID",data); Vehicle[v][vID] = strval(data);
    mysql_fetch_field("vModel",data); Vehicle[v][vModel] = strval(data);
    mysql_fetch_field("vPosX",data); Vehicle[v][vPosX] = floatstr(data);
    mysql_fetch_field("vPosY",data); Vehicle[v][vPosY] = floatstr(data);
    mysql_fetch_field("vPosZ",data); Vehicle[v][vPosZ] = floatstr(data);
    mysql_fetch_field("vAngle",data); Vehicle[v][vAngle] = floatstr(data);
    mysql_fetch_field("vColor1",data); Vehicle[v][vColor1] = strval(data);
    mysql_fetch_field("vColor2",data); Vehicle[v][vColor2] = strval(data);
    mysql_fetch_field("vRespawn",data); Vehicle[v][vRespawn] = strval(data);
    mysql_fetch_field("vHealth",data); Vehicle[v][vHealth] = floatstr(data);
    mysql_fetch_field("vPrice",data); Vehicle[v][vPrice] = strval(data);
    mysql_fetch_field("vGroup",data); strmid(Vehicle[v][vGroup],data,0,sizeof(data),255);
    Vehicle[v][vVehicleID] = AddStaticVehicleEx(Vehicle[v][vModel],Vehicle[v][vPosX],Vehicle[v][vPosY],Vehicle[v][vPosZ],Vehicle[v][vAngle],Vehicle[v][vColor1],Vehicle[v][vColor2],Vehicle[v][vRespawn]);
    SetVehicleHealth(Vehicle[v][vVehicleID],Vehicle[v][vHealth]);
    printf("Vehicle %d created (Group: %s).",Vehicle[v][vVehicleID],Vehicle[v][vGroup]);
    break;
    }
    }
    }
    }
    return 0;
    }


    eigentlich logisch, oder?


    Nur werden dann insgesamt 47 Fahrzeuge gespawnt.


    Dann hab ich mal mit printf debugging gemacht.


    Dabei fand ich heraus, das nur jede zweite vID-Variable 0 ist!!


    wenn ich aber vor der Funktion alle vID auslese, gibt es mir da immer 0 aus!


    d.h. nachdem das erste Fahrzeug gespawnt ist, sieht das so aus


    v 0 ist vID 0
    Fahrzeug gespawnt
    v 0 ist vID 1
    v 1 ist vID 105 (WARUM 105??!!)
    v 2 ist vID 0
    nächstes Fahrzeug gespawnt
    v 0 ist vID 1
    v 1 ist vID 105 (WARUM 105??!!)
    v 2 ist vID 2
    v 3 ist vID 105 (hier auch wieder?!)


    usw.


    Hat da jemand eine Erklärung dazu?


    die Variable vID wird NIE sonst irgendwie gesetzt!


    Bin am verzweifeln :S


    MFG selEcT

  • ja, das ist mir schon klar ;) hab ja auch gesagt, dass ich (um weitere fehler auszuschliessen) vor der funktion die Vehicle[vehicleid][vID] Variable ausgelesen habe und der Wert dort bei allen auf 0 gesetzt war ;)


    hmm wie erklärst du dir dann das jede zweite Vehicle[vehicleid][vID] Variable auf 105 gesetzt ist, obwohl ich das nicht auslese..?

  • Hast du vieleicht schon davor noch Fahrzeuge auf dem Server erstellt? Also bevor die Fahrzeuge aus der MySQL Datenbank gelesen werden?
    Ich verstehe auch nicht ganz wieso du MAX_VEHICLES auf 100 definierst..
    Das heißt du möchtest also insgesamt nur 100 Fahrzeuge auf deinem Server dulden?


    -Zunno

  • Ich nehme an, das mysql_fetch_field klappt nicht,
    und die 105 ist ein anderer Wert aus der Spalte...


    hab ich auch gedacht, dem ist aber nicht so.. ausserdem hab ich auch nach dem vID gesucht, es taucht genau mal dort in dieser Funktion auf..


    Hast du vieleicht schon davor noch Fahrzeuge auf dem Server erstellt? Also bevor die Fahrzeuge aus der MySQL Datenbank gelesen werden?


    Nein, deshalb kommt es mir ja auch ein bisschen komisch vor..



    Ich verstehe auch nicht ganz wieso du MAX_VEHICLES auf 100 definierst..
    Das heißt du möchtest also insgesamt nur 100 Fahrzeuge auf deinem Server dulden?


    Das ist nur am Anfang, um Ressourcen zu sparen. wieso soll ich max-vehicles auf 500 definieren, obwohl es auf dem ganzen server nur 70 fahrzeuge gibt? ;) (die nicht gelöscht werden können, vorerst)

  • Es wäre vieleicht besser wenn du die Gruppe in der mysql_query abfrage einbeziehst..
    sprich
    new query[256];
    format(query, sizeof(query), "SELECT * FROM vehicles WHERE vGroup = '%s'",group);
    mysql_query(query);
    Und dann alles was ausgegeben wird laden/erstellen lassen :)

  • Es wäre vieleicht besser wenn du die Gruppe in der mysql_query abfrage einbeziehst..
    sprich
    new query[256];
    format(query, sizeof(query), "SELECT * FROM vehicles WHERE vGroup = '%s'",group);
    mysql_query(query);
    Und dann alles was ausgegeben wird laden/erstellen lassen :)


    k, probier ich mal, könnte funktionieren..


    hmm.. geht immer noch nicht mit dieser Funktion:



    stock MySQLGetVehicles(group[])
    {
    MySQLCheck();
    new query[MAX_STRING],data[MAX_STRING];
    format(query, MAX_STRING, "SELECT * FROM vehicles WHERE vGroup='%s'",group);
    mysql_query(query); mysql_store_result();
    if(mysql_num_rows())
    {
    while(mysql_fetch_row_data())
    {
    for(new v=0;v<MAX_VEHICLES;v++)
    {
    if(!Vehicle[v][vID])
    {
    mysql_fetch_field("vID",data); Vehicle[v][vID] = strval(data);
    mysql_fetch_field("vModel",data); Vehicle[v][vModel] = strval(data);
    mysql_fetch_field("vPosX",data); Vehicle[v][vPosX] = floatstr(data);
    mysql_fetch_field("vPosY",data); Vehicle[v][vPosY] = floatstr(data);
    mysql_fetch_field("vPosZ",data); Vehicle[v][vPosZ] = floatstr(data);
    mysql_fetch_field("vAngle",data); Vehicle[v][vAngle] = floatstr(data);
    mysql_fetch_field("vColor1",data); Vehicle[v][vColor1] = strval(data);
    mysql_fetch_field("vColor2",data); Vehicle[v][vColor2] = strval(data);
    mysql_fetch_field("vRespawn",data); Vehicle[v][vRespawn] = strval(data);
    mysql_fetch_field("vHealth",data); Vehicle[v][vHealth] = floatstr(data);
    mysql_fetch_field("vPrice",data); Vehicle[v][vPrice] = strval(data);
    mysql_fetch_field("vGroup",data); strmid(Vehicle[v][vGroup],data,0,sizeof(data),255);
    Vehicle[v][vVehicleID] = AddStaticVehicleEx(Vehicle[v][vModel],Vehicle[v][vPosX],Vehicle[v][vPosY],Vehicle[v][vPosZ],Vehicle[v][vAngle],Vehicle[v][vColor1],Vehicle[v][vColor2],Vehicle[v][vRespawn]);
    SetVehicleHealth(Vehicle[v][vVehicleID],Vehicle[v][vHealth]);
    printf("Vehicle %d created (Group: %s).",Vehicle[v][vVehicleID],Vehicle[v][vGroup]);
    break;
    }
    }
    }
    }
    return 0;
    }

  • Eine veränderte Query verbessert zwar deine Performance und macht den Code einfacher, er stellt aber keine Lösung für das von dir geschilderte Problem dar


    ja, wäre auch zu schön gewesen..


    ich habs nun statt vID mal mit vVehicleID versucht.. geht auch nicht..



    edit:
    also, ich habs nun mal probiert, in dem ich am schluss der Zuweisung und der Erstellung des Fahrzeuges das hinzugefügt hab:


    Vehicle[v+1][vID] = 0;


    das funktioniert und es werden alle Fahrzeuge richtig ausgelesen. Das könnte ich so machen, da die Fahrzeuge so nur beim GameModeStart ausgelesen werden..


    Allerdings frag ich mich noch immer, wieso das nicht korrekt funktioniert!