Jump to content

Scripting Guide (C) by tr0n


tr0n

Recommended Posts


  • Group:  Members
  • Topic Count:  28
  • Topics Per Day:  0.01
  • Content Count:  562
  • Reputation:   152
  • Joined:  02/21/12
  • Last Seen:  

Kapitel 1: Alles hat einen Anfang
       1.0 - Einführung in die Welt der Scripter (Vorwort)
       1.1 - NPCs (Non-Playable-Character)
       1.2 - Script Commands
       1.3 - Befehle Teil 1 - Abläufe
       1.4 - Variablen
       1.5 - Operatoren
       1.6 - If-Abfragen
       1.7 - Labels
       1.8 - Kommentare
       1.9 - Befehle Teil 2 - Menüs und Eingaben

    
Kapitel 2: Der Weg des Kriegers
       2.0 - Noch ein weiter Weg

       2.1 - Arrays
       2.2 - Befehle Teil 3 - Die erste Quest
       2.3 - Befehle Teil 4 - Effiziente und bessere Menüs
       2.4 - SQL
       2.5 - Verschiedene Arten von NPCs
       2.6 - Schleifen
       2.7 - Monster
       2.8 - Events


Kapitel 3: Die geheime Kunst der Mönche
       3.0 - Willkommen im Orden

       3.1 - RID
       3.2 - Funktionen
       3.3 - Dynamische Menüs
       3.4 - Dynamische Shops
       3.5 - Dynamische Arrays
       3.x - Coming soon...

 

 

Kapitel 1: Alles hat einen Anfang

 

1.0 - Einführung in die Welt der Scripter (Vorwort)
Viele neue Scripts entstehen in der Ragnarok Community. Die internationale Community tut ihr bestes daran
stetig neue Dinge zu entwickeln und das Leben in Ragnarok so wie wir es kennen zu erweitern und den Spaß zu vergrößern.
Es gibt viele verschiedene Arten von Scripts. Mal sind es kleine Dinge, wie ein Kafra Shop oder auch was größeres, wie ein
Quest System. Die Möglichkeiten sind unendlich. Ich vertrete die Meinung das Scripts das Herzstück jedes Servers sind. Sie
sind die letzte Schnittstelle zu den Spielern und die Spieler sind es die damit kommunizieren. Umso wichtiger ist es das
sie auch funktionieren und den Spielern neue Möglichkeiten bieten Ragnarok neu zu erleben. Ich möchte euch in diese wunderbare
Welt des Scriptens einführen und euch zeigen das in jedem von euch ein Scripter stecken kann und das auch ihr euren Teil
zu dieser tollen Community beitragen könnt.

Wie wird das Guide ablaufen ? - Ich werde euch Schritt für Schritt durch die Thematik führen und euch so gut es geht alles
erklären was ihr wissen müsst. Mit Beispielen vereinfache ich das ganze und erläutere anschließend alles. Gegebenfalls werde
ich euch danach kleine Aufgaben stellen die ihr versucht zu lösen. Hier wirkt das Trial and Error Prinzip. Versuchen und Scheitern.
Das ganze wiederholt ihr bis es funktioniert. Der Prozess des Lernens erfordert Fehler zu machen und aus diesen Fehlern lernen wir
und dann machen wir es besser. Es wichtig das ihr viel übt und wiederholt um euch Dinge einzuprägen.


1.1 - NPCs (Non-Playable-Character)
NPC, auch genannt Non-Playable-Character sind die Personen die in der Map verteilt stehen und die man als Spieler ansprechen kann.
Jeder NPC hat ein Grundgerüst, welches ich euch hier zeige.

Beispiel:

prontera,156,212,7<tab>script<tab>Charlie<tab>811,{ }

Erläuterung:
Das ist unser Beispiel namens Charlie, so sieht das Grundgerüst für jeden NPC aus.
Es definiert alle wichtigen Daten über den NPC. Auf welcher Map es sich befindet, wo es genau steht,
wie es heißt und wie es aussieht. Gehen wir mal genauer drauf ein.

