Kick Befehl auf sscanf basierend

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 liebe Brotfische,


    Ich hab mich entschlossen wieder ein Tutorial zu machen. Dieses mal zeige ich euch einen /kick Befehl der aber auf ocmd & sscanf basiert.

    So, erstmal was ihr braucht:


    - ocmd.inc

    - sscanf Plugin (ihr könnt auch den sscanf stock nutzen)

    - bisschen Geduld

    - Grundwissen


    (Links für die inc bzw. Plugins findet ihr ganz unten im Thread!)


    =========================================================================================================================

    Kommen wir jetzt zum Script Teil:


    Als erstes damit unser Kick Befehl auch funktioniert müsst ihr ganz oben folgendes einfügen:


    #include <ocmd>

    und


    #include <sscanf>


    Wenn ihr aber den sscanf stock benutzen wollt müsst ihr den ganzen stock ganz unten ins Script einfügen

    (Link zum stock ist unten im Thread!)


    So nun haben wir die beiden wichtigen Sachen um den Befehl zu erstellen, also gehen wir nun zu OnPlayerCommandText und fügen unter der Klammer die das

    Callback schließt folgendes ein:


    ocmd:kick(playerid,params[])
    {

    So, nun heißt der Befehl /kick. Der nächste Schritt wäre erstmal alles zu definieren was wir für den Befehl brauchen. Das wäre:


    new pID,reason[20],givename[MAX_PLAYER_NAME],name[MAX_PLAYER_NAME],str[128];

    Zur Erklärung:

    pID = Der Spieler den wir kicken wollen

    reason[20] = Der Grund, der nur maximal 20 Buchstaben/Zahlen/Zeichen lang sein kann

    givename = Der Name des gekickten Spielers

    name = Unser Name

    str[128] = Der String den wir später für die Nachricht brauchen und die Länge


    Ales nächstes Fragen wir ab, ob der Spieler der den Befehl eingibt auch ein Admin ist:


    if(SpielerInfo[playerid][pAdmin] <= 1)return SendClientMessage(playerid,GRAU,"Du besitzt nicht die benötigten Rechte dafür!");

    Dieser Code heißt nicht anderes als:

    Ist der Spieler kleiner als Admin 1, wird ihm die Nachricht gesendet: "Du hast keine Rechte dafür!"

    Ihr könnt natürlich euren beliebigen Admin Rang dort einfügen.

    Als nächstes kommt jetzt die sscanf Abfrage, ob der Spieler auch "ID" und "Grund" eingibt. Die sieht dann so aus:


    if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,GRAU,"Tippe: /kick [ID] [Grund]");

    Zur Erklärung:


    sscanf = Ist unser Programm

    params = Sind die Parameter die wir danach setzen/auswählen

    "us" = Das "u" steht für die Spieler ID (u = Userid) und "s" für die Nachricht die wir dann schreiben also den Grund.

    pID = Die Userid vom ausgwählten Spieler

    reason = Den Grund den wir eingeben


    Also: Sollte der Spieler "ID" (pID) und "Grund" (reason) nicht angeben, kommt die nachricht:" Tippe: /kick ........."

    Das hätten wir dann auch, jetzt muss nur noch was passieren wenn der Spieler das eingibt.

    Wir wollen erstmal die Namen vom Spieler sowie vom Spieler der gekickt wird, deswegen fügen wir noch folgendes hinzu:


    GetPlayerName(playerid,name,sizeof(name)),GetPlayerName(pID,givename,sizeof(givename));

    Nun haben wir auch die Namen aller beiden. Doch bevor der Spieler gekickt wird, müssen wir eine Nachricht senden.

    Und das machen wir so:


    format(str,sizeof(str),"[Server]: %s hat den Spieler %s vom Server gekickt! Grund: %s",name,givename,reason);

    Und damit auch jeder Spieler die Nachricht lesen kann, setzen wir dadrunter noch eine:


    SendClientMessageToAll(ROT,str);

    Jetzt kann jeder auf dem Server diese Nachricht lesen, nun fehlt nur noch das was den Befehl ausmacht:


    Kick(pID);

    Dann noch das return 1; und die geschlossene Klammer nicht vergessen und fertig ist der Befehl.

    Ihr könnt natürlich noch ein paar Extras einfügen wie:

    - man darf keine höheren Admin kicken also zum Beispiel so:


    if(SpielerInfo[pID][pAdmin] > SpielerInfo[playerid][pAdmin])return SendClientMessage(playerid,ROT,""ADMINERROR"");

    - oder auch, dass der gekickte Spieler die Nachricht lesen kann. Das würde man dann mit einem Timer machen und ihn dann nach z.B. 1 Sekunde kicken.


    Wenn jemand durcheinander gekommen ist habe ich euch nochmal den ganzen Befehl hier eingefügt:


    ocmd:kick(playerid,params[])
    {
    new pID,reason[128],name[MAX_PLAYER_NAME],givename[MAX_PLAYER_NAME],str[128];
    if(SpielerInfo[playerid][pAdmin] <= 1)return SendClientMessage(playerid,GRAU,"Du besitzt nicht die benötigten Rechte dafür!");
    if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,GRAU,"Tippe: /kick [ID] [Grund]");
    GetPlayerName(playerid,name,sizeof(name)),GetPlayerName(pID,givename,sizeof(givename));
    format(str,sizeof(str),"[Server]: %s hat den Spieler %s vom Server gekickt! Grund: %s",name,givename,reason);
    SendClientMessageToAll(ROT,str);
    Kick(pID);
    return 1;
    }



    =============================================================================================================================

    Das wars auch schon, falls ihr Fehler entdeckt und welche habt, könnt ihr mir gerne schreiben. Ich würde mich auch über positive Rückmeldungen freuen.


    Hier noch die Download Links:





    Ich hoffe mein 2 Tutorial hat euch gefallen.

    MfG



    Advanced

  • Zitat

    Was ist das? Woher hast du "SpielerInfo" ? Ist nicht in deinem Tutorial erklärt


    Irgendwie habe ich das Gefühl, ihr sucht alle nur nach Fehlern um den Beitrag nur zu kritisieren -.-
    Der einzige der den Sinn des Thema versteht ist echt Dominik und Winston_Churchill.
    Reicht nicht ein: "Ja sieht gut aus" und fertig? Ich hab das schon bei den meisten Themen beobachtet, suchen nach Fehlern (die gar keine Fehler sind) und kritisieren dann nur.
    Naja, mir gefallen die Kommentare von Dominik sowie von Churchill, und die negativen Sachen könnt ihr euch ehrlich sparren, weil ich sie überspringe, da keine Fehler drin sind.


    MfG

  • Schönen guten Tag.


    Ein schönes Tutorial, schön erklärt, wenn auch ein wenig zu sehr auf Copy & Paste ausgelegt.
    Für Anfänger sicher sehr hilfreich, doch gleichzeitig muss ich sagen das ich auch nicht nötig finde, da ich finde das sowas zum Grundwissen gehört, jeder sollte mittlerweile wissen wie man einen Befehl mit Parametern aufbaut.
    Es ist nicht so das wir hier in den Anfängen von PAWN sind sondern uns in der SA:MP Version schon bei 0.3z befinden, natürlich macht das in erster Linie keinen Unterschied, denn selbst jetzt gibt es immer wieder Anfänger.


    Doch persönlich finde ich gehört ein Befehl mit Parametern + der Umgang mit Sscanf und einem Command Prozessor zum Grundwissen.
    Genauso verstehe ich von machen die Kritik nicht zum Beispiel woher er denn SpielerInfo hat, wer sowas nicht versteht sollte nochmal bei Null anfangen, aber das ist nur meine Meinung.


    Alles in allem trotzdem ein sehr schönes Tutorial.
    Mach weiter so.


    Mfg


    Alle Menschen sind eins. Was sie unterscheidet, ist der Name, den man ihnen gibt.
    (Buddha)


    Uns zivilisierten Menschen ist zwar gelungen, das Raubtier in uns auszuschalten, nicht aber den Esel.
    (Winston Churchill)


    Wenn du denkst, die ganze Welt sei schlecht, dann vergisst nicht, dass Leute wie du darin leben.
    (Mahatma Gandhi)

  • rgendwie habe ich das Gefühl, ihr sucht alle nur nach Fehlern um den Beitrag nur zu kritisieren -.-
    Der einzige der den Sinn des Thema versteht ist echt Dominik und Winston_Churchill.
    Reicht nicht ein: "Ja sieht gut aus" und fertig? Ich hab das schon bei den meisten Themen beobachtet, suchen nach Fehlern (die gar keine Fehler sind) und kritisieren dann nur.
    Naja, mir gefallen die Kommentare von Dominik sowie von Churchill, und die negativen Sachen könnt ihr euch ehrlich sparren, weil ich sie überspringe, da keine Fehler drin sind.

    Ohne Kritik kann man sich nicht verbessern. Kritik ist ein Grundsatz, welchen man verstehen und vorallem annehmen sollte, da man sich sonst nicht verbessern kann

  • Ich würds vllt trotzdem noch so angeben beim Timer:
    SetTimerEx("KickTimer...", GetPlayerPing(pID)+100, 0, "i", pID)


    Wenn der Spieler einen Ping von 500 hat, man den Timer auf 250 stellt, kann es trotzdem sein dass er die Nachricht nicht bekommt. ;)

  • Du kannst das zum Beispiel, das ist so bei GF, dies in den KickLog abspeichern lassen, und die Admins können das nachgucken. Wie schon oben erwähnt, man kann
    den Befehl umgestalten wie man viel, von mir aus 10.000 Extras einbauen ^^ Das ist nur das Grundgerüst.


    MfG