Anfänger 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
  • Hallo,
    ich erkläre euch auch hiermal in meinen eigenen Worten die Basics von PAWN.


    1. Kommentare und ausklammern

    Spoiler anzeigen
    // Dies ist ein Kommentar
    Kommentare kann man einfach mit zwei // und einem Text dahinter erstellen. Diese Kommentare umfassen nur den Text in einer Zeile, also alles was dahinter steht.

    Spoiler anzeigen
    Möchte man jedoch ein Kommentar über mehrere Zeilen hinweg erstellen oder bestimmte Scriptingbereiche ausgrenzen, so geht das wie folgt:
    /* Dies ist
    ein Kommentar,
    das mehrere Zeilen umfasst */
    Alles was zwischen einem /* und einem */ steht wird als Kommentar gewertet und vom Script nicht berücksichtigt. Ausklammern ist nützlich, wenn man beispielsweise einen Teil im Script derzeit noch nicht braucht oder er zu verbuggt ist.


    2. Callbacks

    Spoiler anzeigen
    Im Script gibt es verschiedene Bereiche, Callbacks genannt. Mit diesen Callbacks gibt man an, was passieren soll, wenn beispielsweise ein Spieler in ein Fahrzeug einsteigt.
    Dies ist ein simpler Callback:

    public OnPlayerConnect(playerid)
    {
    return 1;
    }
    public gibt an, dass dies ein Callback ist, und das OnPlayerConnect ist einfach der Name des Callbacks. Was das playerid dahinter bedeutet erkläre ich erstmal nicht.
    Dieser Callback gibt an, was passieren soll wenn ein Spieler den Server betritt.
    Wenn dann etwas passieren soll, so gibt man dies zwischen dem { und dem
    return 1 an.


    3. Definitionen und Includes

    Spoiler anzeigen
    Wenn du ein neues Script startest, siehst du in den ersten Zeilen immer etwas wie dies:
    //#define FILTERSCRIPT
    #include <a_samp>
    Jetzt zur Erklärung, ein #define definiert etwas, wie der Name schon sagt. In diesem Falle definiert es unser Script so, dass der Server es als sog. Filterscript ansieht. Da dies allerdings durch das // als Kommentar genutzt wird, kann man es löschen ohne das Script zu ändern. Möchte man also einen Gamemode erstellen ist es ratsam diese Zeile zu löschen, da sie ja eigentlich nichts bringt.
    Man kann ein #define auch für andere Dinge anwenden, wie zum Beispiel für Farben.
    #define COLOR_BLUE 0x0099FFAA
    Dies definiert die Farbe Blau (Mit dem Namen COLOR_BLUE) und der HEX-Farbe wie angegeben. Eine Liste mit Farben kann man per Google und evtl. hier im Forum finden.

    Spoiler anzeigen
    Nun zum #include, dies fügt ein Include zum Script hinzu. Beispielsweise wenn man sich ein Register/Login System erstellen möchte nutzt man dafür oft das sog. dini (oder dutils) welche auch Includes sind.


    4. Der Start

    Spoiler anzeigen
    Wenn wir nun mit dem Scripten anfangen wollen, so müssen wir uns erstmal mit ein paar simplen Dingen beschäftigen. Das nervt zwar, allerdings ist es immer notwendig um später das Komplexe in Anspruch zu nehmen. Man kommt in einer Scriptsprache nicht sehr weit, wenn man die Anfänge nicht kann, aber gleich mit schweren Dingen anfangen möchte.
    Wir starten mit simplen Variablen (Platzhaltern) die wir in der Konsole des Servers wiedergeben.
    Dazu öffnen wir uns ein Script und löschen alles zwischen main() { und dem nächsten }.
    Nun geben wir diesen Text ein:
    new variable = 15;
    printf("%d",variable);
    Jetzt zur Erklärung, das new sagt dem Script, dass wir nun eine neue Variable erstellen. Dass diese zufällig variable heißt ist irrelevant. wir könnten statt variable auch var1 oder sonstiges schreiben. Danach kommt ein = 15; was den Wert der Variable, hier also 15, definiert. Das ; ist nötig um dem Script zu sagen dass wir in dieser Zeile nichts mehr definieren oder ausführen.
    printf gibt eine Nachricht in die Konsole (Das schwarze Fenster in dem der Server läuft) an. Das, was nach den Klammern in Anführungszeichen steht, ist der Text (oder die Zahl) die wiedergegeben wird. Ein %d gibt an, dass man eine Zahl zurückgibt. Doch das %d alleine reicht ja nicht, das Script möchte ja wissen welche Zahl zurückgegeben werden soll. Also geben wir noch ein ,variable ein um dem Script zu sagen dass eben diese Variable zurückgegeben werden soll. Danach schließen wir die Klammern und setzen noch ein ; hintendran um diese Zeile zu beenden.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    Einmal editiert, zuletzt von Padarom ()

  • Sorry für Doublepost, aber der eine Beitrag hätte über 10.000 Zeichen


    5. Ein paar Schritte weiter

    Spoiler anzeigen
    Jetzt wo wir wissen wie wir simple Variablen in der Konsole zurückgeben können, so können wir natürlich auch einen Schritt weiter gehen. Diesmal definieren wir gleich mehrere Variablen und geben sie in einem Schritt zurück. Außerdem nutzen wir dazu das sog. format, welches eine Nachricht formatiert.
    new test[256];
    new test1 = 5, test2 = 10, test3 = 15;
    format(test, sizeof(test), "Als erstes kommt %d, dann %d und dann %d!",test1,test2,test3);
    print(test);
    Dies sieht zwar schon etwas komplizierter aus, aber mit ein bisschen logischem Denken ist dies auch schnell begriffen.
    Als erstes definieren wir die Variable test mit einem Wert von 256. Da wir die Variable test als Nachricht nutzen wollen, so geben wir ihm eine maximale Länge von 256 Zeichen.
    Danach definieren wir noch die Variablen test1 - test3 mit ihren Werten. Dies ist in nur einer Zeile möglich.
    Nun zu dem neuen, dem format. In den Klammern schreiben wir erst welche Variable dieses Format annehmen soll, in unserem Falle ist das test. Danach muss das format wissen, wie groß die Nachricht maximal sein soll, also ein sizeof (Größe von) test. Wir könnten alternativ dazu den Wert auch selber eingeben, also statt sizeof(test) einfach 256. Nachdem dies definiert ist geben wir unsere Nachricht ein. Das %d kennen wir ja inzwischen, es gibt die Variable als Zahl wieder. Nach der Nachricht müssen wir diesmal aber nicht nur eine Variable mit ihrem Namen angeben, sondern in diesem Falle gleich 3, da wir ja drei verschiedene Werte haben möchten und dafür auch drei Variablen definiert haben. Nun haben wir die Nachricht, jetzt müssen wir sie noch wiedergeben.
    Dies geschieht nun auch mit print (nicht mit printf!) und in Klammern der Name der Variable die das Format enthält.
    Die Zeile wieder mit einem ; abschließen und auch dies ist geklärt.


    6. Joinmessage

    Spoiler anzeigen
    Ich gehe hier gleich viele Schritte weiter, doch viele interessiert eben am Anfang genau dieses Thema, weil es genauso leicht zu bewerkstelligen ist. Dazu suchen wir uns erst einmal den Callback OnPlayerConnect und geben in ihn ein:
    new pName[MAX_PLAYER_NAME];
    new join[256];
    GetPlayerName(playerid, pName, sizeof(join));
    format(join, sizeof(join), "%s ist dem Server beigetreten!", pName);
    SendClientMessageToAll(0xAAAAAAAAA,join);
    new pName erstellt die Variable mit dem Namen pName, das [MAX_PLAYER_NAME] ist auch ein Wert, nämlich der längste mögliche Name den man nutzen kann. Danach erstellen wir noch die Variable join, welche später wieder das Format enthalten wird. Auch hier ist der Wert 256. Hier muss das Script erst einmal den Spielernamen rausfinden. Dafür steht das GetPlayerName - Als erstes gibt man die Playerid und es speichert den Spielernamen in die Variable pName. Danach gibt man noch an mit wievielen Zeichen, also welcher Länge der Name gespeichert werden soll. Statt sizeof(join) können wir natürlich auch sizeof(pName) oder einfach eine Zahl eingeben.
    Danach wieder unser format, welches in der Variable join abgespeichert wird und die maximale Länge des Wertes von join besitzt. Der Text enthält diesmal kein %d, sondern ein %s, welches Text wiedergibt. Der Rest ist der Gleiche, da wir dem Script nur sagen was als Text wiedergegeben wird. Hier ist dies natürlich pName.
    Doch nun wollen wir den Spielernamen nicht in der Konsole, sondern allen anderen Spielern anzeigen.
    Dazu geben wir die Funktion SendClientMessageToAll ein. Als erstes geben wir eine Farbe an, in diesem Falle ist das Grau, wir können aber auch eine vorher definierte Farbe (s. Schritt 3) wie zum Beispiel COLOR_BLUE nutzen. Danach geben wir noch die Variable an, in der das Format gespeichert wurde.


    7. Leavemessages

    Spoiler anzeigen
    Da ich natürlich zu viel Text für euch vermeiden möchte, so überspringe ich hier die ersten paar Schritte, da ich diese ja schon in Schritt 6 erklärt habe. Wir suchen uns zuerst den Callback OnPlayerDisconnect und geben ein:
    new pName[MAX_PLAYER_NAME], text[256];
    GetPlayerName(playerid, pName, sizeof(text));
    switch (reason)
    {
    case 0: format(string,sizeof(text),"%s hatte einen Timeout.",pName);
    case 1: format(string,sizeof(text),"%s hat den Server verlassen.",pName);
    case 2: format(string,sizeof(text),"%s wurde gekickt/gebannt.",pName);
    }
    SendClientMessageToAll(0xAAAAAAAAA,text);

    Okay. Ich fange hier an mit dem switch (reason). Dies ist notwendig, da ein Spieler ja aus drei unterschiedlichen Gründen der Server verlassen kann. Timeout, freiwilliges Verlassen und Bann/Kick. Im Fall 0 (case 0) erstellen wir das format in der Variable text, mit der Größe von text und geben an, dass der Spieler den Server durch einen Timeout verlassen hat. Warum case 0 = Timeout weiß ich selber nicht, allerdings ist es einfach so. Im Fall 1 (case1) erstellen wir auch ein Format in text, mit der Größe von text und geben hier an, dass er den Server verlassen hat. Im letzten Fall, case2 wurde der Spieler gekickt oder gebannt. Nachdem wir für jeden dieser Gründe eine eigene Nachricht erstellt haben, so senden wir wieder eine Nachricht an alle (SendClientMessageToAll) und geben die Farbe an. Natürlich noch welche Variable zurückgegeben wird und beenden die Zeile wieder mit einem ;.


    Das war es zu meinem Anfänger-Tutorial. Es ist mein erstes, aber ich hoffe es erklärt euch alles gut und bringt euch mit dieser Scriptsprache in Kontakt.
    Für weitere Informationen könnt ihr die Forensuche benutzen, die SA:MP Wiki und die Google Suche. Für Kritik bin ich natürlich offen.


    Credits:
    Geschrieben von mir, Padarom. Ihr könnt das Tutorial, falls es euch so gefallen würde, beispielsweise auf eine Homepage einfügen, sofern ihr meinen Namen nennt ;)


    Mit freundlichen Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    2 Mal editiert, zuletzt von Padarom ()

  • Für Anfänger ganz gut , jedoch heißt public nicht Automatisch das es ein Callback ist sondern
    eine Öffentliche Klasse auf die man von überall zugreifen kann sobald sie existieren wie CallLocalFunction oder SetTimer .
    Nicht das es Falsch verstanden wird, es gilt noch hinzuzufügen das ,,return´´ einen Wert zurückgibt und die Funktion Automatisch beendet
    Öffentliche Klassen können keine Arraywerte zurückgeben.


    Ansonsten für den Anfänger sehr hilfreich , ich denke so gelingt ein guter Start in Sa-mp ^^

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Danke für eure Feedbacks ;) Ich kann ja bei gelegenheit noch etwas verbessern.

    Sry für die dumme Frage aber wie mache ich wie bei deinem TUT ganz oben mit dem + also:
    "Hier klicken für weitere Informationen"?

    Wenn du einen Beitrag erstellst entweder auf das klicken oder

    Code
    [expander] ...  [/expander]


    eingeben.


    Mit freundlichen Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger