Construction Set Bildschirm schwarz werden lassen

oder betrifft "DisablePlayerControls" nicht die Messages?

Soweit ich bisher sagen kann, wohl leider nicht. Ich habe schon verschiedene Abläufe probiert, doch die blöde Message kam immer. Das beste was mir bisher gelang, ist die Nachricht durch eine andere zu ersetzen.

Zu Deinem ersten Skript:

Code:
Message " " ;verhindert, dass der Spieler das AddSpell sehen kann

Du brauchst glaube ich zwei solcher leeren Messages direkt nacheinander, um die Anzeige späterer Nachrichten (für ein paar Sekunden) zu unterdrücken.

http://cs.elderscrolls.com/constwiki/index.php/Special:Search?search=message+spam&fulltext=Search

Problem hierbei: Die MessageBox wird gar nicht erst angezeigt, der Sound wird jedoch abgespielt. Beim Teleport in die Blackbox stürzt das Spiel ab. Ist mir völlig unerklärlich. Wo liegt also mein Fehler?

Ich tippe stark auf Timing-Probleme. In dem Skript passiert m.E. zuviel auf einmal. Genau kann ich es nicht sagen, da ich dergleichen noch nie mit einer Teleport-Tür gemacht habe. Doch wenn ich es richtig sehe, teleportierst Du den Spieler zu einem Ziel, welches erst im selben Frame enabled wird. Sowas ist immer für einen Absturz gut. ;) Weshalb enablest Du überhaupt die Blackbox? Die könnte doch eigentlich die ganze Zeit dort sein, unter dem Boden sieht man sie ja nicht.

Ich würde versuchen, den Ablauf zeitlich zu strecken, so dass immer wenigstens ein paar Frames zwischen den Aktionen liegen. Also z.B. zuerst die Blackbox enablen und die Messagebox anzeigen, den Transport aber erst initiieren, nachdem der Spieler die Messagebox weggeklickt hat.

Zu Deinem zweiten und dritten Skript:

Ist das mit den Timern so richtig? Das ist eine der Sachen, die ich überhaupt nicht verstehe.

Nein, da die OnActivate-Blöcke jeweils nur einmal ausgeführt werden. Die Timer-Abfragen und das Weiterschalten der "Stage" würden somit nie ausgeführt. Richtig wäre es, den zeitlichen Ablauf im GameMode-Block zu steuern, welcher durch das Aktivieren ausgelöst wird. Etwa so (ungetestet):

Code:
scn ScriptDerTriggerZoneInDerBlackbox

short stage
short doonce
float timer

begin onActivate Player

   if doonce == 0
       WGTTrigZoneInFrontONPCRef.Enable ;TriggerZone am Strand wird "enabled"
      set doonce to 1
      [B]set Stage to 1[/B]
   endif

end

begin GameMode

   if stage == 1
     Player.saa 0.0
     set stage to 2

   elseif stage == 2
     if timer > 0
        set timer to timer - GetSecondsPassed
    else
        MessageBox " " ;verhindert, dass der Spieler das AddSpell sehen kann
        MessageBox " "
        Player.AddSpell IDDerKrankheit
        set timer to 3
        set stage to 3
    endif

   elseif stage == 3
     if Timer > 0
       set Timer to Timer - GetSecondsPassed
     else
        MessageBox "Langsam kommt euer Bewusstsein zurück..."
        Player.saa 1
        set stage to 0
        Player.MoveToMarker WGTFQMarkerInFrontONPC ;Marker am Strand
      endif

   endif

end

Anm.: Die Variablenzuweisung mit set SecondsPassed to GetSecondsPassed habe ich herausgenommen. Ist so eine Angewohnheit von mir, das immer so zu machen. Hier wird es aber eigentlich nicht gebraucht, da der von GetSecondsPassed gelieferte Wert eh nur einmal pro Frame benötigt wird. Von daher muss er nicht extra zwischengespeichert werden.

Moment! Ich bin mir aber gar nicht mehr so sicher, ob es den Player überhaupt umhaut oder nur an Ort und Stelle verharren lässt und was Resistenzen ausmachen...

Soweit ich sagen kann, bewirkt Paralyze keinen Zusammenbruch. Zumindest nicht bei Anwendung auf NPCs. Die stehen dann (meistens) stocksteif in der Gegend und taummeln nur ganz leicht hin und her. Nur selten kippen sie mal um. Wie das mit etwaigen Resistenzen aussieht, müsste man in der Tat noch prüfen. Gibt es Resistenz gegen Ausdauer-Entzug?
 
  • Like