prontera = Die Map auf der sich der NPC befindet
156 = Die X Koordinate auf der Map
212 = Die Y Koordinate auf der Map
7 = Ausrichtung des NPCs (Die Richtung in die der NPC schaut)
script = Typ des NPCs (Es gibt verschiedene Typen von NPCs auf die ich noch eingehen werde)
Charlie = Name des NPCs (Was der Spieler im Spiel sieht unter dem NPC)
811 = Aussehen des NPCs (Es werden IDs für das Aussehen verwendet)
<tab> = Das sollte wohl klar sein. Es ist wichtig das ihr <tab> drückt und keine Leerzeichen verwendet, ansonsten funktioniert der Script nicht
{ } = Hier beginnt der Spaß, denn hier kommen später unsere Befehle und alles andere rein

 

Map,X,Y:
Wenn ihr wissen wollt wohin ihr euren NPC hinstellen sollt dann geht im Spiel auf die gewünschte Stelle und tippt folgendes ein: "/where".
Hiermit erfahrt ihr auf welcher Map und X und Y Koordinate ihr euch befindet. Somit habt ihr schon so gut wie alles was ihr braucht.

Ausrichtung des NPCs:
[1][8][7]
[2][  ][6]
[3][4][5]

An diesem Raster könnt ihr sehen welche Zahl für welche Blickrichtung steht.
Mehr gibt es eigentlich dazu nicht zu sagen.

Typ des NPCs:
Es gibt wie schon gesagt verschiedene Arten von NPC Typen. Ich zeige euch die wichtigsten.

 

script = Standard NPC Typ (Wird am häufigsten verwendet)
shop = Shop NPC (wie der Name schon sagt handelt es sich hierbei um ein Shop)
monster = Monster Spawn (Dieser Typ legt ein Spawn für Monster fest)
warp = Warp Point (Ein Warp Punkt der euch zur gewünschten Map, X und Y Koordinate bringt)

Name des NPCs:
Den denkt ihr euch natürlich selbst aus. Es ist zu beachten das NPC Namen auch Leerzeichen enthalten dürfen.
Maximal können 23 Zeichen für den Namen verwendet werden und jeder Name muss einzigartig sein.
Der Server erlaubt keine doppelte Namen, da sonst Daten durcheinander kommen würden. (z.B. bei Event Labels)

Aussehen des NPCs:
Eine Liste der NPCs und deren IDs findet ihr z.B. hier: http://nn.nachtwolke.com/dev/npclist/

Hinweis:
Haltet euch immer an das Beispiel, dann kann nichts schief gehen. Falls doch mal ein Fehler auftaucht,
dann schaut nach ob ihr auch <tab> statt Leerzeichen verwendet habt und ob alle Kommas richtig sitzen.


1.2 - Script Commands
Im Laufe der Zeit werde ich neue Befehle aufgreifen und ich kann euch natürlich nicht jeden Befehl ins Detail erklären, deswegen
müsst ihr lernen die Wiki zu lesen. Dort findet ihr alle Script-Befehle bis in jedes Detail erklärt, sogar mit Beispielen.
Das ist sehr wichtig. Ihr könnt euch nicht alle Befehle am Anfang merken, erst recht nicht wie alles funktioniert. Nutzt es
als Nachschlagewerk und haltet euch nicht zurück. Die Wiki werdet ihr noch sehr oft verwenden müssen.
Link: http://rathena.org/wiki/Category:Script_Command


1.3 - Befehle Teil 1 - Abläufe
Hier beginnt der ganze Spaß. Ihr werdet nun euren ersten sprechenden NPC erstellen.

Beispiel:

prontera,156,212,7    script    Charlie    811,{

    mes "[Charlie]";
    mes "Hallo ! Mein Name ist Charlie.";
    next;
    mes "[Charlie]";
    mes "Ich heiße euch willkommen!";
    close;

}

Erläuterung:
Sobald ihr den NPC anklickt wird der Script zwischen den { } ausgeführt. Das ist der sogenannte Script-Block. Dieser enthält
den kompletten Script des NPCs. Ich erläutere euch nun die Befehle die ich hier verwendet habe.

