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 ;).
Beiträge von Goldkiller
-
-
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 :/. -
Nutz den Videosammelthread oder euren Vorstellungsthread.
Sonst ist das hier nichts anderes als Werbung. -
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)
-
IsPlayerInArea(playerid, 398.9820, -2177.3076,836.7108,-2424.8113)
-2177.3076 ist MaxY
-2424.8113 ist MinY.Die Werte sind vertauscht.
IsPlayerInArea(playerid, 398.9820, -2424.8113,836.7108,-2177.3076)
-
Stark direkt den falschen Bereich zu erwischen.
-
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.Zitatjede 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=289675Zitat... 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. -
http://forum.sa-mp.de/gta-frem…Cr-konsolen-4#post1982365
Der Thread ist sogar angepinnt -
Neue Kritik:
Benutz den Videosammelthread. -
Zitat
Es geht ja darum, dass die Variable bereits einen Wert hat und man einen völlig neuen Wert haben will
Schon klar, funktioniert ja auch mit beiden Alternativen Funktion:
http://pastebin.com/k4xmx87s -
Welchen Sinn soll das haben ?
Wenn ich einen Text irgendwo in eine Variable "pushen" will, dann benutze ich die direkte Zuweisung.Zitat[14:39:13] Timing "format"...
[14:39:19] Mean = 611.00ns << 4
Mode = 606.00ns
Median = 612.00ns
Range = 12.00ns
[14:39:19] Timing "Push"...
[14:39:22] Mean = 247.00ns << 3
Mode = 247.00ns
Median = 247.00ns
Range = 8.00ns
[14:39:22] Timing "zuweisung"...
[14:39:22] Mean = 46.00ns << 1
Mode = 47.00ns
Median = 47.00ns
Range = 3.00ns
[14:39:22] Timing "strcat"...
[14:39:23] Mean = 132.00ns << 2
Mode = 132.00ns
Median = 132.00ns
Range = 4.00ns
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