Reaktionen: Fellan
Brausebart schrieb:
Ich tippe stark auf Timing-Probleme. In dem Skript passiert m.E. zuviel auf einmal. Genau kann ich es nicht sagen, da ich dergleichen noch nie mit einer Teleport-Tür gemacht habe. Doch wenn ich es richtig sehe, teleportierst Du den Spieler zu einem Ziel, welches erst im selben Frame enabled wird. Sowas ist immer für einen Absturz gut. ;) Weshalb enablest Du überhaupt die Blackbox? Die könnte doch eigentlich die ganze Zeit dort sein, unter dem Boden sieht man sie ja nicht.

Ich würde versuchen, den Ablauf zeitlich zu strecken, so dass immer wenigstens ein paar Frames zwischen den Aktionen liegen. Also z.B. zuerst die Blackbox enablen und die Messagebox anzeigen, den Transport aber erst initiieren, nachdem der Spieler die Messagebox weggeklickt hat.

Gut, ich werde die Blackbox mit Hilfe eines vorherigen Scriptes erst "enablen". Man sieht die Blackbox zwar nicht, ich hätte sie aber trotzdem gern nicht immer da. Das sieht mit der TriggerZone ähnlich aus.
Wie gesagt, ich werde die Blackbox und TriggerZone vorher mal "enablen" lassen, damit beim Aktivieren der Tür am Ende nur der Sound, die MessageBox und der Teleport stattfinden.

Wie lasse ich denn das System so lange warten, bis die MessageBox weggeklickt wurde? Ist das nicht automatisch so, dass das Spiel beim Anzeigen einer MessageBox pausiert wird?

Nein, da die OnActivate-Blöcke jeweils nur einmal ausgeführt werden. Die Timer-Abfragen und das Weiterschalten der "Stage" würden somit nie ausgeführt. Richtig wäre es, den zeitlichen Ablauf im GameMode-Block zu steuern, welcher durch das Aktivieren ausgelöst wird. Etwa so (ungetestet):

Danke dafür, werde ich austesten.

Gibt es Resistenz gegen Ausdauer-Entzug?

Wenn die Krankheit zwangsweise vom Script auf den Spieler gelegt wird, tritt die Resistenz meines Wissens nach nicht in Kraft. Die Krankheiten, die z.B. Ratten übertragen sind über Leveled Lists geregelt, in denen wohl auch steht, wer wann wogegen resistent ist. Wird die Krankheit aber per Script auf den Spieler gelegt, ist das egal.
 
Denke noch dran, dass du den Player nicht liegend teleportieren kannst. Wird also am Strand nochmal umfallen, glaube ich...

Wie lasse ich denn das System so lange warten, bis die MessageBox weggeklickt wurde? Ist das nicht automatisch so, dass das Spiel beim Anzeigen einer MessageBox pausiert wird?

Normalerweise schon. Versuche doch zum Testen mal die MessageBox vor den Sound zu legen.
 
  • Like
Reaktionen: Fellan
Wie lasse ich denn das System so lange warten, bis die MessageBox weggeklickt wurde? Ist das nicht automatisch so, dass das Spiel beim Anzeigen einer MessageBox pausiert wird?

Doch schon. Ich bin mir bloß nicht sicher, ob das sogleich folgende Activate möglicherweise den Absturz verursacht. Allerdings sollte dann eigentlich die Messagebox noch angezeigt werden, was ja bereits nicht mehr passiert.
Ich würde testweise einmal, ähnlich wie Sandro schon vorschlug, den Sound einfach mal weglassen. Oder das Activate am Ende. Einfach um zu sehen, was eigentlich der Grund für die Probleme ist.

Sandro:
Denke noch dran, dass du den Player nicht liegend teleportieren kannst. Wird also am Strand nochmal umfallen, glaube ich...

Doch, das geht. Mache ich in meiner Mod erfolgreich. Man darf meiner Erfahrung nach nur nicht MoveTo verwenden, sondern man muss den Spieler mit SetPos an die neue Position setzen.
 
  • Like
Reaktionen: Fellan und Sandro
Schlechte Nachricht: Ich weiß nicht, wie ich einen "SetPos"-Befehl schreibe. Etwa so:

"Player.SetPos X 123 Y 456 Z 789"

???


Gute Nachricht: Die Abstürze haben absolut keinen Zusammenhang mit Scripts gehabt, sondern mit einer Inkompatibilität mit irgendeiner Mod - ich tippe auf "Imperial Furniture". "Imperial Furniture" ist aber nicht mit meiner Mod, sondern offenbar mit "UL - Imperial Isle" inkompatibel. Das werde aber später überprüfen und meine Tests solange ohne andere PIs fortsetzen. ;)