mes "<message>";
Öffnet ein Fenster mit dem folgenden Text "<message>". Die beiden "" beinhalten den Text der ausgegeben werden soll und mit ;
beenden wir den Befehl. Ein mes steht für eine Zeile. Bedeutet, wenn ihr eine neue Zeile anfangen wollt verwendet ein weiteres mes.
Wenn ihr in der Wiki schaut werdet ihr verschiedene Varianten finden.
Link: http://rathena.org/wiki/Mes

next;
Zeigt euch ein Button am unteren Rand des Fensters an. Bedeutet das Script pausiert und wartet darauf bis ihr "Next" klickt.
Tut ihr das wird das Fenster gesäubert und ihr könnt es wieder neu füllen. Somit könnt ihr eure Texte strukturieren und leserlicher
machen, (auch segmentieren genannt), und dem Spieler Zeit geben Stück für Stück den Text zu lesen.
Stellt euch zum Beispiel eine Unterhaltung mit dem NPC und dem Spieler vor, sieht besser aus und ist Spieler-freundlicher.
Link: http://rathena.org/wiki/Next

close;
Dieser Befehl zeigt euch ein Close Button am unteren Rand des Fensters an. Wenn ihr es klickt wird das Fenster geschlossen und der Script beendet.
Wenn ihr nach diesem Befehl noch mehr Befehle schreibt werden diese nicht ausgeführt, deswegen wird close ausschließlich nach mes und next verwendet.
Link: http://rathena.org/wiki/Close

Der Server arbeitet Schritt für Schritt jede Zeile ab. Stellt euch vor ihr gibt einem Kleinkind vor was es zu tun hat.
Gar nicht mal so schwer oder ?

Lernaufgabe:
Erstelle ein NPC namens Harald, welches dem Spieler sagt das er ihn in Ruhe lassen soll. Danach wird das Script normal beendet.
Wenn ihr wollt probiert es mit verschiedenen Namen und verschiedenen Texten und wenn ihr wollt auch an verschiedenen Orten.
Ihr könnt Harald auch ein anderes Aussehen verpassen. Probiert alles aus und macht euch mit dem Grundgerüst und den Befehlen vertraut.

Hinweis:
Vergesst nicht das ; nach jedem Befehl zu verwenden. Ihr werdet es am Anfang sehr oft vergessen. Prägt es euch also schon früh ein!
Das ; wird verwendet um ein Befehl zu beenden.


1.4 - Variablen
Beim Scripten wird der Punkt kommen wo ihr Variablen verwenden müsst. In diesen könnt ihr Informationen speichern, sie aufrufen und
verarbeiten. Ich werde euch die verschiedenen Arten von Variablen und deren Limitationen zeigen.

Integer:
Sind sogenannte Ganzzahlen z.B. (0, 1, 2, 3, 592, -235, -2, etc.) Zu beachten ist das wenn ihr Kommazahlen verwendet, diese einfach
geschnitten werden. Bedeutet wenn ihr 5.6 eintippt. Dann wird der Server nur die 5 benutzen und nicht das was hinter dem Komma steht.
Später ist das wichtig zu beachten wenn ihr rechnet und Irgendetwas zum Beispiel durch 2 teilen wollt. Behaltet dies im Hinterkopf.

String:
Sind sogenannte Zeichenketten z.B.: "Hallo", "Dies ist eine Botschaft" oder auch Buchstaben wie "a" und "b".
Beinhaltet alle euch bekannten Zeichen von A bis Z und Wörter, Sätze, Sonderzeichen und auch Zahlen. (Mit den Zahlen kann man dann aber nicht rechnen!)
Hier ist zu beachten das Strings immer in "" geschrieben werden müssen, ansonsten werden diese nicht erkannt und es gibt Fehlermeldungen.

Hier nun die verschiedenen Typen die man in der Athena Scripting Sprache festlegen kann:

