Lässt du denn die Speicherfunktion auch bei OnPlayerDisconnect aufrufen & wird die Einlogg Variable beim Registrieren und Anmelden auf "True/1" gesetzt?
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Lässt du denn die Speicherfunktion auch bei OnPlayerDisconnect aufrufen & wird die Einlogg Variable beim Registrieren und Anmelden auf "True/1" gesetzt?
Ja die Speicherfunktion wird Aufgerufen. Und beim Registrieren wird der Wert auf 1(true) gesetzt.
-
Probier mal das "Skin" im Query klein zu schreiben, in deiner DB Struktur ist es schließlich auch klein.
Und beim Registrieren wird der Wert auf 1(true) gesetzt.
Auch beim Einloggen?
Zeig auch mal wie du den Spieler lädst.//EDIT:
Sorry voll übersehen.
Dann probier einfach mal beim Laden & Speichern Skin kleinzuschreiben. -
Probier mal das "Skin" im Query klein zu schreiben, in deiner DB Struktur ist es schließlich auch klein.
Auch beim Einloggen?Zeig auch mal wie du den Spieler lädst.
//EDIT:
Sorry voll übersehen.
Dann probier einfach mal beim Laden & Speichern Skin kleinzuschreiben.
forward OnUserLogin(playerid);
public OnUserLogin(playerid)
{
new rows;
cache_get_row_count(rows);
if(rows == 0)
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
}
else
{
cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pskin]);
PlayerInfo[playerid][pLoggedIn] = true;
SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt");
GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]);
}
return 1;
}
public OnPlayerConnect(playerid)
{
PlayerInfo[playerid][p_id] = 0;
PlayerInfo[playerid][pLoggedIn] = false;
PlayerInfo[playerid][pLevel] = 0;
PlayerInfo[playerid][pMoney] = 0;
PlayerInfo[playerid][pKills] = 0;
PlayerInfo[playerid][pDeaths] = 0;
PlayerInfo[playerid][pskin] = 0;
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
return 1;
} -
Was hatten denn eigentlich das "GetPlayerSkin(playerid);" am Ende deiner Speicherfunktion für einen Sinn, meine.. du führst es ganz am Ende aus.
Mit angepasstem Laden sowie Query von der Speicherfunktion, funktioniert es immer noch nicht?
Lass dir mal deine Spielerstats nach dem Laden ausgeben und aktiviere mal die MySQL Log und sag uns bescheid was drinne steht an Errors usw. -
Was hatten denn eigentlich das "GetPlayerSkin(playerid);" am Ende deiner Speicherfunktion für einen Sinn, meine.. du führst es ganz am Ende aus.
Mit angepasstem Laden sowie Query von der Speicherfunktion, funktioniert es immer noch nicht?
Lass dir mal deine Spielerstats nach dem Laden ausgeben und aktiviere mal die MySQL Log und sag uns bescheid was drinne steht an Errors usw.Hier mal die mysql_log:
Jedes mal wenn ich mich Einlogge erhalte ich den Skin '0'. Obwohl ich in der DB angegeben habe das ich den Skin '5' habe...
-
Poste mal nur die Error.log
mysql_log(ALL); & dann mir mal nur den Inhalt der Error.log zeigen.Zeig mal wie du das Passwort prüfen lässt & die genaue Datenbank Struktur. Also ein komplett Screen.
Und auch mal bitte, wie du das Konto erstellen lässt.Kleiner Tipp am Rande. Nutze SHA1 oder SHA256, MD5 ist fürn Arsch.
-
Bei deinem OnUserLogin musst du nachdem du den Skin aus der Datenbank bekommst auch per SetPlayerSkin(playerid, PlayerInfo[playerid][pskin]); setzten.
Sonst speicherst du den ja nur in die Variable. -
Poste mal nur die Error.log
mysql_log(ALL); & dann mir mal nur den Inhalt der Error.log zeigen.Zeig mal wie du das Passwort prüfen lässt & die genaue Datenbank Struktur. Also ein komplett Screen.
Und auch mal bitte, wie du das Konto erstellen lässt.Kleiner Tipp am Rande. Nutze SHA1 oder SHA256, MD5 ist fürn Arsch.
In er error.log steht nix drinnen...
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == DIALOG_REGISTER)
{
if(!response) return Kick(playerid);
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration","Bitte registriere dich: \n{FF0000}Mindestens 3 Zeichen","ok","Abbrechen");
new query[256];
mysql_format(handle, query, sizeof(query), "INSERT INTO users (name, password) VALUES ('%e', MD5('%e'))", PlayerInfo[playerid][pName], inputtext);
mysql_pquery(handle, query, "OnUserRegister", "d", playerid);
return 1;
}
if(dialogid == DIALOG_LOGIN)
{
if(!response) return Kick(playerid);
if(strlen(inputtext) < 3) return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Mindestens 3 Zeichen!", "Ok", "Abbrechen");
new query[256];
mysql_format(handle, query, sizeof(query), "SELECT * FROM users WHERE name = '%e' AND password = MD5('%e')", PlayerInfo[playerid][pName], inputtext);
mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
return 1;
}
return 0;
} -
Zeig mir mal OnUserRegister bitte.
Werden denn andere Daten gespeichert? Teste das mal.@Whice.
Er lässt den Skin aber mit der Variable speichern, von daher, passt das.
Ich rate eh zu Makros, die erleichtern einiges, vor allem, man muss nicht für den jeden Scheiss ein "stock" schreiben.//Makro Anwendung
#define getSkin(%0) PlayerInfo[%0][pSkin] //%0 ist der erste Platzhalter
#define setSkin(%0,%1) PlayerInfo[%0][pSkin]=%1,SetPlayerSkin(%0,%1) //%0 = playerid, %1 = integerwert z.B für den Skin -
-
Zeig mir mal OnUserRegister bitte.
Werden denn andere Daten gespeichert? Teste das mal.@Whice.
Er lässt den Skin aber mit der Variable speichern, von daher, passt das.
Ich rate eh zu Makros, die erleichtern einiges, vor allem, man muss nicht für den jeden Scheiss ein "stock" schreiben.//Makro Anwendung#define getSkin(%0) PlayerInfo[%0][pSkin] //%0 ist der erste Platzhalter#define setSkin(%0,%1) PlayerInfo[%0][pSkin]=%1,SetPlayerSkin(%0,%1) //%0 = playerid, %1 = integerwert z.B für den Skin
Andere Variablen lädt er ja auch.
Hab z.b in der DB angegeben das ich 1000 Money hab. Das wird Ingame auch Angezeigt.
Er lädt auch anscheinend den Skin aus der Datenbank aber mir wird Ingame halt Skin '0' angezeigt.
forward OnUserRegister(playerid);
public OnUserRegister(playerid)
{
PlayerInfo[playerid][p_id] = cache_insert_id();
PlayerInfo[playerid][pLoggedIn] = true;
SendClientMessage(playerid, 0x00FF00FF,"[Konto] Registration erfolgreich");
return 1;
} -
Ah ne, Whice hat Recht.
Wenn du willst, dass dir der Skin angezeigt wird, setze ihn auch.Schreib es mal so:
//z.B unter die Includes
//Makros
#define getSkin(%0) pInfo[%0][pSkin] //%0 ist der erste Platzhalter
#define setSkin(%0,%1) pInfo[%0][pSkin]=%1,SetPlayerSkin(%0,%1) //%0 = playerid, %1 = integerwert z.B für den Skinpublic OnUserLogin(playerid)
{
new rows;
cache_get_row_count(rows);
if(rows == 0)
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
}
else
{
cache_get_value_name_int(0, "id", PlayerInfo[playerid][p_id]);
cache_get_value_name_int(0, "level", PlayerInfo[playerid][pLevel]);
cache_get_value_name_int(0, "money", PlayerInfo[playerid][pMoney]);
cache_get_value_name_int(0, "kills", PlayerInfo[playerid][pKills]);
cache_get_value_name_int(0, "skin", PlayerInfo[playerid][pskin]);
PlayerInfo[playerid][pLoggedIn] = true;
SendClientMessage(playerid, 0x00FF00FF, "[Konto] Eingeloggt");
GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]),
setSkin(playerid, PlayerInfo[playerid][pSkin]);
}
return 1;
}Und speichern kannst es so lassen oder du nutzt, getSkin(playerid); .. Kommt auf das gleiche hinaus
-
@Whice.
Er lässt den Skin aber mit der Variable speichern, von daher, passt das.Was passt denn da? Er lädt den Skin aus der DB und jeder wird nicht gesetzt. Das passt halt nicht.
Jedes mal wenn ich mich Einlogge erhalte ich den Skin '0'. Obwohl ich in der DB angegeben habe das ich den Skin '5' habe...
Der Grund dafür ist oben beschrieben, du lädst zwar die Variable, setzt jedoch nie deinen Skin. Ergo bleibst du bei Skin ID 0, da es der Standart Skin ist mit dem du spawnst.
-
Was passt denn da? Er lädt den Skin aus der DB und jeder wird nicht gesetzt. Das passt halt nicht.
Der Grund dafür ist oben beschrieben, du lädst zwar die Variable, setzt jedoch nie deinen Skin. Ergo bleibst du bei Skin ID 0, da es der Standart Skin ist mit dem du spawnst.
Wird leider immer noch nicht Gespeichert. Obwohl die Variablen gesetzt werden.
-
Zeigt bitte nochmal dein SaveUserStats
So wie es oben steht sind ja noch die bereits angesprochenen Groß´und Kleinschreibfehler in der Query und in der Variable vorhanden -
Zeigt bitte nochmal dein SaveUserStats
So wie es oben steht sind ja noch die bereits angesprochenen Groß´und Kleinschreibfehler in der Query und in der Variable vorhanden
stock SaveUserStats(playerid)
{
if(!PlayerInfo[playerid][pLoggedIn]) return 1;
new query[256];
mysql_format(handle, query, sizeof(query), "UPDATE users SET level = '%d', money = '%d', kills = '%d', deaths = '%d', skin = '%d' WHERE id = '%d'",PlayerInfo[playerid][pLevel], PlayerInfo[playerid][pMoney], PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths],PlayerInfo[playerid][pskin], PlayerInfo[playerid][p_id]);
mysql_pquery(handle, query);
return 1;
} -
Woher weißt du den das es nicht gespeichert wird? Kann es sein das du dort einen Fehler beim Ändern hast?
So wie es oben in der Log steht sieht es ja gut aus.
Kann es sein das du beim Ändern des Skins nur den Skin per SetPlayerSkin veränderst und nicht die Variable?// EDIT
Fehler wurde nun gefunden, Problem war das die Variable PlayerInfo[playerid][pskin] in dem Skin-Ändern Befehl nicht gesetzt worden ist.
-
Nabend,
Könnte mir jemand sagen wo hier der Fehler liegt?
Er bann den gewünschten Spieler nicht bzw es passiert einfach nix...
CMD:ban(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] >= 1)
{
new PID;
new reason[64];
new str[128];
new Playername[MAX_PLAYER_NAME], Adminname[MAX_PLAYER_NAME];
GetPlayerName(playerid, Adminname, sizeof(Adminname));
GetPlayerName(PID, Playername, sizeof(Playername));
if(sscanf(params, "us[64]", PID, reason)) return SendClientMessage(playerid, -1, "[Benutze] /ban [playerid][Grund]");
format(str, sizeof(str), "'%s' wurde Gebannt von [Admin] '%s'. [Grund:] %s", Playername, Adminname, reason);
SendClientMessageToAll(-1, str);
Ban(PID);
Kick(PID);
if(!IsPlayerConnected(PID))
return SendClientMessage(playerid, -1, "Spieler ist nicht Online!");
}
else
{
SendClientMessage(playerid, -1,"Du bist kein Admin. Du kannst den Befehl nicht nutzen!");
}
return 1;
} -
Die sscanf abfrage muss weiter nach oben, bsp. unter dem new str, weiterhin reicht der ban, da der spieler so direkt gekickt ist und deine letzte Abfrage ob Pid connected ist müsstest du auch weiter nach oben packen, beispielsweise direkt unter die sscanf Zeile
#Handy
-
Die Variable PID wird nie zugewiesen, du musste jene aus den params entnehmen, dazu kann ich dir nur sscanf 2 empfehlen
Könntest du eventuell kurz mit einem Beispiel erklären was du genau meinst? Stehe grade bisschen auf dem Schlauch
Hab die Variable entfernt, aber sobald ich Ingame den Befehl /ban 0 eingebe passiert nix -