Oblivion:Einführung Scriptzauber: Unterschied zwischen den Versionen

Aus Skript-Wiki
Wechseln zu: Navigation, Suche
K
K
 
Zeile 5: Zeile 5:
  
 
=== Blocktypen ===
 
=== Blocktypen ===
'ScriptEffectStart' - Dieser Block wird genau einmal(!) als erstes ausgeführt, wenn der Zauber auf ein Ziel trifft
+
'ScriptEffectStart' - Dieser Block wird genau einmal(!) als erstes ausgeführt, wenn der Zauber auf ein Ziel trifft
 
'ScriptEffectUpdate' - Dieser Block wird jeden Frame, den der Zauber wirkt, ausgeführt (auch in denselben wie ScriptEffectStart) und ScriptEffectEnd)
 
'ScriptEffectUpdate' - Dieser Block wird jeden Frame, den der Zauber wirkt, ausgeführt (auch in denselben wie ScriptEffectStart) und ScriptEffectEnd)
 
'ScriptEffectEnd' - Dieser Block wird wieder genau einmal ausgeführt, wenn der Zauber endet
 
'ScriptEffectEnd' - Dieser Block wird wieder genau einmal ausgeführt, wenn der Zauber endet
 
+
 
 
Wie muss man sich das praktisch vorstellen? Wenn man im [[Oblivion:Spell Window|Spell Window]] seinen Zauber mit dem jeweiligen Scripteffect erstellt hat, kann man u.a. auch die Dauer einstellen. Wenn man Dauer 0 hat, heißt das, das diese 3 Blöcke genau einmal durchlaufen werden. Bei einer Dauer > 0 wird der Start- und Endblock jeweils einmal durchlaufen und die ganze Zeit dazwischen der Updateblock.
 
Wie muss man sich das praktisch vorstellen? Wenn man im [[Oblivion:Spell Window|Spell Window]] seinen Zauber mit dem jeweiligen Scripteffect erstellt hat, kann man u.a. auch die Dauer einstellen. Wenn man Dauer 0 hat, heißt das, das diese 3 Blöcke genau einmal durchlaufen werden. Bei einer Dauer > 0 wird der Start- und Endblock jeweils einmal durchlaufen und die ganze Zeit dazwischen der Updateblock.
  
Zeile 32: Zeile 32:
  
 
begin scripteffectstart
 
begin scripteffectstart
set target to getself
+
  set target to getself
target.placeatme melon 0 0 200
+
  target.placeatme melon 0 0 200
 
end</tesscript>
 
end</tesscript>
 
Aha, statt irgendwelchen langweiligen Zaubern fällt dem Ziel jetzt eine Melone auf den Kopf! Vielleicht nicht ungeheuer hilfreich, aber es soll verdeutlichen, dass man die Scripts wie normale Scripts behandeln kann, also es kann alles rein, was in anderen Scripts auch steht.
 
Aha, statt irgendwelchen langweiligen Zaubern fällt dem Ziel jetzt eine Melone auf den Kopf! Vielleicht nicht ungeheuer hilfreich, aber es soll verdeutlichen, dass man die Scripts wie normale Scripts behandeln kann, also es kann alles rein, was in anderen Scripts auch steht.
Zeile 50: Zeile 50:
  
 
begin Scripteffectstart
 
begin Scripteffectstart
set Me to getself
+
  set Me to getself
switch.activate me
+
  switch.activate me
set questID.person to me
+
  set questID.person to me
set hp to getbaseav health
+
  set hp to getbaseav health
messagebox "Lebenspunkte: %.0f" hp
+
  messagebox "Lebenspunkte: %.0f" hp
 
end</tesscript>
 
end</tesscript>
 
Das sieht jetzt etwas wie sinnlos aneinandergereihte Befehle aus (ist es auch mehr oder weniger), aber zeigt erstmal etwas Wesentliches: durch getself kriegt man jetzt die refID des [[ob:NPC|NPCa]]heraus, diese kann man gleich weiter verwerten, indem man z.B. von genau diesen [[ob:NPC|NPC]] einen Schalter aktivieren lässt. Oder man speichert die RefID in einem Questscript.
 
Das sieht jetzt etwas wie sinnlos aneinandergereihte Befehle aus (ist es auch mehr oder weniger), aber zeigt erstmal etwas Wesentliches: durch getself kriegt man jetzt die refID des [[ob:NPC|NPCa]]heraus, diese kann man gleich weiter verwerten, indem man z.B. von genau diesen [[ob:NPC|NPC]] einen Schalter aktivieren lässt. Oder man speichert die RefID in einem Questscript.
Zeile 66: Zeile 66:
  
 
begin scripteffectstart
 
begin scripteffectstart
addscriptpackage dosomething
+
  addscriptpackage dosomething