variablenname = Eine permanente Charakter basierende Variable
@variablenname = Eine temporäre Charakter basierende Variable
.variablenname = Eine permanente NPC Variable
.@variablenname = Eine temporäre NPC Variable
$variablenname = Eine globale permanente Variable
$@variablenname = eine globale temporäre Variable
#variablenname = eine permanente Account basierende Variable

Ein $ and das Ende einer Variable liefert eine String Variable die man z.B. für die Input funktion gebrauchen kann.
z.B.: @var$ <--- Eine temporäre String Variable mit dem Namen var.

Temporär bedeutet das die Variable gelöscht wird sobald der Server resetted wird.
Permanent bedeutet das die Variable bleibt selbst wenn der Server resetted wird.
Global bedeutet das sie für den Server gilt und nicht nur für den Charakter oder Account.
Account bassierend bedeutet das sie für den Account gesetzt wird. (Nützlich wenn man Quests auf nur 1x pro Account reduziern will)

Bestimmt wollt ihr nun wissen wie man Variablen benutzt. Dafür brauchen wir den Befehl "set".
Wie man ihn benutzt und in ein Script einbaut zeige ich euch jetzt.

Beispiel:

prontera,156,212,7    script    Charlie    811,{

    mes "[Charlie]";
    mes "Hallo ! Mein Name ist Charlie.";
    next;
    mes "[Charlie]";
    mes "Ich heiße euch willkommen!";
    set @geredet, 1;
    close;

}

Erläuterung:
Dies ist unser Beispiel von vorhin, aber etwas ist anders. Wir haben eine temporäre Charakter Variable namens "geredet" erstellt
und eine 1 eingespeichert. Nun könnten wir am Anfang abfragen ob die Variable auf 1 gesetzt ist und wenn ja dann würde statt diesem
Text ein ganz anderer Text erscheinen. Dafür brauchen wir die sogenannten If-Abfragen, zu denen wir schon bald kommen werden.

set;
Speichert einen Wert in eine Variable. Ist die Variable nicht vorhanden wird sie erstellt.
Ist sie jedoch schon vorhanden, wird der alte Wert mit dem neuen Wert überschrieben.
Link: http://rathena.org/wiki/Set

Wir können Variablen auch abrufen und diese in "mes" ausgeben lassen.

Beispiel:

prontera,156,212,7    script    Charlie    811,{

    mes "[Charlie]";
    set @geredet, 1;
    mes "Die Variable ist auf " + @geredet + " gesetzt";
    close;

}

Erläuterung:
Um eine Variable aufzurufen reicht es einfach den Namen anzugeben. Das "+" ist ein Operator, aber dazu kommen wir gleich.
Ihr seht, das ich die Variable mit dem Rest des Textes ganz einfach verbunden habe indem ich das "+" dazwischen geschrieben habe.
Als hätte ich es zusammengerechnet. (In diesem Fall verbunden)


1.5 - Operatoren
Ich behandle in diesem Thema zwei Arten von Operatoren. Die mathematischen und die logischen Operatoren. Bei den logischen
Operatoren gibt es nochmal zwei verschiedene Arten, unzwar die logischen Vergleiche und die logischen Verknüpfungen.

mathematische Operatoren:
+ Addiert Zahlen
- Subtrahiert Zahlen
* Multipliziert Zahlen
/ Dividiert Zahlen (Hinweis: Nicht vergessen, bei einem Ergebnis von z.B 5.6 wird 5 rauskommen, da der Server nur Ganzzahlen verarbeitet)
% Rest einer Division, z.B.: 7%2 = 1

Diese Operatoren sind ausschließlich für Integer zu verwenden. Die einzige Ausnahme ist "+", wie im Beispiel vorhin kann man damit
Variablen mit Texten oder sogar Texte mit Texten verbinden.

