Hallo liebe Community
da mir gerade langweilig ist und öfters nach Commands mit Parametern gefragt wird, dachte ich, ich erstelle mal ein Tutorial in dem so etwas erklärt wird.
Ich mache das mit Dcmd und Sscanf weil es CPU schonender als der ganze Schnik Schnak da mit strcmp und strtok ist und wie ich finde auch viel einfacher ist.
Als erstes brauchen Wir mal die Definitionen für dcmd und sscanf.
Hier die für dcmd:
#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
Und hier der Link zu sscanf weil die Definition für sscanf ein bisschen zu lang wäre .
Klick
Nun fangen wir mal an. Ich mache hier jetzt ein einfaches /goto [PlayerID] Command [Non-GF!].
Als erstes machen wir mal bei OnPlayerCommandText folgendes:
dcmd(goto, 4, cmdtext);
Erklärung:
dcmd gehört einfach zum definieren des Befehls.
goto gibt den Commandnamen an. Ohne '/'.
Und cmdtext ist einfach der Text von dem Commando, dass man eingibt, also die Quelle.
Nun ausserhalb eines Publics machen wir dann folgendes:
dcmd_goto(playerid, params[])
Erklärung: dcmd_goto heisst erstelle die dcmd funktion goto.
Das playerid steht für denjenigen der /goto [PlayerID] ausführt.
Und Params sind einfach die Parameter ( Also hier die PlayerID von dem Spieler zu dem wir uns teleportieren möchten. )
Jetzt eine geschweifte Klammer auf ( { )
Und dann der eigentliche Command.
Als erstes mal die Variablen:
new pid;
new Float: PosX, Float: PosY, Float: PosZ;
Das pid wird dann die PlayerID von dem Spieler beinhalten zu dem wir uns Teleportieren möchten.
Und Float: PosX, Float: PosY und Float: PosZ das sind die Koordinaten von dem Spieler der in pid gespeichert ist.
Jetzt zur Verwendung von sscanf.
Erst der Code, dann die Erklärung:
if(sscanf(params, "d", pid))
{
return SendClientMessage(playerid, COLOR_RED, "Verwendung: /goto [PlayerID]");
}
Zur Erklärung:
sscanf(params, "d", pid):
Hier werden die Parameter festgelegt, also welcher Variablentyp es sein soll ( "d" d steht für Integer ) und in welcher Variable das nach /goto eingegebene gespeichert werden soll.
Dort wird geprüft ob ein Parameter mit /goto eingegeben wurde, wieviele Parameter eingegeben wurden. Und ob der Parameter ein Integer ist ( Also eine Zahl ohne Kommastellen ist ).
Und falls das nicht so ist wird SendClientMessage(playerid, COLOR_RED, "Verwendung: /goto [PlayerID]"); returnt ( zurückgegeben ).
So nun der Code der ganz normal ist:
if(pid == INVALID_PLAYER_ID) // Prüfen ob die eingebene PlayerID gültig ist also ob der Spieler online ist
{
SendClientMessage(playerid, COLOR_RED, "Ungültige PlayerID");
}
else // Wenn es die PlayerID gibt
{
GetPlayerPos(pid, PosX, PosY, PosZ);
SetPlayerPos(playerid, PosX, PosY, PosZ);
SendClientMessage(playerid, 0x00FF00FF, "Du hast dich teleportiert");
}
Nun noch ein "return 1;" und das wars schon. Ziemlich einfach oder?
Das Ganze sollte nun so aussehen:
dcmd_goto(playerid, params[])
{
new pid;
new Float: PosX, Float: PosY, Float: PosZ;
if(sscanf(params, "d", pid))
{
return SendClientMessage(playerid, COLOR_RED, "Verwendung: /goto [PlayerID]");
}
if(pid == INVALID_PLAYER_ID)
{
SendClientMessage(playerid, COLOR_RED, "Ungültige PlayerID");
}
else
{
GetPlayerPos(pid, PosX, PosY, PosZ);
SetPlayerPos(playerid, PosX, PosY, PosZ);
SendClientMessage(playerid, 0x00FF00FF, "Du hast dich teleportiert");
}
return 1;
}
Man kann bei sscanf(params, "d", pid) statt d auch u nehmen, dass ist extra für PlayerIDs und PlayerNamen gemacht.
Das war jetzt natürlich ein ganz einfaches Beispiel man sollte da noch prüfen ob der Player Admin oder so ist und ob der Player überhaupt schon eingeloggt ist. Aber das habe ich jetzt mal rausgelassen um es noch mehr zu vereinfachen.
Ich hoffe ich konnte einigen Leuten mit meinem Tutorial helfen
LG
V1rus