DCMD Tutorial

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
  • Da ich das Forum hier durchsucht habe und irgendwie kein Tutorial für dcmd gefunden habe, dacht ich mir mal ich mach eins :thumbup:
    Vielleicht hab ich auch einfach nur schlecht gesucht aber egal...
    Starten wir mal..


    In dem Tutorial hier werd ich euch zeigen wir ihr Commands mit dcmd und sscanf sehr einfach erstellen könnt.
    Von einfachen Commands wie /kick [playerid] bis zu welchen wie z.b. /veh [vehicleid] [color1] [color2] [respawn Zeit]


    Wir starten mal am Anfang des Scripts wo folgendes stehen muss.

    #include <a_samp>
    #include <sscanf>
    #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


    Das Include a_samp ist standartmäßig in jedem Script vorhanden damit wir die Grund funktionen (SendClientMessage,etc..) verwenden können. (Include Standartmäßig in der Server Datei vorhanden)
    Das Include sscanf ermöglicht uns das Vereinfachte erstellen von commands mit Parametern (Download des Includes: Hier klicken)
    Das dcmd benötigen wir damit wir über dcmd commands erstellen können (ACHTUNG! DCMD BENÖTIGT KEIN INCLUDE)


    Jetzt wollen wir mit den Commands beginnen...
    Erstmal machen wir ein ganz simples Command. Man wird eingeben: /money --> Man erhält 1.000$ Money

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(money,5,cmdtext); //money = das Command ACHTUNG KEIN "/" Davor 5 = die länge des Commands
    return 0;
    }


    dcmd_money(playerid,params[])
    {
    SendClientMessage(playerid,0xFF0018FF,"Du erhältst Geld");
    GivePlayerMoney(playerid,1000);
    return 1;
    }


    Jetzt werdet ihr ein Warning erhalten das ungefähr so Aussieht:
    C:\Dokumente und Einstellungen\loisi\Desktop\Sascha\Grand Theft Auto\Server 0.3b\gamemodes\TutorialBreadfish.pwn(93) : warning 203: symbol is never used: "params"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    1 Warning.


    Ihr könnt das natürlich so stehen lassen aber das sieht doch hässlich aus wenn ihr nach einiger Zeit dann 10 Warnings oder mehr habt..
    Desshalb machen wir folgendes:

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(money,5,cmdtext); //money = das Command ACHTUNG KEIN "/" Davor 5 = die länge des Commands
    return 0;
    }


    dcmd_money(playerid,params[])
    {
    #pragma unused params
    SendClientMessage(playerid,0xFF0018FF,"Du erhältst Geld");
    GivePlayerMoney(playerid,1000);
    return 1;
    }


    Also mit
    #pragma unused params
    Können wir die params ausschalten falls die Commands keinen Parameter haben sollen


    Jetzt gehen wir an ein bisschen schwereres Command. Man wird eingeben /kick [playerid] und dann wird der Spieler (wenn man selbst admin ist) gekickt werden.
    Ich definiere mir erstmal die Farbe rot damit ich das nicht immer schreiben muss

    #define RED 0xFF0018FF


    Jetzt gehen wir zu dem Command:

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(money,5,cmdtext);
    dcmd(kick,4,cmdtext);
    return 0;
    }
    dcmd_kick(playerid,params[])
    {
    new SpielerID;
    if(sscanf(params, "d", SpielerID)) { //d = eine ID z.b. von Spielern oder Vehicles
    return SendClientMessage(playerid,RED,"USAGE: /kick [playerid]");
    }
    if(!IsPlayerAdmin(playerid)) {
    return SendClientMessage(playerid,RED,"Du bist kein Admin");
    }
    if(!IsPlayerConnected(SpielerID)) {
    return SendClientMessage(playerid,RED,"Spieler ID nicht gefunden");
    }
    if(SpielerID == playerid) {
    return SendClientMessage(playerid,RED,"Du kannst dich nicht selber kicken");
    }
    SendClientMessage(playerid,RED,"Spieler erfolgreich vom Server gekickt");
    SendClientMessage(SpielerID,RED,"Du wurdest vom Server gekickt");
    Kick(SpielerID);
    return 1;
    }


    Wichtig ist das man nicht vergisst bei IsPlayerConnected ein "!" davor zu setzen was sowas bedeutet wie ist nicht gleich oder ist nicht wahr
    also bedeutet das dann statt Ist Spieler Connected sowas wie Ist Spieler nicht Connected
    Natürlich hätte man unten noch strings verwenden können um eine Nachricht an alle Spieler zu senden damit Sie wissen wer gekickt wurde bzw. von wem er gekickt wurde.
    Aber das ist nich der Schwerpunkt dieses Tutorials.


    Jetzt gehen wir zu unseren Schwereren Command. Ich werde das so machen: /v [vehicleid] [color1] [color2] [respawn Zeit] [Grund für das erstellen]

    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(money,5,cmdtext);
    dcmd(kick,4,cmdtext);
    dcmd(v,1,cmdtext);
    return 0;
    }
    dcmd_v(playerid,params[])
    {
    new veh, co1, co2, rs, reason[128];
    new Float:x, Float:y, Float:z, Float:a;
    new string1[128], string2[128];
    new nam[MAX_PLAYER_NAME];

    if(sscanf(params, "dddds",veh,co1,co2,rs,reason)) {
    return SendClientMessage(playerid,RED,"USAGE: /v [vehicleid][color1][color2][respawn time][Reason]");
    }
    if(veh < 400 || veh > 610) {
    return SendClientMessage(playerid,RED,"Vehicle ID muss zwischen 400 und 610 sein");
    }
    if(co1 < 0 || co1 > 126 || co2 < 0 || co2 > 126) {
    return SendClientMessage(playerid,RED,"Color muss zwischen 0 und 126 sein");
    }
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    CreateVehicle(veh,x,y,z,a,co1,co2,rs);
    GetPlayerName(playerid,nam,sizeof(nam));
    format(string1,sizeof(string1),"** %s hat ein Vehicle erstellt. Grund: %s",nam,reason);
    format(string2,sizeof(string2),"Du hast das Vehicle %d mit der Farbe 1: %d und Farbe 2: %d erstellt",veh,co1,co2);
    SendClientMessageToAll(RED,string1);
    SendClientMessage(playerid,RED,string2);
    return 1;
    }


    Ich hoffe mein Thread hat euch geholfen. Für Fragen stehe ich natürlich jederzeit offen