logische Operatoren (Vergleiche):
== Trifft zu wenn beide Seiten gleich sind. [ 2==2 (wahr) 2==1 (falsch) ]
!= Trifft zu wenn beide Seiten nicht gleich sind. [ 1==1 (falsch) 2==1 (wahr) ]
>= Trifft zu wenn der erste Wert größer oder gleich ist als der zweite Wert. [ 2>=2 (wahr) 3>=2 (wahr) 1>=2 (falsch) ]
<= Trifft zu wenn der erste Wert kleiner oder gleich ist als der zweite Wert. [ 1<=2 (wahr) 1<=1 (wahr) 2<=1 (falsch) ]
> Trifft zu wenn der erste Wert größer ist als der zweite Wert. [ 2>1 (wahr) 1>2 (falsch) ]
< Trifft zu wenn der erste Wert kleiner ist als der zweite Wert. [ 1<2 (wahr) 2<1 (falsch) ]

logische Operatoren (Verknüpfungen):
&& UND
|| ODER
! NICHT

Diese Operatoren werden einzig und allein für If-Abfragen verwendet.


1.6 - If-Abfragen
Jetzt wird es spannender. Nachdem wir gelernt haben was Variablen und Operatoren sind kommen wir nun zu den If-Abfragen. Hier
werden wir sowohl variablen als auch logische Operatoren verwenden. Zudem lassen sich auch Funktionen mit Rückgabewerten verwenden,
jedoch behandeln wir diese erst später.

if;
Es handelt sich dabei um eine logische Abfrage. Dabei werden Werte mit Hilfe von logischen Operatoren abgeglichen und auf ihre
Wahrheit oder Falschheit überprüft. Je nach Resultat wird der darauf folgende Codeblock ausgeführt oder nicht.
Link: https://rathena.org/wiki/If

Beispiel:

prontera,156,212,7    script    Charlie    811,{

    if(@geredet == 1)
    {
        mes "[Charlie]";
        mes "Habe ich dir meinen Namen nicht schon verraten ?";
        next;
        mes "[Charlie]";
        mes "Na los, verschwinde endlich!";
        close;
    }
    else
    {
        mes "[Charlie]";
        mes "Hallo ! Mein Name ist Charlie.";
        next;
        mes "[Charlie]";
        mes "Ich heiße euch willkommen!";
        set @geredet, 1;
        close;
    }
}

Erläuterung:
Wie ihr sehen könnt ist am Anfang von unserem netten Kerl Charlie eine If-Abfrage. Im Grunde wird überprüft ob die Variable
"@geredet" auf 1 gesetzt ist, wenn diese Aussage WAHR ist, wird der Codeblock darunter zwischen den geschweiften Klammern
ausgeführt. Danach kommt ein "else" welches auf Deutsch "ansonsten" bedeutet. Im Klartext: Ansonsten wenn die Aussage NICHT WAHR,
also UNWAHR ist, führe den Codeblock unter "else" aus. Ein "else" ist kein muss, jedoch kommt es darauf an wie euer Script aufgebaut
sein soll. In diesem Fall wollen wir entweder das eine ODER das andere ausgeben lassen. Nochmal: Wenn ihr den NPC das erste mal anspricht
wird der Codeblock unter "else" ausgefuhrt weil @geredet noch nicht auf 1 gesetzt wurde. Das wird es dann dort. Beim zweiten mal Ansprechen
ist die Aussage WAHR und der Codeblock unter "if" wird ausgegeben. Stellt euch das wie eine Gabelung vor, entweder der eine oder der andere Weg.

Mehrere Verzweigungen:
Es ist auch möglich mehrere If Abfragen zu verketten mit dem "else if" befehl, statt eines "else" benutzt ihr "else if"" und macht
so noch eine abfrage. Die letzte wird dann ein "else" falls keine der vorherigen Abfragen zu trifft.

Ergänzung:
Es ist möglich alle Arten von Variablen miteinander zu vergleichen solange diese den selben Datentypen haben, heißt: string mit string vergleichen.
Int mit Int vergleichen und so weiter. Ansonsten erhaltet ihr nur Fehler. Liest euch zudem unbedingt die Wiki Seite von if durch, damit ihr es besser versteht.

 

 

1.7 - Labels

