Oblivion:Janus-Effekt (Zwei Eigenschaften eines Objektes).: Unterschied zwischen den Versionen

Aus Skript-Wiki
Wechseln zu: Navigation, Suche
K
K
Zeile 24: Zeile 24:
 
Bild:BastardBlade1H.png
 
Bild:BastardBlade1H.png
 
Bild:BastardBlade2H.png
 
Bild:BastardBlade2H.png
<gallery>
+
</gallery>
 +
 
  
 
=== Script ===
 
=== Script ===

Version vom 17. September 2008, 18:20 Uhr

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

 

  

       



    {{#if: Inventar | }} {{#if: Level 3 Scripts | }}