evp
+
  evp
 
end
 
end
 
</tesscript>
 
</tesscript>
Zeile 99: Zeile 99:
  
 
begin scripteffectstart
 
begin scripteffectstart
set questname.target to getself
+
  set questname.target to getself
set questname.zpos to getpos z
+
  set questname.zpos to getpos z
set questname.rotation to getange z
+
  set questname.rotation to getange z
 
end
 
end
 
</tesscript>
 
</tesscript>
 +
  
 
== Links ==
 
== Links ==
Zeile 109: Zeile 110:
 
* [[:Kategorie:Zauber|Zauber]]
 
* [[:Kategorie:Zauber|Zauber]]
 
* [[Oblivion:Magic Effect Scripts|Magic Effect Scripts]]
 
* [[Oblivion:Magic Effect Scripts|Magic Effect Scripts]]
 +
* [[Oblivion:Questvariablen nutzen|Questvariablen nutzen]]
  
  

Aktuelle Version vom 19. Mai 2009, 15:06 Uhr

Thema

Die Kategorie der Scriptzauber oder auch Magic Effect Scripts ist eigentlich die Neuerung schlechthin im Scriptingbereich im Bezug zu Morrowind. Denn Scriptzauber sind unheimlich vielseitig und lassen sich auf fast jedes Objekt in Oblivion anwenden.

Als allererstes muss man wissen, dass Scriptzauber nicht ganz wie normale Scripts geschrieben werden. Siehe Magic Effect Scripts. Das Wesentliche ist, dass man das ganze im Scriptfenster als Magic Effect deklarieren muss und nicht Object Script, und dass man nicht die normalen Blocktypen benutzen darf, sondern eigens dafür gemachte:

Blocktypen

'ScriptEffectStart' - Dieser Block wird genau einmal(!) als erstes ausgeführt, wenn der Zauber auf ein Ziel trifft

'ScriptEffectUpdate' - Dieser Block wird jeden Frame, den der Zauber wirkt, ausgeführt (auch in denselben wie ScriptEffectStart) und ScriptEffectEnd) 'ScriptEffectEnd' - Dieser Block wird wieder genau einmal ausgeführt, wenn der Zauber endet

Wie muss man sich das praktisch vorstellen? Wenn man im Spell Window seinen Zauber mit dem jeweiligen Scripteffect erstellt hat, kann man u.a. auch die Dauer einstellen. Wenn man Dauer 0 hat, heißt das, das diese 3 Blöcke genau einmal durchlaufen werden. Bei einer Dauer > 0 wird der Start- und Endblock jeweils einmal durchlaufen und die ganze Zeit dazwischen der Updateblock.

Jedoch kann man immernoch MenuMode und GameMode-Blöcke mit einbauen. Diese werden auch normal abgearbeitet, wie bei jedem anderen Object-Script (aber logischerweise auch nur solange, wie der Zauber wirkt).

Funktionsweise von Scriptzaubern

Sagen wir, der Spieler feuert einen selbsterstellten Zauber mit Scripteffekt irgendwo in die Gegend. Der Zauber trifft auf einen NPC. Nun wird das Script wird auf den NPC übertragen, ungefähr so, wie wenn man im CS dem NPC ein Script zuweist, jedoch ganz automatisch.

Jetzt läuft das Script 'auf' dem NPC ab. Das Script denkt und handelt also so, wie als wenn es schon immer dem NPC zugewiesen ist, obwohl dieser NPC evtl. in Wirklichkeit gar kein Script hat!


Möglichkeiten

Was man alles mit Scriptzaubern grundsätzlich machen kann, soll hier erläutert werden:

Scriptzauber als Zauber

Klar, wie der Name schon sagt, sind sie ürsprünglich als Zauber gedacht, mit dem kleinen Bonus, dass man nicht nur normale Zaubereffekte zur verfügung hat (wie Feuerschaden usw.), sondern eigene scripten kann. Das sieht dann ungefähr so aus:

<tesscript> scn melonsmash

ref target

begin scripteffectstart

  set target to getself
  target.placeatme melon 0 0 200

end</tesscript> Aha, statt irgendwelchen langweiligen Zaubern fällt dem Ziel jetzt eine Melone auf den Kopf! Vielleicht nicht ungeheuer hilfreich, aber es soll verdeutlichen, dass man die Scripts wie normale Scripts behandeln kann, also es kann alles rein, was in anderen Scripts auch steht.

Scriptzauber zum Herausfinden von RefIDs und Eigenschaften anderer Objekte

Herausfinden von RefIDs, werdet ihr fragen, das geht doch einfach in jedem Script mit GetSelf, GetActionRef oder z.B. auch GetParentRef. Jaja, schon richtig, aber normalerweise

