PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Tutorial] Scripten in Oblivion|Fallout 3



Spanky_Ham
12.12.2010, 10:31
Wozu braucht man Scripts in Oblivion oder Fallout?
Das ist eigentlich ganz einfach, ohne Scripts würden viele Dinge einfach nicht funktionieren (z.B. ein Amulett das, dass Wetter verändert oder eine Atombombe die man über einen Fernzünder explodieren lässt...).

Jetzt wisst ihr im großen und ganzen warum scripten so wichtig ist.
Je mehr man schon mit Programmiersprachen ,wie VB, PHP oder C++, zu tun gehabt hatte, desto leichter wird es.

Für die, die bisher noch nicht mit diesen Programmiersprachen gearbeitet hat, hier ein Crashkurs. (Erfahrenere Modder springen zum nächsten Abschnitt)

Crashkurs:

In der Welt des einfachen Scriptens gibt es ein paar grundlegende Dinge, die man wissen sollte. Zum Beispiel was Variablen und if-Funkionen sind.

Mit Variablen sollten die meisten schon einmal in Mathematik in verbindung gekommen sein. Bei wem es zu lange her ist:
In Variablen kann man Daten/Informationen speichern. Man muss sich eine Variable wie einen Container vorstellen, in den man aber nur eine Sache gleichzeitig legen kann. Mit Variablen lassen sich sehr einfach bestimmte Daten speichern und wieder aufrufen.

If-Funktionen dienen zum Vergleich. Eine If-Funktion vergleicht zwei Werte miteinander. Man will z.B. das wenn man einen Wert hat geschrieben werden soll xyz ist gleich 1 ansonsten soll geschrieben werden xyz ist nicht 1, sähe das in etwa so aus:

If xyz == 1
Message "xyz ist 1"
elseif xyz != 1
Message "xyz ist nicht 1"

Hier seht ihr, dass durch das If geprüft wird, ob xyz (Beispiel für eine Variable) gleich 1 ist. Es gibt dabei mehrere Vergleichsmethoden:
== 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 – xyz gleich 1 ist.
!= steht für ungleich/nicht. Die Funktionen nach dem If werden nur ausgeführt, wenn xyz nicht1 ist.
< Die Funktion wird ausgeführt, wenn xyz kleiner als 1 ist.
> Die Funktion wird ausgeführt wenn xyz größer als 1 ist.
<= Die Funktion wird ausgeführt, wenn xyz kleiner oder gleich 1 ist.
>= Die Funktion wird ausgeführt, wenn xyz größer oder gleich 1 ist.

Man kann auch noch && anhängen. mit ihr könnt ihr eine zweite Bedingung an die If-Schleife hängen und mit || eine alternative Bedingung.


Beispiel Oblivion:
Nun fangen wir an, öffnet das Construction Set (http://www.planetoblivion.de/index.php?option=com_content&task=view&id=198&Itemid=77) (CS), ladet die Oblivion.esm und ruft das Scriptfenster auf (Das Icon ganz rechts).
Geht nun auf Script, New. Ihr solltet nun ein neues Fenster vor euch haben... 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 machen einen Magieeffekt (Magic Effect) also sollten wir auch diesen nehmen, da wir ein Wetteramulett bauen werden.

Zuerst einmal müssen wir dem Script einen Namen geben, deshalb schreiben wir in die erste Zeile:

scn wetteramulett

scn ist die Abkürzung für "scriptname" und gibt eurem Script einen Namen.
Da es Wetteramulett ist, liegt es nahe, ihm die Kraft über das Wetter zu geben:] Und da der User irgendwie ein Wetter auswählen muss, brauchen wir eine Textboxt.
Wie oben schon erklärt, 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:

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)
Ref-Variablen können um einiges mehr speichern, als "normale" Variablen. Da die Erklärung dafür zu abweichend wäre, hier mal ein Link zum CS-Wiki (http://cs.elderscrolls.com/constwiki/index.php/Reference_variables) (englisch).

Nun haben wir also unsere Variable gesetzt, fehlt noch die Textbox;)
Um eine Textbox 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 Script mit etwas "beginnen" soll. Wenn es im normalen Spiel ist, oder im Menü, oder vielleicht erst, wenn ein bestimmter Gegenstand aufgenommen bzw. abgelegt wurde?
Das kann man alles mit Begin einstellen, hier eine kleine Liste:

GameMode: Das Script führt die Funktion zu jedem Zeitpunkt im laufenden Spiel aus
MenuMode: Das Script führt die Funktion zu jedem Zeitpunkt im Menü aus.
OnActivate: Sobald der Gegenstand, auf dem das Ssript 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 Script ausgeführt (Beispiel: Begin OnAdd wetteramulett player;))
OnDrop: Dasselbe wie bei OnAdd, nur wird das Script ausgeführt, wenn ein bestimmter Gegenstand fallen gelassen wird.
ScriptEffectStart, ScriptEffectUpdate und ScriptEffectFinish: Können nur von "Magic Effect"-Scripts benutzt werden.

Da die Scripte im CS in sogenannten Blocks geschrieben werden 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:

Begin ScriptEffectStart

Dann brauchen wir die Textbox. Der Befehl für die Textbox lautet folgendermasen:

MessageBox "Dieser Text steht immer in Anführungszeichen", Variable,"Auswahlmöglichkeiten"

Bei uns würde das so aussehen:


MessageBox "Welches Wetter wollt Ihr haben?", "Klar", "Wolkig", "Nebel", "Regen", "Schnee" , "Normaler Wetterverlauf"


Das reicht nun für diesen Block, also schreiben wir eine Zeile darunter End und beginnen einen neuen Block.
Euer Script sollte nun so aussehen:
http://img384.imageshack.us/img384/6376/tutorial27co1xq.jpg

Nun soll ausgelesen werden, was der Spieler gewählt hat, dazu 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 Scriptes im normalen Spielmodus ausgeführt werden soll, schreiben wir:

Begin GameMode

Nun müssen wir den Wert der Variable auf den Wert des gedrückten Buttons setzen. Der Wert des gedrückten Buttons wird durch GetButtonPressed ermittelt. Das Ganze sieht dann so aus:

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:

If wetter == 0

Wie wir wissen, 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 das der Fall ist, wird folgendes ausgeführt:

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:

if wetter == 0
;Auswahl 1 klar
SetWeather Clear 1
elseif wetter == 1
;Auswahl 2 bewölkt
SetWeather Cloudy 1
elseif wetter == 2
;Auswahl 3 neblig
SetWeather Fog 1
elseif wetter == 3
;Auswahl 4 regnerisch
SetWeather Rain 1
elseif wetter == 4
;Auswahl 5 Schnefall
SetWeather Snow 1
elseif wetter == 5
;Auswahl 6 normal
ReleaseWeatherOverride
endif

Mit ReleaseWeatherOverride legen wir fest, dass sich das Wetter nicht wieder von alleine ändert.
Mit EndIf beenden wir unsere If-Funktion, die ebenfalls immer in Blöcken geschrieben werden.

Jetzt noch End und euer Fenster sollte so aussehen:
http://img478.imageshack.us/img478/120/tutorial303ce.jpg

Speichert nun das Script und fertig! Jetzt könnt ihr es als Zaubereffekt unter Script-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" (sehr einfallsreich, ich weiss^^).

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


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 Scriptes.
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: Script, das aktiviert wird, wenn der Quest in diesem Stage wechselt.
Conditions: Siehe "Quest Conditions" [i](weiter oben).

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

Reiter Topics
Relativ kompliziert, deshalb machen wir das nicht in diesem 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 legen wir fest, dass nur der dafür bestimmte NPC diesen Dialog von sich geben, 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:

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 Script schreiben, welches ihr auf das Amulett legt.

Das Script muss so aussehen:

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 Script, welches ihr unter "Result Script" reinschreibt, so aussehen:

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.


So funktioniert das auch in Fallout, da das G. E. C. K. genau wie das CS aufgebaut ist.

-Spanky

Spanky_Ham
12.12.2010, 10:34
Funktionieren die Spoiler nicht?:S

Mr.XaXa
13.12.2010, 17:21
Hab gerade jemanden um Hilfe gebeten, bitte nochmal testen. Bei mir funktionieren die Spoiler hier jetzt.

Spanky_Ham
13.12.2010, 19:13
joa geht, danke^^