Archiv verlassen und diese Seite im Standarddesign anzeigen : Skript: Timer bei OnTriggerLeave
Palim
Ich möchte erreichen dass ein Sound und ein Drehlicht beim verlassen eines Triggers, nach 7 Sekunden, abgeschaltet werden, ich habe schon etliche Varianten ausprobiert aber irgendwo ist der Wurm in meinem Skript.
Das öffnen und schliessen vom Krantor funktioniert und die Drehlichter / Sound schalten sich auch ein aber das abschalten will nicht klappen. :auh
Ohne Timergedöns funtioniert alles bestens aber ich will ja erreichen dass die Lichter und der Sound erst abschalten wenn das Tor unten ist, das dauert 7 Sekunden nach verlassen des Triggers.
Gugscht Du hier
scn MatrixVillaCraneDoorOpen
float Timer
short doOnce
begin OnTriggerEnter Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 1
MatrixCraneRef.PlayGroup Forward 1
MatrixKlaxonGlow01Ref.Enable
MatrixKlaxonLightOn01Ref.Enable
MatrixKlaxonLightOff01Ref.Disable
MatrixAlarmKlaxon01Ref.Enable
set doOnce to 0
endif
end
begin OnTriggerLeave Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 0
MatrixCraneRef.PlayGroup Backward 1
endif
if ( doOnce == 0 )
set Timer to 7
set doOnce to 1
endif
if ( Timer > 0 )
set Timer to Timer - GetSecondsPassed
else
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
endif
end
Falls jemand schon einen Blick in mein unfertiges Mod riskieren will: Hier das Fomod (http://www.r-appert.ch/fallout/Matrix.rar). :D
Das Fomod ist in ein RAR gepackt weil es sonst zu Problemen beim Download kommt. Einfach das RAR entpacken und mit dem Modmanager installieren oder das Fomod nochmal entpacken (mit beliebigem Pack-Program wie WinZip oder WinRar) und die Dateien in den Fallout-Ordner "Data" kopieren.
Timer geht nur im GameMode, da er sonst nicht läuft. Trigger = 1x Schalter.
Danke für den Tip. Ich habs nun so versucht aber das funktioniert auch nicht.
Wenn ich die IFs im GameMode nicht verschachtele schaltet die Lichter sich gar nicht ein.
Was mache ich falsch ??
scn MatrixVillaCraneDoorOpen
float Timer
short doOnce
begin OnTriggerEnter Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 1
MatrixCraneRef.PlayGroup Forward 1
MatrixKlaxonGlow01Ref.Enable
MatrixKlaxonLightOn01Ref.Enable
MatrixKlaxonLightOff01Ref.Disable
MatrixAlarmKlaxon01Ref.Enable
endif
end
begin OnTriggerLeave Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 0
MatrixCraneRef.PlayGroup Backward 1
set doOnce to 1
endif
end
begin GameMode
if ( doOnce == 1 )
set Timer to 7
if ( Timer > 0 )
set Timer to Timer - GetSecondsPassed
else
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
if ( doOnce == 1 )
set doOnce to 0
endif
endif
endif
end
Das Problem ist deine Abfrage, er geht in die doonce == 1 rein und setzt den Timer immer wieder auf 7, dadurch zählt er nicht runter.
begin GameMode
if doOnce == 1
set Timer to 7
set doonce to 2
elseif doonce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
elseif doonce == 2 && Timer <= 0
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
endif
end
Mit deinem Sound empfehle ich ein Sample mit 7 Sekunden ohne Loop, ich weis nicht, ob man Sound stoppen kann, dazu habe ich bei GECK-Home noch nie etwas gefunden. Starten geht, zum stoppen gibt es nach meinem Wissen keinen Befehl.
Wenn du Abläufe prüfen willst, setzt einfach ein player.additem f 111, 222, 333... in die entsprechenden Zeilen ein, dann siehst du gleich wo er hängen bleibt.
Hmm, irgendwie zählt er immer noch nicht richtig runter oder 2 mal.
Ich habe die Prüfungen eingebaut (rot markiert):
Beim einlogen, bzw. laden der Zelle, bekomm ich 333 (falsch).
Beim verlassen des Triggers 111 (richtig).
Kurz darauf, das Tor schliesst sich, 222 (der Countdown ist angesprungen) und gleich darauf nochmal 222 (Häh ??).
Die Lichter und der Sound bleiben an.
Wegen dem Sound: Das geht weil ich ein Sound-Objekt platziert habe das ich dann disable.
scn MatrixVillaCraneDoorOpen
float Timer
short doOnce
begin OnTriggerEnter Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 1
MatrixCraneRef.PlayGroup Forward 1
MatrixKlaxonGlow01Ref.Enable
MatrixKlaxonLightOn01Ref.Enable
MatrixKlaxonLightOff01Ref.Disable
MatrixAlarmKlaxon01Ref.Enable
endif
end
begin OnTriggerLeave Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 0
MatrixCraneRef.PlayGroup Backward 1
set doOnce to 1
endif
end
begin GameMode
if doOnce == 1
set Timer to 7
set doonce to 2
player.additem f 111
elseif doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
player.additem f 222
elseif doOnce == 2 && Timer <= 0
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 333
endif
end
111 1x, die 222 muss mehrmals kommen, das ist der Timer, 333 1x
Benutzt du das Vault Tor ? Kuck mal in den gesetzten Objekten nach, ob in deren Menüs unter Activate etwas eingetragen ist. Im Original aktivieren sich die Lichter automatisch durch das Tor das vom Schalter angeworfen wird. Gerade die Klaxon Lighst können noch Links haben, wenn du sie kopiert hast.
Ich habe es nun so geändert weil die 333 bei laden der Zelle schon kam da ja am Ende doOnce auf 0 gesetzt wird:
begin GameMode
if doOnce == 1
set Timer to 7
set doonce to 2
player.additem f 111
else
if doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
set doOnce to 3
player.additem f 222
endif
else
if doOnce == 3 && Timer == 0
player.additem f 333
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 444
endif
endif
end
333 und 444 kommen gar nicht, deswegen schalten die Lichter sich ja auch nicht aus. Da 333 und 444 nicht kommen vermute ich mal das der Timer nicht bei 0 ankommt und sich das Skript bei "if doOnce == 3 && Timer == 0" aufhängt, warum auch immer.
Es ist das Krantor wie in der Citadelle aber keine Kopie sondern neu angelegt, ebenso neu die Klaxonlichter und der Sound.
MacGyver8472
30.11.2009, 17:31
elseif muss in dem Fall zusammen geschrieben werden.
elseif <Bedingung> und else if <Bedingung> sind zwei paar Schuhe.
elseif muss in dem Fall zusammen geschrieben werden.
elseif <Bedingung> und else if <Bedingung> sind zwei paar Schuhe.
Hab ich auch schon so gemacht, funtioniert aber trotzdem nicht.
111 und 222 kommen nun je 1 mal, 333 und 444 gar nicht.
begin GameMode
if doOnce == 1
set Timer to 7
set doonce to 2
player.additem f 111
elseif doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
set doOnce to 3
player.additem f 222
elseif doOnce == 3 && Timer == 0
player.additem f 333
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 444
endif
end
MacGyver8472
30.11.2009, 20:43
Kann ja auch nicht funktionieren. Bei doOnce == 2 soll das Script 7 mal durchlaufen aber doOnce wird schon beim ersten Durchlauf auf 3 gesetzt und demzufolge springt er gar nicht mehr in den Block. Die Variablen bleiben also bei doOnce=3 und Timer=6 stehen und das trifft für keine Bedingung zu.
Das sollte gehen:
begin GameMode
if doOnce == 1
set Timer to 7
set doOnce to 2
player.additem f 111
elseif doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
player.additem f 222
if Timer == 0
player.additem f 333
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 444
endif
endif
end
Funktioniert so leider auch nicht. 1 x 111, 2 x 222, 333 und 444 nix.
Aber wenn ich richtig verstanden habe, ist der Timer keine Stopuhr im herkömmlichen Sinn, der die Sekunden abzählt, sondern lässt mit "GetSecondsPassed" jeweils 1 Sekunde verstreichen und spult das Skript, ab doOnce == 2, gemäss Timerwert, 7 mal ab !?
Dann müsste ich doch eigentlich 6 mal die 222 bekommen !? :gruebel
Was klemmt denn nun noch ?
elseif doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
player.additem f 222
if Timer == 0
player.additem f 333
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 444
endif
endif
Kenn mich da non nicht sogut mit Timern aus, aber >= 1 und dan untergeordnet == 0 zu nehmen kann nicht funktionieren - in dem Moment wo der Timer 0 ist, stimmt das >= 1 ja nicht mehr und das Script bricht ab bevors zur == 0 Abfrage kommt.
MacGyver8472
01.12.2009, 00:24
Da wird nichts pausiert und das Script läuft immer komplett in jedem Frame ab.
begin GameMode
if doOnce == 1
if Timer < 7
set Timer to Timer + GetSecondsPassed
else
set Timer to 0
set doOnce to 0
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
endif
endif
end
Irgendwie wird das Script immer kürzer :gruebel
@Stygs
Guck mal was dazwischen steht
set Timer to Timer - GetSecondsPassed
Das läuft durch wenn er Timer noch 1 ist aber wird subtrahiert und wäre dann theoretisch 0. Praktisch hab ich aber das Gefühl das damit die Millisekunden zwischen den aufrufen gemessen wird und dann ist es ein Ding der Unmöglichkeit das der Timer exakt 0 ist.
"Das läuft durch wenn er Timer noch 1 ist aber wird subtrahiert und wäre dann theoretisch 0."
Tja, aber auch ich hab da meine Zweifel ob das Ding wirklich in Sekunden oder eher im Milisekunden misst - in dem Fall wäre wohl eher ein < 1 besser als ein == 0. (bzw checken obs größer als 0 ist - wenn ja, einfach weiterhin Zeit abziehen)
elseif doOnce == 2 && Timer >= 1
set Timer to Timer - GetSecondsPassed
player.additem f 222
if Timer == 0
player.additem f 333
MatrixAlarmKlaxon01Ref.Disable
MatrixKlaxonGlow01Ref.Disable
MatrixKlaxonLightOn01Ref.Disable
MatrixKlaxonLightOff01Ref.Enable
set doonce to 0
player.additem f 444
endif
endif
Kenn mich da non nicht sogut mit Timern aus, aber >= 1 und dan untergeordnet == 0 zu nehmen kann nicht funktionieren - in dem Moment wo der Timer 0 ist, stimmt das >= 1 ja nicht mehr und das Script bricht ab bevors zur == 0 Abfrage kommt.
Habs anstatt if Timer == 0 mit if Timer >= 1 getestet. Die Prüfsummen werden der Reihe nach 1malig ausbezahlt, also läuft das Skript durch.
ABER die Klaxon und der Sound schalten sich direkt ab wenn ich den Trigger verlasse und nicht erst 7 Sekunden danach, wenn auch das Tor unten ist.
@ MacGyver8472: Deinen Vorschlag test ich morgen, bzw. später. Ich muss ins Bettchen bevor mir die Birne auf die Tastatur knallt. :D
GN8 Ihrs und Danke erstmal. :wink :grinundwech:
Timer würde ich immer <= 0 einstellen.
Leg mal einen Xmarker an, den du disabled machst, die Klaxon Lights machst du zu enable Parents.
JIHAAA, Danke MacGyver8472, Du machst Deinem Nicknamen alle Ehre. Ich schick Dir eine Ersatzrolle Klebeband. :D
Es FUNKTIONIERT. :fest1
Und Danke natürlich auch an EMOD und Stygs. :A
@ EMOD: Wie Du unten siehst hab ich nun 2 XMarker gemacht. Ist etwas eleganter so aber doch eigentlich von der Funktion her dasselbe, hatte vorhin einfach alle enable Parents auf jeweils eines von jedem Typ. Aber ist schon viel übersichtlicher mit den XMarkern. :)
scn MatrixVillaCraneDoorOpen
float Timer
short doOnce
begin OnTriggerEnter Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 1
MatrixCraneRef.PlayGroup Forward 1
MatrixAlarmXMarkerREF.Enable
MatrixNonAlarmXMarkerREF.Disable
endif
end
begin OnTriggerLeave Player
if IsActionRef player == 1
MatrixCraneRef.setOpenState 0
MatrixCraneRef.PlayGroup Backward 1
set doOnce to 1
endif
end
begin GameMode
if doOnce == 1
if Timer < 7
set Timer to Timer + GetSecondsPassed
else
set Timer to 0
set doOnce to 0
MatrixAlarmXMarkerREF.Disable
MatrixNonAlarmXMarkerREF.Enable
endif
endif
end
Falls jemand gucken will: Hier sind die Dateien (http://www.r-appert.ch/fallout/Matrix.rar)
Alles zusammen ist ziemlich gross, das liegt aber daran dass ich vieles kopiert und neu texturiert habe.
Wenn der Innenausbau fertig ist werde ich dann einen eigenen Thread dazu machen.
Edit: und hier der Beweis (http://www.youtube.com/watch?v=2Zf7E0SFv8c) :P
auf YouTube
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.