OCMD - Das wohl übersichtlichste!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OCMD - Das wohl übersichtlichste!

    Hallo,
    auf Wunsch des Users "Luigi Baker" möchte ich hier ein Tutorial zum Thema "OCMD" entwerfen. :)

    OCMD ist eine Commandart in der Scriptsprache "Pawn".
    Es ist meiner Meinung nach die beste und leichteste Art zu scripten, aber vorallem die übersichtlichste!

    Um das Include mit deinem Gamemode überhaupt kompatibel zu machen, lade dir das im Dateianhang zu findene Include "ocmd" einfach herunter und schreib oben in dein Gamemode:
    [pwn]#include[/pwn]

    Fangen wir nun mal mit einem einfachen /hp-Befehl an. Dieser soll einfach nur bezwecken dem Spieler der den Befehl ausführt volle Health zu geben:
    [pwn]ocmd:hp(playerid,params[])
    {
    #pragma unused params
    SetPlayerHealth(playerid, 100);
    return 1;
    }[/pwn]

    Nun zur Erklärung:
    Oben habe ich den Befehl hinter dem "ocmd:" indem Fall: /hp
    Anschließend öffne ich die Klammer und dann kommt der Schritt der bei Parameterlosen Commands bei nicht beachten eine Warnung auslöst: Wir sagen das dieser Command kein Parameter hat/besitzt!
    Anschließend setzen wir die Health des Spielers noch auf 100 und "returnen" das ganze.

    Zur Erklärung: Ein Parameter ist "die Stelle(n) nach dem Command", sprich z.B. "/hp 50" währe mit einem Parameter, 50 ist hier der Parameter.
    Nun machen wir einfach mal einen Command mit Parameter, indem Fall benötigen wir noch das Include "sscanf2", das ihr im Anhang findet, diesen wie oben kompatibel machen:
    [pwn]#include[/pwn]

    Kommen wir nun mal zu dem Command.
    Wir möchten also das der User selbst festlegen kann wieviel Health er überhaupt bekommt.

    [pwn]ocmd:hp(playerid,params[])
    {
    new Health;
    if(sscanf(params, "d", Health)) return SendClientMessage(playerid, Farbe, "Benutzung: /hp [Menge]");
    [/pwn]

    Bis dahin erstmal.
    Indem Fall definieren wir die "Health" und fragen dann ab ob der Spieler hinter dem Command noch ein Parameter gesetzt hat welches ja eine "Health"-Zahl sein soll; wenn nicht -> SendClientMessage mit dem gewünschten Inhalt. Zur genauen Erklärung forme ich hier mal die if(sscanf [...]-Zeile um:

    [pwn]wenn(sscanf(KeinDefinierterParameterHinterCMD, "Zahl (d = Zahl)", Health)) dannreturn GebeSendClientMessageAus[/pwn]
    Wie ich sscanf nun erklären soll ist mir relativ fragwürdig. :wacko:

    Jetzt kommen wir mal zum Command wie er weiter aussehen könnte:
    [pwn]ocmd:hp(playerid,params[])
    {
    new Health;
    if(sscanf(params, "d", Health)) return SendClientMessage(playerid, Farbe, "Benutzung: /hp [Menge]");
    if(Health > 0 && Health < 100)
    SetPlayerHealth(playerid, Health);
    return 1;
    }[/pwn]

    Wir sagen also wenn die Healthangabe vom Spieler mehr als 0 und weniger als 100 ist dann kann er selbst bestimmen wieviel HP er will. :)

    Jetzt machen wir das ganze mal so das der Spieler (playerid) einem anderen Spieler die HP setzen kann, nur zum Verständnis:

    [pwn]ocmd:hp(playerid,params[])
    {
    new pID, Health;
    if(sscanf(params, "ud", pID, Health)) return SendClientMessage(playerid, Farbe, "Benutzung: /hp [Spieler] [Menge]");
    if(IsPlayerConnected(pID) && Health > 0 && Health <= 100)
    SetPlayerHealth(pID, Health);
    return 1;
    }[/pwn]


    Man merke bitte auch:
    Welche funktionen hat sscanf?
    Als erstes sollte man die parameter kennen die man benötigt um z.b integer von string oder float zu unterscheiden.

    [table='Parameter, Name, Erklärung, Beispiel']
    [*]i, d
    [*]Integer
    [*]Eine einfache Zahl.
    [*]-314, -1, 0, 1, 2, 5, 8765345

    [*]I, D
    [*]Integer (Optional)
    [*]Eine einfache Zahl.
    [*]-314, -1, 0, 1, 2, 5, 8765345

    [*]c
    [*]Character
    [*]Ein einzelner Character bzw Bustabe.
    [*]a, o, *

    [*]C
    [*]Character (Optional)
    [*]Ein einzelner Character bzw Bustabe.
    [*]a, o, *

    [*]l
    [*]Logical
    [*]Ein Logischer wert wie true (wahr) oder false (falsch).
    [*]true, false

    [*]L
    [*]Logical (Optional)
    [*]Ein Logischer wert wie true (wahr) oder false (falsch).
    [*]true, false

    [*]b
    [*]Binary
    [*]Eine Binärzahl.
    [*]01001, 0b1100

    [*]B
    [*]Binary (Optional)
    [*]Eine Binärzahl.
    [*]01001, 0b1100

    [*]h, x
    [*]Hex
    [*]Eine Hexadezimalzahl.
    [*]1A, 0x23

    [*]H
    [*]Hex (Optional)
    [*]Eine Hexadezimalzahl.
    [*]1A, 0x23

    [*]o
    [*]Octal
    [*]Ein Oktalwert.
    [*]045 12

    [*]O
    [*]Octal (Optional)
    [*]Ein Oktalwert.
    [*]045 12

    [*]n
    [*]Number
    [*]Eine einfache Zahl (Sowohl integer, als auch Binär,Hexadezimal, etc. Wert).
    [*]42, 0b010, 0xAC, 045

    [*]N
    [*]Number (Optional)
    [*]Eine einfache Zahl (Sowohl integer, als auch Binär,Hexadezimal, etc. Wert).
    [*]42, 0b010, 0xAC, 045

    [*]f
    [*]Float
    [*]Eine Gleitkommazahl.
    [*]0.7, -99.5

    [*]F
    [*]Float (Optional)
    [*]Eine Gleitkommazahl.
    [*]0.7, -99.5

    [*]g
    [*]IEEE Float
    [*]Eine IEEE Gleitkommazahl.
    [*]0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E

    [*]G
    [*]IEEE Float (Optional)
    [*]Eine IEEE Gleitkommazahl.
    [*]0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E

    [*]u
    [*]User name/id (bots und spieler)
    [*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich.
    [*]Maddin, Hans, Bot1, Bot2, 0, 1

    [*]U
    [*]User name/id (bots und spieler) (Optional)
    [*]Ein Spieler-/Botname oder eine player-/botid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich.
    [*]Maddin, Hans, Bot1, Bot2, 0, 1

    [*]q
    [*]Bot name/id
    [*]Ein Botname oder eine botid. Also sowohl z.b /kick Beispielbot als auch /kick 0 sind möglich. Hier werden allerdings nur Bots beachtet, keine Spieler!
    [*]Bot1, Bot2, 0, 1

    [*]Q
    [*]Bot name/id (Optional)
    [*]Ein Botname oder eine botid. Also sowohl z.b /kick Beispielbot als auch /kick 0 sind möglich. Hier werden allerdings nur Bots beachtet, keine Spieler!
    [*]Bot1, Bot2, 0, 1

    [*]r
    [*]Player name/id
    [*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich. Hier werden allerdings nur Spieler beachtet, keine Bots!
    [*]Maddin, Hans, 0, 1

    [*]R
    [*]Player name/id (Optional)
    [*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich. Hier werden allerdings nur Spieler beachtet, keine Bots!
    [*]Maddin, Hans, 0, 1

    [*]{, }
    [*]Quit section
    [*]{ } Wird verwendet wenn in einem parameter zwar bestimmte zeichen vohanden sind, diese aber nicht weiter verarbeitet werden solle.
    [*]{iis[128]}

    [*]P
    [*]Trennzeichen
    [*]Ein angegebenen trennzeichen, an dem sscanf erkennt was die einzelnen werte voneinander trennt. Standartmäßigm ist es das Leerzeichen.
    [*]P<|>iiii Ersetzt ungültige Trennzeichen mit einem "|"

    [*]p
    [*]Trennzeichen
    [*]Ein angegebenen trennzeichen, an dem sscanf erkennt was die einzelnen werte voneinander trennt. Standartmäßigm ist es das Leerzeichen.
    [*]p<|>iiii Ersetzt Trennzeichen mit einem "|"

    [*]Z(string)[länge]
    [*]Ungültiger Optionaler String
    [*]Ein Ungültiger Optionaler String.
    [*]-

    [*]z(string)[länge]
    [*]Verworfener Optionaler String
    [*]Ein Verworfener Optionaler String.
    [*]-

    [*](string)[länge]
    [*]Optionaler String
    [*]Eine zeichenkette (string) mit angegebener länge. Hierbei wird die länge des strings angegeben, an den der wert übergeben werden soll.
    [*]-

    [*]s[länge]
    [*]String
    [*]Eine zeichenkette (string) mit angegebener länge. Hierbei wird die länge des strings angegeben, an den der wert übergeben werden soll.
    [*]-

    [*]A(default)[länge]
    [*]Optionales Array des Angegebenen types
    [*]Ein Optionales Array des Angegebenen types.
    [*]-

    [*]a[länge]
    [*]Array des Angegebenen types
    [*]Ein Array des Angegebenen types.
    [*]-

    [*]e
    [*]Enum
    [*]Ein Parameter, der verwendet werden kann um alle werte die sich zwischen den beiden < > befinden an ein Enum weiter zu geben.
    [*]-

    [*]E(default)
    [*]Enum (Optional)
    [*]Ein Parameter, der verwendet werden kann um alle werte die sich zwischen den beiden < > befinden an ein Enum weiter zu geben.
    [*]-

    [*]'string'
    [*]Suchbegriff
    [*]Ein Begriff nachdem im angegebenen Parameter gesucht werden soll
    [*]-

    [*]%
    [*]Deprecated optional specifier prefix
    [*]Ganz ehrlich, ich habe keine ahnung xD Wenns jemand weiss PN an mich und ich trag es nach.
    [*]-
    [/table]
    Quelle: sa-mp.de; Ursprung Y_Less; übersetzt von Maddin


    Ich hoffe ich konnte etwas helfen!
    Bei Fragen stehe ich zur Verfügung!
    Grüße.
    Dateien
    • sscanf2.inc

      (1,04 kB, 598 mal heruntergeladen, zuletzt: )
    • sscanf.zip

      (82,55 kB, 564 mal heruntergeladen, zuletzt: )
    • ocmd.inc

      (1,4 kB, 931 mal heruntergeladen, zuletzt: )
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Logan_Adams () aus folgendem Grund: Neue OCMD Include VERSION 2.0.1 eingefügt!

  • Es ist meiner Meinung nach die beste und leichteste Art zu scripten, aber vorallem die übersichtlichste!
    Deine Meinung in allen ehren, aber könntest du das mal bitte begründen? Es gibt nämlich noch andere CMD Arten, die von der struktur her genau so aufgebaut sind, aber noch zusätzliche Funktionen anbieten.

    Und wieso hängst du die sscanf2 include an, aber nicht das dazu gehörige plugin? So alleine nützt die nämlich nüscht^^

    Und das du nich angibst das die erklärungen zu den parametern von mir bzw von y_less sind, dazu sag ich jetzt ma garnix ;)
  • Hallo,
    Quelle: sa-mp.de

    Soviel zu den Parametern, gerne schreibe ich deinen Namen noch hin.

    Natürlich gibt es noch andere Arten von CMD's mit der gleichen Struktur, ich habe mich nunmal auf OCMD eingestürzt ... es ist eben meine Meinung. ;)
    Das sscanf2-Plugin lad ich gerne noch hoch ... passiert. ;)
    "Das müsste jetzt funktionieren..."

    ---
    Mit freundlichen Grüßen,
    Vincent Petritz
  • Mehrere Befehle, eine Funktion!

    Seit OCMD 2.1.0 ist es nun möglich 1 Befehl mit max. 4 - Synonym Befehlen zu erstellen.
    Das funktioniert folgendermaßen:
    [pwn]
    ocmd@3:hallo,servus,bonjour(playerid,params[])
    {
    SendClientMessage(playerid,0xffffffff,"Du hast /hallo, /servus oder /bonjour eingegeben");
    return 1;
    }
    [/pwn]
    Man schreibt wie gewohnt "ocmd". Dahinter ein "@" mit der Anzahl der Synonyme (max. 4). Danach ein ":" und die jeweiligen Befehle, getrennt durch ein Komma
    Drasko@easy-scripting.net since 31.12.2011
    [Blockierte Grafik: http://files.tzdev.de/banner.png]
  • Maydo schrieb:

    Seit OCMD 2.1.0 ist es nun möglich 1 Befehl mit max. 4 - Synonym Befehlen zu erstellen.
    Das funktioniert folgendermaßen:
    [pwn]
    ocmd@3:hallo,servus,bonjour(playerid,params[])
    {
    SendClientMessage(playerid,0xffffffff,"Du hast /hallo, /servus oder /bonjour eingegeben");
    return 1;
    }
    [/pwn]
    Man schreibt wie gewohnt "ocmd". Dahinter ein "@" mit der Anzahl der Synonyme (max. 4). Danach ein ":" und die jeweiligen Befehle, getrennt durch ein Komma

    Cool, danke für die Info!:)