Oblivion:Janus-Effekt (Zwei Eigenschaften eines Objektes).: Unterschied zwischen den Versionen
Keris (Diskussion | Beiträge) K (Die Seite wurde neu angelegt: {{Subst:Scriptseite}}) |
Keris (Diskussion | Beiträge) K |
||
Zeile 1: | Zeile 1: | ||
== Thema == | == Thema == | ||
+ | Häufig ist das Problem, einem Objekt im Inventar zwei unterschiedliche (und manchmal sich widersprechende) Eigenschaften zuweisen zu müssen, es also einen Janus-Effekt hat. ([[wikipedia:de:Ianus|Janus]] ist der römische Gott mit den zwei Gesichtern) | ||
+ | Meist ist dies Problem scipttechnisch aufwendig oder gar nicht lösbar. | ||
+ | |||
+ | Eine Möglichkeit ist, dass man nicht etwa mit viel Aufwand zwei Eigenschaften für ein Objekt verwaltet sondern '''zwei''' unterschiedliche Objekte mit den jeweils gewünschten Eigenschaften erzeugt und die dann je nach Anforderung im Inventar tauscht. | ||
+ | |||
== Anwendung == | == Anwendung == | ||
=== Aufgabenstellung === | === Aufgabenstellung === | ||
+ | Der Spieler soll beim Anlegen eines Schwerts entscheiden, ob er es als Ein- oder Zweihänder nutzen will. | ||
+ | |||
=== Theorie === | === Theorie === | ||
+ | Schwerter sind in ihrer Anwendung (genauer in der zugehörigen Animation der Benutzung) als Einhänder oder Zweihänder festgelegt. | ||
+ | |||
+ | Auch Rüstungen und Kleidung (Amulette z.B.) können unterschiedlich sein. Sie können z.B. unterschiedliche Verzauberungen tragen. Es empfiehlt sich, einmal im [[ob:Object Window| Object Window]] zu schauen, wie sich gleich aussehende Objekte unterscheiden können. | ||
+ | |||
== Realisierung == | == Realisierung == | ||
=== Umgebung === | === Umgebung === | ||
+ | Es existieren zwei neue Objekte (ein Einhänder mit EditorID Bastard1H und ein vom Aussehen her gleicher Zweihänder mit EditorID Bastard2H), davon ist eines (und nur eines!) im Inventar. Aus optischen Gründen bekommen natürlich beide Objekte den gleichen Namen, damit sind sie im Inventar nicht zu unterscheiden. Auch die weiteren Eigenschaften wie Wert, Gewicht usw. sind angeglichen. | ||
+ | |||
+ | [[Bild:BastardBlade1H.png]] [[Bild:BastardBlade2H.png]] | ||
+ | |||
=== Script === | === Script === | ||
+ | |||
+ | <tesscript>scn WaffeBastardScript | ||
+ | ;Written by keris | ||
+ | ; 17.09.2007 | ||
+ | |||
+ | short Button | ||
+ | short DoOnce | ||
+ | short Timer | ||
+ | |||
+ | Begin onEquip player | ||
+ | ;onEquip will not run when an item is equipped via script using the EquipItem function | ||
+ | |||
+ | MessageBox "Wollt Ihr das Schwert als Ein- oder Zweihänder benutzen?", "Einhänder", "Zweihänder" | ||
+ | set DoOnce to 1 | ||
+ | end | ||
+ | |||
+ | Begin onUnequip | ||
+ | set DoOnce to 0 | ||
+ | end | ||
+ | |||
+ | Begin gamemode | ||
+ | set Button to GetButtonPressed | ||
+ | if DoOnce == 1 | ||
+ | set DoOnce to 2 | ||
+ | if Button == -1 | ||
+ | Return | ||
+ | elseif Button == 0 | ||
+ | if player.GetEquipped Bastard2H ; the wrong blade is equipped | ||
+ | Message " " | ||
+ | Message " " | ||
+ | Player.AddItem Bastard1H 1 | ||
+ | Player.EquipItem Bastard1H | ||
+ | set DoOnce to 3 | ||
+ | set Timer to 10 | ||
+ | endif | ||
+ | elseif Button == 1 | ||
+ | if player.GetEquipped Bastard1H ; the wrong blade is equipped | ||
+ | Message " " | ||
+ | Message " " | ||
+ | Player.AddItem Bastard2H 1 | ||
+ | Player.EquipItem Bastard2H | ||
+ | set DoOnce to 3 | ||
+ | set Timer to 10 | ||
+ | endif | ||
+ | endif | ||
+ | endif | ||
+ | |||
+ | if DoOnce == 3 ; the script part for the wrong equipped blade | ||
+ | if Timer > 0 | ||
+ | set Timer to Timer -1 ; wait 10 Frames for the RemoveMe to avoid crashes | ||
+ | else | ||
+ | RemoveMe ; the object will go and the script too. | ||
+ | endif | ||
+ | endif | ||
+ | end | ||
+ | </tesscript> | ||
+ | |||
+ | |||
=== Handhabung === | === Handhabung === | ||
+ | |||
+ | Auf beiden Objekten (Bastard1H, Bastard2H) liegt das Script. An dieser Realisierung ist deutlich erkennbar, dass zwei! Scripte laufen (auch wenn sie gleich aussehen), die jeweils eine Referenz verwalten. Es wird nicht aus der Sicht des Players gearbeitet oder aus der Sicht des Inventars, sondern jeweils aus der Sicht '''eines''' Schwertes (Bin ich da? Bin ich richtig? Bleibe ich oder tausche ich mit dem Kumpel und verschwinde?). Die beiden dürfen sich auch nicht irgendwie ins Gehege kommen. Glücklicherweise hilft hier, dass das EquipItem per Script keinen OnEquip-Block startet. Damit hat das zweite Schwert (das ggf. angelegt werden muss) eine einfache scripttechnische Eigenschaft, die ausgenutzt wird. | ||
+ | |||
== Weiterführende Hinweise== | == Weiterführende Hinweise== | ||
+ | |||
+ | * [[:Kategorie:Timer|Timer]] | ||
+ | * [[ob:RemoveMe|RemoveMe]] | ||
+ | |||
+ | {{ Scriptkategorie |Inventar|Level 3 Script}} |
Version vom 17. September 2008, 18:07 Uhr
Inhaltsverzeichnis
Thema
Häufig ist das Problem, einem Objekt im Inventar zwei unterschiedliche (und manchmal sich widersprechende) Eigenschaften zuweisen zu müssen, es also einen Janus-Effekt hat. (Janus ist der römische Gott mit den zwei Gesichtern) Meist ist dies Problem scipttechnisch aufwendig oder gar nicht lösbar.
Eine Möglichkeit ist, dass man nicht etwa mit viel Aufwand zwei Eigenschaften für ein Objekt verwaltet sondern zwei unterschiedliche Objekte mit den jeweils gewünschten Eigenschaften erzeugt und die dann je nach Anforderung im Inventar tauscht.
Anwendung
Aufgabenstellung
Der Spieler soll beim Anlegen eines Schwerts entscheiden, ob er es als Ein- oder Zweihänder nutzen will.
Theorie
Schwerter sind in ihrer Anwendung (genauer in der zugehörigen Animation der Benutzung) als Einhänder oder Zweihänder festgelegt.
Auch Rüstungen und Kleidung (Amulette z.B.) können unterschiedlich sein. Sie können z.B. unterschiedliche Verzauberungen tragen. Es empfiehlt sich, einmal im Object Window zu schauen, wie sich gleich aussehende Objekte unterscheiden können.
Realisierung
Umgebung
Es existieren zwei neue Objekte (ein Einhänder mit EditorID Bastard1H und ein vom Aussehen her gleicher Zweihänder mit EditorID Bastard2H), davon ist eines (und nur eines!) im Inventar. Aus optischen Gründen bekommen natürlich beide Objekte den gleichen Namen, damit sind sie im Inventar nicht zu unterscheiden. Auch die weiteren Eigenschaften wie Wert, Gewicht usw. sind angeglichen.
Script
<tesscript>scn WaffeBastardScript
- Written by keris
- 17.09.2007
short Button short DoOnce short Timer
Begin onEquip player
;onEquip will not run when an item is equipped via script using the EquipItem function
MessageBox "Wollt Ihr das Schwert als Ein- oder Zweihänder benutzen?", "Einhänder", "Zweihänder" set DoOnce to 1
end
Begin onUnequip
set DoOnce to 0
end
Begin gamemode set Button to GetButtonPressed
if DoOnce == 1 set DoOnce to 2 if Button == -1
Return
elseif Button == 0 if player.GetEquipped Bastard2H ; the wrong blade is equipped Message " "
Message " "
Player.AddItem Bastard1H 1 Player.EquipItem Bastard1H set DoOnce to 3
set Timer to 10
endif elseif Button == 1 if player.GetEquipped Bastard1H ; the wrong blade is equipped Message " "
Message " "
Player.AddItem Bastard2H 1 Player.EquipItem Bastard2H
set DoOnce to 3 set Timer to 10
endif endif
endif
if DoOnce == 3 ; the script part for the wrong equipped blade
if Timer > 0 set Timer to Timer -1 ; wait 10 Frames for the RemoveMe to avoid crashes
else RemoveMe ; the object will go and the script too. endif
endif
end </tesscript>
Handhabung
Auf beiden Objekten (Bastard1H, Bastard2H) liegt das Script. An dieser Realisierung ist deutlich erkennbar, dass zwei! Scripte laufen (auch wenn sie gleich aussehen), die jeweils eine Referenz verwalten. Es wird nicht aus der Sicht des Players gearbeitet oder aus der Sicht des Inventars, sondern jeweils aus der Sicht eines Schwertes (Bin ich da? Bin ich richtig? Bleibe ich oder tausche ich mit dem Kumpel und verschwinde?). Die beiden dürfen sich auch nicht irgendwie ins Gehege kommen. Glücklicherweise hilft hier, dass das EquipItem per Script keinen OnEquip-Block startet. Damit hat das zweite Schwert (das ggf. angelegt werden muss) eine einfache scripttechnische Eigenschaft, die ausgenutzt wird.
Weiterführende Hinweise
Weitere Scripts aus dieser Kategorie
Level 1
- Oblivion:Anzahl bestimmter Items
- Oblivion:Inventar komplett ablegen
- Oblivion:Items hinzufügen/ entfernen
{{#if: Inventar | }}
{{#if: Level 3 Script | }}