[SAMMELTHREAD] Kleine Scripting Fragen

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

  • 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:

    Code
    #

    Jedes mal wenn ich mich Einlogge erhalte ich den Skin '0'. Obwohl ich in der DB angegeben habe das ich den Skin '5' habe... ?(

    Einmal editiert, zuletzt von Laaazzyy ()

  • 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.

  • 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

  • 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 Skin


    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]),
    setSkin(playerid, PlayerInfo[playerid][pSkin]);
    }
    return 1;
    }


    Und speichern kannst es so lassen oder du nutzt, getSkin(playerid); .. Kommt auf das gleiche hinaus

    • Offizieller Beitrag

    @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.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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


    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;
    }

    • Offizieller Beitrag

    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 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 :D
    Hab die Variable entfernt, aber sobald ich Ingame den Befehl /ban 0 eingebe passiert nix ^^

  • @LordDemacia
    Auch wenn mein Code selber manchmal unordentlich ist, möchte dir diesbezüglich, mal ein paar Tipps geben.


    Verwende wie ich bereits gestern erwähnte Makros, es ist nicht sehr "gut", überall im Skript, jederzeit, den Spieler Namen erneut auszulesen, wenn es einmal auch reicht.
    Wenn du eine Variable erstellst, erstelle sie alle auf einmal, und nicht einzeln.
    Verwende doch Tab anstatt Leerzeichen um deine Zeilen einzurücken, das ist schrecklich, aber genau so, habe ich es in meiner Anfangszeit auch gemacht, ist aber so ziemlich hässlich, benutze Tab.
    Ich weiß dass es bei einer bestimmten sscanf Version der Fall war, dass man die String Länge auch bei der Nutzung angeben musst, probiere es mal ohne, ich kann es auch problemlos ohne Angabe nutzen.
    Frage am Besten gleich ab ob er Eingeloggt ist & nicht ob er nur Online ist.
    Ban & Kick hintereinander? Das macht kein Skin, bei der Ban Funktion wird man ebenfalls gekickt.
    Nutze Banfix oder einen eigenen Timer der die das mit dem Kickfix übernimmt, sprich, wenn du es so machst, wird dem Spieler selbst, die Nachricht nicht angezeigt, warum er gebannt/gekickt wurde.


    Soo
    Wie gesagt, erstell dir mal in deiner Datenbank Struktur ein Feld was sich 'ban' nennt & richte es beim Speichern & Laden ein.
    Habe dir mal den Code umgeschrieben & kleine Erklärungen unterkommentiert, hoffentlich kannst du was mit anfangen.



    //Makro für das Spielernamen ausgeben, kann für jeden Spieler der Online ist, genutzt werden.
    #define getName(%0) PlayerInfo[%0][pName]


    //Bei deinem Player Enum fügst du hinzu & pBan
    pName[MAX_PLAYER_NAME+1],
    pBan,


    //Einmalig bei OnPlayerConnect
    GetPlayerName(playerid, getName(playerid), MAX_PLAYER_NAME+1);


    CMD:ban(playerid, params[])
    {
    if(PlayerInfo[playerid][pAdmin] < 1)return SendClientMessage(playerid, -1,"Du bist kein Admin. Du kannst den Befehl nicht nutzen!");
    new PID, str[128];
    if(sscanf(params, "us", PID, str)) return SendClientMessage(playerid, -1, "[Benutze] /ban [playerid] [Grund]");
    if(!PlayerInfo[PID][pLoggedIn])return SendClientMessage(playerid, -1, "Spieler ist nicht eingeloggt!");
    format(str, sizeof str, "'%s' wurde gebannt von [Admin] '%s'. [Grund:] %s", getName(PID), getName(playerid), str),
    SendClientMessageToAll(-1, str),
    pInfo[PID][pBan] = 1,
    Kick(PID);
    return 1;
    }


    //EDIT Admin Abfrage abgeändert. || Banfix ist ein Include, lad es dir mal runter.


    Meine SSCANF Version, die ich nutze. <- Download
    BanFix - Include | Download

    Einmal editiert, zuletzt von Kasakow ()

  • Danke für deinen Tipp.
    Ja das mit den Makros muss ich noch besser Umsetzen bzw mir eintrichtern :D
    Aber sehr gut erklärt. Ich werde mir mal Tutorials anschauen wegen dem kürzen Code schreiben und alles.

  • Kleine Frage...


    Wenn man mit Doppelklick auf einen Server connecten will, erscheint ja dieses Fenster indem man unter anderem das Server- sowie RCON-Passwort eingeben kann. Warum ist man also nicht bereits als RCON-Admin angemeldet, wenn man auf dem Server gespawned ist?