Oblivion:Zellwechsel des Spielers erkennen
Inhaltsverzeichnis
Thema
Wie kann man den Zellwechsel des Spielers oder auch eines NPSc erkennen?
Manchmal muss man rausfinden ob der Spieler die Zelle wechselt, z.B. wenn man sein Eigenes Musiksystem in seinen Zellen haben will.
Anwendung
Aufgabenstellung
Es muss erkannt werden wann der Spieler die Zelle wechselt, es soll dann eine Nachricht angezeigt werden.
Theorie
Wir erstellen uns ein kleines Item oder ein Objekt, dessen Größe wir im Render Window sehr sehr klein machen. Dazu stellen wir für das Item eine Persistent ReferenceID "ZellWechselFlyRef" ein.
Wozu das ganze?
Weil es leider keinen Befehl gibt, der abfragt, ob der Spieler die Zelle wechselt, sondern nur GetInSameCell, müssen wir etwas erfinderisch werden. Und in dem Moment kommt unser ZellWechselFly-Objekt zum Einsatz. Diese wird immer per <tesscript>MoveTo player</tesscript> zum Spieler bewegt. Und zwar immer, wenn die Abfrage <tesscript>ZellWechselFlyREF.GetInSameCell player </tesscript> den Wert 0 hat, oder in anderen Worten wenn das Objekt nicht in der gleichen Zelle wie der Spieler ist. Wenn der Spieler die Zelle verlässt wird die GetInSameCell Abfrage 0 ausgeben. Das heißt umgekehrt: Wenn <tesscript>if ZellWechselFlyREF.GetInSameCell player == 0
- Spieler hat die Zelle gewechselt"
</tesscript>
Probleme
Es werden nicht nur "Der Spieler geht durch eine Tür in eine andere Zelle" - Zellwechsel erkannt. Bei dieser Methode wird auch ein Zellwechsel Im Exterior Bereich erkannt, also wenn man sich von einem Quad ins nächste bewegt. Um das zu unterscheiden werden wir noch den Befehl IsInInterior benutzen.
Realisierung
Umgebung
Wir erstellen ein neues Item, geben dem Item die Persistent Reference ID "ZellwechselFly" und machen das Objekt sehr klein.
Script
<tesscript> scn ZellwechselErkennen
- written by sinHHHans
short drinnen
Begin Gamemode if player.IsInInterior == 1 && drinnen == 0 set drinnen to 1 elseif player.IsInInterior == 0 && drinnen == 1 set drinnen to 0 endif
if player.GetInSameCell ZellWechselFlyREF == 0 && drinnen == 1 message "Zellwechsel im Interior" ZellWechselFlyREF.moveto player elseif player.GetInSameCell ZellWechselFlyREF== 0 && drinnen == 0 if ZellWechselFlyREF.IsInInterior == 1 message "Zellwechsel nach Exterior" ZellWechselFlyREF.moveto player elseif ZellWechselFlyREF.IsInInterior == 0 message "Zellwechsel innerhalb Exterior" ZellWechselFlyREF.moveto player endif endif End </tesscript>
Handhabung
Das Skript wird als Questskript laufen und im HIntergrund immer wieder prüfen ob der Spieler die Zelle verlässt.