Beiträge von Kasakow

    Moin.
    Ich experimentiere sehr viel rum und mir ist etwas aufgefallen. Ich teste meinen Code auf einem Linux System und wenn ich den Prozess beende, dann reagiert der Server nicht schnell genug um OnPlayerDisconnect aufzurufen. Ich habe in der Wiki gelesen das es mit Ongamemodeexit nicht funktionieren wird beim Prozessende und/-oder Server Crash nicht aufgerufen. Merkt man eine 5-10 Minütige gesamt Speicherung in der Performance? Oder gibt es da eine andere Methode?

    @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

    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

    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

    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.

    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.