Beiträge von Kasakow

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

    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.

    Er macht immer noch Soundtracks, was ein Ding.
    Ja, der Fire Soundtrack, taugt mir.
    Wobei ich finde dass du die Musik etwas runter regeln solltest & die Stimme, ein bisschen höher drehen solltest, ein kleines bisschen nur.

    Vielleicht steht sie auf geheime Kommunikation.
    Also mir ist sowas, gar nicht bekannt.
    Ich weiß wie oft Menschen schon auf ein ähnlich aussehendes Fake - Facebook Login Layout reingefallen sind aber mit Whatsapp kenne ich das nicht.

    Mal ne klitze kleine Frage zur Pawn Syntax.
    Also wenn ich etwas als "Float" deklarieren soll, dann muss ich das F ja auch groß schreiben.
    Aber wenn ich float klein schreibe, dann wird es mir Blau gefärbt & ich kriege eine Warnung dass ich es falsch verwende.. was steckt dahinter?

    Wenn ich es richtig Verstanden habe, dann sollst du dir für jedes Fahrzeug, ein realistischen Verbrauch ausdenken, deklarieren & die Rechnungsmethode von Kaliber nutzen, es sollte dann automatisch bei jeden gefahrenen 100 Meter, so viel abziehen, dass du auf deine Rechnung kommst.

    Vielen Dank Kaliber, es funktioniert nun wie gegossen.
    Da ich es aber nicht mag, Copy & Paste zu betreiben & dann bestimmte Sektoren des Codes, nicht zu verstehen, hab ich noch die ein oder andere Frage.


    EOS? End of String?
    Inwiefern lässt sich das irgendwo noch einsetzen.
    Ich meine, könnte ich z.B anstatt if(!strlen(string)) auch if(string[0] == EOS) einsetzen? Und inwiefern macht das dann auch Sinn? Dann könnte ich ja auch if(!string[0]) einsetzen oder nicht?
    Wo lässt sich EOS wo verwenden?


    if(rows%10 == 0) btnB = "Weiter",SetPVarInt(playerid,"ProtocolBtnB",1);
    Damit frage ich ab ob der PVar Zahlenwert kleiner als 10 ist oder wie? So habe ich meinen Code noch nicht gestaltet.


    Auch wenn ich nicht müsste, möchte ich noch was hinzufügen.
    Ich hatte über 1.5 Jahre Pause beim Skripten und bin ein bisschen raus, ich bin gewiss kein Volldepp aber ich muss wieder reinkommen, auch was das ordentliche Arbeiten angeht.-
    Ich werde mal mit nem Zeichenzähler durch meine Strings gehen und schauen wie viel Speicher ich überhaupt benötige.

    "Zahlung per Handy".
    Das erinnert mich.. an mich selber früher.
    Mama zahlt den o2 Handyvertrag und ich verballere mehrere hundert Euro via Handyrechnung um es zu Echtgeld zu machen.. nur so eine Idee..Mister.. eine reine Spekulation.
    Sorry Made, aber das was du hier versuchst, ist richtig mies. Ich nehm dir das nicht ab, dass du mit Freude Steam Guthaben verkaufst für nur die Hälfte.

    Naja, man es kann aber sicherlich einrichten, das sobald einmal auf Weiter geklickt wurde, der Schließen Button als Zurück benutzt werden kann.


    Ich habe keine Ahnung, was du meinst.

    Wenn ich auf Seite 2 gehe, weil von meinem Account aus, sind mehrer MySQL Seiten vorhanden, dann sagt er beim "!response Button", das nichts mehr vorhanden sei.


    //EDIT
    Einigermaßen geht das jetzt auch.. aber bei der ersten Seite gibt er mir dann aus das nicht mehr da sei & dass kein Eintrag gefunden wurde.
    Gerne kann ich dir es auch mit Bildern verdeutlichen @Kaliber.



    case D_PP:
    {
    new end = GetPVarInt(playerid,"ProtocolEnd");
    DeletePVar(playerid,"ProtocolEnd");
    if(!response)
    {
    if(end%10==0)
    {
    ShowPlayerProtocol(playerid,end-10);
    return 1;
    }
    DeletePVar(playerid,"ProtocolName"), SCM(playerid, COLOR_GREY, "Du hast entweder das Fenster geschlossen oder es sind keine weiteren Einträge vorhanden!");
    }
    ShowPlayerProtocol(playerid,end+10);
    }