Information:
Es wurde ein Fehler im LoadFracVehicles_Data() Callback gefunden und behoben. Je nach eigenem System-Aufbau sollte der eigene Code in diesem Callback überarbeitet werden.
Dank geht an @_iPit_: der auf den Fehler gestoßen ist.
Information:
Es wurde ein Fehler im LoadFracVehicles_Data() Callback gefunden und behoben. Je nach eigenem System-Aufbau sollte der eigene Code in diesem Callback überarbeitet werden.
Dank geht an @_iPit_: der auf den Fehler gestoßen ist.
Das kannst du bei der jeweiligen Speicherung der Fahrzeuge so machen:
new query[256];
format(query, sizeof(query), "UPDATE FracVehicles SET tuning0 = %d", GetVehicleComponentInSlot(fracVehicle[i][e_vID] , 0));
for(new s=1; s<14; s++)
{
format(query, sizeof(query), "%s, tuning%d = %d ", query, s, GetVehicleComponentInSlot(fracVehicle[i][e_vID] , s));
}
format(query, sizeof(query), "%sWHERE ID = %d", query, i);
mysql_pquery(db, query);
In der Tabelle musst du dann die Attribute tuning0, tuning1, ... tuning13 anlegen.
Moin,
bei mir speichert er keine fahrzeuge mehr. Es funktionierte bis ich e_gekauft und e_zerstoert hinzugefügt habe. Was ist der fehler?
enum fracVehEnum
{
e_modelID,
e_gekauft,
e_zerstoert,
Float:e_x,
Float:e_y,
Float:e_z,
Float:e_a,
Float:carheal,
e_color1,
e_color2,
e_fracID,
e_vID
};
Hier die Publics:
public LoadFracVehicles_Data()
{
//Deklaration neuer temporärer Variablen:
new rows, id, createdVehs;
//Anzahl der gelesenen Datensätze abfragen:
rows = cache_num_rows();
//Schleife durch alle Datensätze:
for(new i=0; i<rows; i++)
{
//Fahrzeug existiert in der Datenbank, wir laden die Daten jetzt aus dem Cache.
id = cache_get_field_content_int(i, "ID");
//Um Fehler bei der Verarbeitung zu vermeiden:
if(id < 0 || id >= MAX_FRAC_VEHICLES) continue;
//Danach die restlichen Daten laden. Unser Index (der Wert mit dem wir auf das
//Fahrzeug in der Datenbank zugreifen) ist die "ID".
fracVehicle[id][e_modelID] = cache_get_field_content_int(i, "ModelID");
fracVehicle[id][e_gekauft] = cache_get_field_content_int(i, "Gekauft");
fracVehicle[id][e_zerstoert] = cache_get_field_content_int(i, "Zerstoert");
fracVehicle[id][e_x] = cache_get_field_content_float(i, "PosX");
fracVehicle[id][e_y] = cache_get_field_content_float(i, "PosY");
fracVehicle[id][e_z] = cache_get_field_content_float(i, "PosZ");
fracVehicle[id][e_a] = cache_get_field_content_float(i, "PosA");
fracVehicle[id][carheal] = cache_get_field_content_float(i, "CarHealth");
fracVehicle[id][e_color1] = cache_get_field_content_int(i, "Color1");
fracVehicle[id][e_color2] = cache_get_field_content_int(i, "Color2");
fracVehicle[id][e_fracID] = cache_get_field_content_int(i, "FracID");
//Zur Sicherheit fragen wir hier nun ab, ob das angegebene Modell auch existiert,
//sollte das nicht der Fall sein, dann wird das Fahrzeug nicht erstellt.
if(fracVehicle[id][e_modelID] >= 400 && fracVehicle[id][e_modelID] <= 611)
{
if(fracVehicle[id][e_gekauft] == 1)
{
//Nachdem das Fahrzeug geladen wurde, wird es erstellt.
fracVehicle[id][e_vID] = CreateVehicle(fracVehicle[id][e_modelID], fracVehicle[id][e_x], fracVehicle[id][e_y], fracVehicle[id][e_z], fracVehicle[id][e_a], fracVehicle[id][e_color1], fracVehicle[id][e_color2], -1);
SetVehicleHealth(fracVehicle[id][e_vID],fracVehicle[id][carheal]);
}
else
{
//Falls eine nicht existierende Model-ID angegeben wurde, geben wir eine Information aus.
printf("[Error] Model-ID %d existiert nicht (ID: %d).", fracVehicle[id][e_modelID], id);
}
}
//Zur Sicherheit fragen wir noch ab, ob das Fahrzeug-Limit noch nicht überschritten wurde.
//Existiert ein Fahrzeug mit der höchsten ID, dann kann kein weiteres mehr erstellt werden.
if(GetVehicleModel(MAX_VEHICLES-1) != 0) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_VEHICLES) erreicht.");
//Zur weiteren Sicherheit prüfen wir noch, ob die maximale Anzahl an Fraktions-Fahrzeugen erreicht ist.
createdVehs++;
if(createdVehs == MAX_FRAC_VEHICLES) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_FRAC_VEHICLES) erreicht.");
}
return 1;
}
public SaveAllFracVehs()
{
//Deklaration neuer temporärer Variablen:
new query[256];
//Schleife durch alle Fraktions-Fahrzeuge
for(new i=0; i<MAX_FRAC_VEHICLES; i++)
{
//Wenn das Fahrzeug existiert
if(fracVehicle[i][e_modelID] >= 400 && fracVehicle[i][e_modelID] <= 611)
{
//Wir fragen die Position des Fahrzeugs ab:
GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
GetVehicleHealth(fracVehicle[i][e_vID], fracVehicle[i][carheal]);
//Und wir erstellen das Query:
format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', Gekauft = '%d', Zerstoert = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', CarHealth = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
fracVehicle[i][e_modelID], fracVehicle[i][e_gekauft], fracVehicle[i][e_zerstoert], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][carheal], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
//handle = die Connection Handle ID die vor mysql_connect steht.
mysql_tquery(handle, query);
}
}
return 1;
}
Hier das Stock
stock SaveFracVehCheck(vehicleid)
{
//Deklaration neuer temporärer Variablen:
new query[256];
//Schleife durch alle Fraktions-Fahrzeuge
for(new i=0; i<MAX_FRAC_VEHICLES; i++)
{
//Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
if(fracVehicle[i][e_vID] == vehicleid)
{
//Wir fragen die Position des Fahrzeugs ab:
GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
GetVehicleHealth(fracVehicle[i][e_vID], fracVehicle[i][carheal]);
//Und wir erstellen das Query:
format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', Gekauft = '%d', Zertoert = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', CarHealth = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
fracVehicle[i][e_modelID], fracVehicle[i][e_gekauft], fracVehicle[i][e_zerstoert], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][carheal], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
//handle = die Connection Handle ID die vor mysql_connect steht.
mysql_tquery(handle, query);
return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
}
}
return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
}
Und hier die Befehle:
ocmd:fferstellen(playerid, params[])
{
//Zuerst fragen wir ab, ob wir noch Fahrzeuge erstellen können
if(GetVehicleModel(MAX_VEHICLES-1) != 0) return SendClientMessage(playerid, 0xFF0000FF, "Es können keine weiteren Fahrzeuge erstellt werden, Limit (MAX_VEHICLES) erreicht.");
//Wir deklarieren die benötigten temporären Variablen.
new tmp[20], idx, model, fID, color1 = -1, color2 = -1;
//Anschließend teilen wir mit strtok die eingegebenen Paramater auf und wandeln sie in eine Zahl um.
//Falls etwas falsches eingegeben wurde, geben wir eine entsprechende Meldung zurück.
tmp = strtok(params, idx);
if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
model = strval(tmp);
//Eine solche Abfrage kann man auch für nachfolgende FraktionsID (fID) machen, falls gewünscht.
if(model < 400 || model > 611) return SendClientMessage(playerid, 0xFF0000FF, "Error: Model ID existiert nicht.");
tmp = strtok(params, idx);
if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
fID = strval(tmp);
tmp = strtok(params, idx);
if(strlen(tmp) && IsNumeric(tmp)) color1 = strval(tmp);
tmp = strtok(params, idx);
if(strlen(tmp) && IsNumeric(tmp)) color2 = strval(tmp);
//Sind alle Parameter korrekt übergeben worden, dann suchen wir uns einen freien Index in den wir das Fraktions-Fahrzeug speichern können.
for(new i=0; i<MAX_FRAC_VEHICLES; i++)
{
//Frei:
if(fracVehicle[i][e_vID] == 0)
{
//Daten werden übergeben
new Float:x, Float:y, Float:z, Float:a;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
fracVehicle[i][e_modelID] = model;
fracVehicle[i][e_gekauft] = 1;
fracVehicle[i][e_zerstoert] = 0;
fracVehicle[i][e_x] = x;
fracVehicle[i][e_y] = y;
fracVehicle[i][e_z] = z;
fracVehicle[i][e_a] = a;
fracVehicle[i][carheal] = 1000;
fracVehicle[i][e_color1] = color1;
fracVehicle[i][e_color2] = color2;
fracVehicle[i][e_fracID] = fID;
//und anschließend in die Datenbank geschrieben.
new query[256];
format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, Gekauft, Zerstoert, PosX, PosY, PosZ, PosA, CarHealth, Color1, Color2, FracID) VALUES ('%d', '%d', '%d, '%d', '%f', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
i, fracVehicle[i][e_modelID], fracVehicle[i][e_gekauft], fracVehicle[i][e_zerstoert], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][carheal], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID]);
mysql_tquery(handle, query);
//Zuletzt wird dann noch das Fahrzeug erstellt und der Spieler in das Fahrzeug gesetzt.
fracVehicle[i][e_vID] = CreateVehicle(fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], -1);
SetVehicleHealth(fracVehicle[i][e_vID],fracVehicle[i][carheal]);
PutPlayerInVehicle(playerid, fracVehicle[i][e_vID], 0);
return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gespeichert.");
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Fraktions-Fahrzeuge erreicht.");
}
ocmd:ffloeschen(playerid, params[])
{
//Wir deklarieren die benötigte temporäre Variable.
new vid;
//Wenn der Spieler keine Vehicle-ID eingibt wird die gelöscht, in der sich der Spieler befindet,
//ansonsten die eingegebene ID.
if(!IsNumeric(params) || !strlen(params)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nutze: /ffloeschen [Vehicle ID]");
vid = strval(params);
if(vid <= 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
for(new i=0; i<MAX_FRAC_VEHICLES; i++)
{
//Eingegebene ID und die des Fraktions-Fahrzeugs stimmen überein.
if(fracVehicle[i][e_vID] == vid)
{
//Daten werden entfernt
fracVehicle[i][e_modelID] = 0;
fracVehicle[i][e_gekauft] = 0;
fracVehicle[i][e_zerstoert] = 0;
fracVehicle[i][e_x] = 0.0;
fracVehicle[i][e_y] = 0.0;
fracVehicle[i][e_z] = 0.0;
fracVehicle[i][e_a] = 0.0;
fracVehicle[i][carheal] = 0.0;
fracVehicle[i][e_color1] = 0;
fracVehicle[i][e_color2] = 0;
fracVehicle[i][e_fracID] = -1;
//und anschließend in der Datenbank gelöscht.
new query[128];
format(query, sizeof(query), "DELETE FROM FracVehicles WHERE ID = '%d'", i);
mysql_tquery(handle, query);
DestroyVehicle(fracVehicle[i][e_vID]);
fracVehicle[i][e_vID] = 0;
return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gelöscht.");
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
}
ocmd:parken(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist in keinem Fahrzeug.");
new vehicleid = GetPlayerVehicleID(playerid);
if(SaveFracVehCheck(vehicleid)) return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug geparkt.");
else return SendClientMessage(playerid, 0xFF0000FF, "Dieses Fahrzeug kann nicht geparkt werden.");
}
Hoffe du kannst mir helfen, mit freundlichem Gruß,
SebMcpepp
format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', Gekauft = '%d', Zertoert = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', CarHealth = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
zu:
format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', Gekauft = '%d', Zerstoert = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', CarHealth = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
Bei Zerstoert hat das "s" gefehlt.
Ich schwöre dir ich habe es alles locker 5 mal durchgeschaut und habe es ums verrecken nicht gesehen. Was stimmt nur mit mir nicht :D:D Danke dir.
Ich schwöre dir ich habe es alles locker 5 mal durchgeschaut
Kein Problem!
Einen kleinen Tipp dazu: Du kannst dir die genaue Fehlermeldung auch im MySQL Log anschauen, das hätte dir sicher direkt auf die Sprünge geholfen.
Stimmt, danke für den Tipp. Ich habe das nun mal verbessert mit der Zertoert in Zerstoert aber er macht es immer noch nicht.
Wenn ich den Server starte kommt diese Errorline:
[20:15:54] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1000', `Color1` int(11) NOT NULL DEFAULT '0', `Color2` int(11) NOT NULL DEFAU' at line 1
Kannst du mir eventuell erklären was ich daraus an Informationen entnehmen kann?
Kannst du bitte den Code dazu posten? So kann ich nur erkennen, dass in der Nähe der angegebenen Stelle ein Fehler ist.
Sorry vergessen, ich denke er meint etwas in diesem Abschnitt:
CreateFVTable()
{
new query[512];
format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `FracVehicles` (");
format(query, sizeof(query), "%s`ID` int(11) NOT NULL PRIMARY KEY,", query);
format(query, sizeof(query), "%s `ModelID` int(11) NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `Gekauft` int(11) NOT NULL DEFAULT '1',", query);
format(query, sizeof(query), "%s `Zerstoert` int(11) NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `PosX` float NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `PosY` float NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `PosZ` float NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `PosA` float NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `CarHealth` float NOT NULL DEFALUT '1000',", query);
format(query, sizeof(query), "%s `Color1` int(11) NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `Color2` int(11) NOT NULL DEFAULT '0',", query);
format(query, sizeof(query), "%s `FracID` int(11) NOT NULL DEFAULT '-1',", query);
format(query, sizeof(query), "%s) ENGINE=InnoDB DEFAULT CHARSET=latin1;", query);
//handle = die Connection Handle ID die vor mysql_connect steht.
mysql_tquery(handle, query);
return 1;
}
Anhand der Fehlermeldung erkennst du ja, dass vor Color1 ein Fehler sein muss. Dann kannst du dort nachschauen.
Dadurch sehe ich, dass hier ein Schreibfehler ist:
format(query, sizeof(query), "%s `CarHealth` float NOT NULL DEFALUT '1000',", query);
DEFALUT zu DEFAULT ändern, dann passt es.
Ah okey, dann weiß ich in Zukunft wie ich diese Fehler zu verstehen habe, vielen Dank.
Ein Problem ist nun das mir beim Starten immernoch ein Error gezeigt wird welcher wie folgt aussieht:
[20:34:15] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
Den kann ich mir nun wirklich nicht erklären. Und wüsste auch nicht wo ich da nach dem Fehler schauen müsste. Mfg
Dazu musst du den Debug Modus einschalten, um zu sehen, welches Query abgesendet wird.
mysql_log(LOG_ALL);
Dann lasse dir den Fehler nochmal ausgeben, und schaue welches Query zuvor im MySQL Log steht. Entsprechend kannst du dann den Code posten bzw. anschauen.
Bei der Fehlermeldung ist es schwieriger den Fehler zu finden, da keine Position angegeben wird.
Okey, habe den Debugmodus angeschaltet und daraufhin den Server gestartet. Dann erscheint folgendes in der mysql_log Datei:
[20:44:05] [DEBUG] mysql_connect - host: "GEAENDERT", user: "GEAENDERT", database: "GEAENDERT", password: "GEAENDERT", port: GEAENDERT, autoreconnect: true, pool_size: 2
[20:44:05] [DEBUG] CMySQLHandle::Create - creating new connection..
[20:44:05] [DEBUG] CMySQLHandle::CMySQLHandle - constructor called
[20:44:05] [DEBUG] CMySQLHandle::Create - connection created (id: 1)
[20:44:05] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[20:44:05] [DEBUG] CMySQLConnection::Connect - connection was successful
[20:44:05] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[20:44:05] [DEBUG] mysql_errno - connection: 1
[20:44:05] [DEBUG] mysql_tquery - connection: 1, query: "CREATE TABLE IF NOT EXISTS `FracVehicles` (`ID` int(11) NOT NULL", callback: "(null)", format: "(null)"
[20:44:05] [DEBUG] mysql_tquery - connection: 1, query: "SELECT * FROM FracVehicles ORDER BY ID ASC", callback: "LoadFracVehicles_Data", format: "(null)"
[20:44:05] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[20:44:05] [DEBUG] CMySQLConnection::Connect - connection was successful
[20:44:05] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[20:44:05] [DEBUG] CMySQLConnection::Connect - establishing connection to database...
[20:44:05] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[20:44:05] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[20:44:05] [DEBUG] CMySQLConnection::Connect - connection was successful
[20:44:05] [DEBUG] CMySQLConnection::Connect - connection was successful
[20:44:05] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
[20:44:05] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[20:44:05] [DEBUG] CMySQLConnection::Connect - auto-reconnect has been enabled
[20:44:05] [DEBUG] CMySQLQuery::Execute[] - error will be triggered in OnQueryError
[20:44:05] [DEBUG] CMySQLQuery::Execute[LoadFracVehicles_Data] - starting query execution
[20:44:05] [DEBUG] CMySQLQuery::Execute[LoadFracVehicles_Data] - query was successfully executed within 0.656 milliseconds
[20:44:05] [DEBUG] CMySQLResult::CMySQLResult() - constructor called
[20:44:05] [DEBUG] Calling callback "LoadFracVehicles_Data"..
[20:44:05] [DEBUG] cache_get_row_count - connection: 1
[20:44:05] [DEBUG] cache_get_field_content_int - row: 0, field_name: "ID", connection: 1
[20:44:05] [DEBUG] CMySQLResult::GetRowDataByName - row: '0', field: "ID", data: "0"
Alles anzeigen
GEAENDERT steht da oben nur da ich meine Daten da raus entfernt habe. Wie man sieht startet er die Verbindung baut sich auf zeigt einen Error und lädt dann ganz normal die Sachen. Schlauer bin ich daraus noch nicht geworden
Der Log zeigt, dass der Fehler beim CREATE TABLE Query sein sollte. Durch genaues Hinschauen und die Erfahrung ist mir dann aufgefallen, dass bei der letzten Spalte ein Komma am Ende ist, das darf da nicht sein.
format(query, sizeof(query), "%s `FracID` int(11) NOT NULL DEFAULT '-1',", query);
Zu
format(query, sizeof(query), "%s `FracID` int(11) NOT NULL DEFAULT '-1'", query);
Ja hatte getestet ob es vielleicht daran liegt und dann vergessen wieder zu löschen.
Also wenn ich in Fahrzeug erstelle schreibt er mir folgendes in die mysql_log Datei:
[21:10:44] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[21:10:44] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 1.240 milliseconds
[21:10:44] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving
[21:10:55] [DEBUG] mysql_tquery - connection: 1, query: "INSERT INTO FracVehicles (ID, ModelID, Gekauft, Zerstoert, PosX,", callback: "(null)", format: "(null)"
[21:10:55] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[21:10:55] [ERROR] CMySQLQuery::Execute[] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0', '-1988.578125', '200.177536', '27.687500', '0.000000', '1000.000000', '3', '' at line 1
[21:10:55] [DEBUG] CMySQLQuery::Execute[] - error will be triggered in OnQueryError
[21:11:12] [DEBUG] mysql_tquery - connection: 1, query: "UPDATE FracVehicles SET ModelID = '407', Gekauft = '1', Zerstoer", callback: "(null)", format: "(null)"
[21:11:12] [DEBUG] CMySQLQuery::Execute[] - starting query execution
[21:11:12] [DEBUG] CMySQLQuery::Execute[] - query was successfully executed within 0.488 milliseconds
[21:11:12] [DEBUG] CMySQLQuery::Execute[] - no callback specified, skipping result saving
Alles anzeigen
Der /fferstellen Befehl sieht so aus:
ocmd:fferstellen(playerid, params[])
{
//Zuerst fragen wir ab, ob wir noch Fahrzeuge erstellen können
if(GetVehicleModel(MAX_VEHICLES-1) != 0) return SendClientMessage(playerid, 0xFF0000FF, "Es können keine weiteren Fahrzeuge erstellt werden, Limit (MAX_VEHICLES) erreicht.");
//Wir deklarieren die benötigten temporären Variablen.
new tmp[20], idx, model, fID, color1 = -1, color2 = -1;
//Anschließend teilen wir mit strtok die eingegebenen Paramater auf und wandeln sie in eine Zahl um.
//Falls etwas falsches eingegeben wurde, geben wir eine entsprechende Meldung zurück.
tmp = strtok(params, idx);
if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
model = strval(tmp);
//Eine solche Abfrage kann man auch für nachfolgende FraktionsID (fID) machen, falls gewünscht.
if(model < 400 || model > 611) return SendClientMessage(playerid, 0xFF0000FF, "Error: Model ID existiert nicht.");
tmp = strtok(params, idx);
if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
fID = strval(tmp);
tmp = strtok(params, idx);
if(strlen(tmp) && IsNumeric(tmp)) color1 = strval(tmp);
tmp = strtok(params, idx);
if(strlen(tmp) && IsNumeric(tmp)) color2 = strval(tmp);
//Sind alle Parameter korrekt übergeben worden, dann suchen wir uns einen freien Index in den wir das Fraktions-Fahrzeug speichern können.
for(new i=0; i<MAX_FRAC_VEHICLES; i++)
{
//Frei:
if(fracVehicle[i][e_vID] == 0)
{
//Daten werden übergeben
new Float:x, Float:y, Float:z, Float:a;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
fracVehicle[i][e_modelID] = model;
fracVehicle[i][e_gekauft] = 1;
fracVehicle[i][e_zerstoert] = 0;
fracVehicle[i][e_x] = x;
fracVehicle[i][e_y] = y;
fracVehicle[i][e_z] = z;
fracVehicle[i][e_a] = a;
fracVehicle[i][carheal] = 1000;
fracVehicle[i][e_color1] = color1;
fracVehicle[i][e_color2] = color2;
fracVehicle[i][e_fracID] = fID;
//und anschließend in die Datenbank geschrieben.
new query[512];
format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, Gekauft, Zerstoert, PosX, PosY, PosZ, PosA, CarHealth, Color1, Color2, FracID) VALUES ('%d', '%d', '%d, '%d', '%f', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
i, fracVehicle[i][e_modelID], fracVehicle[i][e_gekauft], fracVehicle[i][e_zerstoert], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][carheal], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID]);
mysql_tquery(handle, query);
//Zuletzt wird dann noch das Fahrzeug erstellt und der Spieler in das Fahrzeug gesetzt.
fracVehicle[i][e_vID] = CreateVehicle(fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], -1);
SetVehicleHealth(fracVehicle[i][e_vID],fracVehicle[i][carheal]);
PutPlayerInVehicle(playerid, fracVehicle[i][e_vID], 0);
return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gespeichert.");
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Fraktions-Fahrzeuge erreicht.");
}
format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, Gekauft, Zerstoert, PosX, PosY, PosZ, PosA, CarHealth, Color1, Color2, FracID) VALUES ('%d', '%d', '%d, '%d', '%f', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
Zu
format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, Gekauft, Zerstoert, PosX, PosY, PosZ, PosA, CarHealth, Color1, Color2, FracID) VALUES ('%d', '%d', '%d', '%d', '%f', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
Beim dritten %d hat ein ' gefehlt.
Wow da muss man ja wirklich genau schauen, vielen Dank für die Mühe. Jetzt wird wieder alles gespeichert wie es soll. Vielen Dank.
Eine kleine Frage nebenbei noch:
Würde das funktionieren wenn die FracCars geladen werden?:
if(fracVehicle[id][e_modelID] >= 400 && fracVehicle[id][e_modelID] <= 611)
{
if(fracVehicle[id][e_gekauft] == 1)
{
//Nachdem das Fahrzeug geladen wurde, wird es erstellt.
fracVehicle[id][e_vID] = CreateVehicle(fracVehicle[id][e_modelID], fracVehicle[id][e_x], fracVehicle[id][e_y], fracVehicle[id][e_z], fracVehicle[id][e_a], fracVehicle[id][e_color1], fracVehicle[id][e_color2], -1);
SetVehicleHealth(fracVehicle[id][e_vID],fracVehicle[id][carheal]);
}
}
else
{
//Falls eine nicht existierende Model-ID angegeben wurde, geben wir eine Information aus.
printf("[Error] Model-ID %d existiert nicht (ID: %d).", fracVehicle[id][e_modelID], id);
}
}
Du meinst das SetVehicleHealth? Das sollte so klappen.
Ja das klappt, ich meinte aber das hier:
if(fracVehicle[id][e_gekauft] == 1)
{
CreateVehicle . ... .
Wenn 0 ist soll das Vehicle nicht created werden.