Hi.
Man sollte in verschiedene World's keine Befehle eingeben können.
Inwiefern sollte es gehen?
Einfach bei jenen Befehlen am Anfang die Virtuelle Welt abfragen und vergleichen
Hi.
Man sollte in verschiedene World's keine Befehle eingeben können.
Inwiefern sollte es gehen?
Einfach bei jenen Befehlen am Anfang die Virtuelle Welt abfragen und vergleichen
Einfach bei jenen Befehlen am Anfang die Virtuelle Welt abfragen und vergleichen
Wurdest du mir den Quellcode schicken, bin grad am Handy
Wurdest du mir den Quellcode schicken, bin grad am Handy
Naja anpassen müsstest du es ja sowieso auf deine Vorstellungen aber grob würde es so funktionieren
Bin wieder zuhause.
Hab folgendes Problem:
error 021: symbol already defined: "ocmd_ic"
Wie hole ich im MySQL plugin R39-5 von BlueG im mysql_tquery()-Callback die Felder eines mit diesem Callback verbundenen INSERT-Queries?
Dass ich die ID bspw. mit cache_insert_id() hole, ist mir bekannt. Ich könnte also theoretisch einfach mit der einen neuen Query senden, der dann die Daten holt. Ebenso könnte ich dem Callback auch einfach die Daten übergeben. Beides möchte ich aber vermeiden.
Gibt es also eine Möglichkeit, die direkt im Callback des INSERT-Queries zu laden?
Danke im Voraus.
Jemand eine Ideee
Hay.
Also. Ich will es so ungefähr haben: Spieler spawnt (Nur wenn 2 Spieler on sind) er muss ca. 10 sekunden warten und spawnt dann in eine andere virtuelle Welt da spawn anschließend Fahrzeuge.
Wie hole ich im MySQL plugin R39-5 von BlueG im mysql_tquery()-Callback die Felder eines mit diesem Callback verbundenen INSERT-Queries?
Dass ich die ID bspw. mit cache_insert_id() hole, ist mir bekannt. Ich könnte also theoretisch einfach mit der einen neuen Query senden, der dann die Daten holt. Ebenso könnte ich dem Callback auch einfach die Daten übergeben. Beides möchte ich aber vermeiden.
Gibt es also eine Möglichkeit, die direkt im Callback des INSERT-Queries zu laden?
Danke im Voraus.
Also du möchtest einen Datensatz erstellen und beim Funktionsaufruf die Daten, die du übermittelt hast, direkt wieder verwenden? Funktionieren die anderen cache_* Funktionen denn nicht? Ansonsten sollte es da keine (mir bekannte) Möglichkeit geben, das abzuwickeln. Welchen Verwendungszweck soll das denn erfüllen? Eventuell kann man da einen anderen Lösungsansatz finden -> eventuell sind PVars o.ä. interessant?
Hay.
Also. Ich will es so ungefähr haben: Spieler spawnt (Nur wenn 2 Spieler on sind) er muss ca. 10 sekunden warten und spawnt dann in eine andere virtuelle Welt da spawn anschließend Fahrzeuge.
Du hast eine Variable, die Spieleranzahl, die immer +1 gerechnet wird, wenn ein Spieler beitritt. Sollte diese gleich zwei sein, erstellst du einen Timer mit einem Intervall von 1000*10, welcher dann eine Funktion aufruft, der alle Spieler durchgeht und setzt deren virtuelle Welt + ersetellst Fahrzeuge. Falls nicht alle Spieler, die auf dem Server sind, in eine andere virtuelle Welt gesetzt werden soll, musst du bei der Schleife noch eine Bedingung hinzufügen.
weil deine if abfrage irgendwie keinen Sinn ergibt, wenn ich nicht falsch bin, setz am besteln Standard mässig die house_id auf -1 und frag ab ob ein haus -1 hat, wenn ja nimm i.
Kann mir das einer in einem Quellcode zeigen wie das gemeint wird
Hey, mein Haussystem spinnt. Es werden 200 Häuser erstellt(MAX_HOUSE Wert). Kann mir einer erklären warum?
@Jeffry
ocmd:chouse(playerid, params[]){new price, interior, typ;if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]");for(new i=0; i<MAX_HOUSE; i++){if(strval(hInfo[i][house_id])) continue;new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512];GetPlayerPos(playerid, x, y, z);format(string,sizeof(string), "Zum verkauf");format(string2,sizeof(string2), "Niemand");hInfo[i][house_id] = i;hInfo[i][house_owner] = string2;hInfo[i][house_description] = string;hInfo[i][house_price] = price;hInfo[i][house_interior] = interior;hInfo[i][house_typ] = typ;hInfo[i][house_x] = x;hInfo[i][house_y] = y;hInfo[i][house_z] = z;format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')",i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]);mysql_tquery(handle, query);format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i);printf("%s", query);SCM(playerid, BABYBLAU, string);}return 1;}
Erst einmal solltest du bei einer Schleife, wenn du nur ein Haus erstellen willst (wie auch Kaliber bereits meinte), die Schleife durch ein return oder break beenden, sonst durchläuft der die komplette Schleife, auch wenn bereits ein Haus erstellt wurde (-> ergibt keinen Sinn).
Zweitens meint er, dass deine Prämisse keinen Sinn ergibt, die du dort angibst innerhalb der Schleife. Du überprüfst lediglich, ob der Wert eine Zahl ist, sonst nichts. Fraglich ist für mich auch, was es bringt einer Variable einen Index zuzuweisen, auf welche du nur zugreifen kannst, wenn du eh den Index brauchst.
Du kannst entweder eine Variable hinzufügen (z.B. boolean), die auf true setzen wenn ein Slot / Index belegt ist und diese als Bedingung nutzen, oder eben einen Default Wert beim Besitzer setzen und ermitteln, ob dieser gegeben ist oder nicht.
ocmd:chouse(playerid, params[])
{
new price, interior, typ;
if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);
if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]");
for(new i=0; i<MAX_HOUSE; i++)
{
if(strlen(hInfo[i][house_owner]) > 0) continue;
==> Bsp länge vom owner oder du hast alle leeren häuser mit -1 vorinitalisiert das würde auch gehen:
new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512];
GetPlayerPos(playerid, x, y, z);
format(string,sizeof(string), "Zum verkauf");
format(string2,sizeof(string2), "Niemand");
hInfo[i][house_id] = i;
hInfo[i][house_owner] = string2;
hInfo[i][house_description] = string;
hInfo[i][house_price] = price;
hInfo[i][house_interior] = interior;
hInfo[i][house_typ] = typ;
hInfo[i][house_x] = x;
hInfo[i][house_y] = y;
hInfo[i][house_z] = z;
format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')",
i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]);
mysql_tquery(handle, query);
format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i);
printf("%s", query);
SCM(playerid, BABYBLAU, string);
==> break;
}
return 1;
}
Alles anzeigen
Beschreibung ist enthalten mit einem ==> am besten ließt du dir den post von Douq dazu auch nochmal durch.
CodeAlles anzeigenocmd:chouse(playerid, params[]) { new price, interior, typ; if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN); if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]"); for(new i=0; i<MAX_HOUSE; i++) { if(strlen(hInfo[i][house_owner]) > 0) continue; ==> Bsp länge vom owner oder du hast alle leeren häuser mit -1 vorinitalisiert das würde auch gehen: new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512]; GetPlayerPos(playerid, x, y, z); format(string,sizeof(string), "Zum verkauf"); format(string2,sizeof(string2), "Niemand"); hInfo[i][house_id] = i; hInfo[i][house_owner] = string2; hInfo[i][house_description] = string; hInfo[i][house_price] = price; hInfo[i][house_interior] = interior; hInfo[i][house_typ] = typ; hInfo[i][house_x] = x; hInfo[i][house_y] = y; hInfo[i][house_z] = z; format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')", i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]); mysql_tquery(handle, query); format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i); printf("%s", query); SCM(playerid, BABYBLAU, string); ==> break; } return 1; }Beschreibung ist enthalten mit einem ==> am besten ließt du dir den post von Douq dazu auch nochmal durch.
Ok, hab das von Douq nicht ganz verstanden aber mal versucht umzusetzen.
ocmd:chouse(playerid, params[])
{
new price, interior, typ, i;
if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);
if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]");
hInfo[i][house_id] = -1;
for(i=0; i<MAX_HOUSE; i++)
{
if(hInfo[i][house_id] == -1){ break; } else {
new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512];
GetPlayerPos(playerid, x, y, z);
format(string,sizeof(string), "Zum verkauf");
format(string2,sizeof(string2), "Niemand");
hInfo[i][house_id] = i;
hInfo[i][house_owner] = string2;
hInfo[i][house_description] = string;
hInfo[i][house_price] = price;
hInfo[i][house_interior] = interior;
hInfo[i][house_typ] = typ;
hInfo[i][house_x] = x;
hInfo[i][house_y] = y;
hInfo[i][house_z] = z;
format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')",
i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]);
mysql_tquery(handle, query);
format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i);
printf("%s", query);
SCM(playerid, BABYBLAU, string);
}
}
return 1;
}
Er erstellt jetzt garnichts mehr ![]()
Versuchs mal so:
ocmd:chouse(playerid, params[])
{
new price, interior, typ;
if(!isPlayerAnAdmin(playerid,4))return SCM(playerid, ERROR_FARBE, ERROR_ADMIN);
if(sscanf(params,"ddd",price,interior,typ))return SCM(playerid, -1, "Tippe: /chouse [price] [interior] [typ]");
for(new i; i<MAX_HOUSE; i++)
{
if(hInfo[i][house_description][0] != EOS) continue;
new Float:x, Float:y, Float:z, string[64], string2[MAX_PLAYER_NAME], query[512];
GetPlayerPos(playerid, x, y, z);
format(string,sizeof(string), "Zum verkauf");
format(string2,sizeof(string2), "Niemand");
hInfo[i][house_id] = i;
hInfo[i][house_owner] = string2;
hInfo[i][house_description] = string;
hInfo[i][house_price] = price;
hInfo[i][house_interior] = interior;
hInfo[i][house_typ] = typ;
hInfo[i][house_x] = x;
hInfo[i][house_y] = y;
hInfo[i][house_z] = z;
format(query, sizeof(query), "INSERT INTO houses (id, owner, description, price, interior, posx, posy, posz, typ) VALUES ('%d', '%s', '%s', '%d', '%d', '%f', '%f', '%f', '%d')",
i, hInfo[i][house_owner], hInfo[i][house_description], hInfo[i][house_price], hInfo[i][house_interior], hInfo[i][house_x], hInfo[i][house_y], hInfo[i][house_z], hInfo[i][house_typ]);
mysql_tquery(handle, query);
format(string,sizeof(string), "Du hast erfolgreich das Haus(ID: %d) erstellt.",i);
printf("%s", query);
SCM(playerid, BABYBLAU, string);
break;
}
return 1;
}
Alles anzeigen
Also du möchtest einen Datensatz erstellen und beim Funktionsaufruf die Daten, die du übermittelt hast, direkt wieder verwenden?
Richtig
Funktionieren die anderen cache_* Funktionen denn nicht?
Nein, leider nicht. Die waren auch meine erste Idee.
Gut, wenn sonst auch niemand eine andere Idee hat, muss ich wohl oder übel die drölftausend Werte als Parameter an das Callback übergeben. ![]()
Danke für die Antwort.
Tagchen, hätte mal eine Frage zu einer recht neueren Funktion der "r40" BlueG SQL Plugin Reihe.
Und zwar wollte ich fragen ob die INI datei im Main Ordner liegen muss oder im Scriptfiles ordner und ob meine Konfiguration richtig ist.
Die 2 Fragen kommen auf, da der errno -1 ausgibt und der errno meines Wissens nach auf 0 stehen muss für eine aktive Verbindung.
-> SQL Konfigurationsdatei <-
hostname = 127.0.0.1
username = root
password =
database = actors
auto_reconnect = true
multi_statements = true
pool_size = 2
server_port = 3306
-> SQL Verbindung <-
sql = mysql_connect_file("mysql.ini");printf("errno:%d",mysql_errno(sql));
Und zwar wollte ich fragen ob die INI datei im Main Ordner liegen muss oder im Scriptfiles ordner und ob meine Konfiguration richtig ist.
Die 2 Fragen kommen auf, da der errno -1 eingibt und der errno meines Wissens nach auf 0 stehen muss für eine aktive Verbindung.
1. Ehh probiers aus?
Das sollte nicht sehr lange dauern xD
2. Richtig, er muss 0 sein. errno steht für Error Code, und wenn dieser -1 ist, bedeutet dies invalid connection handle. Sprich, da stimmt etwas mit dem connecten nicht ![]()
@Kaliber
Hab bereits beide ausprobiert, also Main & Scriptfiles Ordner und hatte diese Konfig angegeben, connecten tut er aber nicht.
Finde diese Methode aber echt interessant und toll, da man dafür nur noch eine Zeile im Quellcode braucht fast um sich zur Datenbank zu verbinden.
1. Es steht im Wiki: You can't specify any directories in the file name, the connection file has to be in the SA-MP server root folder.
Also es darf nicht in den scriptfiles liegen.
2. Hat man davor doch auch...mysql_connect...
Du musst immer noch prüfen..ob alles geklappt hat oder nicht.
Der einzige Vorteil ist, du musst dein Passwort nicht im Skript angeben ![]()