Construction Set Bitte Hilfe bei einem Teleport-Script

Quakente

Fremdländer
Hallo zusammen,

ich spiele zwar schon seit Ewigkeiten Morrowind, habe aber erst vor sechs Wochen angefangen, Mods zu installieren und vor zwei Wochen, mir Scripte näher anzusehen. Bisher konnte ich die meisten auftretenden Probleme innerhalb einiger Tage durch Tutorials, Forenlesen und Selbstversuch lösen, aber an dem hier sitz ich jetzt schon sehr lange und weiß nicht weiter:

Ich finde die Idee des tragbaren Krughauses toll und wollte mir gern ein eigenes bauen, da mich am Original ein paar Dinge stören: 1. das Haus sieht innen ganz anders aus als außen, 2. man hat die Flasche, in der man sich gerade befindet, weiterhin im Inventar.
Meine Idee war daher eine tragbare Laterne, die man als Lichtquelle benutzen, nach dem Abstellen aber auch aktivieren und betreten kann.
Im Inneren des Hauses befindet sich dann eine Tür, die einen wieder nach draußen bringt. Ein Nachteil wäre, daß man die Laterne nach der Rückkehr stehen lassen kann, aber da könnte man als Erinnerung noch eine MessageBox schreiben.

Ich habe es von 0 Vorkenntnissen aus soweit geschafft, das Interior des Hauses zu bauen, die Mesh einer Straßenlaterne aus Balmora (die gefiel mir besser als die normalen Laternen) zu verändern, so daß man sie abstellen kann und ein Script draufzulegen, mit dem man die Laterne wahlweise einstecken oder betreten kann.
Nun hab ich folgende Probleme:

- wenn ich die Laterne nehme, hängt sie am Mauszeiger und landet erst nach nochmaligem Klicken im Inventar

- wenn ich die Laterne ausrüste, wird das zwar angezeigt, aber wenn ich das Menü dann schließe, verschwindet sie sowohl aus meiner Hand als auch aus dem Inventar, ist also futsch. Ich hab versucht, das Script auf eine Misc-Variante der Laterne zu legen, aber dann kann man sie erst gar nicht ausrüsten und sie leuchtet auch nicht mehr... Ich weiß, daß bei OnPCEquip Unterschiede zwischen tragbaren Lichtern und Misc-Items gemacht werden, aber das Ausrüsten hat ja hier gar nichts mit dem Script zu tun, oder?

- mein Rückkehr-Script, das auf einer Falltür im Interior liegt, teleportiert mich nicht zurück, sondern an die gleiche Stelle, an der mich das Teleport-Script auch absetzt. Braucht der Markierungszauber eine gewisse Zeit, um aktiv zu werden? Ich hab versucht, den Timer aus dem Krughaus-Skript einzubauen, aber dann funktionierte bei mir der Teleport nicht mehr... Oder ist das Rückkehr-Script an sich falsch?
EDIT: Wenn ich das angepaßte Krughaus-Script auf der Misc-Laterne zum Reinteleportieren benutze, funktioniert meine Falltür. Es ist wohl wirklich der Timer. Aber wie krieg ich den in mein tragbare-Laterne-Script eingebaut?

Teleport-Script:
Begin llh_Laternenhaus

short status
short button
short tp

If ( OnActivate == 1 )
MessageBox, "Die Laterne leuchtet schwächer als andere ihrer Art, aber ihr Licht ist warm und behaglich. Im Deckel befindet sich eine kleine Klappe.", "Laterne mitnehmen", "Klappe öffnen"
set status to 1
endif

if ( status == 1 )
set button to GetButtonPressed
if ( button == -1 )
return
elseif ( button == 0 )
activate
set status to 0
elseif ( button == 1 )
player->AddSpell, "llhmark"
set tp to 1
set status to 0
endif

if ( tp == 1 )
player->RemoveSpell, "llhmark"
set tp to 2
endif

if ( tp == 2 )
player->positioncell, 2890,3630,15820,270 "Laternenhaus"
set tp to 0
endif

endif

End

Rückkehr-Script:
Begin llh_Laternenhaus_raus

short status
short tp

If ( OnActivate == 1 )
set status to 1
endif

if ( status == 1 )
player->Addspell, "llhrecall"
set tp to 1
set status to 0
endif

if ( tp == 1 )
player->RemoveSpell, "llhrecall"
set tp to 0
endif
endif

End

Was muß ich ändern? Geht das überhaupt so, wie ich mir das vorstelle? Kann mir jemand weiterhelfen?

Liebe Grüße
Quakente
 
