The Elder Scrolls III: Morrowind - Scriptkurs
2. Inventar-Scripte
Im letzten Teil haben wir die Funktion OnActivate kennengelernt. So wie man mit OnActivate viele Interaktionen des Spielers mit seiner Umwelt feststellen kann, gibt es auch Möglichkeiten verschiedene Interaktionen mit dem Inventar zu erkennen. In vielen fällen ist das zwar sehr viel komplizierter als man sich vielleicht vorstellt, in anderen aber auch sehr leicht. Was OnActivate für die Umgebung des Spielers ist, ist in gewisser Weise die Funktion OnPCEquip für das Inventar.
Um OnPCEquip verwenden zu können, muss man es zuvor als lokale Variable short OnPCEquip deklarieren.
Die Wirkung von "OnPCEquip" hängt vom Typ des Gegenstands ab, auf dem ein Script liegt.
Kategorie 1; ausrüstbare Gegenstände: Rüstungen, Waffen, Kleidung, tragbare Lichter, Dietriche, Sonden
OnPCEquip wird auf 1 gesetzt, wenn der Spieler den Gegenstand ausrüstet (auf sein Charakterbild im Inventar zieht oder per Hotkey benutzt).
Die Variable wird beim ABLEGEN automatisch auf 0 zurückgesetzt, kann aber auch von Hand zurückgesetzt werden, via set OnPCEquip to 0.
Ansonsten bleibt ihr Wert 1.
Code:
Begin IdV_EquipTest_equipable
; Armor, Weapons, Clothing, Lights, Picks, Probes
short OnPCEquip
short IsEquiped
if ( OnPCEquip )
if ( IsEquiped == 0 )
MessageBox "Equiped"
set IsEquiped to 1
endif
endif
if ( IsEquiped )
if ( OnPCEquip == 0 )
MessageBox "Un-Equiped"
set IsEquiped to 0
endif
endif
End
Kategorie 2; sonstige Gegenstände: alles unter Misc Item im Objekfenster des CS, außer geladenen Seelensteinen
OnPCEquip wird auf 1 gesetzt, wenn der Spieler den Gegenstand ausrüstet und wird nicht automatisch zurückgesetzt, sondern bleibt 1. Man muss dies also von Hand tun oder alles im OnPCEquip Block wird jeden Frame ausgeführt.
Code:
Begin IdV_EquipTest_misc
short OnPCEquip
if ( OnPCEquip )
MessageBox "Equiped"
set OnPCEquip to 0
endif
End
Bei geladenen Seelensteinen bleibt OnPCEquip auch beim ausrüsten 0, es aber eine andere Funktion mit der man das Benutzen eines Seelensteins erkennen kann.
Kategorie 3; allen anderen Inventargegenständen: Zutaten, Tränke, Alchemie-Apparaten, Reparturwerkzeug, Bücher/schriftrollen
OnPCEquip funktioniert nur in verbindung mit PCSkipEquip.
short PCSkipEquip muss ebenfalls als lokale Variable deklatiert werden. Und kann dann auf 1 gesetzt werden.
Wenn PCSkipEquip gleich 1 ist, dann verhält sich ein Gegenstand wie ein Misc-Item.
Code:
Begin IdV_EquipTest_else
short OnPCEquip
short PCSkipEquip
set PCSkipEquip to 1
if ( OnPCEquip )
MessageBox "Equiped"
set OnPCEquip to 0
endif
End
Das lässt zwar die OnPCEquip Funktion korrekt auslösen macht den Gegenstand aber nutzlos, denn er kann so nicht mehr benutzt oder verbraucht werden. Das lässt sich zwar auch wieder umgehen, benötigt aber ein weiteres (globales) Script und ist uns im Moment noch zu kompliziert.
Funktioniert nicht bei geladenen Seelensteinen.
Ein weiteres Problem ist, dass Gegenstände, die ein Script tragen sich nicht mehr im Inventar stapeln lassen, was sehr hässlich aussehen kann.
Man kann PCSkipEquip natürlich auch ohne OnPCEquip verwenden und somit verhindern dass der Spieler einen bestimmten Gegenstand verwendet.
Eine besonderheit von PCSkipEquip ist, dass es bei Büchern beim Ausrüsten (= Lesen) auf 1 gesetzt wird (was bei allen anderen Gegenständen scheinbar nicht passiert).
Code:
Begin IdV_BookActivate
short PCSkipEquip
if ( PCSkipEquip )
MessageBox "Gelesen"
set PCSkipEquip to 0
endif
End
Dies gilt nicht für Bücher die aus der Welt heraus gelesen werden, was sich aber durch OnActivate feststellen lässt.
Bei Büchern kann man mit OnActivate drei verschiedene Aktionen festellen: Den Versuch das Buch mit der Maus ins geöffnete Inventar zu ziehen, Lesen (Benutzen) in der Welt und das anklicken von 'nehmen' beim Lesen.
Der 'Activate' Befehl hingegen erzwingt immer lesen.
Dies bedeutet man muss mit 'OnActivate' auf Büchern SEHR vorsichtig sein, da man sonst einen Gegenstand erschafft den man nicht mehr aufheben kann falls man ihn einmal ablegt. Hier ist zum Beispiel ein Script das verhindert, dass man ein Buch aufheben kann, es wurde von Dave Humphrey entdeckt:
Code:
Begin DontPickMeUp_Simple
if ( OnActivate )
Activate
endif
End
Es gilt also festzustellen ob das Buch bereits gelesen wird oder jemand nur versucht es in das Inventar zu ziehen. Um diese Ereignisse abzufangen, brauchen wir folgende Funktionen:
MenuMode
Gibt 1 zurück, wenn irgendein Menü geöffnet ist. Dies betrifft das Spielmenü (Esc-Taste), Inventar, Dialoge, Messageboxen, Wartezeiten beim Schlafen und Reisen, Bücher lesen sowie Alchemie-Menüs etc., gilt aber nicht für eine auf dem HUD fixierte Karte.
return
Wenn man return aufruft, wird jeglicher Code unterhalb davon für den momentanen Frame ignoriert. Bereits durchlaufener Code wird NICHT rückgängig gemacht.
häufige verwendung:
Code:
if ( Menumode )
return
endif
Aufgaben
1) Probiert die Beispiel-Scripte aus, weißt sie unpassenden Objekten zu und seht euch an was passiert.
2) Erschafft eine tragbare Uhr, die dem Spieler beim Ausrüsten die Zeit anzeigt.
3) Erschafft ein Buch, aus dem beim ersten lesen ein Schlüssel fällt und dabei einen Tagebucheintrag erstellt.
4) Erschafft ein Schwert, das der Spieler nur tragen kann wenn er einen bestimmten Tagebucheintrag hat, zum Beispiel den von oben.
Tipps: am anspruchsvollsten ist 3), es gilt hier aber eigentlich nur den Inhalt der Beispielscripte in eine "sinnvolle" Reihenfolge zu bringen (und euer wissen aus den vorherige Lektionen anzuwenden)
Zuletzt bearbeitet von einem Moderator: