Skyrim:Unterschiede zur vorherigen Scripterstellung: Unterschied zwischen den Versionen

Aus Skript-Wiki
Wechseln zu: Navigation, Suche
K (Die Seite wurde neu angelegt: =='''Was ist neu?'''== Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch ...)
 
K
Zeile 1: Zeile 1:
=='''Was ist neu?'''==
+
='''Was ist neu?'''=
 
Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch die Einführung erweiterter Funktionalität und flexibilität gibt es jedoch viele signifikante Änderungen in Syntax und Workflow sowie gelegentlich in der Funktionalität. Diese Seite ist für Leute, die mit den Konzepten eine Scriptsprache vertraut sind und ein bischen darüber wissen, was Pypyrus ist. Falls das für dich nicht zutrifft, lies bitter erst die [[sk:Papyrus Introduction|Einführung in Papyrus]].  
 
Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch die Einführung erweiterter Funktionalität und flexibilität gibt es jedoch viele signifikante Änderungen in Syntax und Workflow sowie gelegentlich in der Funktionalität. Diese Seite ist für Leute, die mit den Konzepten eine Scriptsprache vertraut sind und ein bischen darüber wissen, was Pypyrus ist. Falls das für dich nicht zutrifft, lies bitter erst die [[sk:Papyrus Introduction|Einführung in Papyrus]].  
  
 
Eine technisch und detailierte Erkläfung der neuen Scriptsprache bietet die  [[:Category:Papyrus_Language_Reference|Papyrus Sprachreferenz]].
 
Eine technisch und detailierte Erkläfung der neuen Scriptsprache bietet die  [[:Category:Papyrus_Language_Reference|Papyrus Sprachreferenz]].
  
===Neue Konzepte===
+
==Neue Konzepte==
 
Die neue Scriptsprache bietet mehr möglichkeiten. Dies bedeutet, dass die Menge dessen, was du über die neue Scriptsprache wissen musst, anwachsen wird.  Auf der Habenseite steht, dass bestimmte Ergänzungen der Scriptsprache dafür sorgen, dass Dinge viel schneller und leichter zu machen sind. Unter diesen neuen Ergänzungen sind es eigene Funktionen zu machen, die Möglichkeit, Timer zu nutzen, Schleifenlogik und Zustand, die Möglichkeiten zur Vereinfachung des Lebens. Ich selbst habe es als so empfunden, dass es beim Scripten einfacher ist, geradlinig zu denken. Es gibt viel weniger Rück- und Vorwärtssprünge zwischen GameMode und anderen Ereignissen. Ich finde, das ich ebenfalls weniger Variablen verfolgen und enable/disablen muss.  
 
Die neue Scriptsprache bietet mehr möglichkeiten. Dies bedeutet, dass die Menge dessen, was du über die neue Scriptsprache wissen musst, anwachsen wird.  Auf der Habenseite steht, dass bestimmte Ergänzungen der Scriptsprache dafür sorgen, dass Dinge viel schneller und leichter zu machen sind. Unter diesen neuen Ergänzungen sind es eigene Funktionen zu machen, die Möglichkeit, Timer zu nutzen, Schleifenlogik und Zustand, die Möglichkeiten zur Vereinfachung des Lebens. Ich selbst habe es als so empfunden, dass es beim Scripten einfacher ist, geradlinig zu denken. Es gibt viel weniger Rück- und Vorwärtssprünge zwischen GameMode und anderen Ereignissen. Ich finde, das ich ebenfalls weniger Variablen verfolgen und enable/disablen muss.  
  
=====Ersetzen des GameModes=====
+
====Ersetzen des GameModes====
======Timer======
+
=====Timer=====
 
Im alten System bedeutete ein Event (Ereignis)  ablaufen zu lassen, dass das gesamte Script sofort und vollständig durchlaufen wurde. Wenn man nicht wollte, dass Teile des Scripts durchlaufen wurden, wurden If-Anweisungen gebraucht, mit deren Bedingungen dann Teile des Scripts ausgeklammert wurden. Wenn du Teile des Scripts später laufen lassen wolltest, musstest du mit einer Bedingung einen Timer GameMode-Block „anstellen“ getSecondsPassed laufen lassen, bis dann ein anderer Abschnitt des Scripts laufen konnte.
 
