Skripten

Grundlegende Informationen zum Skripten

Schlagworte:
  1. Lakos
    Grundlegende Informationen zum Skripten
    Hiermit möchte ich euch Tutorial präsentieren, welches euch ein wenig in die Welt des Skriptens einführt. Zunächst einmal stellt sich die Frage nach dem Sinn und Zweck des Skriptens. Wozu braucht man das? Zunächst einmal sind fast alle Quests in Oblivion durch Skripts gesteuert. Dann eröffnen sich durch das Skripten auch nochmal unzählige Möglichkeiten seine Ideen wahr werden zu lassen. Ihr wollt eine Armee von Ratten um euch scharen? Lernt skripten. Ihr wollt das Wetter beeinflussen? Lernt skripten. Ihr wollt ein unendliches Inferno an Special-Effects in einem einzigen Zauber abfeuern? Lernt skripten.

    Da nun jeder von der Wichtigkeit des Skriptens überzeugt sein sollte, wenden wir uns der Materie zu.
    Je mehr man schon mit Programmiersprachen, wie VB, PHP oder C++, zu tun gehabt hatte, desto leichter fällt einem auch der Einstieg.

    Für die, die bisher noch nicht in "Kontakt" mit einer der oben genannten Programmiersprachen gekommen ist, hier ein Crashkurs. (Erfahrenere Modder springen zum nächsten Abschnitt)

    Crashkurs
    In der Welt des einfachen Skriptens (in der ich mich zur Zeit auch noch bewege) gibt es ein paar elementare Dinge, die man wissen sollte. Zum Beispiel was Variablen und if-Funkionen sind.

    Mit Variablen sollten die meisten schon einmal in Mathematik zu gehabt haben. Wer es nicht mehr weiß: In Variablen kann man Daten speichern. Man muss sich eine Variable wie einen Container vorstellen, in den man aber nur eine Sache legen gleichzeitig kann. Mit Variablen lassen sehr einfach bestimmte Daten speichern und wieder aufrufen.

    If-Funktionen dienen zum Vergleich. Eine If-Funktion vergleicht zwei Werte miteinander. Da sich das nur schwer erklären lässt, gebe ich hier ein Beispiel.

    Code:
    If x == 1
     Message "Die Variable X ist 1" elseif x != 1
     Message "Die Variable X ist nicht 1"
    Hier seht ihr, dass durch das If geprüft wird, ob x (eine Variable) gleich 1 ist. Es gibt dabei mehrere Vergleichsmethoden.


    1. == steht für den direkten Vergleich zweier Werte. Also wird die Funktion, die unter der If-Bedingung steht, nur ausgeführt, wenn – wie in unserem Beispiel – x gleich 1 ist.
    2. != steht für ungleich. Die Funktionen nach dem If werden nur ausgeführt, wenn x ungleich 1 ist.
    3. < Die Funktion wird nur ausgeführt, wenn x kleiner als 1 ist.
    4. > Die Funktion wird nur ausgeführt wenn x größer als 1 ist.
    5. <= Die Funktion wird nur ausgeführt, wenn x kleiner oder gleich 1 ist.
    6. >= Die Funktion wird nur ausgeführt, wenn x größer oder gleich 1 ist.
    Mit && könnt ihr eine zweite Bedingung an die If-Schleife hängen, mit || eine alternative Bedingung.
    Am Anfang war der Name

    So, nun starten wir durch: Öffnet das CS, ladet die Oblivion.esm rein und ruft das Skriptfenster auf (Das Icon ganz rechts).
    Geht nun auf Script, New. Die Fläche in der Mitte wird weiß, und ihr habt auch neue Schaltflächen zur Verfügung. Uns interessieren jetzt erstmal nur die zwei Icons links.

    Zunächst solltet ihr auswählen, als was euer Skript verwendet wird. Gehört es zu einem Objekt (zum Beispiel einer Statue oder einem NPC), zu einem Quest oder soll das Skript als Magieeffekt dienen (dazu später mehr)?

    Wir entscheiden uns für den Magieeffekt (Magic Effect). Wir wollen nämlich ein Wetteramulett bauen. [Wink]

    Zuerst einmal müssen wir dem Skript einen Namen geben. Deshalb schreiben wir in die erste Zeile:

    Code:
    scn wetteramulett
    scn steht für Scriptname und gibt eurem Skript einen Namen.
    Dann stellt sich die Frage, was das Amulett können soll. Da es Wetteramulett heißt, liegt es nahe, ihm die Kraft über das Wetter zu geben. Und wie soll der User auswählen können, welches Wetter er haben will? Hm. Vielleicht durch eine Textbox? Ja, das ist eine gute Idee.
    Wie wir oben schon gelernt haben, kann man in Variablen bestimmte Werte speichern. Wenn wir also eine Variable erschaffen, die speichert welches Wetter der Spieler haben will und es dann ans Spiel weiterleitet, wären wir schon einen Schritt weiter. Also gebt dies als nächstes ein:

    Code:
    short wetter
    Es gibt beim CS vier Arten von Variablen: short, long, float, ref.
    Short: Können Zahlen von -32768 bis 32767 erfassen
    Long: Können Zahlen von -2147483648 bis 2147483647 erfassen
    Float: Können verdammt viele Zahlen erfassen (von 1.18 x 10-38 bis 3.40 x 1038)

    Mit Ref-Variablen könnt ihr um einiges mehr speichern, als mit den "normalen" Variablen. Da die Erklärung dafür zu ausschweifend wären, hier mal ein Link zum (englischen) CS-Wiki.

    Nun haben wir also unsere Variable gesetzt. Fehlt noch die Textbox.
    Um eine Textbox, oder MessageBox wie sie im CS genannt wird, zu erstellen, müsst ihr den Befehl zur Ausgabe einer Textbox (MessageBox) schreiben und ausführen lassen.

    Zunächst aber müssen wir festlegen, wann unser Skript mit was "beginnen" soll. Wenn es im normalen Spiel ist, oder im Menü, oder erst, wenn ein bestimmter Gegenstand aufgenommen bzw. abgelegt wurde?
    Das kann man alles mit Begin einstellen. Im Folgenden sind die wichtigsten Einstellungen für Begin.

    GameMode: Das Skript führt die Funktion in jedem Frame im laufenden Spiel aus
    MenuMode: Das Skript führt die Funktion in jedem Frame im Menü aus
    OnActivate: Sobald der Gegenstand, auf dem das Skript liegt, aktiviert wurde, wird das Skript ausgeführt
    OnAdd: Sobald ein bestimmer Gegenstand in einen bestimmten "Container", z.B. in das Inventar des Spielers, aufgenommen wird, wird das Skript ausgeführt (Beispiel: Begin OnAdd wetteramulett player)
    OnDrop: Dasselbe wie bei OnAdd, nur wird das Skript ausgeführt, wenn ein bestimmter Gegenstand fallen gelassen wird.
    ScriptEffectStart, ScriptEffectUpdate und ScriptEffectFinish: Können nur von "Magic Effect"-Skripts benutzt werden.

    Da die Skripts im CS in sogenannten Blocks geschrieben und jeder Anfang ein Ende hat, muss man nach dem letzten Befehl eines Blocks ein End setzen. So weiß das Spiel, dass dieser Block zu Ende ist.

    Wir schreiben also dann einige Zeilen unter der Deklarierung der Variablen. Da wir einen neuen "Magic Effect" erstellen, benutzen wir dafür ScriptEffectStart; für die meisten Scripts wird GameMode genommen. Wir schreiben also:

    Code:
    Begin ScriptEffectStart
    Dann brauchen wir die Textbox. Der Befehl für die Textbox ist folgendermaßen aufgebaut.

    Code:
    MessageBox "Hier stehen immer Anführungsstrichen", Variable,"Auswahlmöglichkeiten"
    In unserem Fall würde da so aussehen:

    Code:
    MessageBox "Welches Wetter wollt Ihr haben?", "Klar", "Wolkig", "Nebel", "Regen", "Schnee" , "Normaler Wetterverlauf"
    Im Spiel sieht das dann so aus:
    [​IMG]

    Das reicht nun für diesen Block, also schreiben wir eine Zeile darunter ein End hin und beginnen einen neuen Block. Euer Script sollte nun so aussehen:
    [​IMG]

    Nun soll ausgelesen werden, was der Spieler gewählt hat. Dafür benutzen wir unsere Variable, in die wir den Wert des gedrückten Buttons speichern und dann später wieder auslesen lassen. Da der Rest des Skriptes im normalen Spielmodus ausgeführt werden soll, schreiben wir:

    Code:
    Begin GameMode
    Nun müssen wir den Wert der Variable auf den Wert des gedrückten Buttons setzen. Das geht Setzen übernimmt der Befehl Set. Und der Wert des gedrückten Buttons wird durch GetButtonPressed ermittelt. Das Ganze sieht dann so aus:

    Code:
    Set wetter to GetButtonPressed
    Nun hat die Variable wetter den Wert des gedrückten Buttons. Jetzt lassen wir sie von einer If-Funktion auslesen. Das sieht dann so aus:

    Code:
    If wetter == 0
    Wie wir oben schon gelernt haben wird jetzt verglichen, ob der gedrückte Button der erste in der Auswahl war (in der MessageBox ist die erste Auswahl die 0, die zweite die 1, die dritte die 2, usw.). Wenn dem so ist, wird folgendes ausgeführt:

    Code:
    SetWeather Clear 1
    Mit dem SetWeather-Befehl wird das aktuelle Wetter verändert, bzw. der Verlauf des Wetters. Der erste Befehl nach SetWeather, Clear, gibt an, in welches Wetter sich das Wetter umformen soll, mit der 1 nach dem Clear wird festgelegt, dass sich das Wetter dann auch nicht mehr ändert. Das erweitern wir nun auf alle Auswahlmöglichkeiten, so dass es am Ende so aussieht:

    [/CODE]if wetter == 0 ;Auswahl 1 Klar
    SetWeather Clear 1
    elseif wetter == 1 ;Auswahl 2 Wolkig
    SetWeather Cloudy 1
    elseif wetter == 2 ;Auswahl 3 Nebel
    SetWeather Fog 1
    elseif wetter == 3 ;Auswahl 4 Regen
    SetWeather Rain 1
    elseif wetter == 4 ;Auswahl 5 Schnee
    SetWeather Snow 1
    elseif wetter == 5 ;Auswahl 6 Normal
    ReleaseWeatherOverride
    endif[/CODE]
    Mit ReleaseWeatherOverride legen wir fest, dass sich das Wetter wieder von alleine ändern "darf."
    Mit EndIf beenden wir unsere If-Funktion, die ebenfalls immer in Blöcken geschrieben werden.

    Jetzt noch ein End dranfügen, und nun sollte euer Fenster so aussehen:
    [​IMG]
    Speichert jetzt das Skript ab. Herzlichen Glückwunsch! Ihr habt nun euer erstes Skript geschrieben. Jetzt könnt ihr es als Zaubereffekt unter Skript-Effekte auswählen und damit einen individuellen Zauber erschaffen.

    Wir haben nun also das Wetteramulett erschaffen. Aber wie soll der Spieler das Amulett erhalten? Am besten durch einen Quest, oder? Also gehen wir ins Quest-Fenster und rechtsklicken auf die Liste und wählen New, um einen neuen Quest zu erstellen. Nennen wir ihn "Das Wetteramulett". Ein richtig toller Name, was?

    Auf der rechten Fensterhälfte erscheinen viele neue Felder, die ihr ausfüllen könnt. Ich erkläre hier kurz ihre Funktionen.

    Reiter Quest Data
    Quest Name
    : Eigentlich selbstverständlich, dass man dem Quest einen Namen gibt.
    Priority: Setzt die Priorität des Quests. 1 ist für Tutorials, 10 für questlose Dialoge, 20 für Haus- und Pferdequests, 40 für Vampirquests, 50 für sonstige Quests, 60 für Gildenquests, 85 für die Hauptquest reserviert.
    Script: Zur Auswahl eines Skriptes.
    Start Game Enabled: Der Spieler startet das Spiel mit diesem Quest.
    Allow Repeated Conversation Topics: Normalerweise verschwinden bestimmte Themen nach der Erfüllung ihrer Pflicht wieder, aber wenn diese Funktion aktiviert wird, bleiben sie erhalten.
    Allow Repeated Stages: Siehe oben.
    Add Icon Image: Hier könnt ihr ein Icon für eure Quest einfügen.
    Quest Conditions: Die Bedingungen, unter denen der Quest angenommen werden kann.

    Reiter Quest Stages
    Index
    : Hier tragt ihr die verschienden "Stages" der Quest ein. Dazu später mehr.
    Log Entry: Der Eintrag, der in eurem Ingame-Logbuch erscheint.
    Result Script: Skript, das aktiviert wird, wenn der Quest in diesem Stage wechselt.
    Conditions: Siehe oben.

    Reiter Quest Targets
    Hier tragt ihr ein, wo eure Kompassnadel hinzeigen soll.

    Reiter Topics
    Relativ kompliziert, deshalb machen wir das im Tutorial.

    So, nach dieser langen Reihe von Fakten, begeben wir uns mal ans Praktische. Zunächst legen wir also fest, dass unser Quest "Das Wetteramulett" heißt, die Priorität 50 hat und nur von spielbaren Rassen angenommen werden kann. Dazu Rechtsklick auf das Conditionsfeld, New und wählt dann unten "GetIsPlayableRace" aus.

    Im Quest Stages-Reiter legen wir fest, wieviele Stages, oder auch Stufen, unsere Quest haben soll. Sagen wir mal, dass uns ein Auftraggeber damit beauftragt das Wetteramulett zu holen, um es ihm zu bringen. Als Belohnung macht er eine Kopie davon (er will es Cyrodiil-weit vermarkten) und gibt sie dem Spieler. Das wären also: Annahme des Quests, Suchen des Amuletts und Rückkehr zum Auftraggeber. 1, 2, 3 Stages.
    Klickt also rechts auf das Index-Feld und weist den Stages eine Zahl zwischen 0 und 255 zu. Ihr könnt zwar jede Zahl zwischen diesen beiden benutzen, allerdings ist es – übersichtshalber – anzuraten die Stages in Zehnerschritten zu benennnen.
    Erstellt also 3 Stages: 0, 10, 20 und 30. Warum 0 auch noch eingefügt werden sollte, erkläre ich später.

    Ihr könnt die Log Entrys nun ausfüllen. Lasst eurer Fantasie dabei freien Lauf.

    Bei Quest Targets müssen wir jetzt ein wenig nachdenken. Was soll alles durch den Kompass angezeigt werden? Der Standort des Amuletts und der Standort des Auftraggebers vielleicht? Ja, ich glaub, dass wäre gut. Platziert eure Amulett also irgendwo in die Pampa rein und legt einen Xmarker darauf (WorldObjects > Static). Klickt auf den Marker doppelt und tragt bei ReferenceID "wetteramulettMarker" ein. Zurück im Quest Targets-Fenster, erstellt ihr ein neue Target und wählt mit "Select Reference in Render Window" den Xmarker aus. Da dieser Marker nur in der zweiten Phase, der Suche nach dem Amulett, angezeigt werden soll, wählt ihr unter den Conditions noch "GetStage". Hier müsst ihr ein bisschen aufpassen, denn es wird nicht die aktuelle Stage ausgegeben, sondern nur die zuletzt erfüllte. Da wir bis jetzt aber noch nichts gemacht haben, setzen wir den Value der Condition auf 0. Erstellt außerdem einen NPC, auf den ihr ebenfalls ein Quest Target setzt, allerdings mit der Condition "GetStage wetteramulettquest 10"

    Im Topics-Reiter, dem mitunter wichtigsten Teil eines Quests, können wir die Dialoge zusammenstellen. Anfangs brauchen wir eine Begrüßung für den NPC. Wählt also unter "Add Topic"(rechtsklick auf das linke Feld) GREETING aus. In dem nun weißen Feld tragt ihr den Text des NPCs ein. Wie auch bei sovielem, spielen die Conditions eine wichtige Rolle. Hier sollten folgende Conditions gewählt werden:

    GetIsplayableRace == 1
    GetIsID == QuestNPC (hier die ID des NPCs einfügen)
    GetStage (QuestID) (Stagenummer, Erklärung siehe oben) < 10


    Damit wird festgelegt, dass nur der dafür bestimmte NPC diesen Dialog von sich gibt, und auch nur, falls die Stage nicht größer als 10 ist.
    Der NPC bittet uns also das Amulett zu finden. Wir fügen nun zwei Choices ein. Dafür müssen wir aber erstmal zwei neue Topics erstellen. Klickt rechts auf das Choices-Feld und dann Add Topic. In diesem Fenster klickt ihr nochmal rechts und wählt New und gebt eurem neuen Topic einen Namen.

    Wählt dieses Topic jetzt durch nochmaliges "Add Topic" aus. Nun habt ihr zwei Antwortmöglichkeiten; z.B. Ja und Nein. Dieses werden dann im Spiel angezeigt. Gebt dem NPC, je nach Antwort des Spielers, weiteren Text. Bei Nein könntet ihr allerdings auch gar nichts hinschreiben.

    Sollte der Spieler den Quest angenommen haben, muss der Quest in die Stage 10 springen, damit der Marker aktiviert wird. Also schreiben wir unter "Result Script" folgende Zeile rein:

    Code:
    SetStage wetteramulett 10
    Damit wird die Stage des Quests "wetteramulettquest" auf den Wert 10 gesetzt, was den Marker aktiviert. Für die spätere Nutzung solltet ihr übrigens noch ein Topic für die Belohnung erstellen. Wenn der Spieler den NPC darauf anspricht, wird dieser ihm sagen, dass er das Amulett erst holen soll (GetStage wetteramulett 0), sollte der Spieler das Amulett aber schon haben, wird der NPC ihm die Belohnung geben.

    Damit aber der Zeiger wieder umspringt, wenn wir das Amulett aufnehmen, müssen wir noch ein kleines Skript schreiben, welches ihr auf das Amulett legt.

    Code:
    scn wetteramulettscript
    
    Begin OnAdd wetteramulett player
    SetStage wetteramulett 20
    End
    Dadurch wird die Stage auf den Wert 20 gesetzt, sobald der Spieler das Amulett aufnimmt. Nun sollte der Spieler den NPC auf die Belohnung ansprechen, woraufhin er eine Belohnung erhält. Um das zu realisieren muss das Skript, welches ihr unter "Result Script" reinschreibt, so aussehen:

    Code:
    player.RemoveItem wetteramulett 1
    player.AddItem Gold001 200
    Player.AddItem wetteramulett 1
    SetStage wetteramulettquest 30
    Setzt noch im Quest Stages-Reiter, bei der Stage 30, einen Haken bei "Complete Quest", damit die Quest nach Erhalt der Belohnung abgeschlossen ist. Genauso wie dieses Tutorial.
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden