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

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