Angepinnt MTA-Wiki - Verstehen & Nutzen

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

    • MTA-Wiki - Verstehen & Nutzen

      Nahezu 95% der Fragen hier im Forum hätten ganz einfach vom MTA-Wiki beantwortet werden können.
      Doch die Anfänger scheinen Probleme mit der MTA-Wiki zu haben, sodass sie nicht damit arbeiten können.

      Aus diesem Grund will ich hier versuchen zu erklären, wie man das MTA-Wiki beim Scripten nutzen kann.
      Wenn ihr was hinzuzufügen oder zu korrigieren habt, könnt ihr es gerne per Kommentar machen.
      Versucht bitte das Tutorial von oben nach unten durchzugehen, sodass ihr alles verstehen könnt.


      1. Wo suchen?


      Zuerst fangen wir am Hauptmenü an.
      wiki.multitheftauto.com/wiki/Main_Page

      Links findet ihr diese Themen:
      [Blockierte Grafik: https://i.imgur.com/0PW4R5K.png]
      In denen könnt ihr alle clientseitigen und serverseitigen MTA Funktionen & Events finden.
      Achtet darauf, dass es auch zig LUA Funktionen gibt - also werdet ihr hier nicht immer alles finden können (z.B. type).

      Außerdem gibt es die Suche, wo ihr im besten Falle etwas suchen und finden könnt.
      [Blockierte Grafik: https://i.imgur.com/TuJt1VH.png]
      Beachtet hierbei jedoch, dass die Suche oft die Themen nicht finden kann. Wenn ihr also sicher gehen wollt, sucht lieber darüber bei references (STRG+F).

      Wenn ihr nun auf z.B. "Client Functions" klickt, findet ihr hier alle clientseitigen Funktionen von MTA.



      2. Was heißt das alles hier?


      Funktionen und Events können clientseitig, serverseitig oder shared (beides) sein.
      Clientseitig heißt, dass der Client (also euer MTA auf eurem PC) das Script ausführen kann (nicht der Server).
      Serverseitig heißt, dass der Server das Script ausführt (nicht der Client).
      Shared heißt, dass sowohl Client, als auch Server das Script ausführen können.

      Da clientseitige Funktionen nur vom Client selbst ausgeführt werden, bemerken die anderen Spieler nichts von, wenn bei meinem Client ein Script genutzt wird (außer das Script kommuniziert mit dem Server).
      z.B. kann ich clientseitig createVehicle nutzen, jedoch wird das Auto niemand sehen. Ich kann setPedAnimation benutzen, aber nur ich selber werde die Animation sehen. Ich kann createObject nutzen, aber nur ich werde das Objekt sehen usw.

      Der Typ wird in der meta.xml angegeben.
      Es ist sehr wichtig zu unterscheiden, ob man eine Funktion/ein Event serverseitig oder clientseitig benutzt, also immer darauf achten!

      1. Funktionen:

      Tipp: getter und setter
      In der Informatik stößt man immer wieder auf "getter" und "setter".
      Die "getter" geben Informationen zurück und fangen mit "get" an, die "setter" setzen etwas und fangen mit "set" an.
      Wenn ihr also die Position von einem Spieler bekommen wollt und die Funktion nicht kennt, sucht einfach nach "Position" zusammen mit "get".
      Wenn ihr die Position setzen wollt, dann eher nach "set".


      Wenn ihr nun auf eine Funktions-Seite geht, findet ihr eine Seite voll mit Informationen.
      Am Anfang wird man nicht verstehen, was alles bedeuten soll - jedoch werde ich es euch hier erklären.

      Nehmen wir als Beispiel die Funktion setElementData.
      wiki.multitheftauto.com/wiki/SetElementData

      Hier achten wir zuerst rechts darauf, ob es clientseitig, serverseitig oder shared ist.
      Diese Info bekommen wir zum einen durch die Farbe des Rahmen und zum anderen durch die Wörter rechts oben in der Ecke:
      [Blockierte Grafik: https://i.imgur.com/FYfz2KJ.png]

      Direkt unter dem Funktions-Namen bekommen wir Infos darüber, was die Funktion ungefähr tut.
      Unter diesem Text findet ihr noch weitere Infos (Notes, Tipps).
      Außerdem gibt es manchmal auch rechts weitere Hinweise wie z.B. hier:
      [Blockierte Grafik: https://i.imgur.com/DajPjBP.png]
      Es ist sehr wichtig die Texte alle zu lesen, um Fehler zu vermeiden!

      Nun kommen wir zum Syntax:
      [Blockierte Grafik: https://i.imgur.com/XwouhSK.png]
      Hierbei hatte ich am Anfang die größten Probleme, denn ich habe nichts verstanden.
      Jedoch ist es ganz einfach, wenn man es einmal verstanden hat.

      ACHTUNG: Wenn ihr Wörter wie boolean, integer usw. nicht kennt, solltet ihr euch hier erkundigen:
      wiki.multitheftauto.com/wiki/DE/Lua_Tutorial#Einf.C3.BChrung

      [Blockierte Grafik: https://i.imgur.com/i8WhLfR.png]
      Hier erfahren wir, dass die Funktion setElementData heißt und ein bool(ean) zurück gibt.

      [Blockierte Grafik: https://i.imgur.com/6uk8Xmc.png]
      Hier sehen wir die Argumente, die wir der Funktion übergeben.
      Die grünen Wörter geben den Typen an, die schwarzen Wörter ungefähr das, was wir da eintragen sollen.
      Die Argumente in der eckigen Klammer sind optional/freiwillig.
      Wenn wir hier also synchronize nicht angeben, wird automatisch true genutzt.

      Hier auf dem Bild können wir also rauslesen:
      Die Funktion setElementData gibt einen boolean zurück.
      Wir müssen der Funktion das Element, einen key als Zeichenkette und einen Wert übergeben.
      Optional können wir einen boolean für synchronize übergeben - tun wir das nicht, wird automatisch true genutzt.

      Nun wissen wir jedoch nicht, was genau theElement, key, value oder synchronize sind - oder was gibt dieses boolean an, welches wir zurück bekommen?
      Dafür gehen wir etwas runter:
      [Blockierte Grafik: https://i.imgur.com/YeOXP54.png]

      Hier bekommen wir direkt unsere Infos:
      theElement ist das Element, welchem wir die Daten anbinden wollen.
      key ist der "Schlüssel", unter welchem wir die Daten verstauen wollen (max. 31 Zeichen).
      value ist der Wert, eben die Daten.
      synchronize ist optional und bestimmt, ob die Daten synchronisiert werden sollen mit server und clients.
      Der bool, welcher zurückgegeben wird, zeigt uns an, ob die Daten ordentlich angebunden werden konnten - true für ja, false für nein.

      Durch diese Informationen konnen wir schon die Funktion benutzen:

      LUA-Quellcode

      1. local player = getPlayerFromName ( "[TDS]Bonus" )
      2. setElementData ( player, "babalevel", 9999999999999999999 )
      3. -- player => thePlayer
      4. -- "babalevel" => key
      5. -- 9999... => value
      6. -- nil/nichts => synchronize, welches durch nil/nichts automatisch true ist

      Etwas unten finden wir nun auch Bugs, welche gemeldet wurden, Beispiele (orange = serverseitig, rot = clientseitig) und ähnliche Themen.

      Viele Funktionen, die shared sind, haben verschiedene Syntaxen clientseitig und serverseitig.
      Zum Beispiel kann man bei createBlip serverseitig angeben, von welchen Spielern der/das Blip gesehen werden können soll.
      Clientseitig kann man das jedoch nicht einstellen, denn der client ist der einzige, der den/das Blip sehen kann.
      Oder als anderes Beispiel kann ich serverseitig bei fadeCamera einen Spieler angeben, dessen "Kamera" ich "faden" will.
      Clientseitig geht das jedoch schlecht, denn ich kann von meinem PC aus nicht einfach deine Kamera "faden", daher kann man hier keinen Spieler angeben.

      Meistens gibt es bei shared-Funktionen bei den Syntaxen einen Unterschied - Angabe des Spielers, wie vorhin schon erwähnt.
      Der Server kann jeden Spieler beeinflussen. Wenn du einen Spieler beeinflussen willst, dann musst du den Spieler angeben, denn woher soll der Server wissen, wen du meinst?
      Wenn du jedoch clientseitig einen Spieler beeinflussen willst, dann kannst du nur dich selbst beeinflussen (z.B. setPlayerBlurLevel). Daher gibt man bei einigen Funktionen clientseitig kein Element an, denn das Element ist der Client selbst.
      Bei Funktionen wie z.B. setPedAnimation gibt es clientseitig trotzdem die Möglichkeit der Spieler-Angabe, denn man kann hier auch ein Ped angeben, muss also nicht unbedingt sich selbst angeben.


      2. Events

      Mit Events kann man ganz einfach von einem Client mit dem Server kommunizieren und umgekehrt.
      Man kann Informationen übergeben oder einfach nur Funktionen auf der anderen Seite ausführen lassen.
      Außerdem kann man sehr gut bestimmte Ereignisse abfangen und da eine Funktion ausführen lassen.

      Hier gibt es wieder verschiedene Kategorien:
      Clientseitige-Events, serverseitige-Events und custom-Events.
      Clientseitige-Events kann man nur clientseitig nutzen, serverseitige-Events nur serverseitig und custom-Events erstellt man selber.

      Events werden getriggert (sozusagen "gesendet"), wenn etwas bestimmtes passiertes.
      Wenn z.B. jemand stirbt, wird onPlayerWasted zum Server und onClientPlayerWasted zu den Clients getriggert.
      Diese Events kann man abfangen, indem man die Funktion addEventHandler nutzt.
      wiki.multitheftauto.com/wiki/AddEventHandler
      Sind also gut, um etwas passieren zu lassen, wenn etwas bestimmtes passiert ist.

      Wenn man ein Event mit addEventHandler abfängt, wird die dort angegebene Funktion aufgerufen.
      Diese Funktion kriegt dann zuallerst immer den source ("Quelle") des Events.
      source wird dann für die Funktion als Variable erstellt und kann genutzt werden, ist immer ein Element.
      Was das source ist, erfahrt ihr immer auf der Seite des Events.
      Bei z.B. onPlayerWasted wäre das der Spieler, der gestorben ist.
      [Blockierte Grafik: https://i.imgur.com/Lph1oh7.png]
      wiki.multitheftauto.com/wiki/OnPlayerWasted

      Außerdem kann ein Event einige Parameter an die Funktion, die wir in addEventHandler nutzen, übergeben.
      Zum Beispiel gibt das Event onPlayerWasted 5 Parameter an die Funktion:
      totalAmmo, killer, killerWeapon, bodypart, stealth
      [Blockierte Grafik: https://i.imgur.com/xy6yLDR.png]
      Diese bekommt ihr in der Funktion, wenn ihr nach function bei den Klammern die Variablen-Namen angibt.
      z.B. so:

      LUA-Quellcode

      1. addEventHandler ( "onPlayerWasted", root, function ( ammo, derkiller17, waffe, koerperteil, wardasstealthamk ) ... end

      Nun könnt ihr dann die Variablen so nutzen, denn hier ist dann ammo eben totalAmmo usw.
      Achtet jedoch darauf, dass die Namen keinen Unterschied machen (außer eben Optik - vorausgesetzt es werden nur erlaubte Zeichen genutzt).
      Wenn ihr nur bodyPart haben wollt, aber den Rest nicht, könnt ihr nicht einfach nur bodyPart reinschreiben.
      Die erste Variable in der Klamme ist bei onPlayerWasted IMMER totalAmmo, also könnt ihr dafür sowas tun:

      LUA-Quellcode

      1. addEventHandler ( "onPlayerWasted", root, function ( _, _, _, koerperteil ) ... end

      Somit nehmen wir nur diesen Parameter, welcher uns auch interessiert. Der Rest wird verworfen, stealth nehmen wir gar nicht erst an.

      Nun können wir schon unseren ersten Code schreiben:

      LUA-Quellcode

      1. addEventHandler ( "onPlayerWasted", getPlayerFromName("dennismitzwein"), function ( _, killer )
      2. if getPlayerName ( killer ) == "Bonus" then
      3. outputChatBox ( "Bonus, dein Vater, hat dich zerstört!", source )
      4. end
      5. end

      Bei diesem Code kriegt dennismitzwein (falls er während der Funktions-Erstellung online war) die Nachricht "Bonus, dein Vater, hat dich zerstört!", wenn eben Bonus ihn tötet.
      Wir hängen durch getPlayerFromName... direkt nach onPlayerWasted das Event NUR an dennismitzwein. source ist der Spieler, der gestorben ist, also dennismitzwein, da das Event nur an ihn angehangen wurde.

      ACHTUNG: Wenn ihr ein Event an ein Element anhängt, dann muss das Element zu diesem Zeitpunkt auch existent sein.
      Wenn dennismitzwein offline wäre, während das Script gestartet ist, wäre das Event nicht an ihn angehangen wurde - da käme nur ein Warning heraus.


      Custom-Events sind nun etwas anders als vordefinierte Events, denn hierbei erstellen wir selber das Event, geben an ob es clientseitig oder serverseitig sein soll und welche Parameter es an die Funktion übergeben soll.

      Wir wollen zum Beispiel clientseitig ein Button machen.
      Wenn wir das Button drücken, soll an dennismitzwein eine Nachricht kommen mit "Du Lappen" - doch wie machen wir das?
      outputChatBox kann man clientseitig nur nutzen, um sich selbst eine Nachricht zu senden, also müssen wir mit dem Server arbeiten.

      Hier kommen custom-Events zur Rettung:
      Wir erstellen ein custom-Event und können so mit dem Server kommunizieren.

      Dazu nutzen wir zuerst addEvent.
      wiki.multitheftauto.com/wiki/AddEvent
      Mit dieser Funktion können wir das Event sozusagen erstellen.
      Wir nutzen addEvent serverseitig, um das Event zu erstellen.
      Als nächstes nutzen wir addEventHandler, um serverseitig das Event abzufangen.
      Danach nutzen wir clientseitig triggerServerEvent, um das Event dem Server zu senden.

      Dann sieht das Ganze ungefähr so aus:

      LUA-Quellcode

      1. -- clientseitig --
      2. triggerServerEvent ( "sendDennisLappenMessage", localPlayer, "Du Lappen" ) -- "send..." ist das Event, localPlayer die Quelle/source, "Du Lappen" eines der Parameter
      3. -- serverseitig --
      4. addEvent ( "sendDennisLappenMessage", true ) -- erstellen das Event und mit true lassen wir zu, dass es von clients gesendet werden kann
      5. addEventHandler ( "sendDennisLappenMessage", root, function ( msg ) -- fange das Event ab - durch root kann es von allen clients kommen. Die Funktion bekommt msg als Parameter.
      6. outputChatBox ( getPlayerFromName(client)..": "..msg, getPlayerFromName ( "dennismitzwein" ) ) -- hier senden wir die Nachricht an dennismitzwein - da "Du Lappen" genutzt wurde, wird ihm "Bonus: Du Lappen" gesendet.
      7. end )

      Wenn ihr den code gelesen habt, werdet ihr vielleicht das "client" erkennen im outputChatBox.
      Woher kommt es?
      Ganz einfach:
      Wenn wir per triggerServerEvent ein Event senden, kriegt die Funktion serverseitig außerdem weitere Variablen, nachzulesen hier:
      wiki.multitheftauto.com/wiki/Predefined_variables_list
      client ist der Client, welcher das Event gesendet hat.
      source ist das Element, welches bei triggerServerEvent als 2. Argument angegeben wurde. Da wir localPlayer angegeben haben, ist der client gleichzeitig auch der source.

      Um euren Code sicherer zu machen, solltet ihr bei triggerServerEvent immer mit client statt source arbeiten.
      Bei client wisst ihr zu 100% sicher, wer das Event gesendet hat.
      Bei source wisst ihr es nicht sicher, denn statt localPlayer hätte da auch ein anderes Element stehen können.


      3. Useful Functions

      Useful Functions sind Funktionen, die nicht in MTA sind, sondern von Leuten selbst erstellt wurden - eine Art Codeschnipsel eben.
      Um eine useful function nutzen zu können, müsst ihr daher die Funktion zuallererst in euer Script reintun - erst dann könnt ihr die Funktion nutzen.
      Diese Funktionen sind nicht notwendig, aber sehr hilfreich - anschauen lohnt sich!


      4. Weitere Infos

      Das MTA Wiki besteht nicht nur aus Infos zu Funktionen und Events, sondern hat viel mehr Infos.
      Ich würde euch raten überall mal rumzugehen und es euch durchzulesen, das wird euch als Anfänger eine Menge helfen.
      Da dieses Tutorial schon lange genug ist, werde ich die einzelnen Punkte nicht durchgehen.



      3. Ist das MTA Wiki wirklich wichtig?


      Absolut!
      Ich selber habe so vieles durch das MTA Wiki gelernt und scripte nur selten ohne das Wiki.
      Kein Mensch erwartet von den Scriptern, dass sie alles auswendig wissen müssen.
      Wenn ihr also eine Funktion nicht zu 100% auswendig könnt, dann ist es immer sehr empfehlenswert ins MTA Wiki zu gucken.
      Manchmal gibt es auch Änderungen bei Funktionen/Events, solltet also auch ab und zu reingucken, auch wenn ihr die Funktionen/Events schon kennt

      Wenn ihr die Grundlagen nicht kennt, empfehle ich euch diese Seite:
      wiki.multitheftauto.com/wiki/DE/Lua_Tutorial

      Wenn ihr Probleme mit meta.xml habt:
      wiki.multitheftauto.com/wiki/Meta.xml

      usw. - es gibt so viele Seiten, einfach nur reingucken.

      Was ich auch sehr empfehlen kann:
      Geht einfach mal alle Funktionen und Events durch.
      Liest euch die Infos durch, guckt was die Funktionen und Events tun können.
      So wisst ihr dann, was ungefähr in MTA möglich ist.
      Wenn ihr dann irgendwann eine Funktion sucht, könnt ihr euch vllt. daran erinnern alle durchgegangen zu sein und könnt die Funktion schnell finden.



      4. Wie suche ich am besten nach Funktionen/Events?


      Da empfehle ich euch auf die Seite alle Funktionen / Events zu gehen und dort zu suchen.
      Wenn ihr z.B. etwas in Bezug aus Spielern sucht, dann sucht bei Player-Functions und Ped-Functions.
      Wenn ihr z.B. wissen wollt, wie man ein Auto abschließt, dann sucht nach dem englischen Wort "lock", "set" (setter, oben erklärt) und/oder "vehicle" dafür -> setVehicleLocked.

      Es ist recht einfach etwas zu finden, man muss nur wissen, wie man es macht.
      Hat man es paar Mal gemacht, hat man auch irgendwann den Bogen raus und später keine Probleme mehr dabei.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Gelöschter Benutzer ()

    • Sehr gutes Tutorial, ich hoffe Anfänger machen sich die Mühe und lesen es wenigstens aufmerksam durch. Könnte wirklich sehr viele Fragen im Vorhinein beantworten.

      Ein kleiner Fehler hat sich eingeschlichen:

      [TDS]Bonus schrieb:

      Clientseitige-Events kann man nur serverseitig nutzen, clientseitige-Events nur clientseitig und custom-events erstellt man selber.