Labels werden heutzutage so gut wie kaum noch verwendet. Man bezeichnet es als unsauber. Es kann in einigen Situationen jedoch hilfreich sein
und sollte niemals ganz vergessen werden. Wir werden dafür ein neuen Befehl benötigen den ich euch zeigen werde.

goto <label>;
Mit "goto" kann man an ein label springen. Heißt man springt an eine bestimmte Zeile im Script wo euer Label steht.
Für mehr Informationen besucht die Wiki Seite.
Link: https://rathena.org/wiki/Goto

Beispiel:

prontera,156,212,7    script    Charlie    811,{

    if(@geredet == 1)
    {
        goto L_geredet;
    }
    
    mes "[Charlie]";
    mes "Hallo ! Mein Name ist Charlie.";
    next;
    mes "[Charlie]";
    mes "Ich heiße euch willkommen!";
    set @geredet, 1;
    close;
    
L_geredet:
    mes "[Charlie]";
    mes "Habe ich dir meinen Namen nicht schon verraten ?";
    next;
    mes "[Charlie]";
    mes "Na los, verschwinde endlich!";
    close;
}

Erläuterung:
Kommt euch das bekannt vor ? Genau es ähnelt dem "if" und "else" Beispiel. Statt das wir ein "else" verwenden, springen wir
zur Zeile wo "L_geredet:" steht. "goto" erlaubt uns quasi einfach hin und her zu springen und von dort aus läuft der Script
ganz normal weiter nach unten. Man kann mit dieser Methode auch aus Schleifen springen nachdem ein gewünschter Zustand erreicht
wurde. Die Möglichkeiten sind unendlich.

Lernaufgabe:
Probiert euch mal selbst daran und baut ein paar Labels in euer Script und versucht hin und her zu springen.

 

 

1.8 - Kommentare

Eines der nützlichsten Werkzeuge in der Informatik. Auch wenn sie selbst kein Einfluss auf eueren Script haben, werden sie
dazu verwendet euch das Leben leichter zu machen. Wie der Name schon sagt sind es Kommentare. Sie dienen euch dazu Notizen
im Script zu machen oder euren Script zu erklären und leserlicher zu machen und haben dabei kein Einfluss auf den Script selbst.

Beispiel:

prontera,156,212,7    script    Charlie    811,{


    //Hier frage ich ab ob die Variable @geredet auf 1 gestellt ist
    if(@geredet == 1)
    {
        goto L_geredet; //Wenn ja springe ich zum Label L_geredet
    }
    
    //Diese Stelle wird nur ausgeführt wenn wir nicht zu L_geredet gesprungen sind und die If-Abfrage UNWAHR war.
    mes "[Charlie]";
    mes "Hallo ! Mein Name ist Charlie.";
    next;
    mes "[Charlie]";
    mes "Ich heiße euch willkommen!";
    set @geredet, 1;
    close;

//Hier steht das Label. Man kann es sich als eine Art Checkpoint vorstellen an den man springen kann.
L_geredet:
    mes "[Charlie]";
    mes "Habe ich dir meinen Namen nicht schon verraten ?";
    next;
    mes "[Charlie]";
    mes "Na los, verschwinde endlich!";
    close;
}

Erläuterung:
Wie ihr sehen könnt beginnt man ein Kommentar mit "//" Damit hat die Zeile kein Einfluss mehr und steht nur als Text da für euch.
Sehr hilfreich also nutzt es auch ! Im Laufe der Zeit lernt ihr sparsam aber effizient damit umzugehen. Ihr wollt euren Script
damit ja nicht zukleistern.

 

 

1.9 - Befehle Teil 2 - Menüs und Eingaben

- coming soon...

 

_____________________________________________________________________________________

Dieses Guide basiert auf dem veralteten Guide aus 2007 welches erstmalig auf eAthena veröffentlich wurde.

Ich selbst habe durch diesen Guide scripten gelernt. Ich habe dieses Werk als Grundlage für meinen Guide

genommen. Die Struktur ist ähnlich oder wurde verändert, der Inhalt jedoch ist von mir verfasst und basiert

auf der aktuellen rAthena Wiki. Link: Klick mich

  • Upvote 7
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...