Na dann ![]()
Ja, das kann man hiermit abfragen:
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_row_count
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_field_count
An sich ist es nur "besser", wenn du nur eines der beiden brauchst.
Na dann ![]()
Ja, das kann man hiermit abfragen:
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_row_count
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_field_count
An sich ist es nur "besser", wenn du nur eines der beiden brauchst.
Ah, du stirbst in der Skin-Auswahl.
Schreibe es so:
public leben()
{
new Float:health;
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
GetPlayerHealth(i,health);
if(health > 0.0)
{
printf("i: %d / health: %f / new: %f", i, health, health-1.0);
SetPlayerHealth(i,health-1.0);
}
}
}
return 1;
}
Dann debugge es so und poste dann was im Server Log steht, wenn du stirbst:
public leben()
{
new Float:health;
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
GetPlayerHealth(i,health);
printf("i: %d / health: %f / new: %f", i, health, health-1.0);
SetPlayerHealth(i,health-1.0);
}
}
return 1;
}
Den Timer machst du natürlich wieder an.
Bin ja schon still :p
War keine Kritik gegen dich, nur eine generelle Anmerkung warum ich es gemacht habe. Ich begründe meine Aktionen immer um Fragen zu vermeiden. ![]()
Ändere:
format(query, sizeof(query), "SELECT * FROM user WHERE username='%e'", Spielername(playerid));
zu:
mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e'", Spielername(playerid));
Ja, genau.
Zwecks dem Tod: Nein, daran sollte es nicht liegen. Du kannst den Timer ja mal entfernen, ob es dann immernoch passiert, sollte es eigentlich.
Wenn es dann nicht mehr passiert, dann müssen wir das mal debuggen, ansonsten schau mal was es noch verursachen könnte.
Meine Schuld wenn ich nur C & P mache und du solltest eventuell 'passwort' mit 'd' (password) schreiben sonst kommen da noch mehr fragen auf.
Kein Problem. Im Gegenteil, das ist gut, so finden wir alle restlichen Fehler. Sollte jetzt aber passen.
Er hat nur einmal "password" verwendet, sonst immer "passwort", in den Queries zumindest, daher habe ich es zu "passwort" geändert.
Bessere bitte diese Dinge hier aus, ich habe es schon einige Male gesehen, dass Leute sich an dem Tutorial orientiert haben und immer wieder die gleichen Fehler machen. Die Fehler kommen aus dem Tutorial, und das ist nicht gut.
Wenn man das Tutorial Schritt für Schritt befolgt, dann funktioniert das System auf Grund von Syntax-Fehlern im Query, sowie fehlerhaften Funktionsanwendungen nicht.
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new query[256], key[50];
if(dialogid == DIALOG_REGISTER)
{
if(!response)
{
return Kick(playerid);
}
if(!strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
format(key, 50, "%s", inputtext);
mysql_escape_string(Spielername(playerid), Spielername(playerid)), mysql_escape_string(key, key);
format(query, sizeof(query), "INSERT INTO (username, passwort) VALUES ('%s',MD5('%s')", Spielername(playerid), key);
mysql_tquery(Handle, query);
SendClientMessage(playerid, -1, "Dein Account wurde erstellt.");
GivePlayerMoney(playerid, 50000), SetPlayerScore(playerid, 10);
}
return 1;
}
zu:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_REGISTER)
{
if(!response)
{
return Kick(playerid);
}
if(!strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
new query[256];
mysql_format(Handle, query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%e',MD5('%e'))", Spielername(playerid), inputtext);
mysql_tquery(Handle, query);
SendClientMessage(playerid, 0xFFFFFFFF, "Dein Account wurde erstellt.");
GivePlayerMoney(playerid, 50000);
SetPlayerScore(playerid, 10);
}
return 1;
}
Und:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_LOGIN)
{
if(!response)
{
return Kick(playerid);
}
format(key, 50, "%s", inputtext);
mysql_escape_string(Spielername(playerid), Spielername(playerid)), mysql_escape_string(key, key);
format(query, sizeof(query), "SELECT * FROM user WHERE username='%s' AND password='%s'", Spielername(playerid), key);
mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
}
return 1;
}
zu:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_LOGIN)
{
if(!response)
{
return Kick(playerid);
}
new query[256];
mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5('%e')", Spielername(playerid), inputtext);
mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
}
return 1;
}
Falls du wieder mal ein Tutorial machst, dann solltest du wenigstens die Grundfunktionen testen, bevor du es veröffentlichst.
Ah, siehste, noch ein Fehler.
Ich ändere das gleich in meinem Post in dem Tutorial. EDIT: Geändert.
format(query, sizeof(query), "INSERT INTO (username, passwort) VALUES ('%s',MD5('%s'))", name, key);
zu:
format(query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%s',MD5('%s'))", name, key);
So sollte es klappen:
dcmd_report(playerid, params[])
{
new string[145], name[MAX_PLAYER_NAME];
if(sscanf(params, "s", string)) return SendClientMessage(playerid,COLOR_ORANGE,"'/report [Narchicht]'");
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(string, sizeof(string), "[Report]Neuer report von %s. Report: %s", name, report);
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
if(PlayerInfo[i][pAdminLevel] > 0)
{
SendClientMessage(i, COLOR_ORANGERED, string);
}
}
}
return 1;
}
Poste bitte den Code von dem mysql_tquery und das was drum herum steht.
Joa, da steht es leicht an der falschen Position. ![]()
Zitat[18:38:21] [ERROR] CMySQLQuery::Execute[UserCheck] - (error #1054) Unknown column 'username' in 'where clause'
Es gibt in deiner Tabelle user keine Spalte "username".
Du baust nach dem mysql_tquery die Verbindung erst auf? Das scheint nicht richtig.
Hast du vielleicht in einem anderen geladenen Code noch ein mysql_connect das ausgeführt wird?
Alternativ kannst du in diesem Code auch das mysql_connect komplett entfernen und einfach die Connection ID 1 verwenden, die scheint ja zu existieren.
Also:
new MySQL = 1;
mysql_tquery(MySQL, //etc...);
Zitat[18:12:08] [WARNING] CMySQLHandle::Create - connection already exists
Du hast bereits eine Verbindung zur Datenbank, du musst nicht nochmal eine machen. Daher wird wohl auch das Query nicht, oder nicht korrekt abgesendet. Prüfe das mal, die Warnung sollte auf jeden Fall nicht kommen.
if(Spieler[pID][pFraktion] == 1 || Spieler[pID][pFraktion] == 5 || Spieler[pID][pFraktion] == 6 || Spieler[pID][pFraktion] == 11)
Da war jeweils eine Klammer hinter der Zahl.
Das kannst du so nicht machen, da musst du zwei Variablen verwenden, oder besser so:
CMD:uclight(playerid)
{
if(!IsLoggedIn(playerid))return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht eingeloggt.");
if(Spieler[playerid][pFraktion] !=5)return SendClientMessage(playerid,COLOR_GRAU,"Du bist kein Beamter.");
new vehicleid = GetPlayerVehicleID(playerid);
if(UCLight[vehicleid] == -1)
{
UCLight[vehicleid] = CreateObject(18646,0,0,-1000,0,0,0,100);
AttachObjectToVehicle(UCLight[vehicleid], GetPlayerVehicleID(playerid), -0.449999,0.225000,0.824999,0.000000,0.000000,0.000000);
GameTextForPlayer(playerid, "~w~Blaulicht~n~~g~eingeschaltet", 3000, 6);
}
else
{
DestroyObject(UCLight[vehicleid]);
UCLight[vehicleid] = -1;
GameTextForPlayer(playerid, "~w~Blaulicht~n~~r~ausgeschaltet", 3000, 6);
}
return 1;
}
Und
new bool:UCLight[MAX_VEHICLES];
Zu
new UCLight[MAX_VEHICLES]={-1,...};
Mach das new weg, das hast du ja schon bei
new sirene[MAX_VEHICLES];
Hier ist der Fehler:
SendClientMessage(playerid, COLOR_RED, "Du hast dich mit Admin Level %s eingeloggt.");
zu:
new str[145];
format(str, sizeof(str), "Du hast dich mit Admin Level %d eingeloggt.", PlayerInfo[playerid][pAdminLevel]);
SendClientMessage(playerid, COLOR_RED, str);
Edit: Ach ja, ist im Dialog, kein Befehl. Aber das passt, hast du richtig verstanden ![]()
Lade dir das crashdetect Plugin herunter und füge es in deinen Server ein. Dann poste was im Server Log steht, wenn du den Befehl eingibst.
http://forum.sa-mp.com/showthread.php?t=262796
Mach das hier mal weg, das gibt keinen Sinn:
new adminlvl[1];
format(adminlvl, 1, PlayerInfo[playerid][pAdminLevel], string);
Möglicherweise, ja.
Das kann ich dir aber nicht genau sagen, da ich nicht weiß wie du dein System aufgebaut hast, und ob wirklich alle Unterordner und Dateien vorhanden sind, die vorhanden sein müssen.
Generell ist es eben so, dass fwrite den Server abstürzen lässt, wenn die Datei nicht beschrieben werden kann.