Im alten System bedeutete ein Event (Ereignis)  ablaufen zu lassen, dass das gesamte Script sofort und vollständig durchlaufen wurde. Wenn man nicht wollte, dass Teile des Scripts durchlaufen wurden, wurden If-Anweisungen gebraucht, mit deren Bedingungen dann Teile des Scripts ausgeklammert wurden. Wenn du Teile des Scripts später laufen lassen wolltest, musstest du mit einer Bedingung einen Timer GameMode-Block „anstellen“ getSecondsPassed laufen lassen, bis dann ein anderer Abschnitt des Scripts laufen konnte.
  
Zeile 17: Zeile 17:
 
;wartet 5.1 Sekunden
 
;wartet 5.1 Sekunden
 
Wait( 5.1 )  
 
Wait( 5.1 )  
</ tesscript >
+
</tesscript >
 
<br/>
 
<br/>
 
<tesscript >
 
<tesscript >
Zeile 34: Zeile 34:
 
Ersatzweise kannst du  
 
Ersatzweise kannst du  
  
< tesscript>
+
<tesscript>
 
utility.Wait(5.1)
 
utility.Wait(5.1)
 
</tesscript >  
 
</tesscript >  
Zeile 48: Zeile 48:
  
  
======Schleifen======
+
=====Schleifen=====
 
Im alten System konntest du eine Schleife konstruieren, indem du eine Reihen von IF-Anweisungen machtest und einen Zähler inkrementell änderst, bis eine bestimmte Bedingung (üblicherweise, indem der Zähler gebraucht wird) nicht mehr länger wahr ist..  
 
Im alten System konntest du eine Schleife konstruieren, indem du eine Reihen von IF-Anweisungen machtest und einen Zähler inkrementell änderst, bis eine bestimmte Bedingung (üblicherweise, indem der Zähler gebraucht wird) nicht mehr länger wahr ist..  
 
Im neuen System kann man Schleifen-Anweisungen innerhalb jedes gewünschten Events nutzen (bisher ist ein „While“ implementiert). Solange der dem While folgende Ausdruck wahr ist, läuft die Schleifen.
 
Im neuen System kann man Schleifen-Anweisungen innerhalb jedes gewünschten Events nutzen (bisher ist ein „While“ implementiert). Solange der dem While folgende Ausdruck wahr ist, läuft die Schleifen.
Zeile 60: Zeile 60:
  
  
======OnUpdate======
+
=====OnUpdate=====
 
OnUpdate ist ein Event,  dass an deine „Form“ gesendet wird, wenn und nur dann wenn es angefragt ist. Es wird in regelmäßigen Abständen gesendet, die von dir definiert werden (vergleichbar wie der Gamemode-Block bei Quests mit der Delay-Option arbeitet). Beachte, dass jedes Script, welches mit der Form verbunden ist, Update-Events empfängt. Wenn z.B. dein Queststage-Fragment für Updates angemeldet ist, empfängt dein Questscript ebenfalls die Update-Events. Damit deine Form beginnt, Update-Events zu empfangen, muss es dafür eingetragen werden.
 
OnUpdate ist ein Event,  dass an deine „Form“ gesendet wird, wenn und nur dann wenn es angefragt ist. Es wird in regelmäßigen Abständen gesendet, die von dir definiert werden (vergleichbar wie der Gamemode-Block bei Quests mit der Delay-Option arbeitet). Beachte, dass jedes Script, welches mit der Form verbunden ist, Update-Events empfängt. Wenn z.B. dein Queststage-Fragment für Updates angemeldet ist, empfängt dein Questscript ebenfalls die Update-Events. Damit deine Form beginnt, Update-Events zu empfangen, muss es dafür eingetragen werden.
  
Zeile 78: Zeile 78:
 
Wait(), kann das Abarbeiten eines einzelnen Events eine längere Zeit dauern. Das führt zu der Frage: „was passiert, wenn ich ein OnTriggerEnter-Event auslöse, bevor die Abarbeitung des vorherigen OnTriggerEnter-Event erledigt ist?“ Es stellt sich heraus, dass es einem einzigen Script  möglich ist, mehrfache Instanzen eines einzelnen Events abzuarbeiten. Um dies zu vermeiden, kannst du Status- oder Control-Variablen benutzen, um zu ändern oder abzuschalten, was passiert, wenn ein Event aufgerufen wird, bevor die Abarbeitung einer anderen Instanz des selben Events abgearbeitet ist.
 
