Lass dir die IP mal per print ausgeben. Ist dort eventuell auch alles 0?
Falls nicht, versuche es hiermit:
http://forum.sa-mp.com/showthread.php?t=362764
Code dazu:
strexplode(zahl, ip, ".");
Lass dir die IP mal per print ausgeben. Ist dort eventuell auch alles 0?
Falls nicht, versuche es hiermit:
http://forum.sa-mp.com/showthread.php?t=362764
Code dazu:
strexplode(zahl, ip, ".");
Ok.
Splitte die IP so:
new zahl[4];
sscanf(ip, "p<.>iiii", zahl[0], zahl[1], zahl[2], zahl[3]);
Dann hast du dort die einzelnen Zahlen drin stehen und kannst die vergleichen.
Bei vielen ändern sich übrigens die hinteren beiden Ranges der IP.
wie würde man dies in R39 auslesen?
Je nach dem wie genau es aussehen soll, eventuell so:
mysql_pquery(handle, "SELECT name, version FROM server WHERE id = 1;", "OnServer");
Und dann in einem extra Public:
forward OnServer();
public OnServer()
{
if(cache_get_row_count() == 0) return 1;
new strVersion[64], strGameMode[32];
cache_get_field_content(0, "name", strGameMode, handle);
cache_get_field_content(0, "version", strGameMode, handle);
format(strGameMode, sizeof(strGameMode), "%s %s", strGameMode, strVersion);
SetGameModeText(strGameMode);
format(strVersion, sizeof(strVersion), "hostname %s", strGameMode);
SendRconCommand(strVersion);
return 1;
}
Wäre das dann so?
Warum willst du die IP eigentlich splitten?
Nein, du kannst ein Query natürlich auch so schreiben, um alle Spalten auszulesen:
Die mysql_Get/Set... Funktionen waren schon in den alten Plugin Versionen das schlechteste an Performance, da die Datenbank viel zu oft unnötig angesprochen wird. Man kann das sich zwar basteln, aber das ist nicht zu empfehlen, da es am Sinn des Plugins vorbei geht. Dann kann man gleich bei der alten Version bleiben, einen Unterschied macht das dann kaum/keinen.
oder wäre das mit sscanf besser?
sscanf ist hier besser, das ist auf sowas optimiert.
gibt es eine mysql_GetString variante für R39?
Kann man zwar machen, ist aber aus Performancegründen nicht zu empfehlen, da man dann am Sinn des Plugins vorbei arbeitet. Nutze lieber die Cache-Funktionen in einem separaten Callback.
mysql_pquery(handle, "SELECT Kennzeichen FROM Autos WHERE id = 1;", "OnKennzeichen", "d", 1);
Und dann in einem extra Public:
forward OnKennzeichen(id);
public OnKennzeichen(id)
{
if(cache_get_row_count() == 0) return 1;
new str[50];
cache_get_field_content(0, "Kennzeichen", str, handle);
//Hier dann das Kennzeichen von id auf str setzen (id = 1 im Beispiel)
return 1;
}
Schalte mal den MySQL Debug Modus an und poste was im Log steht.
Es wird irgendwo sicher nochmal ein INSERT Query auf die "accounts" Tabelle angewendet.
Es dürfte nach dem Code eigentlich gar nichts in der Datenbank stehen, da das Query falsch ist.
Das INSERT Query muss so aussehen:
format(query, sizeof(query), "INSERT INTO accounts (Name, Passwort, Registrierungsdatum) VALUES ('%s', MD5('%s'), '%d.%d.%d')", SpielerName(playerid), passwort, day, month, year);
Siehe: Autos laden nicht
ocmd:carkey(playerid,params[])
{
new string[512], bool:found, model;
for(new s = 1; s <= 5; s++)
{
found = false;
for(new i = 0; i < sizeof(cInfo); i++)
{
if(cInfo[i][besitzer] == PlayerInfo[playerid][pMySQLID] && cInfo[i][slot] == s)
{
found = true;
model = cInfo[i][carmodel];
if(model >= 400 && model <= 611) format(string,sizeof(string),"%s{FF0000}%d) %s\n",string, s, getVehicleName(model));
else format(string,sizeof(string),"%s{00FF0}%d) -Schlüssel frei-\n",string, s);
break;
}
}
if(!found) format(string,sizeof(string),"%s{00FF0}%d) -Schlüssel frei-\n",string, s);
}
ShowPlayerDialog(playerid,DIALOG_CARKEY,DIALOG_STYLE_LIST,"Fahrzeuge",string,"Auswählen","Beenden");
return 1;
}
Was sagt der Server Log (prints) und der MySQL Log (Queries)?
Liegt es hierbei an "AUTO_INCREMENT"?
Nein, das ist korrekt so.
Woran könnte es liegen?
Wie sieht der Code aus?
Das kannst du auch ohne die Datenbank anzusprechen machen.
Versuche es so:
ocmd:carkey(playerid,params[])
{
new string[512], bool:found, model;
for(new s = 1; s <= 5; s++)
{
found = false;
for(new i = 0; i < sizeof(cInfo); i++)
{
if(cInfo[i][besitzer] == PlayerInfo[playerid][pMySQLID] && cInfo[i][slot] == s)
{
found = true;
model = cInfo[i][carmodel];
if(model >= 400 && model <= 611) format(string,sizeof(string),"%s{FF0000}%d) %s\n",string, s, getVehicleName(model));
else format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
break;
}
}
if(!found) format(string,sizeof(string),"%s{00FF00}%d) -Schlüssel frei-\n",string, s);
}
ShowPlayerDialog(playerid,DIALOG_CARKEY,DIALOG_STYLE_LIST,"Fahrzeuge",string,"Auswählen","Beenden");
return 1;
}
Genau, den Text eben mit SendClientMessage ausgeben, denke das ist aber klar.
Das kannst du mit dieser Funktion abfragen:
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
}
Das kannst du mit dieser Include machen:
http://forum.sa-mp.com/showthread.php?t=347605
Dann sollte es den Dialog auch anzeigen, wenn du dir das Admin Level entfernst, sodass die Nachricht im Chat nicht mehr kommt.
Wie hast du DIALOG_INFO definiert?
Du bist ein Admin.
Entferne dir das Admin Level.
Was?
Schau dir den Code im Tutorial an. Das ist ein format über mehrere Zeilen zusammengefügt.
Erst am Ende hast du ein mysql_tquery bzw. mysql_pquery. Versuche den Code von dir dazu abzuändern.
Nein, du musst in diesem Statement auch die Spalten angeben.
Du gibst alle deine Spalten mit ALTER TABLE an, da kannst du nicht abfragen, ob die Spalte/Tabelle bereits existiert.