Adminsystem erstellen

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
  • Huhu, ich hab mir gedacht weils so oft gefragt wird könnte ich mal ein Tut posten in dem beschrieben wird wie man ein Adminsystem erstellt. Also als Grundlage verwende ich das Account System von BlackFoX_UD_.
    So dann legen wir mal los, als erstes müssen den Enums eine Zeile hinzufügen
    enum spieler_daten
    {
    wanted,
    skin,
    Float:lastx,Float:lasty,Float:lastz,
    eingeloggt,
    AdminLevel // Diese Variable wird später für das Laden und abfragen benötigt.
    }
    new Spieler[MAX_PLAYERS][spieler_daten];


    So. nun suchen wir uns den Register Dialog und fügen folgendes hinzu
    case DIALOG_REG: // ID Registrieren
    {
    if(!strlen(inputtext))
    {
    ShowPlayerDialog(playerid,DIALOG_REG,1,"Registrieren","Bitte Registriere dich","Abbrechen","Weiter");
    return SendClientMessage(playerid,0xFFFFFFFF,"Das Passwort ist zu kurz!");
    }
    dini_Create(accFormat);
    dini_Set(accFormat,"Passwort",inputtext);
    dini_IntSet(accFormat, "AdminLevel" , 0); // Hier wird das Adminlevel in der Spielerdatei auf 0 gesetzt.
    Spieler[playerid][AdminLevel] = 0; // Hier wird das Levels des neu registrierten Spielers auf 0 gesetzt.
    Spieler[playerid][eingeloggt] = 1;
    SendClientMessage(playerid,0xFFFFFFFF,"Account wurde angelegt und du wurdest eingeloggt.");
    }
    Laden des Adminlevels beim Login, ihr sucht den folgenden Code unter OnPlayerDialogResponse
    if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)
    {
    Spieler[playerid][wanted] = dini_Int(accFormat,"wanted");
    Spieler[playerid][skin] = dini_Int(accFormat,"skin");
    Spieler[playerid][lastx] = dini_Float(accFormat,"lastx");
    Spieler[playerid][lasty] = dini_Float(accFormat,"lasty");
    Spieler[playerid][lastz] = dini_Float(accFormat,"lastz");
    GivePlayerMoney(playerid,dini_Int(accFormat,"Geld"));
    SetPlayerScore(playerid,dini_Int(accFormat,"Score"));
    Spieler[playerid][eingeloggt] = 1;
    SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest erfolgreich eingeloggt.");
    }
    und ersetzt ihn durch
    if(strcmp(inputtext,dini_Get(accFormat,"Passwort")) == 0)
    {
    Spieler[playerid][wanted] = dini_Int(accFormat,"wanted");
    Spieler[playerid][skin] = dini_Int(accFormat,"skin");
    Spieler[playerid][lastx] = dini_Float(accFormat,"lastx");
    Spieler[playerid][lasty] = dini_Float(accFormat,"lasty");
    Spieler[playerid][lastz] = dini_Float(accFormat,"lastz");
    GivePlayerMoney(playerid,dini_Int(accFormat,"Geld"));
    SetPlayerScore(playerid,dini_Int(accFormat,"Score"));
    Spieler[playerid][AdminLevel] = dini_Int(accFormat, "AdminLevel"); // Das Level wird aus der Datei geladen
    Spieler[playerid][eingeloggt] = 1;
    SendClientMessage(playerid,0xFFFFFFFF,"Du wurdest erfolgreich eingeloggt.");
    }


    So nun zeige ich euch noch wie man mit diesem Level Befehle erstellt. Zuerst benötigt ihr das sscanf Makro (da die Wiki down ist findet ihrs hier) und das dcmd Makro muss unter die includes!

    #include <a_samp>
    #include <dini>
    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1

    So damit haben wir jetzt dcmd definiert :) wird Zeit für den ersten Befehl
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    //anderer Code
    dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8 insgesamt.
    return 0;
    }
    Und nun der eigentliche Befehl
    dcmd_setlevel(playerid,params[])
    {
    new pID, Level;
    if(sscanf(params, "ud",pID,Level))return SendClientMessage(playerid,0xFF0000FF,"Benutze: /setlevel [ID][Level]!"); //Falls nur /setlevel eingegeben wurde
    if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Spielerid ist nicht vorhanden!");
    // Falls eine falsche ID angegeben wurde, wird 0 returnt ;)
    if(Spieler[playerid][AdminLevel] > 3) // Hier wird abgefragt ob das Level des Spielers der den Befehl eingegeben hat größer als 3 ist.
    {
    new adminstring[128],levelsetter[MAX_PLAYER_NAME], playername[MAX_PLAYER_NAME];
    GetPlayerName(pID,playername,sizeof playername);
    format(adminstring,sizeof(adminstring),"Admins/%s.sav",playername);
    GetPlayerName(playerid,levelsetter,sizeof(levelsetter));
    Spieler[pID][AdminLevel] = Level; //Hier wird die Levelvariable mit dem neu eingegebenen Level überschrieben
    dini_IntSet(adminstring,"AdminLevel",Level); // Und hier das neue Level in der Datei gespeichert.
    format(adminstring,sizeof(adminstring),"%s hat dein Level auf %d gesetzt!",levelsetter, Level);
    SendClientMessage(pID,0x33FF33FF, adminstring);
    }
    else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
    // Falls das Level nicht ausreicht wird dieser Text gesendet.
    return 1;
    }


    Und zur Einfachheit halber hab ich noch einen weiteren Befehl erstellt, dazu sucht ihr wieder OnPlayerCommandText und ersetzt
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    //anderer Code
    dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8.
    return 0;
    }
    durch
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    //anderer Code
    dcmd(setlevel,8,cmdtext); // Die 8 steht für die Anzahl der Buchstaben im Wort setlevel - also 8.
    dcmd(kick, 4, cmdtext); // Dieses Mal nur 4 Buchstaben
    return 0;
    }


    Dieser Befehl kommt direkt unter den dcmd_setlevel Befehl!
    dcmd_kick(playerid,params[])
    {
    new pID, str[64];
    if(sscanf(params, "uz",pID,str))return SendClientMessage(playerid,0xFF0000FF,"USAGE: /kick ID Grund");
    //Falls nur /Kick eingegeben wurde
    if (pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,0xFF0000FF,"Kein Spieler mit angegebener ID Online!");
    //Falsche Id
    if (pID == playerid)return SendClientMessage(playerid,0xFF0000FF,"Du kannst dich nicht selber kicken!");
    // Falls man seine eigene ID angegeben hat ;)
    if(Spieler[playerid][AdminLevel] > 0) // Wenn das Level größer ist als 0
    {
    new ThePlayer[MAX_PLAYER_NAME], str2[128];
    GetPlayerName(pID,ThePlayer,sizeof(ThePlayer));
    format(str2,sizeof(str2),"%s wurde vom Server gekickt!(Grund: %s)",ThePlayer,str[0] ? str : "<Kein Grund>");
    // Falls kein Grund angegeben wird als Grund <Kein Grund> angegeben
    SendClientMessageToAll(0xFF0000FF,str);
    Kick(pID);
    }
    else return SendClientMessage(playerid, 0xFF0000FF, "Dein Level reicht nicht aus!");
    return 1;
    }


    Im Anhang ist das fertige Script :)
    Für Anregungen, Verbesserungen und Kommentare wäre ich dankbar.
    Lg Hp :thumbup:
    Pastebin
    *Update* : Habe den Code etwas optimiert und auch die .pwn optimiert und den Pastebin Link eingefügt.
    *Update2*: Bug gefixxt und Code weiter optimiert.
    Stand: 18.10.2010breadfish.de/wcf/attachment/2400/

    5 Mal editiert, zuletzt von ]hp[ ()

  • Hab grad das Admin System mit dem Tut. gemacht.
    Nicht sehr gut erklärt aber manche Sachen erklären sich von alleine :)


    Tutorial: 7,5/10


    Mfg Andy

    Du suchst ein Scripter der für "maximal" 5€ für dich Scriptet?


    Dann bist du bei mir genau richtig.

  • nice .. aber könntest mehr erklären. Bzw. solche cmd´s mit ban u. kick kann man als Admin Fraktion machen ist viel leichter für anfänger und auch schneller zu machen für vortgeschrittene.

  • Mal sehen mit ocmd, vllt nachdem ich aus dem Urlaub wieder da bin :) werde das gesamte Tut dann nochmal überarbeiten denke ich :D thx für die Kritik :thumbup:

  • Hey.
    Gutet Tutorial, doch ich habe eine Frage.Wie mache ich das mit skin und der position? Ich hab alles versucht aber es klappt nich.Bin langsam am verzweifeln ;(


    Ich habe schon bei Onplayerspawn
    if(dini_Isset(accFormat,"skin"))
    {
    SetPlayerSkin(playerid,Spieler[playerid][skin]);
    }


    eingefügt,da BlackFox das mit lastx etc auch so gemacht hat. Jedoch ohne auswirkung

    MFG MrTadäus

    Einmal editiert, zuletzt von MrTadäus ()

  • Erklärs doch mit oCmd, is ja noch besser wie dcmd... ;D


    [offtopic]Vergiss es doch, Ocmd isn abklatsch von Dcmd und das sagen absolut alle.
    Ich wundere mich, wie %30 des Forums aufeinmal kleinerOpa-Fans geworden sind ? ò.ò
    Joa gute Scripts kann man schon haben, aber man mus och auch korrekt sein.
    bei KleinerOpa hab ich jedenfalls gesehen: Multi-Accounts, angeben, Beleidigungen...
    PS.: Hier guck, zieh dir dieses bild ma ganz rein :thumbdown:
    klick


    DCMD ist besser als OCMD, nur weil man nichts unter ONPlayerCommandText schreiben muss, und nur weil Opa in sein siggi "OCMD: Besser als DCMD" geschrieben hat, macht das OCMD nicht den besten ^^
    Aber respekt, der junge konnte viel, ich mag ihn auch. Bis ich bemerkt habe wie respektlos er ist, das er jeden beleidigt, multi-accounts macht, angibt nur weil sein "PN-Fach" voll ist XD


    Wenn User soetwas oder sowas wie das hier sehen:
    "Ihr müsst nicht mehr das machen", "ihr müsst nicht mehr unter xxxx(); schreiben", "es ist viel kürzer" o.æ. dann sagen sie "Oooh toll, wie geile features, 100000/10 !!!".
    Aber die User versuchen nicht, einmal zu denken, ob die Funktion die eingebracht wurde oder ob dsa rausnehmen einer Funktion wirklich nötig war bzw. ist.
    Bei dcmd schreibt man ja die Cmds einmal ins Script, einmal unter OnPlayerCommandText.
    Und das, was man unter OnPalyerCommandText schreibt ist nur eine zeile lang.
    Genau vor ein paar stunden vor dem lesen deines Posts dachte ich mir, wie gut die Idee ist, das man die Cmds auch unter OnPlayerCommandText schreibt, da es so übersichtlicher wird -wenigstens für mich-.
    Und glaub mir, wie gesagt: Nur weil man bei Ocmd nichts unter OnPlayerCommandText schreiben muss macht das Ocmd noch laaange nicht den besten, DracoBlue (scripter des Dcmd's) ist ein %100 besserer Scripter als unser kleinerOpa und der hætte es sich bestimmt auch denken können, wie man es machen kann das man nichts unter OnPlayerCommandText schreibt ^^ [/offtopic]


    @]hp[ ://
    Echt gutes Tutorial, danke dir in namen von allen noobs (neulingen) ^^:thumbup:

    Einmal editiert, zuletzt von FoxHound ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • *Update* Ein paar Sachen präzise erklärt und noch den Kick Befehl dazu niedergeschrieben, das ganze ist jetzt auch mit im Dateianhang vorhanden :thumbup:

  • @SenfToTopic strcmp ist noch immer besser als dcmd von der Leistung her, nur ist dcmd deswegen so toll, dass es bereits, wie es im dcmd gennant wird, in Parameter unterteilt und mann nicht extra Abfragen durchführen muss ob nach dem /lol ein Leerzeichen ist und Co.

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • @Templer://
    Ja, strcmp ist schon schneller als dcmd, aber wen juckts schon das es ein paar Milisekunden schneller ist ^^
    dcmd ist sehr übersichtlich.
    Und beim vorherigen Post meinte ich, die Leute sollen nicht sofort "OOOOH TOLLER FEATuRE 10//10!" schreiben und das Script in seine Signatur packen.
    Sondern sie sollen sich mal denken, ob dieses neue Feature wirklich nötig ist.
    Unter OnPlayerCommandText nichts schreiben zu müssen ist für mich absolut unnötig, aber ich respektiere was andere denken ;)
    Und wer DCMD mit Goldkiller's Tutorial schon kann, kann doch auch OCMD, es würde ABSOLUT unnötig sein, für OCMD ein Tutorial zu schreiben, oder es in einem Tutorial zu benutzen, weil DCMD eh immer besser als DCMD wird (von Features etc. abgesehen).
    Frag doch mal die LEute wie sie Commands erstellen, die meisten, sogar fast ALLE werden Dcmd oder Strcmp sagen.
    Siehe hier:
    Welche "Command-Sprache" bevorzugt ihr ?
    Nur %13 der Usern die abgestimmt haben, benutzen Ocmd, mehr nicht!
    Könnt ja im Thread auch voten ^^

  • Meine Adminbefehle sind mit OCMD ;) , aber ich habe am Anfang strcmp benutzt und es hat mir auch nicht geschadet . Dann bin ich auf DCMD gekommen und gleichzeitig auf OCMD , und es ist für mich nur Gewöhnungssache Welches man jetzt benutzt . Einen wirklichen Sieger zwischen denen gibt es nicht . Gutes Tutorial , ich hoffe dass da keiner C&P macht und fertig.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen