Skyrim:Scripterweiterung

Aus Skript-Wiki
Wechseln zu: Navigation, Suche

Übersicht

Scripterweiterung bedeutet, dass man ein Script nimmt, welches beinahe tut, was man will und dann einige Events oder Funktionen so modifiziert, dass sie etwas unterschiedliches tun und das alles, ohne das Originalscript zu editieren.


Terminologie

  • Parent: Das Originalscript, dass erweitert wird.
  • Child: Das Script, dass das Parent-Script erweitert.
  • Inherit: Wenn ein Child-Script etwas ohne Veränderung vom Parent-Script bekommen, „erbt“ es das
  • Override: Wenn ein Child-Script das Verhalten von etwas in seinem Parent-Script ändert, indem eine neue Version gemacht wird, „übersteuert“ es die Parent-Version.

Wie man erweitert

Ein Script zu erweitern ist leicht: Am Anfang des Scripts wird nach "scriptname x" "extends y" eingefügt, wobei Y der Name des Scripts ist, das erweitert werden soll.

Beispiel: <papyrusscript> Scriptname Dornenfalle extends Falle </papyrusscript >

In diesem Fall erweitert das " Dornenfalle " -Script das "Falle"-Script. Man kann sich das als eine "ist eine"-Beziehung vorstellen. Eine Dornenfalle "ist eine" Falle.

Was ein erweitertes Script kann

Funktionen und Events

Ein Child-Script hat Zugriff auf alle Funktionen und Events seines Parents. Jede Funktion oder jedes Event, das nicht im Child-Script implementiert ist, wird vom Child-Script geerbt. Wenn eine Funktion oder ein Event im Parent implementiert ist und man das ebenfalls im Child implementiert, übersteuert das Child den Parent und jeder Aufruf dieser Funktion oder dieses Events wird statt dessen die Child-Version nutzen. Wenn man eine Funktion oder ein Even im Child implementiert, ist zu beachten, dass die Parameter und der Rückgabe-Typ zusammen mit dem Namen mit dem Parent übereinstimmen müssen. Wenn nicht wird das Script nicht übersetzt.

Beispiel: <papyrusscript> Scriptname ParentScript

Function MyFunction()

 Debug.Trace("Parent MyFunction!")

EndFunction

Function MyOtherFunction()

 Debug.Trace("Parent MyOtherFunction!")

EndFunction </papyrusscript>
<papyrusscript> Scriptname ChildScript extends ParentScript

Function MyFunction()

 Debug.Trace("Child MyFunction!")

EndFunction </papyrusscript>

  • Verbinden des Child-Script mit etwass. Anschließend ein Aufruf von MyFunction darauf:
Child MyFunction!

Das Child hier übersteuert und ersetzt die Funktion des Parents mit seiner eigenen.

  • Verbinden des Parent-Script mit etwas. Anschließend ein Aufruf von MyFunction darauf:
Parent MyFunction!

Das Child-Script existiert in diesem Fall nicht, deshalb bleibt die Funktionalität des Parents intakt.

  • Verbinde beide Script mit etwas. Anschließend ein Aufruf von MyFunction darauf:
Parent MyOtherFunction!

Das Child übersteuert diese Funktion nicht, deshalb wird die originale Parent-Funktion genutzt.

Aufruf einer Funktion im Parent

Wenn man aktuell eine Funktion im Parent aufrufen will und die Funktion im eigenen Script ignorieren möchte, kann man eine besondere "parent"-Variable nutzen. Es ist zu beachten, dass diese Variable nur auf dem Script selbst funktioniert - man kann es nicht nutzen, um etwas auf einem anderen Script aufzurufen. Das wird üblicherweise benutzt, wenn das Script nur eine kleine Änderung an etwas machen soll, bevor dann das Parent die gravierenden Dinge erledigt.

Beispiel: <papyrusscript> Scriptname ChildScript extends ParentScript

Function MyFunction()

 Debug.Trace("Child MyFunction!")
 parent.MyFunction()

EndFunction </papyrusscript>

  • Aufruf von MyFunction auf diesem Child-Script, das mit einem Objekt verbunden ist:
Child MyFunction!
Parent MyFunction!

Beachte das die Parent-Variable erzwingt, dass die Version des Parents anstatt der Child-Version aufgerufen wird.


States

States in einem Child-Script werden mit den States aus dem Parent-Script vermischt. Funktionen im selben State im Child übersteuern Funktionen im Parent - und alle States werden vermischt. States in a child script are merged with states from the parent script. Functions in the same state in the child will override functions in the parent - and all states will be merged.

  • Das Parent hat einen State, das Child nicht : Die Parent-Funktionen in dem State werden genutzt.
  • Das Child hat einen State, das Parent nicht : Die Child-Funktionen in dem State werden genutzt.
  • Das Parent hat eine Funktion im State, das Child nicht: Die Parent-Version wird genutzt.
  • Das Child hat eine Funktion im State, das Parent nicht: Die Child-Version wird genutzt.
  • Beide haben eine Funktion im selben State: Die Child-Version wird genutzt.

Properties

Properties in einem Parent-Script verhalten sich so als wären sie Properties im Child-Script. Man kann sie jedoch im Child-Script nicht übersteuern, um etwas anderes zu tun. Wenn man so etwas versucht wird der Compiler sich beschweren.

Beispiel: <papyrusscript> Scriptname ParentScript

int Property MyProperty Auto </papyrusscript>
<papyrusscript> Scriptname ChildScript extends ParentScript

Function MyFunction()

 Debug.Trace("MyProperty = " + MyProperty)

EndFunction </papyrusscript>

Beachte dass MyProperty im Child-Script genutzt wird, als würde es dort existieren obwohl es doch im Parent existiert.

Variablen

Variablen sind private und können von anderen Scripts nicht gesehen werden, auch nicht von ihrem Parent- oder Child-Script. Wenn man eine Variable mit dem selben Namen hat, wie im Parent-Script, ist die vollständig verborgen, wenn auf die Variable im Child-Script zugegriffen wird. Die Funktion im Parent nutzt ihre eigene Variable

Beispiel: <papyrusscript> Scriptname ParentScript

int MyVar = 1

Function MyFunction()

 Debug.Trace("Parent MyVar = " + MyVar)

EndFunction </papyrusscript>
<papyrusscript> Scriptname ChildScript extends ParentScript

string MyVar = "Hello World!"

Function MyFunction()

 Debug.Trace("Child MyVar = " + MyVar)
 parent.MyFunction()

EndFunction </papyrusscript>

  • Aufruf von MyFunction auf einem Child-Script, das mit einem Objekt verbunden ist:
Child MyVar = Hello World!
Parent MyVar = 1

Beachte, dass beide Scripts nur ihre lokale Kopie der Variable sehen können


Links