Wait(), kann das Abarbeiten eines einzelnen Events eine längere Zeit dauern. Das führt zu der Frage: „was passiert, wenn ich ein OnTriggerEnter-Event auslöse, bevor die Abarbeitung des vorherigen OnTriggerEnter-Event erledigt ist?“ Es stellt sich heraus, dass es einem einzigen Script  möglich ist, mehrfache Instanzen eines einzelnen Events abzuarbeiten. Um dies zu vermeiden, kannst du Status- oder Control-Variablen benutzen, um zu ändern oder abzuschalten, was passiert, wenn ein Event aufgerufen wird, bevor die Abarbeitung einer anderen Instanz des selben Events abgearbeitet ist.
  
====Keywords====
+
===Keywords===
 
Es gibt ein paar Keywords (Schlüsselwörter), die aus dem einen oder anderen Grund sinnvoll sind.
 
Es gibt ein paar Keywords (Schlüsselwörter), die aus dem einen oder anderen Grund sinnvoll sind.
 
*'''None''' - dies kennzeichnet eine Referenz, die im Prinzip leer ist.
 
*'''None''' - dies kennzeichnet eine Referenz, die im Prinzip leer ist.
Zeile 95: Zeile 95:
 
*'''False''' - wird für Boolesche Werte anstelle von 0 benutzt
 
*'''False''' - wird für Boolesche Werte anstelle von 0 benutzt
  
====Misc Stuff====
+
===Verschiedenes===
 +
*Scriptvariablen können mit einem Anfangswert mit folgender Syntax initialisiert werden: "= &lt;value&gt;"
 +
 
 +
Beispiel:
 +
<tesscript>
 +
int myVar = 20
 +
</tesscript>
 +
:*Funktionsvariablen können mit einem kompletten mathematischen Ausdruck anstatt nur eines einfachen Wertes initialisiert werden.
 +
 
 +
*Scripts sind Typen – also wenn du eine besondere Scriptfunktion aufrufen willst, oder auf eine Property des Scripts zugreifen willst, musst du zuerst das Objekt, das du im Script hast, auf das Script casten, das du erwartest. 
 +
 
 +
*Casting zwischen Typen nutzen die "&lt;genericType&gt; as &lt;specificType&gt;" Syntax. Wenn du versuchst, eine Variable in etwas zu casten, was sie nicht ist, gibt es einen "None"-Wert.
 +
 
 +
Beispiel:
 +
<tesscript>
 +
Function DoFunnyDance(Actor target)
 +
  FunnyDanceScript targetScript = target as FunnyDanceScript
 +
  if targetScript != None
 +
    targetScript.doingFunnyDance = 1
 +
    targetScript.DoFunnyDance()
 +
  else
 +
    Print("kann keinen funny dance machen, weil der Actor nicht das richtige Script hat")
 +
  endIf
 +
endFunction
 +
</tesscript>
 +
 
 +
:*Alles kann als Boolean behandelt oder gecastet werden.
 +
:**Int and float: Nicht-Null-Werte sind true, Null ist false.
 +
:**Strings: nicht-leere Strings sind true, leere Strings sind false.
 +
:**Objects: nicht-none Objects sind true, none-Objecse sind false.
 +
:**Arrays: nicht-none-Arrays oder Arrays mit einem Element oder mehr sind true (sogar wenn die Elemente selbst false sind). None-Arrays oder Arrays mit 0 Elementen sind false.
 +
:*Alles kann als String gecastet werden. Zahlen werden in eine Stringdarstellung konvertiert, boolesche Variablen werden einfach zu einem "true" oder "false"-Text und Objects werden zu einem lesbaren Format, das im Detail den Scriptnamen und das aktuelle zugeordnete Ingame-Objekt enthält.
 +
:*Strings können als Zahlen gecastet werden, wenn der String eine Zahl repräsentiert.
 +
:*Wenn der Compiler automatisch und ohne die Möglichkeit eines Fehlers casten kann, wird er das tun. Die folgenden Casts werden automatisch gemacht.
 +
:**Int -> Float
 +
:**Anything -> String
 +
:**Anything -> Bool
 +
:**Object -> Parent Object
 +
*Ein Object kann nur als ein Child Object gecastet werden, wenn es gerade eines ist. Mit anderen Worten, jede Form, die auf diese Weise castet, benötigt ein angehängtes Script, das den Formeditor nutzt.
 +
*Du kannst den  "+"-Operator zum Zusammenfügen von Zeichenketten benutzen
 +
Beispiel:
 +