kann man dabei nur die RefID des Objektes auf dem das Script liegt, seinen Parent oder den, der es aktiviert hat, herausfinden.

Scriptzauber können nahezu jede RefID und andere Informationen über das getroffene Objekt herausfinden, z.B. so: <tesscript> scn ActivateThingys

ref Me float hp

begin Scripteffectstart

  set Me to getself
  switch.activate me
  set questID.person to me
  set hp to getbaseav health
  messagebox "Lebenspunkte: %.0f" hp

end</tesscript> Das sieht jetzt etwas wie sinnlos aneinandergereihte Befehle aus (ist es auch mehr oder weniger), aber zeigt erstmal etwas Wesentliches: durch getself kriegt man jetzt die refID des NPCaheraus, diese kann man gleich weiter verwerten, indem man z.B. von genau diesen NPC einen Schalter aktivieren lässt. Oder man speichert die RefID in einem Questscript. Genausogut kann man sich auch alle Daten von dem NPC anzeigen lassen, wie die Lebenspunkte usw... Und das geht alles, obwohl der NPC normalerweise kein Script hat!

Scriptzauber zur Steuerung von NPCs

Scriptzauber eignen sich auch hervorragend zur Massenmanipulation. Man muss nicht immer an die selbstverständlichen Aufgaben von Zaubern denken, wenn man von Scriptzaubern spricht. Damit lassen sich auch dynamische Prozesse steuern. Als Beispiel kann man anbringen, dass die Dorfbewohner, welche Martin vor dem Sturm auf das Obliviontor zujubeln kein eigenes Script haben, das ihnen sagt, was sie zu tun haben. Es wird ein Scriptspell mit einem Effektradius von einigen tausend Einheiten gewirkt, welcher den NPCs sagt, dass sie sich vor der Kirche zu versammeln haben. Ähnliche Dinge kann man selber auch ohne großen Aufwand mit Scriptzaubern machen. Dazu würde schon das Script hier reichen: <tesscript> scn massmanipulation

begin scripteffectstart

  addscriptpackage dosomething
  evp

end </tesscript>

Gültigkeit von Scriptzaubern

Scriptzauber haben viele Vorzüge, jedoch muss man auch auf einiges achten, wenn man sie benutzt:

Gültige Ziele

Man sollte sich merken, dass Scriptzauber auch nicht allmächtig sind, und man jetzt locker-flockig ein paar Zauber durch die Gegend schießt und alle Dinge das machen, was man will. Scriptzauber funktionieren nur auf diesen Objekten:

Die volle Funktionsfähigkeit entfalten Scriptzauber bei 'NPCs' und 'Creatures'. Bei 'Leichen', 'Activators', 'Lights' 'Containers', 'Doors' und 'Furniture' werden die 3 Blöcke (sofern vorhanden) nur einmal durchlaufen, danach endet der Zauber, ganz einfach deswegen, weil man diesen Objekten im CS normalerweise auch keine Zauber zuordnen kann.

Bei 'Statics', 'Trees' und allen 'Items' funktionieren Scriptzauber nicht.

Probleme

Probleme treten bei der Variablenspeicherung auf. Wenn euer Zauber die Aufgabe hat, wichtige Daten über das getroffene Objekt zu sammeln, dann müsst ihr diese woanders speichern, als in dem Script des Zaubers. Solange der Zauber aktiv ist, kann er Variablen speichern wie jedes andere normale Script auch. Wenn aber der Zauber zu Ende ist, wird er sozusagen von dem getroffenen Objekt wieder gelöscht, und damit gehen auch alle Variablen verloren. Vorsicht: Die Variablen werden auch gelöscht, wenn ihr die Zelle verlasst, in der das getroffene Objekt ist. Heißt also, wenn ein NPC getroffen ist, und der Spieler in eine andere Zelle wechselt (z.b. in ein Haus geht), dann gehen auch alle gespeicherten Daten im Script verloren.

Abhilfe: Wenn es wirklich wichtige Dinge sind, die ihr über den NPC oder jedes andere getroffene Objekt erfahren wollt, so ist es am besten, diese an ein Questscript zu übertragen. Dazu muss man vorher eine Quest erstellt haben, und dieser ein Script zuordnen, welches vorzugsweise nur die Variablen beinhaltet: <tesscript> scn questvarsave

ref target float zpos float rotation </tesscript> Speichern kann man dann mit dem Zauber so: <tesscript> scn vargaterspell

begin scripteffectstart

  set questname.target to getself
  set questname.zpos to getpos z
  set questname.rotation to getange z

end </tesscript>


Links


Weitere Scripts aus dieser Kategorie

  

    Level 2

         



    {{#if: Scriptzauber | }} {{#if: Level_1_Scripts | }}