Callbacks ( Rückruffunktionen)

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
  • Ersteinmal, dieses Tutorial ist eher optional,
    es erleichtert euch die Arbeit und ist für alle gedacht,
    die die Grundlagen verstanden haben und anwenden koennen.


    1. Was ist ein Callback?
    Callbacks sind Funktionen, welche aufgerufen werden, wenn ein bestimmtes Ereignis eintritt.
    Diese liefern dann bestimmte Werte usw. zurück, z.b.:
    einen Integer ( Ganze Zahl, z.b. 1 oder -5 ),
    einen String ( Zeichenkette, z.b. "Hallo" )
    oder auch einen boolschen Ausdruck ( true oder false ).



    2. Callbacks in MTA
    MTA verfügt bereits über verschiedenste Arten von Callbacks, z.b.
    liefert die Funktion

    Code
    getElementPosition()


    x, y und z-Koordinate eines Objektes zurück.
    Dieses Abfrage kann dann z.b. zum belegen von Variabeln
    benutzt werden, damit das Script flexibel bleibt und man nicht jedes mal
    neue Zahlen eintragen muss
    Beispiel:

    Code
    local x, y, z = getElementPosition ( player )
    createVehicle ( 500, x, y, z )


    Die Variabeln x, y und z werden mit den Koordinaten des Elements "player" ( z.b. ein Spieler ) belegt
    und anschliessend verwendet, um ein Fahrzeug an der Position zu erstellen.


    3. Callbacks selber schreiben
    Nehmen wir nun an, dass man abfragen moechte, ob ein bestimmtes
    Fahrzeug ein "Mesa" ( kleinerer Jeep ) ist.
    Dazu muessen wir nun zunächst das Callback schreiben:

    Code
    function isVehicleAMesa ( theVehicle )
       if getElementModel ( theVehicle ) == 500 then
          return true
       else
          return false
       end
    end


    Wird nun die Funktion gerufen,
    belegt die Funktion die Variabel aus dem "Kopf" mit dem ersten Argument, das weiter gegeben wurde:

    Code
    isVehicleAMesa ( getPedOccupiedVehicle ( player ) )


    Das Callback isVehicleAMesa wird gerufen und die Variabel theVehicle des Callbacks
    mit dem Fahrzeug des Spielers gefuellt.


    Code
    isVehicleAMesa ( getPedOccupiedVehicle ( player ), false )


    Wieder wird das Callback gerufen und die Variabel theVehicle mit dem Fahrzeug des Spielers
    gefuellt, jedoch wird ebenfalls false als 2. Argument weitergegeben - da jedoch im "Kopf" des Callbacks
    nur eine Variabel belegt werden soll, ist der Effekt der selbe, wie im oberen Beispiel.
    Wollte man false ebenfalls weitergeben, so muesste man im Kopf des Callbacks
    eine weitere Variabel angeben, die mit dem Wert gefuellt werden soll:

    Code
    function isVehicleAMesa ( theVehicle, xyz )


    Im Script wuerde man dann z.b. folgendes verwenden:

    Code
    function checkIfItsAMesa ( vehicle )   -- Die Funktion, die gerufen wird, falls ein Spieler ein Fahrzeug betritt.
       if isVehicleAMesa ( vehicle ) then   -- Unser Callback wird gerufen - falls das Fahrzeug ein Mesa ist, trifft der erste Fall zu, da das Callback isVehicleAMesa den Wert true zurückliefert
      outputChatBox ( "Das Fahrzeug ist ein Mesa.", source )
       else -- Wenn das Fahrzeug kein Mesa ist, tritt der else-fall in Kraft
      outputChatBox ( "Das Fahrzeug ist kein Mesa.", source )
       end
    end
    addEventHandler ( "onPlayerVehicleEnter", getRootElement(), checkIfItsAMesa )


    Wird noch ergänzt, falls ich mich irgendwo vertippt habe, bitte sagen

  • Weitere Beispiele:


    1.


    Liefert einen String mit Zeit/Datum zurück,
    z.b. folgendes:
    "14.2.2010, 19:14"


    Benutzung:

    Code
    outputChatBox ( "Zeit: "..timestamp() )


    Zeigt Zeit und Datum für den ganzen Server an



    2.


    Liefert bei Benutzung die jeweiligen Namen der Spieler auf den Sitzen.


    Anwendung:

    Code
    local d, p1, p2, p3 = getVehicleOccupantNames ( veh )
    outputChatBox ( "Fahrer:"..d..",Beifahrer"..p1..",Passagier 1:"..p2..",Passagier 2:"..p3 )


    gibt die Namen Spieler aus.


    Sry wegen dem Einrücken, irgendwie spackt das bei mir...

  • Für Anfänger ist das Tutorial Recht gut aber den Vorwurf das die MTA Community keinen Support bietet kann man nicht so stehen lassen,
    in deren Wikipedia steht mehr als du dir je erträumen kannst, alle Funktionen zudem auch diverse Erklärungen auf Deutsch aber auch wenn das
    meiste auf Englisch ist kann ich dazu nur sagen das Englisch halt eine Weltsprache ist die man ja in der Schule lernt, normal sollte man mit gutem Englisch Basiswissen
    an den Tutorials nicht scheitern

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Naja, Sachlich gesehen, ist das Ding ja total falsch.


    "Ein Callback ist eine Funktion, die einen Wert zurückliefert - ", nö.
    Callbacks sind Funktionen, welche aufgerufen werden, wenn ein bestimmtes Ereignis eintritt.

  • Naja, Sachlich gesehen, ist das Ding ja total falsch.


    "Ein Callback ist eine Funktion, die einen Wert zurückliefert - ", nö.
    Callbacks sind Funktionen, welche aufgerufen werden, wenn ein bestimmtes Ereignis eintritt.

    habs verbessert, danke für den Hinweis - habe mich da etwas vertan...

  • Für Anfänger ist das Tutorial Recht gut aber den Vorwurf das die MTA Community keinen Support bietet kann man nicht so stehen lassen,
    in deren Wikipedia steht mehr als du dir je erträumen kannst, alle Funktionen zudem auch diverse Erklärungen auf Deutsch aber auch wenn das
    meiste auf Englisch ist kann ich dazu nur sagen das Englisch halt eine Weltsprache ist die man ja in der Schule lernt, normal sollte man mit gutem Englisch Basiswissen
    an den Tutorials nicht scheitern


    Er meint vermutlich den Support über die Spieler weil in Mta nicht viel los ist.
    Stimme aber Blackfox zu die machen einen guten Job dort, haben uns bei -XIII- bei einem Problem direkt ein Clientseitiges Html/Stylsheet-Auslesungs Patch für das Adminsystem
    gebaut. Wer von Sa-mp würde das tun ? Niemand.


    @Zipper gutes Tutorial aber du kannste deine Abfrage kürzer gestalten und musst ne Abfrage einfügen, wie viele Plätze das Fahrzeuge überhaupt hat.
    Falls es nur ein Roller ist, der nur 2 Slots hat, stellst du unnötige Anfragen auf die Slots 3 und 4


    function getVehicleOccupantNames ( veh )
    local driver = getVehicleOccupant ( veh, 0 )
    if not driver then
    driver = "Keiner"
    else
    driver = getPlayerName( passanger1 )
    end
    local passanger1 = getVehicleOccupant ( veh, 1 )
    if not passanger1 then
    passanger1 = "Keiner"
    else
    passanger1 = getPlayerName( passanger1 )
    end
    local passanger2 = getVehicleOccupant ( veh, 2 )
    if not passanger2 then
    passanger2 = "Keiner"
    else
    passanger2 = getPlayerName( passanger2 )
    end
    local passanger3 = getVehicleOccupant ( veh, 3 )
    if not passanger3 then
    passanger3 = "Keiner"
    else
    passanger3 = getPlayerName( passanger2 )
    end
    return driver, passanger1, passanger2, passanger3
    end


    Falls die variable platz_2, platz_3 und platz_4 nicht benötigt werden gibt dir return ein false wieder.


    function getVehicleOccupantNames ( veh )
    for i=1, getVehicleMaxPassengers ( veh ), 1 do
    local platz_"..i = getVehicleOccupant ( veh, i )
    if not platz_"..i then
    platz_"..i = "Keiner"
    else
    platz_"..i = getPlayerName( platz_"..i)
    end
    end
    return platz_1, platz_2, platz_3, platz_4
    end

    [align=center]
    Mta Script Editor - Work in Progress