PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Skript: Timer bei OnTriggerLeave



Papi62
29.11.2009, 05:45
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.

EMOD
29.11.2009, 13:18
Timer geht nur im GameMode, da er sonst nicht läuft. Trigger = 1x Schalter.

Papi62
29.11.2009, 16:15
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

EMOD
29.11.2009, 18:44
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.

Papi62
29.11.2009, 22:08
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

EMOD
30.11.2009, 08:25
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.

Papi62
30.11.2009, 16:05
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.

Papi62
30.11.2009, 19:41
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

Papi62
30.11.2009, 23:23
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 ?

Stygs
01.12.2009, 00:20
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.

Stygs
01.12.2009, 00:39
"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)

Papi62
01.12.2009, 04:11
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:

EMOD
01.12.2009, 09:51
Timer würde ich immer <= 0 einstellen.

Leg mal einen Xmarker an, den du disabled machst, die Klaxon Lights machst du zu enable Parents.

Papi62
01.12.2009, 21:31
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