[ MTA - TuT ] Command mit Parametern

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Guten Abend,


    .:: Da die Tutorialsektion von MTA-SA momentan anscheinend am rumbuggen ist, schreibe ich mein MTA-Tutorial einfach mal hier in die MTA-SA Scripting Base ::.


    Da der Titel bereits alles sagt fange ich mal direkt an ;) ...
    Heute zeige ich euch, wie man einfach einen Befehl mit Parametern erstellen kann...


    Da es sich um einen Command handelt brauchen wir (wer hätts gedacht?) einen CommandHandler.
    Die Syntax dazu lautet wie folgt:


    Code
    bool addCommandHandler ( string commandName, function handlerFunction, [bool restricted = false, bool caseSensitive = true] )


    Also brauchen wir als erstes den Namen des Befehls. Wir erstellen und nun einen /veh bzw /v Befehl. Dazu erstellen wir uns 2 commandHandler:


    Code
    addCommandHandler( "veh", ...)
    addCommandHandler( "v", ...)


    Das wäre schonmal ein Anfang. Würde man einen Normalen /veh daraus machen, kann man es auch einfach so schreiben:


    Code
    addCommandHandler( "veh", ... )


    Und nun kommen wir zu der function, die bei Command folgende Syntax beinhaltet:


    Code
    function( playerid, cmdtext, [ args, ... ] )


    Ich habe nun bewusst playerid und cmdtext geschrieben, damit die, die PAWN können, sich leichter ein Bild machen können,
    da wahrscheinlich ein großteil hier immernoch PAWN-Fische sind :) ..


    Unter args kommen die Argumente bzw Parameter des Befehls rein. Wir brauchen vehid..
    Also würde due function so aussehen:


    Code
    function( playerid, cmdtext, vehid)


    Und in unseren commandHandler bauen wir es als handlerFunction (siehe Syntax oben) so nun rein:

    Code
    addCommandHandler( { "veh", "v" },
    	function( playerid, cmdtext, vehid )
    
    	end
    )


    Als nächstes werden wir abfragen, ob der Parameter ausgefüllt wurde mit einer einfachen If-Abfrage.
    Dabei wird nil verwendet, was soviel wie leer heißen soll.


    Code
    if vehid == nil then
    
    
    end


    Für die, die es nicht wissen: Hier gibt es keine {} Klammern für die Funktionen: end ist hier sozusagen die Klammer:

    Code
    function func( ... )
    
    
    end


    Bedeutet sozusagen das hier:

    Code
    function func( ... )
    {
    
    
    }


    Also unser Command hat nun eine Abfrage, ob der Parameter ausgefüllt wurde. Nun müssen wir dazu eine Error-Message ausgeben:
    Dazu verwenden wir:

    Code
    bool outputChatBox ( string text [, element visibleTo=getRootElement(), int r=231, int g=217, int b=176, bool colorCoded=false ] )


    Also hier unsere Error-Message, die in Grau erscheint:

    Code
    outputChatBox( "Fehler: [Verwende]:: /veh <ModelID>",playerid,150,150,150,false)


    Die 150,150,150 sind der Rot-Grün-Blau-Anteil. 150,150,150 == Grau..
    Höchste Zahl ist 255..
    255,255,255 ist demnach Weiß.


    Jetzt noch einen else reinhauen, falls die Parameter angegeben wurden.
    Der ganze Code müsste dann so aussehen momentan:


    Code
    addCommandHandler( { "veh", "v" },
    	function( playerid, cmdtext, vehid )
    		if vehid == nil then
    			outputChatBox( "Fehler: [Verwende]:: /veh <ModelID>",playerid,150,150,150,false)
    		else
    
    
    		end
    	end
    )


    Wie ihr seht, steht kein end vor dem else, da das end wirklich erst ganz am Ende der "Abfragen-Reihe" steht.


    Nun müssen wir als erstes die Position des Spieler abfragen, der den Command verwendet. Den Player fragen wir über (siehe commandHandler Parameter)
    playerid ab.. Die Position fragt mal mit getElementPosition ab... Das Element hierbei ist einfach der Spieler.


    Code
    local x, y, z = getElementPosition(playerid)


    Das local ist übrigend das selbe, wie das new in PAWN, damit werden Variablen erstellt.
    Und nun kommt endlich der Teil, an dem das Auto erstellt wird. Hier ist mal die Syntax dazu:


    Code
    vehicle createVehicle ( int model, float x, float y, float z [, float rx, float ry, float rz, string numberplate, bool bDirection, int variant1, int variant2 ] )


    Wir erstellen uns nun unser Auto mit der Variable check_create.. Weiter unten werden ihr sehen, warum ich es so mache.. Ihr könnt jedoch auch einfach nur das
    Auto erstellen, das ist keine Pflicht, ist aber mMn besser.


    Code
    local check_create = createVehicle( vehid, x, y, z )


    x,y,z wurden ja bereits definiert oben unter getElementPosition..
    Nun seht ihr, wozu das check_create gedacht ist:


    Damit könnt ihr nun abfragen, ob das Auto erstellt wurde (alles hat funktioniert) oder ob es nicht erstellt wurde (fehler in den Parametern)...


    Code
    if not check_create  then
    	outputChatBox( "Es gab ein Problem beim Erstellen des Fahrzeugs. Bitte überprüfe deine Parameter.",playerid,150,150,150,false)
    else
    	outputChatBox( "Du hast dir erfolgreich ein Fahrzeug gespawnt.",playerid,20,200,20,false)
    end


    Nun ist der Befehl so gut wie fertig, und damit hat man nun einen /veh Befehl. Wenn ihr alles verstanden habt, merkt ihr sicher, dass
    es Theoretisch viel leichter ist und vor allem nicht so umständlich wie in PAWN mit den params, sscanf usw..
    Das wurde alles spontan geschrieben, bitte schreibt hier drunter, wenn ich irgendwo einen Fehler in der Erklärung bzw. im Code habe.


    Das wars dann mit meinem #1 MTA-Tutorial..
    Danke fürs lesen, und viel Glück beim Scripten :thumbup:


    mfg,
    Sh13

    Einmal editiert, zuletzt von Sh13 ()

  • Funktionieren wird das nicht, denn erwarten dürft ihr das:


    Der Fehler liegt darin, dass das Argument "commandName" als String angegeben werden muss, nicht als Table.
    D.h. man müsste zwei CommandHandler adden, was dann so aussieht:

    • addCommandHandler( "veh", commandFunction )
    • addCommandHandler( "v", commandFunction )


    Um es zu ermöglichen, Tables als Commandname zu akzeptieren, ist folgender Code von Nöten:

    Multi Theft Auto - San Andreas