<tesscript>
 +
string Hello = "Hello"
 +
string World = "World"
 +
Trace(Hello + " " + World) ; schreibt  "Hello World" in das Log
 +
</tesscript>
 +
*Der "!"-Operator wurde hinzugefügt und steht für "not". Der Ausdruck "!value" ist true wenn und nur wenn value den Wert false hat.
 +
*Hexadezimal-Zahlen beginnen mit "0x" – üblicherweise sind dies FormIDs. Wenn du z.B. die FormID 00012EC7 möchtest, ist 0x00012EC7 zu benutzen (die führenden Nullen sind nicht erforderlich)
 +
*Operatoren wie  "+=" and "-=" wurden hinzugefügt. Sie funktionieren folgendermaßen:
 +
<tesscript>
 +
myNumber += 1
 +
myFloat -= 2 + 4 * player.getAV("repair")
 +
</tesscript>
 +
Ist gleichbedeutend mit:
 +
<tesscript>
 +
myNumber = myNumber + 1
 +
myFloat = myFloat - (2 + 4 * player.getAV("repair"))
 +
</tesscript>
 +
Alle mathematischen Operatoren haben vergleichbare Versionen: +=, -=, *=, /=, and %=
 +
 
 +
 
  
  
 +
{{Übersetzung|ckwiki|Differences from Previous Scripting}} vielen Dank dafür
 
[[Category:Papyrus]][[Category:Scripting_Wissen]]
 
[[Category:Papyrus]][[Category:Scripting_Wissen]]

Version vom 17. Februar 2012, 18:36 Uhr

Was ist neu?

Papyrus, die neue Scriptsprache, ähnelt in vieler Hinsicht der alten Scriptsprache, die in den Spielen von Bethesda Game Studios. Bedingt durch die Einführung erweiterter Funktionalität und flexibilität gibt es jedoch viele signifikante Änderungen in Syntax und Workflow sowie gelegentlich in der Funktionalität. Diese Seite ist für Leute, die mit den Konzepten eine Scriptsprache vertraut sind und ein bischen darüber wissen, was Pypyrus ist. Falls das für dich nicht zutrifft, lies bitter erst die Einführung in Papyrus.

Eine technisch und detailierte Erkläfung der neuen Scriptsprache bietet die Papyrus Sprachreferenz.

Neue Konzepte

Die neue Scriptsprache bietet mehr möglichkeiten. Dies bedeutet, dass die Menge dessen, was du über die neue Scriptsprache wissen musst, anwachsen wird. Auf der Habenseite steht, dass bestimmte Ergänzungen der Scriptsprache dafür sorgen, dass Dinge viel schneller und leichter zu machen sind. Unter diesen neuen Ergänzungen sind es eigene Funktionen zu machen, die Möglichkeit, Timer zu nutzen, Schleifenlogik und Zustand, die Möglichkeiten zur Vereinfachung des Lebens. Ich selbst habe es als so empfunden, dass es beim Scripten einfacher ist, geradlinig zu denken. Es gibt viel weniger Rück- und Vorwärtssprünge zwischen GameMode und anderen Ereignissen. Ich finde, das ich ebenfalls weniger Variablen verfolgen und enable/disablen muss.

Ersetzen des GameModes

Timer

Im alten System bedeutete ein Event (Ereignis) ablaufen zu lassen, dass das gesamte Script sofort und vollständig durchlaufen wurde. Wenn man nicht wollte, dass Teile des Scripts durchlaufen wurden, wurden If-Anweisungen gebraucht, mit deren Bedingungen dann Teile des Scripts ausgeklammert wurden. Wenn du Teile des Scripts später laufen lassen wolltest, musstest du mit einer Bedingung einen Timer GameMode-Block „anstellen“ getSecondsPassed laufen lassen, bis dann ein anderer Abschnitt des Scripts laufen konnte.

Im neuen Systen kannst du latente Funktionen nutzen (so wie die Wait() Funktion), um das Scipt zeitweise pausieren zu lassen. Wenn die Pause vorbei ist (das wird üblicherweise irgndewon von dir definiert) wird das Script wieder anfangen zu laufen und an genau an der unterbrochenen Stelle weitermachen.

Einige latente Funktionen: <tesscript>

wartet 5.1 Sekunden

Wait( 5.1 ) </tesscript >
<tesscript >

Dies spielt eine Animation und wartet dann auf ein Animations-Event um fortzusetzen
Dies Animations-Event wird durch die Havok-Verhaltensweise des Akteurs ausgelöst.

PlayAnimationAndWait( "AnimationName", "EventName" ) </tesscript >

Beachte bitte, dass du die Utility-Library am Anfang deines Scripts importieren musst, <tesscript > import utility </tesscript > wenn du Wait() benutzen willst.


Ersatzweise kannst du

<tesscript> utility.Wait(5.1) </tesscript >

ohne etwas zu importieren eingeben.


♥ und danke an unsere Freunde bei Bethesda für solche ein wunderbares Spiel und beeindruckendes Creation Kit!


• Hinweis: du kannst Libraries Game and Debug ebenfalls laden, so dass du zum Beispiel nur getplayer() und messageBox("happy msg") statt game.getPlayer() und debug.messageBox eingeben musst.


Schleifen

Im alten System konntest du eine Schleife konstruieren, indem du eine Reihen von IF-Anweisungen machtest und einen Zähler inkrementell änderst, bis eine bestimmte Bedingung (üblicherweise, indem der Zähler gebraucht wird) nicht mehr länger wahr ist.. Im neuen System kann man Schleifen-Anweisungen innerhalb jedes gewünschten Events nutzen (bisher ist ein „While“ implementiert). Solange der dem While folgende Ausdruck wahr ist, läuft die Schleifen.

<tesscript> While counter <= 100  ;mache etwas 100 mal

    ...
    counter += 1        ;Kurzform für "counter = counter + 1"

EndWhile </tesscript >


OnUpdate

OnUpdate ist ein Event, dass an deine „Form“ gesendet wird, wenn und nur dann wenn es angefragt ist. Es wird in regelmäßigen Abständen gesendet, die von dir definiert werden (vergleichbar wie der Gamemode-Block bei Quests mit der Delay-Option arbeitet). Beachte, dass jedes Script, welches mit der Form verbunden ist, Update-Events empfängt. Wenn z.B. dein Queststage-Fragment für Updates angemeldet ist, empfängt dein Questscript ebenfalls die Update-Events. Damit deine Form beginnt, Update-Events zu empfangen, muss es dafür eingetragen werden.

<tesscript > RegisterForUpdate(10.0) ;frage alle 10 Sekunden nach Updates </tesscript > Wenn du nicht länger Updates empfangen möchtest, melde dich ab: <tesscript > UnregisterForUpdate() </tesscript > Wenn du ändern möchtest, wie oft dir Updates gesendet werden, melde dich einfach mit der neuen Zeitspanne neu an.

Bitte schau in der OnUpdate-Beschreibung nach, denn dort befinden sich einige Warnungen, von denen ein Scripter Kenntnis haben sollte.

Ein Script durchläuft mehrere Instanzen des selben Events

Events, wie OnActivate, liefen in einem einzigen Frame. Nach der Einführung von Multithreading, Schleifen und latenten Funktionen wie Wait(), kann das Abarbeiten eines einzelnen Events eine längere Zeit dauern. Das führt zu der Frage: „was passiert, wenn ich ein OnTriggerEnter-Event auslöse, bevor die Abarbeitung des vorherigen OnTriggerEnter-Event erledigt ist?“ Es stellt sich heraus, dass es einem einzigen Script möglich ist, mehrfache Instanzen eines einzelnen Events abzuarbeiten. Um dies zu vermeiden, kannst du Status- oder Control-Variablen benutzen, um zu ändern oder abzuschalten, was passiert, wenn ein Event aufgerufen wird, bevor die Abarbeitung einer anderen Instanz des selben Events abgearbeitet ist.

Keywords

Es gibt ein paar Keywords (Schlüsselwörter), die aus dem einen oder anderen Grund sinnvoll sind.

  • None - dies kennzeichnet eine Referenz, die im Prinzip leer ist.

<tesscript> refVariable01 = GetLinkedRef() if refVariable01 != None

   ;mache etwas mit refVariable01 weil GetLinkedRef() etwas zurück gegeben hat

