Beiträge von Goldkiller

    Die mysql_log alleine bringt in dem Fall nicht alles.
    Was steht denn in der server_log ?
    Falls du dir mal die mysql_log anschaust,dann siehst du,dass die Daten aus der Datenbank geladen werden. Komischerweise aber immer aus row 0. Daher wäre die server_log nicht schlecht.
    Außerdem:
    new id=getFreeCarID(); // Ob du wirklich id brauchst kann ich nicht unbedingt beurteilen.
    printf("id = %d , i = %d",id,i);
    Zu dem Posy:
    fInfo[id][f_y]=cache_get_field_content_float(i,"PosY",dbhandle);// i, nicht id
    Der Fehler stand ja in der mysql_log ;).

    Da steht "Invalid Row Index", nicht "Invalid Column Index".
    Column = Spalte
    Row = Zeile.


    Du gehst die Zeilen falsch durch. Der Ansatz von [GSR]Kaito-sensei ist eigentlich schon ganz okay, nur stimmt dort bei cache_get_field_content_int etwas nicht. Dort solltest du nicht id nehmen. id ist nicht die Zeile die du gerade aus der DB hast sondern für die Variable fInfo den Index den du belegst.
    Ausgehend vom o.g. Code:
    forward OnFrakCarsLoad();
    public OnFrakCarsLoad()
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    printf("num_rows=%d,num_fields=%d",num_rows,num_fields);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++) // i ist der "Row Index" für dein MySQL Ergebnis. Bloß nicht id!
    {
    new id=getFreeCarID(); // Ob du wirklich id brauchst kann ich nicht unbedingt beurteilen.
    fInfo[id][model]=cache_get_field_content_int(i,"model",dbhandle); // i, nicht id
    fInfo[id][fid]=cache_get_field_content_int(i,"Frakid",dbhandle);// i, nicht id
    fInfo[id][f_c1]=cache_get_field_content_int(i,"color1",dbhandle);// i, nicht id
    fInfo[id][f_c2]=cache_get_field_content_int(i,"color2",dbhandle);// i, nicht id
    fInfo[id][f_x]=cache_get_field_content_float(i,"PosX",dbhandle);// i, nicht id
    fInfo[id][f_y]=cache_get_field_content_float(i,"Posy",dbhandle);// i, nicht id
    fInfo[id][f_z]=cache_get_field_content_float(i,"PosZ",dbhandle);// i, nicht id
    fInfo[id][f_r]=cache_get_field_content_float(i,"PosR",dbhandle);// i, nicht id
    fInfo[id][caridd]=cache_get_field_content_int(i,"carid",dbhandle);// i, nicht id
    fInfo[id][db_id]=cache_get_field_content_int(i,"id",dbhandle);// i, nicht id
    //fInfo[id][kmstand]=cache_get_field_content_float(i,"kmstand",dbhandle);// i, nicht id
    fInfo[id][id_x]=CreateVehicle(fInfo[id][model],fInfo[id][f_x],fInfo[id][f_y],fInfo[id][f_z],fInfo[id][f_r],fInfo[id][f_c1],fInfo[id][f_c2],-1);
    printf("Fahrzeuge geladen und erstellt %d", /* fInfo[id][model] */ fInfo[id][id_x] );
    }
    return 1;
    }

    Das hättest dann oben wenigstens auch erwähnen können :-0.
    Dann sollte es mit dem SQL Kommando nicht klappen. Eigentlich solltest du dann aber Fehlern in der server_log.txt erhalten.
    Gut möglich das query zu klein ist.
    saveCarToDB(playerid,carid)
    {
    new query[160];//bischen größer
    format(query,sizeof(query),"INSERT INTO car (besitzer,model,x,y,z,r,farbe1,farbe2) VALUES ('%i','%i','%f','%f','%f','%f','%i','%i')",pInfo[playerid][db_id],cInfo[carid][model],cInfo[carid][c_x],cInfo[carid][c_y],cInfo[carid][c_z],cInfo[carid][c_r],cInfo[carid][farbe1],cInfo[carid][farbe2]);
    printf("query='%s', len = %d",query,strlen(query) );
    mysql_function_query(dbhandle,query,true,"CarSavedToDB","i",carid);
    return 1;
    }

    Zitat

    Seit dem ich die Farbe abspeichere funkt das irgendwie nicht mehr es wird geladen also muss der Fehler beim speichern bzw. beim eintragen in die Datenbank sein.


    Den unterstrichenen Teil sehe ich in deinem Post nicht (UPDATE).
    Ob das Eintragen klappt (INSERT) kannst du doch ganz einfach selber prüfen: /mveh ausführen, zu phpmyadmin wechseln (wahrscheinlich ohne vorher den Server zu Verlassen) und schauen ob der Eintrag in der Datenbank korrekt ist.

    Ich bezweifel mal ganz stark,dass du eine eigene MySQL Funktion Namens getHouseListForPlayer() angelegt hast.
    Steht aber auch in der Fehlermeldung:
    "Error: FUNCTION dean.getHouseListForPlayer does not exist"


    Da es aber nicht deine Funktionen sind, würde ich an deiner Stelle mal eher den Autoren fragen was es mit "getHouseListForPlayer" auf sich hat.
    Der Logik nach könnte man das aber auch nachbauen, ist aber etwas umständlich.

    OnPlayerWeaponShot:
    Da kann man aber noch einiges refaktorieren.
    Eine Frage nebenbei. Warum nimmst du von dem getroffenem Objekt/Auto/Spieler die Position ? Ist da nicht fX,fY,fZ genauer ? Ich stelle mir nur mal vor, ich habe ein riesen Objekt (Hochhaus) und treffe es irgendwo außen. Deiner Funktion nach würde es aber die Map-Position nehmen und dort die Explosion erstellen. Das wäre mit Sicherheit irgendwo "im Haus", was ich niemals sehen könnte.
    Habe ehrlich gesagt OnPlayerWeaponShot noch nie verwendet, daher die Frage zu fX,fY und fZ.


    explosionsmunition:
    Das str ist aber ganz schön überflüssig :/.

    Habe das SendClientMessageFormatted in dieser Version nie benutzt, es könnte aber an den Platzhaltern liegen:
    SCMF(playerid,COLOR_YELLOW,"Du hast dir %s Mats für %s$ gekauft!",anzahl,kosten);
    Sowohl das erste als auch zweite %s müsstest du in %d ändern. Die Variablen anzahl und kosten sind bei dir Integers.

    Zitat

    So, auch das mit dem ausführlichem printing tat ich schon, es kommt einfach nichts.


    "es kommt einfach nichts".
    Wer soll mit dieser Aussage auch nur etwas anfangen könen außer dir?
    Dann füg doch noch mehr Debug Informationen ein.
    zB direkt unter OnPlayerStateChange und nach jedem größerem Block darin.

    Zitat

    Und, mich wundert es, wieso die IDs der BusCars nicht bei 0 anfängt.


    Die VehicleIDs beginnen bei 1.


    Würde es an deiner Stelle erstmal ausführlicher Debuggen.

    new vehicleid = GetPlayerVehicleID(playerid); // Raus aus der Schleif mit GetPlayerVehicleID. Ist unnötig wiederholte Arbeit.
    for(new i=0; i<sizeof(BusCar); i++)
    {
    printf("vehicleid %d - BusCar[%d] %d",vehicleid,i,BusCar[i]);
    if( /* GetPlayerVehicleID(playerid) */ vehicleid == BusCar[i])
    {
    printf("#1 Ok!");
    printf("(Job %d != 1) = %d", GetPVarInt(playerid,"Job") , GetPVarInt(playerid,"Job") != 1 );
    if(GetPVarInt(playerid,"Job")!=1)
    {
    printf("#2 Ok! Spieler wird aus dem BusCar entfernt");
    RemovePlayerFromVehicle(playerid);
    TogglePlayerControllable(playerid,true);
    SendClientMessage(playerid,GRAU,"Du darfst dieses Fahrzeug nicht fahren.");
    }
    }
    }
    Lass es doch mal so laufen und gib die Inhalte aus :-0.

    [Plugin] nativechecker
    Installieren und nochmal ausprobieren. Dir wird dann angezeigt welche Funktion fehlt und daher nicht läuft. Dann kann man Rückschluss auf ein fehlende Plugin ziehen oder Version.


    Ansonsten hört sich aber folgendes auch nicht richtig an:

    Zitat

    [19:24:49] Failed (libmysqlclient_r.so.16: cannot open shared object file: No such file or directory)

    Zitat

    - jede Sekunde mit gettime synchronisieren


    Beste Lösung mMn. Den Timer einfach so einstellen, dass er mindestens 1x pro Sekunde eine Funktion aufruft. Wenn die Timer exakt wären, dann ein Wert unter 1000ms. Sonst hast du eventuell das Pech und überspringst eine Sekunde in der Anzeige.

    Zitat

    jede Sekunde mit UNIX_TIMESTAMP synchronisieren


    Wo bekommst du denn den UNIX_TIMESTAMP her ? Meinst du gettickcount ? Ist im Endeffekt die gleiche Lösung wie mit gettime.

    Zitat

    - jede Sekunde eine Variable hochzählen und jede Nacht mit gettime synchronisieren
    jede Minute eine Variable hochzählen und jede Nacht mit gettime synchronisieren


    Beides ist Mist. Angenommen du machst eine Aktualisierung immer um Mitternacht und lässt dann immer 1000ms (und/oder 60000ms) Timer laufen für die Minute und Sekunden, wird es von der Zeit absolut nicht passen.
    http://forum.sa-mp.com/showthread.php?t=289675

    Zitat

    ... As you can see, the timer is roughly 25% off! ...


    Mit einer Ungenauigkeit wie dieser kann man keine ordentliche Uhr basteln.

    Zitat

    Text3D:GW,
    Text3D:EntLabel,
    Text3D:ExtLabel,


    Vermute mal es liegt daran.


    Du hast die zwar bei FrakDaten drin, möchtest dort aber bestimmt keine Daten hinein laden aus der Datenbank (würde mMn sowieso keinen Sinn machen).
    Daher passt die Struktur innerhalb von e<> nicht mehr, da du nur 49 Werte angibst (und auch 49 Werte aus der DB bekommst) aber 52 innerhalb von FrakDaten zu Verfügung hast.
    Ich wüsste jetzt auch nicht direkt, wie du die Text3D:* skippen könntest.


    Mein Vorschlag:
    Ich würde eine extra enum Struktur anlegen als dummy-FrakDaten (identisch zu FrakDaten,nur ohne die Text3Ds), die genau mit der Datenbankstruktur übereinstimmt. Von dieser dann in FrakDaten kopieren.

    Welchen Sinn soll das haben ?
    Wenn ich einen Text irgendwo in eine Variable "pushen" will, dann benutze ich die direkte Zuweisung.


    http://pastebin.com/b6iAEkCV


    Selbst wenn deine Funktion toll ist,sollte man lieber direkt strcat nutzen.

    Zitat

    Wenn ihr Fehler findet (was gut sein kann, da ich es nichtmal wirklich getestet habe), einfach sagen ^^


    Grund genug es nicht hier zu posten.
    Es ist von der Funktion absolut nicht durchdacht und wird auch nicht funktionieren.
    Hier hast einen Ansatz, wo ein Fehler liegt:
    new mein_tolles_fahrzeug = CreateStreamVehicle(...);


    Übrigens ist der Quellcode auch nicht gerade Übersichtlich gehalten. Das sieht man aber regelmäßig.
    v_Info[idx][v_p][0] = x,v_Info[idx][v_p][1] = y,v_Info[idx][v_p][2] = z,v_Info[idx][v_p][3] = angle;
    DestroyVehicle(v_Info[v][v_ID]),v_Info[v][v_State]=false;
    Kann man machen,klar. Ist zum lesen aber mehr als verwirrend.


    //Edit:
    123marvin123 :thumbup: