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