Admin Rang im Befehl nutzen / in MysQL so mit Einspeichern,

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
  • Hallo,
    Ich sitze derzeit an meinem Adminsystem und habe eine Frage.
    Und zwar würde ich gerne die Adminränge mit in der Datenbank speicher lassen.
    Also nicht das z.b bei
    /setadmin player adminlevel Nur die 1 Ausgegeben wird.


    Ich habe derzeit folgendes angefangen umzusetzen.
    Die Adminränge werden per #Define dekladiert:

    #define ADMIN_LEVEL_1_NAME "Supporter"
    #define ADMIN_LEVEL_2_NAME "Admin"


    Dafür hab ich eine Funktion geschrieben:

    GetAdminRank(playerid)
    {
    new arank[64];
    switch(PlayerInfo[playerid][pAdmin])
    {
    case 2: arank = ADMIN_LEVEL_2_NAME;
    case 1: arank = ADMIN_LEVEL_1_Name;
    }
    return arank;
    }


    Und würde gerne die Funktion in meinem Befehl nutzen:

    CMD:setadmin(playerid,params[])
    {
    new string[128];
    if(PlayerInfo[playerid][pAdmin] >= 1)
    {
    if(sscanf(params,"ui",p_id ,pAdmin))return SendClientMessage(playerid,0x00FF00,"[Info] /setadmin [playerid][adminlevel]");
    PlayerInfo[p_id][pAdmin] = pAdmin;
    mysql_format(handle, string, sizeof(string), "UPDATE `users` SET `admin` = '%d' WHERE `id` = %d", PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][p_id]);
    mysql_pquery(handle, string);
    SendClientMessage(playerid,0x00FF00,"Du hast den Adminrang geändert");
    }
    else
    {
    SendClientMessage(playerid,0x00FF00, "[ ! ] Du besitzt keine Rechte um diesen Befehl auszuführen!"); // Keine Rechte
    }
    return 1;
    }


    Ich weiß man könnte es über die Funktion / Variable Case :  probieren.


    Nur leider weiß ich nicht genau wie ich da Ansetzen soll.
    Habe derzeit nur folgende Idee im Kopf:

    switch(PlayerInfo[playerid][pAdmin])
    {
    case 1: format(string, sizeof(string), "%s (%d) - Level %d (%s)", pName(i), i, PlayerInfo[i][pAdmin], ADMIN_LEVEL_1_NAME);


    }


    Leider komme ich nicht bei der Umsetzung weiter.

  • Und zwar würde ich gerne die Adminränge mit in der Datenbank speicher lassen.

    Wieso würdest du das wollen?


    Es reicht doch, nur die ID in der Datenbank zu speichern und die Namen im Skript zu hinterlegen, so wie du es gemacht hast in deiner Funktion.


    Und dann kannst du das einfach so nutzen:


    format(string,sizeof(string), "Spieler ist Adminrank: %s", GetAdminRank(PlayerInfo[playerid][pAdmin]);

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Wieso würdest du das wollen?
    Es reicht doch, nur die ID in der Datenbank zu speichern und die Namen im Skript zu hinterlegen, so wie du es gemacht hast in deiner Funktion.


    Und dann kannst du das einfach so nutzen:


    format(string,sizeof(string), "Spieler ist Adminrank: %s", GetAdminRank(PlayerInfo[playerid][pAdmin]);

    Heute ist meine Denkweise nicht sehr Hilfreich.
    Noch eine andere Frage bezüglich der Speicherung meiner Daten über MySqL.
    Ich hab es jetzt hinbekommen, das bei /setadmin die Daten in die DB geschrieben werden.
    Leider wird es nicht Überschrieben sondern einfach hinzugefügt.
    Sodas z.b dann in der DB unter admin 31 Steht obwohl ich dem User Adminrang 3 gegeben habe.
    Hier wird die Query an den Server geschickt.


    mysql_format(handle, string, sizeof(string), "UPDATE `users` SET `admin` = '%d' WHERE `id` = %d", PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][p_id]);

  • Sehe gerade, du nutzt ja p_id.
    Schreibe das mal so:
    PlayerInfo[p_id][pAdmin], PlayerInfo[p_id][p_id]

    Habe es grade Geändert.
    Leider wird mir die Nachricht: Spieler ist Adminrank: %s Ingame nicht angezeigt.


    Habe es so Eingefügt:

    CMD:setadmin(playerid,params[])
    {
    new string[128];
    if(PlayerInfo[playerid][pAdmin] >= 1)
    {
    if(sscanf(params,"ui",p_id ,pAdmin))return SendClientMessage(playerid,0x00FF00,"[Info] /setadmin [playerid][adminlevel]");
    PlayerInfo[p_id][pAdmin] = pAdmin;
    format(string,sizeof(string),"Spieler ist Adminrank: %s",GetAdminRank(PlayerInfo[playerid][pAdmin]));
    mysql_format(handle, string, sizeof(string), "UPDATE `users` SET `admin` = '%d' WHERE `id` = '%d'", PlayerInfo[p_id][pAdmin], PlayerInfo[p_id][p_id]);
    mysql_pquery(handle, string);
    }
    else
    {
    SendClientMessage(playerid,0x00FF00, "[ ! ] Du besitzt keine Rechte um diesen Befehl auszuführen!"); // Keine Rechte
    }
    return 1;


    }

  • Schreib das mal alles so:


    Ich glaube du hast da was komisches mit den Variablen gemacht (du verwendest enum Platzhalter..anstatt neuen Variablen).



    Die Nachricht wurde auch nicht ausgegeben, da du SendClientMessage nicht verwendet hattest ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Aber wieso Verwendest du jetzt 'admin' anstatt 'pAdmin'? Da ich 'pAdmin' im Enum stehen habe ^^

  • Aber wieso Verwendest du jetzt 'admin' anstatt 'pAdmin'? Da ich 'pAdmin' im Enum stehen habe

    Eben genau das ist der Punkt.


    Das wird ja auch noch weiterhin verwendet:


    PlayerInfo[pID][pAdmin] = admin;

    Schauen wir uns das kurz genau an:


    pID = Die Spielerid, bei der das Adminlevel gesetzt werden soll.


    pAdmin = Gibt an, an welchem index in der Variable das geändert werden soll.


    Im Endeffekt hast du hier ja ein Array:



    new x[2];
    x[0] = 1337;
    x[1] = 23;


    Hier ist jeweils 0 und 1 der Array Index.
    Wenn du jetzt ein Enum verwendest, gibt es diese index auch, aber du benennst ihn halt:



    C
    enum Spieler_Enum
    {
        pAdmin,
        pAlter
    };
    new x[Spieler_Enum];
    
    
    x[pAdmin] = 1337;
    x[pAlter] = 23;

    Im Endeffekt machen beide Codes das Selbe!


    Wenn du jetzt aber pAdmin auf 1337 setzten würdest, das macht ja keinen Sinn, es muss ja auf 0 bleiben, damit immer der richtige Index gesetzt wird.


    Deshalb brauchst du eine weitere Variable, in diesem Fall admin die dann das Admin-Level (1337) beinhaltet.


    Und es wird quasi:


    x[pAdmin] = admin;


    gemacht bzw:


    x[0] = admin;


    Also


    x[0] = 1337;


    Hoffe hast es nun etwas besser verstanden ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Danke für die Erklärung.
    Leider wird mir der definierte Adminrang Ingame nicht Angezeigt.

    Aktuell hast du ja auch nur 2 Ränge in der Funktion.


    Vergibst du also Adminrang 3..kann dieser nicht angezeigt werden, da er noch nicht existiert ^^


    Musst die Funktion natürlich auf alle Adminränge ausweiten haha xD

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • IchDanke für die Erklärung.

    Aktuell hast du ja auch nur 2 Ränge in der Funktion.
    Vergibst du also Adminrang 3..kann dieser nicht angezeigt werden, da er noch nicht existiert ^^


    Musst die Funktion natürlich auf alle Adminränge ausweiten haha xD

    Ich gebe z.b Ingame /setadmin 0 1(ID1) ein[/tt)Aber Er zeigt Ingame dann nur folgendes an: [tt]Spieler ist Adminrang: 
    Mehr wird nicht Angezeigt

  • Achso ja sorry ^^


    Schreib es so:


    format(string,sizeof(string),"Spieler ist Adminrank: %s",GetAdminRank(pID));


    Fragst ja den Adminrang da nochmal hab ^^


    Dachte du machst es direkt, mein Fehler :D

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Danke nochmals für die Hilfe.
    Sollte ich noch ein Problem haben werde ich mich melden.


    #Edit


    Hab ein anderes Problem.
    Und zwar wird es jetzt wieder Angezeigt die Ausgabe, aber dort steht der normale Benutzername.


    Hier mal mein GetAdminRank:
    GetAdminRank(playerid)
    {
    new arank[64];
    switch(PlayerInfo[playerid][pAdmin])
    {
    case 3: arank = ADMIN_LEVEL_3_NAME;
    case 2: arank = ADMIN_LEVEL_2_NAME;
    case 1: arank = ADMIN_LEVEL_1_NAME;
    }
    return arank;
    }


    Hier mal der Befehl:
    CMD:setadmin(playerid,params[])
    {
    if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,0x00FF00, "[ ! ] Du besitzt keine Rechte um diesen Befehl auszuführen!"); // Keine Rechte
    new string[128], pID, admin;
    if(sscanf(params,"ui",pID ,admin))return SendClientMessage(playerid,0x00FF00,"[Info] /setadmin [playerid][adminlevel]");
    PlayerInfo[pID][pAdmin] = admin;
    format(string,sizeof(string),"Spieler ist Adminrank: %d",GetAdminRank(pID));
    SendClientMessage(playerid, -1, string);
    mysql_format(handle, string, sizeof(string), "UPDATE `users` SET `admin` = '%d' WHERE `id` = '%d'", admin, PlayerInfo[pID][p_id]);
    mysql_pquery(handle, string);
    return 1;
    }


    Und hier mal die Defines
    //Admin-Level//#define ADMIN_LEVEL_1_NAME "Supporter"#define ADMIN_LEVEL_2_NAME "Administrator"#define ADMIN_LEVEL_3_NAME "User"//Admin-Level Ende//


    Mir wird bei der Ausführung immer der normale Benutzername angezeigt.
    Ich möchte aber gerne wie in den #Defines definiert die Festgelegten Ränge angezeigt bekommen.
    @Kaliber

    Einmal editiert, zuletzt von PlayEasy ()

  • format(string,sizeof(string),"Spieler ist Adminrank: %d",GetAdminRank(pID));

    Da hast du nicht richtig kopiert gehabt :P


    Es muss lauten:


    format(string,sizeof(string),"Spieler ist Adminrank: %s",GetAdminRank(pID));


    %s für Strings ;)


    und %d bzw %i für Integer (also Zahlen) :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    2 Mal editiert, zuletzt von Kaliber ()

  • Ich hatte es so ins Skript geschrieben gehabt. aber trotzdem kam dort der Fehler.
    Ich versuche es nochmals ^^


    #Edit
    So das klappt schon mal ^^
    Jetzt habe ich die selbe Funktion für /setlevel gemacht
    Jetzt wird mir aber Ingame einfach nur Spieler ist Level: s Angezeigt.


    Der Befehl:

    CMD:setlevel(playerid,params[])
    {
    if(!PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid, 0x00FF00, "[ ! ] Du besitzt keine Rechte um diesen Befehl zu nutzen!");
    new string[128], pID, level; // 'level' ist eine neue Variable für [pLevel]
    if(sscanf(params,"ui",pID,level))return SendClientMessage(playerid, 0x00FF00,"[Info] /setlevel [playerid][level]");
    PlayerInfo[pID][pLevel] = level;
    format(string,sizeof(string),"Spieler ist Levelrank: %s",GetLevelRank(pID));
    SendClientMessage(playerid, -1, string);
    mysql_format(handle, string, sizeof(string), "UPDATE `users` SET `level` = '%d' WHERE `id` = '%d'", level, PlayerInfo[pID][p_id]);
    mysql_pquery(handle, string);
    return 1;
    }


    Und der GetLevelRank

    GetLevelRank(playerid)
    {
    new levelrank[128];
    switch(PlayerInfo[playerid][pLevel])
    {
    case 2: levelrank = USER_LEVEL_2_NAME;
    case 1: levelrank = USER_LEVEL_1_NAME;
    }
    return levelrank;
    }


    Wieso wird mir dort nur S wiedergegeben?^^

    Einmal editiert, zuletzt von PlayEasy ()

  • Wieso wird mir dort nur S wiedergegeben?^^

    Um ehrlich zu sein, keine Ahnung.


    Bist du sicher, dass du dein Skript kompiliert hast und das wirklich 1:1 der Code ist?


    Denn wenn ich das mache, wird das Richtige ausgegeben, also ich kann den Fehler nicht reproduzieren.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S