edit: Das mit SetPos funktioniert so (jedenfalls meckert das CS nicht):

Code:
Player.SetPos X, 123
Player.SetPos Y, 456
Player.SetPos Z, 789
Neues Problem: Gibt es einen Befehl, der die Rotation des Spielers angibt? Ich möchte ihn in seiner X-Achse um 170° drehen. Ist das per Script möglich? Oder kommt der Spieler so an, wie er in der Ausgangsposition, also in der Blackbox, stand?

edit2: Ich sollte mir angewöhnen, von vornherein erst das Wiki zu fragen. "SetAngle" funktioniert genauso wie "SetPos", nur eben mit der Rotation.

Außerdem gibt es einen "Rotate"-Befehl, der bestimmte Objekte pro Sekunde rotieren lässt, sodass es wie eine Animation aussieht. Das kann man bestimmt auch nochmal irgendwo verwenden.
 
Zuletzt bearbeitet:
Ich habe die letzten vier Stunden ununterbrochen an dem ... Script gearbeitet. Das Ergebnis: Nichts! Es will und will einfach nicht funktionieren.

Hier nochmal das Szenario. Es gibt drei Activators, die nacheinander aktiviert werden. Hier der Ablauf:

  1. Der Spieler aktiviert den ersten Activator
  2. MessageBox, dass der Spieler von einer Flutwelle getroffen wird
  3. [Ladebildschirm]
  4. "DisablePlayerControls"
  5. "Player.saa 0"
  6. Teleport in die Blackbox
  7. Dort zweiter Activator, der folgendes macht:
  8. Spieler wird mit Hilfe eines Zaubers umgefallen
  9. MessageBox, dass langsam das Bewusstsein zurückkommt
  10. Wartezeit von drei Sekunden, damit der Spieler auch wirklich umgefallen ist
  11. "Player.saa 1"
  12. "SetPos" an den Strand
  13. [kein Ladebildschirm!]
  14. Dort dritter Activator, der folgendes macht:
  15. Entfernung des Zaubers, Spieler steht wieder auf
  16. Wartezeit von elf Sekunden, damit der Spieler auch wirklich aufgestanden ist und sich erstmal zurechtfinden kann
  17. "EnablePlayerControls"
  18. Spieler wird sofort nach dem "EnablePlayerControls" von NPC angesprochen
Vielleicht hat ja irgendjemand Interesse, mir die drei dafür nötigen Scripts anzufertigen.

Bis hierhin: fast eine Woche Arbeit für nichts, trotzdem Danke für die, die versucht haben, zu helfen. Ich werde mir irgendwas anderes ausdenken, dass dann zwar nicht so schön aussieht, ist aber nicht zu ändern.
 
Nachtrag: Seltsamerweise scheint es jetzt zu funktionieren. Komplizierte Scripts scheinen eine Reifezeit von etwa 24 Stunden zu haben, bis sie funktionieren. Das einzige Problem ist jetzt noch, dass der Spieler mit "SetPos" nicht da landet, wo er soll und ca. 300m über der Kaiserstadt landet, nachdem er aus der Blackbox kommt. Bis hierhin war die Arbeit also anscheinend doch erfolgreich. Wie gestern bereits gesagt: Vielen Dank an alle, die geholfen haben. ;)
 
Ich war mir nicht sicher, ob SetPos in Exteriors funktioniert. Hmm, anscheinend nicht. ;) Hast Du es schon einmal mit PositionWorld versucht? Die Syntax lautet: PositionWorld x, y, z, zRot, WorldID. Das sollte den Spieler defintiv an die richtige Stelle bringen - die Frage ist nur, ob das auch im liegenden Zustand funktioniert.
 
Der Absturz bei "SetPos" hing offenbar mit dem Zauber zusammen. Irgendwie mochte es das Spiel nicht, dass ich mich mit der Krankheit bewege. Jetzt ist der Spieler am Strand kurz unsichtbar und liegt dann am Boden. Das sieht nicht weiter schlimm aus, wie ich finde. So wie es jetzt ist gefällt es mir im Grunde sehr gut, weswegen ich nach einer Woche Arbeit an 30 Sekunden Spielzeit auch aufhören werde, das ganze noch weiter verbessern. Vielleicht gegen Ende der Entwicklungszeit, jetzt will ich aber erstmal weiterkommen und die Quest beenden. ;)
 
Nein, kann man nicht. Die Befehle gibt es in Oblivion nicht mehr. Das sind Morrowind-Befehle.