endif </tesscript>

  • Self - eine Variable, die auf die derzeitige Instanz des Scripts verweist. Es ist mit der getself-Funktion aus der alten Scriptsprache vergleichbar nur gibt es die Referenz des Scripts und nicht die Referenz des Objekts, auf dem das Script läuft.
  • Parent - ein besonderes Keyword, das man beim Aufruf einer Funktion benutzen kann, um sicher zu stellen, dass du die Funktion aufrufst, die als Funktion in einem Parent-Script definiert ist und nicht die Funktion im lokalen Script.
  • Hidden - verbirgt ein Script oder eine Property vor dem Editor
  • Conditional - markiert ein Script oder eine Variable als sichtbar für das Conditional-System. Beachte, dass das Script für alle Variablen innerhalb als conditional markiert sein muss, damit es sichtbar ist. Du darfst nur ein Conditional-Script zur Zeit mit einem Objekt verbinden.
  • True - wird für Boolesche Werte anstelle von 1 benutzt
  • False - wird für Boolesche Werte anstelle von 0 benutzt

Verschiedenes

  • Scriptvariablen können mit einem Anfangswert mit folgender Syntax initialisiert werden: "= <value>"

Beispiel: <tesscript> int myVar = 20 </tesscript>

  • Funktionsvariablen können mit einem kompletten mathematischen Ausdruck anstatt nur eines einfachen Wertes initialisiert werden.
  • Scripts sind Typen – also wenn du eine besondere Scriptfunktion aufrufen willst, oder auf eine Property des Scripts zugreifen willst, musst du zuerst das Objekt, das du im Script hast, auf das Script casten, das du erwartest.
  • Casting zwischen Typen nutzen die "<genericType> as <specificType>" Syntax. Wenn du versuchst, eine Variable in etwas zu casten, was sie nicht ist, gibt es einen "None"-Wert.

Beispiel: <tesscript> Function DoFunnyDance(Actor target)

 FunnyDanceScript targetScript = target as FunnyDanceScript
 if targetScript != None
   targetScript.doingFunnyDance = 1
   targetScript.DoFunnyDance()
 else
   Print("kann keinen funny dance machen, weil der Actor nicht das richtige Script hat")
 endIf

endFunction </tesscript>

  • Alles kann als Boolean behandelt oder gecastet werden.
    • Int and float: Nicht-Null-Werte sind true, Null ist false.
    • Strings: nicht-leere Strings sind true, leere Strings sind false.
    • Objects: nicht-none Objects sind true, none-Objecse sind false.
    • Arrays: nicht-none-Arrays oder Arrays mit einem Element oder mehr sind true (sogar wenn die Elemente selbst false sind). None-Arrays oder Arrays mit 0 Elementen sind false.
  • Alles kann als String gecastet werden. Zahlen werden in eine Stringdarstellung konvertiert, boolesche Variablen werden einfach zu einem "true" oder "false"-Text und Objects werden zu einem lesbaren Format, das im Detail den Scriptnamen und das aktuelle zugeordnete Ingame-Objekt enthält.
  • Strings können als Zahlen gecastet werden, wenn der String eine Zahl repräsentiert.
  • Wenn der Compiler automatisch und ohne die Möglichkeit eines Fehlers casten kann, wird er das tun. Die folgenden Casts werden automatisch gemacht.
    • Int -> Float
    • Anything -> String
    • Anything -> Bool
    • Object -> Parent Object
  • Ein Object kann nur als ein Child Object gecastet werden, wenn es gerade eines ist. Mit anderen Worten, jede Form, die auf diese Weise castet, benötigt ein angehängtes Script, das den Formeditor nutzt.
  • Du kannst den "+"-Operator zum Zusammenfügen von Zeichenketten benutzen

Beispiel: <tesscript> string Hello = "Hello" string World = "World" Trace(Hello + " " + World) ; schreibt "Hello World" in das Log </tesscript>

  • Der "!"-Operator wurde hinzugefügt und steht für "not". Der Ausdruck "!value" ist true wenn und nur wenn value den Wert false hat.
  • Hexadezimal-Zahlen beginnen mit "0x" – üblicherweise sind dies FormIDs. Wenn du z.B. die FormID 00012EC7 möchtest, ist 0x00012EC7 zu benutzen (die führenden Nullen sind nicht erforderlich)
  • Operatoren wie "+=" and "-=" wurden hinzugefügt. Sie funktionieren folgendermaßen:

<tesscript> myNumber += 1 myFloat -= 2 + 4 * player.getAV("repair") </tesscript> Ist gleichbedeutend mit: <tesscript> myNumber = myNumber + 1 myFloat = myFloat - (2 + 4 * player.getAV("repair")) </tesscript> Alle mathematischen Operatoren haben vergleichbare Versionen: +=, -=, *=, /=, and %=



vielen Dank dafür