Befehle mit rCmd v2 erstellen: Befehle so einfach wie nie!

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
  • Befehle mit rCmd v2 erstellen:

    Befehle so einfach wie nie!


    Vorwort:

    Hallo Leute,
    ich heiße euch hiermit herzlich Willkommen zu einem weiteren Tutorial von mir.
    Bevor jetzt irgendeiner damit kommt, dass es ein Tutorial über dieses Thema schon einmal gabt,
    möchte ich gerne darüber aufmerksam machen, dass dieses Tutorial sich auf die v2 bezieht.
    Die Include wurde nochmal komplett neugeschrieben, da einige Bugs drinnen waren, die zur Folge hatten, das viele Befehle nicht
    funktioniert haben & die "Art" bzw. "Vorangehensweise" Befehle zu erstellen hat sich auch geändert.


    rCmd ? Oh Gott, bitte nicht noch ein anderer Commandprozessor ...

    werden sich sicherlich viele von euch just gerade in diesem Augenblick denken.
    Viele kennen es ja: OCMD,DCMD,ZCMD,BCMD, uvm. ( Ich kann hier nur Maddin zitieren: "XCMD [für X bitte einen beliebigen Buchstaben aus dem Alphabet einfügen]"). Bei solchen Commandprozessoren ist eben der Fall, dass die Syntax immer die selbe ist. Die Befehle für OCMD,DCMD,ZCMD,etc. erstellen sich immer gleich.
    Doch das hier soll nicht das Thema des Tutorials sein.
    Es geht hier um rCmd. Dieser Commandprozessor hebt sich von diesen andern CMDProzessoren erheblich ab.
    Die Include wurde von RyDeR` aus dem englischen SAMP-Forum entwickelt.
    Ihr könnt sozusagen "dynamische Parameter" in euren Befehlen verwenden (wie eben in sscanf auch), jedoch ist diese Art, meiner Meinung nach
    einfacher & auch leichter zu handhaben.
    Um sich hier einfach mal konkret auf die v2 zu beziehen, hat sich geändert, dass das sscanf2 Plugin nun mit integriert wurde.
    D.h., ihr braucht die sscanf2 Include und auch dementsprechend dann das Plugin für den Server.



    Benötigte Includes:

    So, wie bei vielen anderen Sachen, braucht ihr auch hier ein paar Dinge im Voraus.
    Das wären:
    --- > sscanf2 Include + Plugin
    ---> rCmd.inc
    ---> dynamicparams.inc
    Ihr verschiebt alle Includes in den pawno/includes Ordner und das sscanf.dll/so Plugin in den Ordner "plugins".
    Danach passt ihr in der server.cfg bitte noch den Abschnitt "plugins" an.
    Natürlich müsst ihr dann auch noch mit #include <rCmd> den Commandprozessor in euer/en Filterscript/Gamemode inkludieren.
    Wichtig: Bitte unbedingt rCmd so schreiben! Bei mir gabs sonst Fehler! Bei den Befehlen auch immer: rCmd[]->...



    Befehlserstellung:

    Doch wie kann ich nun mit rCmd dementsprechend Befehle erstellen ?
    Ruhig, dazu kommen wir genau jetzt :)
    Wenn ich mich jetzt grob ausdrücken könnte, würde ich den allgemeinen rCmd Befehl ungefährt so gliedern:
    rCmd["Bezeichner für die Befehlsparameter"]->befehlsname(playerid,success,parameter1,parameter2,...)
    Wir werden dann noch genauer darauf eingehen, jedoch unterteile ich dieses "Kapitel" jetzt noch einmal in zwei Untergliederungen.


    Befehle mit Parameter:

    So da wären wir mal bei den Befehlen mit Parametern.
    Wir beziehen uns oben jetzt mal auf den Grobaufbau, den ich oben ausführlich geschildert habe.
    Man schreibt generell immer "rCmd" vor den eigentlichen Befehl.
    Danach, in den eckigen Klammern, kommen die entsprechenden sscanf2 Bezeichner für die Datentypen der Parameter jeweils hin (so wie ihr immer u für playerid, usw. nehmt). Danach folgt ein "->". Das bedeutet eigentlich nur so viel, dass hier danach der eigentliche Befehl folgt.
    Für den Befehlsnamen gebt ihr dann eben den Namen für den gewünschten Befehl an (z.B ban,kick,etc.).
    In der runden Klammern bzw. der Parameterliste danach, folgt danach erst einmal "playerid" & danach "success".
    "playerid" steht hier einfach nur für den ID des Spielers, die den Befehl ausführt.
    "success" steht hier dafür, ob der Spieler "inGame" die richtige Syntax für den Befehl eingegeben hat (z.B ob der auch wirklich alle Parameter für den /kick Befehl belegt hat). Danach für den Parameter1 bzw. 2 und 3. ( wie viele ihr eben haben wollt) schreibt ihr dann die Variablennamen für die Parameter hin ( Bei OCMD z.B habt ihr dann einfach halt, das im Funktionsbauch gemacht, z.B new pID oder new grund[]).


    Wichtig: Vor alle nicht array Variablen (also Floats,Integers ...) müsst ihr immer ein & Zeichen davor setzen (aber nicht vor playerid und success), da sonst die Parameter verbuggt wären würden.
    Hier schreibe ich einfach mal ein kleines Beispiel rein:
    rCmd["r"]->kick(playerid,success,&pID) { //"r" ist hier der Bezeichner für pID (da das nur eine Spielerid oder Name sein soll). Vor pID muss ein &! (nicht array Variable)
    if(!success)return SendClientMessage(playerid,-1,"Falsche Verwendung! Benutze: /kick <playerid>"); //"Syntax" Check
    if(pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,-1,"Ungültiger Spieler!"); //Wenn Spieler nicht verbunden
    Kick(pID); //Ansonsten kicke den Spieler vor dem Server
    return 1;
    }
    Ich denke, dass im Code in den Kommentaren alles nochmals ausführlich erklärt ist.
    Wer immer noch nicht weiß, wie die richtigen Bezeichner für die "Datentypen" der Parameter ist, sollte sich mal das sscanf2 Tutorial von maddin: ! anschauen!



    Befehle ohne Parameter:

    Jetzt werden sich aber einige fragen, was denn ist, wenn man z.B einen Befehl ohne Parameter erstellen will ?
    Das geht auch sehr einfach. Man lässt einfach die Bezeichner in den eckigen Klammern weg und schreibt in die Parameterliste einfach nur "playerid" noch mit rein.
    Beispiel:
    rCmd[]->test(playerid) {
    SendClientMessage(playerid,-1,"Du hast gerade einen Befehl ohne Parameter eingegeben!");
    return 1;
    }


    Callbacks:


    Wie auch in ZCMD, gibt es in rCmd die gleichen Callbacks, da Sie ziemlich nützlich sind.
    Fangen wir mal beim 1. von zweien an.
    forward OnPlayerCommandReceived(playerid, cmdtext[]);
    Dieser Callback wird aufgerufen, bevor der eigentliche Befehl ausgeführt wird. Sprich: Wenn man hier return 0; hinschreibt, hat das die Folge,
    dass der eigentliche Befehl deaktiviert wird. Das eignet sich prima zum Deaktivieren von Befehlen, wenn man z.B gemutet ist.
    public OnPlayerCommandReceived(playerid,cmdtext[]) {
    if(!strcmp(cmdtext,"/notenabled",true)) { //checken ob der "notenabled" Befehl eingegeben wurde
    SendClientMessage(playerid,-1,"Dieser Command ist derzeit leider deaktiviert!"); // Sende ihm dementsprechend eine Nachricht
    return 0; //Und verhinder hier, dass der Befehl ausgeführt wird.
    }
    return 1;
    }


    Dann kommen wir auch noch zum letzen Callback:
    forward OnPlayerCommandPerformed(playerid, cmdtext[], success);
    Dieser Callback wird dann aufgerufen, nachdem der Befehl ausgeführt wurde.
    Nutzen kann man dies z.B um zu überprüfen, ob der Spieler überhaupt einen gültigen Befehl eingegeben hat, wenn nicht, sende ihm eine Nachricht, die ihn über die Nichtexistenz
    aufklären soll.

    public OnPlayerCommandPerformed(playerid,cmdtext[],success) { //cmdtext ist der eingegebene Befehl, success ob der CMD erfolgreich ausgeführt wurde
    if(!success) { //Wenn der CMD nicht ausgeführt wurde, sprich er eigentlich gar nicht existiert ...
    return SendClientMessage(playerid,-1,"Dieser Befehl existiert nicht. Benutze /help für verfügbare Befehle!"); //sende ihm eine Infonachricht
    }
    return 1;
    }




    Probleme mit rCmd:


    Es gibt vielleicht auch Leute, bei denen die Benutzung von rCmd zu Problemen führt, bzw. bei denen vielleicht einfach gar kein Befehl klappen will.
    Dazu gebe ich folgenden Tipps:
    - Wenn ihr ein anders CMD-System wie OCMD,etc. benutzt, entfernt es
    - Wenn OnPlayerCommandText sich noch in eurem Script befindet, entfernt es!



    Schlusswort:


    Ich muss sagen, dass die Befehle mit rCMD auf den ersten Blick ein wenig kompliziert wirken.
    Das war auch der erste Eindruck auf mich. Jedoch wenn man es wirklich verstanden hat, geht es nach einiger Zeit wirklich viel einfacher so Befehle
    mit Parametern zu erstellen, da diese Methode sehr effektiv ist. Mittlerweile bin auch Nutzer der Include.
    Falls ihr irgendwelche Fehler findet, scheut euch nicht, diese mir mitzuteilen!
    Ich hoffe, dass euch mein Tutorial gefallen hat!


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

    4 Mal editiert, zuletzt von Logan () aus folgendem Grund: RS Fehler verbessert

  • Wie handhabt man es wenn man einen Begrhl haben will bei dem man einen Parameter eingeben kann aber nicht muss?


    Bsp. /tanken => Tankt voll
    /tanken 10 => Tankt 10 Liter



    MfG

    Wer ist der Mensch hinter der Uniform? Ist euch das bekannt?
    Es ist der selbe der noch eben in Zivil neben euch stand.
    Warum wird er gehasst und so selten respektiert?
    Warum ist er derjenige der seinen Hals für euch riskiert?
    Trägt der Bulle eine Weste, das hat er früher nie gemacht,
    die Zeiten haben sich geändert und jeder Dienst ist ein Kampf!
    Warum gibt’s das SEK und warum sind sie so brutal?
    Und wieso hat wieder einer mit seinem Leben bezahlt?

  • Eigentlich ganz einfach. Ich würde es so machen:
    rCmd["D(100)"]->tanken(playerid,success,&tankmenge) { //100 eben mit deiner vollen Tankmenge ersetzen D hier groß schreiben, d.h. optional. 100 bedeutet wenn ichts eingesetzt wurde //soll es 100 einsetzen
    new veh = GetPlayerVehicleID(playerid);
    Tank[veh] = tankmenge; //wie auch immer du den Tank vom Fahrzeug setzt
    new str[128];
    format(str,sizeof str,"Du hast dein Fahrzeug mit %d Litern erfolgreich betankt!",tankmenge);
    SendClientMessage(playerid,-1,str);
    return 1;
    }


    Ich hoffe, dass das jetzt stimmt, da ich mich noch fast noch gar nicht mit optionalen Parametern beschäftigt habe,
    aber eigentlich sollte das funktionieren.


    @Topic: /push


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Ich glaube ich bin zu doof dafür... :S
    Bitte noch mal eine genaue Anleitung wie man das Installiert (rCmd,sscanf2)


    *̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡
    B0wmH0use

  • Ich glaube ich bin zu doof dafür... :S
    Bitte noch mal eine genaue Anleitung wie man das Installiert (rCmd,sscanf2)


    Wie, wie man es installiert ?
    Einfach die Includes downloaden und in der rCmd include sscanf2 noch inkludieren.
    Wenn nicht einfach bei mir im Anhang downloaden, da habe ich sscanf2 schon inkludiert.

    Dateien

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Klasse tutorial! ich tuhe mich seitdem ich mit Scripten angefangen habe schwer mit Parametern bzw. mit Sscanf jedoch habe ich es nun endlich verstanden. Ich werde auch um steigen,dank dir.
    MFG.
    //E Logan
    Kannst du villeicht mal eben einen Kick Befehl mit Grund zeigen?
    ich habe schon einiges damit ausprobiert, z.B. mein Ban Befehl:

    rCmd["rs"]->ban(playerid,succes,&pID,grund[])
    {
    if(!IsAdmin(playerid,3))return SendClientMessage(playerid,Bfarbe,"Du bist nicht befugt!");
    if(!succes)return SendClientMessage(playerid,Bfarbe,"Benutze: /ban [ID] [Grund]");
    if(pID == INVALID_PLAYER_ID)return SendClientMessage(playerid,Bfarbe,"Falsche Spieler ID!");
    new Aname[MAX_PLAYER_NAME],string[57];
    GetPlayerName(playerid,Aname,sizeof(Aname));
    format(string,sizeof(string),"%s wurde von %s gebannt! | Grund: %s",pID,Aname,grund); // ich habe es auch schon mit %r ausprobiert...
    SendClientMessageToAll(Bfarbe,string);
    print(string);
    return 1;

    }

    Aber nichts will klappen...
    Danke!
    //e @L0g4n

    Dieser Beitrag wurde bereits 763 mal editiert, zuletzt von »Anker.« (Vor einem Moment)


    "eingetragende Stand -Ins"


    2 Mal editiert, zuletzt von Anker. ()

  • Kannst du mal genauer sagen, was nicht funktioniert ?
    Funktionieren alle anderen auch nicht, oder nur dieser ?


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.

  • Doch, er hat ja in die Include das sscanf Plugin integriert seit der v2.
    Du brauchst also das sscanf Plugin.


    LG

    Main: CPU: Intel Core i5-4440 @ 3,10 GHz | CPU-Cooling: Matterhorn -PURE- | RAM: 16GB Crucial Ballistix Sport DDR3-1600 DIMM CL9-9-9-24 |
    Motherboard: ASRock B85M Pro4 | GPU: Sapphire Radeon R9 390X Nitro 8GB GDDR5 |

    SSD: Samsung SSD 840 Evo 500GB | Power Supply: 550 Watt Corsair CS Series Modular 80+ Gold | Case: beQuiet! Silent Base 800


    As I walk through the valley of the shadow of death
    I take a look at my life and realize there's nothin' left.