Zuletzt bearbeitet:
1.) Willkommen im Forum.
2.) Ich gehe davon aus, dass dein Post in den Script-Thread verschoben wird, also wunder dich nicht, wenn er als eigenständiges Thema verschwindet.
3.) Bei deinen Scripts ist mir aufgefallen, dass du zwar die Markierungs- und Rückkehrsprüche dem Spieler hinzugefügt hast, aber den Spieler diese Sprüche nicht ausführen lässt. Du musst also noch player->Castspell "ID" einfügen. Das Problem dabei ist mMn aber, dass du so bereits vorhandenen Markierungen überschreibst. Du könntest dies umgehen, indem du deine Koordinaten zum Zeitpunkt der Lampenaktivierung abfragst und in Variablen abspeicherst und dann dein Rückkehrscript so anpasst, dass du zu diesen Koordinaten zurückgeschickt wirst. Bei der genauen Umsetzungen können dir da aber die Profis aus dem Script-Thread besser helfen.

Edit: Sorry, falscher Cast-Befehl. Der richtige lautet: Cast "Spell-ID" player
 
Zuletzt bearbeitet:
Vielen Dank für deine Antwort und Hinweis 2.), Lyali.

3.) Die Sprüche funktionieren beide als Curse, aktivieren sich also selbst. Das hab ich so aus dem Krughaus-Script übernommen. Für sich genommen funktionieren auch beide prima, der Teleport ist nur anscheinend schon passiert, wenn die Markierung gesetzt wird. Ob sich das mit anderen Markierungen beißt, müßte ich noch ausprobieren, aber dann müßten eigentlich alle Haus-Mods dieses Problem auch haben...
 
Es beisst sich mit anderen Mark-Zaubern, da Morrowind im Standard nur einen Speicher für "Markieren" besitzt. Egal wie der Zauber benannt ist, der Effekt ist Mark und nutzt diesen Speicher.

Warum der Mark-Effekt bei deinem Script nicht funktioniert, ist eigentlich logisch. Schau es dir mal genau an:

Du setzt den Fluch, entfernst ihn und teleportierst den Spieler... alles im gleichen Frame. Das kann nicht gehen. Setze mindestens nach Aktivieren und Deaktivieren des Fluches direkt vor endif jeweils ein "return", so dass Fluchauslöser, Aufhebung und Teleport in drei Frames ablaufen. Das sollte das Problem beheben.
 
Ich hab das mit den returns gerade ausprobiert, es hat leider nicht geholfen. Damit passiert einfach gar nichts, wenn ich die Laterne anklicke. Trotzdem danke für den Vorschlag.

Das auf meine Koordinaten angepaßte Krughaus-Script funktioniert ja und sieht so aus:
Begin llh_Laternenhaus

short onpcequip
short zk
short turn

If (Turn == 0)
if (MenuMode == 1 )
return
endif

if ( onpcequip == 1 )
player->addspell "llhmark"
set onpcequip to 0
set zk to 1
endif

if (zk == 1)
player->removespell "llhmark"
set zk to 2
endif

if ( zk == 2 )
float timer
set timer to ( timer + getsecondspassed )
endif

if ( timer > 2 )

player->positioncell, 2890,3630,15820,270 "Laternenhaus"
set turn to 1
set timer to 0
set zk to 0
endif

ElseIf ( Turn == 1)

if (MenuMode == 1 )
return
endif

if ( onpcequip == 1 )
player->addspell "llhrecall"
set onpcequip to 0
set zk to 3
endif

if (zk == 3)
player->removespell "llhrecall"
set zk to 0
set turn to 0
endif
endif
endif
End

Ich würde den Timer gern in mein Script einbauen, weiß aber nicht, wie ich das genau machen muß. Die Zeilen an den entsprechenden Stellen reinkopieren hat nicht geklappt. Den hinteren Teil vom Krughaus-Script brauch ich ja nicht, da mein Recall auf einem anderen Objekt liegt, und Turn dürfte nur feststellen, ob man ins Haus rein oder aus dem Haus raus will, oder?
 
Zuletzt bearbeitet:
Soweit ich weiß, ist es nicht möglich, dass man einen neuen Markierungspunkt künstlich setzt. Das Spiel akzeptiert nur tatsächlich willentlich vom Spieler gewirkte Zauber als neuen Markierungspunkt. Zumindest war das das Problem auf das ich bei meinen Stadtportalen gestoßen bin.

Dort habe ich es auf andere Art und Weise gelöst. Die funktioniert aber nur im Freien. Wenn du genau wissen willst wie, kannst du es dir in meinem Sets und Talismane PI anschauen.
 
Wenn es mit dem adspell und curse beim Krughaus geht, dann ist das ein möglicher Workaround für das Problem mit dem Mark. Ein anderer wäre, eine eigene Potion mit dem Effekt zu generieren und den Spieler diese per Script trinken zu lassen. Das funktioniert auch. Der Knackpunkt ist wie gesagt das zu schnelle Teleportieren mit PositionCell. Ich kenne das Original-Krughaus Script nicht - das dort ein Timer eingebaut ist, hatte ich mir allerdings gedacht. So etwas in Dein Script einzubauen, sollte einfach sein - probier mal das hier:

Code:
Begin llh_Laternenhaus
float Timer
short status
short button

If ( OnActivate == 1 )
  MessageBox, "Die Laterne leuchtet schwächer als andere ihrer Art, aber ihr Licht ist warm und behaglich. Im Deckel befindet sich eine kleine Klappe.", "Laterne mitnehmen", "Klappe öffnen"
  set status to 1
endif

if ( status == 1 )
  set button to GetButtonPressed
  if ( button == -1 )
    return
  elseif ( button == 0 )
    activate
    set status to 0
  elseif ( button == 1 )
    player->AddSpell, "llhmark"
    set status to 2
    set Timer to 0*GetSecondsPassed
  EndIF
ElseIF ( status == 2 )
  player->RemoveSpell, "llhmark"
  set Timer to Timer + GetSecondsPassed
  IF ( Timer > 2 )
    set status to 3
  EndIF
ElseIF ( status == 3 )
  player->positioncell, 2890,3630,15820,270 "Laternenhaus"
  set status to 0
EndIF

End
 
  • Like
Reaktionen: Quakente
Supercool,[FONT=Times New Roman, serif] [/FONT]£exas Verbesserung hat funktioniert. Dankeschön!

Vielleicht findet sich ja auch noch jemand, der eine Idee zu den anderen beiden Problemen hat, also warum sich die Laterne im Inventar so seltsam verhält.
 
Hm, eine Lampe ist vielleicht generell keine gute Idee. Was machst du denn, wenn jemand die Lampe ausrüstet und danach ins Wasser springt? Oder wenn die Lampe ausbrennt? ;-)
 
Hi,

ich habe zwar seit Ewigkeiten nicht mehr Morrowind, gespielt und gemoddet, aber das Problem der Lampe könnte schon in der Nif begründet liegen. Da du die Strassenlaterne aus Balmoral genommen hast ist die Nif ein Static Objekt, das du wie Clutter behandelst. Soweit ich weiss nimmt der Morrowind, wie auch Oblivion das nicht an, da sich kein Static Object sich in einem Inventar befinden kann verschwindet es. Also entweder du findest jemanden der dir das umbauen kann oder du nimmst irgend ein Objekt aus dem Bereich Clutter.
 
Daß Wasser für die Laterne ein Problem wird, hab ich mir auch schon überlegt. Da hätte ich gut aufpassen müssen. Die Brenndauer hatte ich auf 0 gestellt, und bisher ist sie im Spiel nicht ausgebrannt.
Die Nif von der Laterne hatte ich in Blender verändert und unter einem neuen Namen gespeichert. Wenn da aber trotzdem eine Static-Eigenschaft irgendwie erhalten bleibt, könnte das schon sein, daß es Probleme gibt. Ich weiß nicht, denn ins Inventar bekomme ich die Lampe ja schon, ich kann sie auch immer wieder rein und raus legen, nur eben mit einem zusätzlichen Klick bein Einpacken. Nur Ausrüsten geht nicht.

Aber wie £exa schon sagt, ist eine Lampe vielleicht wirklich nicht so eine gute Idee. Ich könnte auf die Ausrüstbarkeit auch verzichten, ich hätte nur eben gern daß das Ding leuchtet. Es muß ja gar nicht wirklich hell machen. Wenn ich die als Misc-Item erstellte Version der Nif nehme, kann ich die dann irgendwie anders zum Leuchten bringen? Es gibt ja z.B. auch einen Mod, der Daedrawaffen glühen läßt, aber den hab ich nicht.
 
Leuchten im Sinne von "Glüheffekt" oder von "Licht erzeugen"? Das ist ein Unterschied. Man könnte der Mesh eine GlowMap und/oder dem Material des Lampenglases Emissive Colors verpassen, damit das Ding im Dunkeln scheinbar "glüht"... es ist dann keine Lichtquelle im originären Sinn, erscheint aber heller/strahlender als normale Objekte. Echtes Licht erzeugen kann man nur mit einem Light Object. Allerdings würde es auch gehen, einem Objekt eine unsichtbare Lichtquelle anzuheften, wenn das Teil in der Welt platziert ist und diese beim Aufsammeln via Script zu löschen. Ich hab sowas mal für meine Dwemer Desk Neon gemacht - eine an-/ausschaltbare, portable, mehrfarbige Lichtquelle, die man nicht in der Hand halten muss und die auch unter Wasser leuchtet und sogar mitkriegt, wenn man sie in einen Container schmeisst. Das Script oder besser gesagt die Scripte dafür sind allerdings alles andere als trivial...

Was das Klickproblem angeht, könnte ein dem Script vorangestelltes:

IF ( Menumode )
return
ENDIF

... helfen.
 
Das Menumode-return hat geholfen. nochmal vielen Dank.

Ja, daß richtiges Licht nur von Lichtquellen kommt, weiß ich.

...eine an-/ausschaltbare, portable, mehrfarbige Lichtquelle, die man nicht in der Hand halten muss und die auch unter Wasser leuchtet und sogar mitkriegt, wenn man sie in einen Container schmeisst
wäre natürlich ein Traum. :-D

Wie bisher demonstriert bin ich zwar lernfähig, aber eben absolut unerfahren was Scripte angeht. Wenn es für Anfänger einfacher ist, die Mesh strahlen zu lassen, wär ich auch zufrieden, wenn das Licht halbwegs nach Kerze aussieht und nicht gerade wie ein neonblauer Leuchtpilz oder so wirkt. Kannst du mir für GlowMaps und Emissive Colors ein Tutorial oder eine Anleitung empfehlen, damit ich mir das mal näher ansehen kann?
 
Nunja, am simpelsten wäre das Verhindern des Ausrüstens.

Wenn das Teil doch ausgerüstet werden soll, könnte man in dem Fall, dass die Lampe ausgerüstet wird beim Equip ein Hintergrundscript starten, das im Verlauf feststellt, ob "player->HasItemEquipped" TRUE ist. Solange das so ist, passiert nichts. Wird es FALSE und ist die Lampe nicht gedropped worden (muss mit einem Scriptabschnitt im Lampenscript festgestellt und irgendwie an das Hintergrundscript übergeben werden - z.B. über eine Globale Variable) und befindet sich die Lampe dann auch nicht im Inventar des Spielers (player->GetItemCount ist > 0), wurde sie vermutlich zerstört. In dem Fall müsste das Hintergrundscript eine neue Lampe ins Inventar des Spielers legen und sich selbst beenden. Ein Problem könnte noch bestehen, falls der Spieler eine ausgerüstete Lampe direkt in einen offenen Container schmeisst.
 
So nebenbei bemerkt- Light-Items lassen sich prima als "geheime extra-Variablen" am Player verwenden oder auch den Spieler in anderem Licht erscheinen.

Dazu mache ein Objekt Typ Light welches nicht tragbar/ausrüstbar ist.
Trotzdem lässt es sich per Player->AddItem ins Inventar bringen, Spieler kann's im Inventar aber nicht sehen, ablegen oder verkaufen.

GetItemCount liefert die Anzahl zurück. So kann man z.B. den Spieler anweisen "Töte 100 Banditen im Glottertal" und alle dortigen Banditen (verschiedene NPCs) tragen ein Script
If ( OnDeath )
Player->AddItem myBanditcounterLight 1
EndIf
An der Zahl (GetItemCount) lässt sich ablesen wie viele Banditen getötet wurden.

Radius 0 und Farbe weiss damit es nicht auffällt- Radius irgendwas und bunt lässt den Spieler leuchten. Ich hab mal sowas gemacht um Strahlenkrankheit, die man sich in Dwemer Ruinen einfangen kann zu machen. Das Vorhandensein eines bestimmten Lights im Inventar des Spielers ist ausreichend für Dialoge um NPCs sagen zu lassen "He, Ihr habt ja die Strahlenkrankheit!", welches natürlich keine gewöhnliche Krankheit und auch nicht ansteckend oder über einen simplen Zauber heilbar ist. Das Light hab ich flackern lassen so war der Spieler selbst die ganze Zeit im Dunkeln am Leuchten, Sneak und Chameleon hab ich - solange kein Menu auf war, auf 0 gesetzt, so ist es auch unmöglich gewesen sich irgendwo unbemerkt anzuschleichen.

Also: ein nicht tragbares Light kann man trotzdem - auch mehrfach- im Inventar haben, der Spieler hat keinen Zugriff darauf- egal in welchem Inventar- und es kann NPCs und Kreaturen leuchten lassen - vieleicht kann man sogar Container damit zum Glühen bringen?
 
Zuletzt bearbeitet: