PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer Funktioniert nicht.



Yoas
13.06.2011, 15:52
Momentan hab ich echt ein problem und zwar, funktioniert mein Script nicht so wie er sollte. Denn ich will ein spezieller timer Für einen Terminal. nur funktioniert der nicht... why ever! hab den grund noch nicht herausgefunden weshalb das ganze nicht klappt...

hab auch schon mit einem schalter herum experementiert, dort klappt allein der timer nicht "die objecte" werden sofort freigeschaltet sprich enabled.

hier der Script:

scn timerTestScript

Float Timer
Short DoOnce

short Opened
Begin OnActivate Player
set timer to getSecondsPassed + 10
Activate
End

Begin GameMode
If Opened == 0 && GetSecondsPassed >= timer
arenadoor01.setopenstate 1

Set Opened To 10
Activate
EndIf
End

PS; zu beginn, ist immer eine tür offen, die ich eigentlich geschlossen haben will.

Carnatics
13.06.2011, 16:58
also zu der offenen tür kann ich dir folgendes erklären
klicke sie doppelt an und gleich im ersten fenster das aufgeht steht ganz unten (wo man verschiedene häckchen setzten kann in der mitte "open by default" mach da den hacken raus

scn timerTestScript

Float Timer
Short DoOnce

short Opened
Begin OnActivate Player
set timer to getSecondsPassed + 10
Activate
End

Begin GameMode
If Opened == 0 && GetSecondsPassed >= timer
arenadoor01.setopenstate 1

Set Opened To 10
Activate
EndIf
End

okay das mit den timer befehlen kommt mir komisch vor
zb.

set timer to getSecondsPassed + 10<---sicher das da ein plus sein muss ?

und

"If Opened == 0"<--müsste doch "if openstate == 3" heißen

und

If Opened == 0 && GetSecondsPassed >= timer
arenadoor01.setopenstate 1 <---warum sagst du dem script das es"bildlich gesprochen" die türe öffnen soll wenn sie ungeöffnet ist ?
sprich das if opened kann da ja wohl weg
und mit dem "ist grösser als" symbol sagst du dem script wenn mehr zeit vergangen ist als der timer hat soll er die türe öffnen ?
sollte doch so aussehen

If Openstate == 1 && GetSecondsPassed >= timer
arenadoor01.setopenstate 3


Set Opened To 10 <---und was soll das bewirken ? kann doch weg weil die türe ja von selbst schliesstalso

EndIf
End
und wenn sie von selbst öffnen soll da einfach die 1 und die 3 vertauschen


legende
0 = none (not a door)
1 = open
2 = opening
3 = closed
4 = closing

Boïndil
13.06.2011, 17:02
Dein Zähler macht keinen Fortschritt, das is das Problem. Entweder muss er runter oder rauf zählen, bis er einen Wert erreicht.
GetSecondsPassed gibt dir die Zeit seit dem letzen Script-Aufruf zurück, das ist keine absolute Zeit wie GameDaysPassed.

Ich verwende immer den Zähler hier:


If fTimer >= 4
; Do Someting
set fTimer to 0
Else
set fTimer to fTimer + GetSecondsPassed
EndIf

Aaaaaimbot
14.06.2011, 10:27
Um Gottes willen, mach das "Begin OnActivate Player" weg und ersetz es durch ein "Begin OnActivate". Wenn es nur für den Spieler gelten soll, dann bau noch ein "IsActionRef player == 1" ein. Aber ein "OnActivate Player" geht nicht richtig! Der Compiler schluckt es zwar, wirken tut es aber wie ein "OnActivate"!

Yoas
15.06.2011, 12:01
also:

short Opened
Begin OnActivate Player
set timer to getSecondsPassed + 10
Activate
End

Begin GameMode
If Opened == 0 && GetSecondsPassed >= timer
arenadoor01.setopenstate 1

Set Opened To 1
EndIf
End

besser so ? mit dem timer hab ich echt grad mühe, da der beim terminal verlinkt sein soll doch das funktioniert ja überhaupt nicht.

Boïndil
15.06.2011, 12:28
Wie wäre es hiermit?


short OpenDoor
float fTimer
Begin OnActivate
If IsActionRef Player
Set OpenDoor To 1
Activate
Else
Set OpenDoor To 0
EndIf
End

Begin GameMode
If OpenDoor == 1
If fTimer >= 4
arenadoor01.setopenstate 1
Set OpenDoor To 0
set fTimer to 0
Else
set fTimer to fTimer + GetSecondsPassed
EndIf


EndIf
End

Yoas
15.06.2011, 12:59
das mit der tür ist so eine sache. :/

meine idee ist das nach dem timer je eine tür geöffnet wird "also der timer soll sich max 3" x wieder holen mit je einer anderen tür.

hier n beispiel wie aussieht; bild (http://s3.imgimg.de/uploads/fall7814807ajpg.jpg)

Carnatics
15.06.2011, 20:32
dann setz doch für türe 2 als referenz die türe eins und für türe 3 die referenz türe 2 ins script
so gehen sie nacheinander auf wenn der player als referenz von türe eins diese auch aktiviert...

Yoas
16.06.2011, 12:09
kennt jemand n tipp wie ich diesen script "bug" umgehen kann? kann nämlich diese scripts nicht abspeichern "echt ätzend"

Boïndil
16.06.2011, 13:05
Es gibt nach meinem Wissen keinen Bug, der Scripte nicht abspeichern lässt. Das ist so gewollt, weil keine fehlerhaften Scripte gespeichert werden dürfen.
Ein Fehler ist es hingegen, dass man keine Meldungen mehr über die Fehlerquelle kriegt und den gibt es im NV-GECK.

Hier gibt es eine Erweiterung für das GECK, der eigentlich Pflicht sein sollte:
http://www.ravenmodding.terminal47.net/?p=725

Yoas
29.06.2011, 15:31
wie siehts denn aus wenn ich zwei timer in einem script haben will? muss ich dann erneut;

Begin GameMode
If OpenDoor == 1
If fTimer >= 2
ArenadoorKanal01.setopenstate 0
ArenadoorKanal01.lock 1000
Set OpenDoor To 0
set fTimer to 0
Else
set fTimer to fTimer + GetSecondsPassed
endif
end

Begin GameMode
If fTimer >= 5
...... etc machen?

Boïndil
29.06.2011, 15:44
Dann könntest du sie mit fTimer1 und fTimer2 benennen.

Yoas
29.06.2011, 16:09
Begin GameMode
If fTimer2 >= 5
....
...
set fTimer2 to 0
Else
set fTimer to fTimer + GetSecondsPassed
endif
end

funktioniert irgendwie nicht "es sei denn ich hab da wiedermal was falsches verstanden"

Boïndil
29.06.2011, 17:10
Jeder Timer muss natürlich für sich zählen.

If fTimer1 >= 5
....
...
set fTimer1 to 0
Else
set fTimer1 to fTimer1 + GetSecondsPassed
endif

If fTimer2 >= 5
....
...
set fTimer2 to 0
Else
set fTimer2 to fTimer2 + GetSecondsPassed
endif

Yoas
29.06.2011, 17:22
Warum zum teufel kommt jetzt wieder diese meldung "current = SCN scriptname" .. dachte es sei richtig...

Yoas
30.06.2011, 19:59
weshalb klappt das nicht?

scn timerTestScript

short OpenDoor
float Timer
float fTimer1

Begin OnActivate
If IsActionRef Player
Set OpenDoor To 1
Activate
Else
Set OpenDoor To 0
EndIf
End

Begin GameMode
If OpenDoor == 1
If Timer >= 2
ArenadoorKanal01.setopenstate 0
ArenadoorKanal01.lock 1000
Set OpenDoor To 0
set Timer to 0
Else
set Timer to Timer + GetSecondsPassed
endif

If fTimer1 >= 3
arenadoor01.setopenstate 1
arenagreenlight01.disable
arenaalarm.enable
set fTimer1 to 0
Else
set fTimer1 to fTimer1 + GetSecondsPassed

EndIf


EndIf
End

Boïndil
01.07.2011, 18:41
Ich weiss auch nicht, wieso das nicht geht. Hast du das Fehler-Modul für das GECK aus meinem Link installiert? Existieren diese Objekte?

Yoas
01.07.2011, 19:05
ja diese objecte existieren. und den patch hab ich ebenfalls installiert.

Galerion
01.07.2011, 19:16
SCN TimerOpenDoors

; -------------

short Next
float TimerOpenDoor
float TimerCloseDoor

; -------------

Begin OnActivate Player ; diesee Begin Block funktioniert auf jeden fall ... habe ich schon zig mal verwendet
if (Next == 0)
Activate ; Aktiviert schalter (Animation)
Set Next to 1
EndIf
End

; -------------

Begin GameMode
If (Next == 1)
set TimerOpenDoor to TimerOpenDoor + GetSecondsPassed ;Timer zaehlt hinauf
If (TimerOpenDoor >= 2) ; nach zwei sekunden
ArenadoorKanal01.setopenstate 0 ;wird die türe geschlossen
ArenadoorKanal01.lock 255 ; 255 ist das höchste und versperrt.
Set TimerOpenDoor to 0 ; muss unbedingt vor Set Next to 2 stehen
Set Next to 2
Endif
Endif
End

; -------------

Begin Gamemode
if (Next == 2)
set TimerCloseDoor to TimerCloseDoor + GetSecondsPassed ;Timer zaehlt hinauf
If (TimerCloseDoor >= 3) ; nach drei sekunden
arenadoor01.setopenstate 1 ; wird diese Türe geöffnet
arenagreenlight01.disable ; Licht disabled
arenaalarm.enable ; und sound enabled
Set TimerCloseDoor to 0 ; Timer wird wieder auf 0 gesetzt
Set Next to -1 ; Wenn du diesen hier auf 0 setzt kann der script nochmal abgespielt werden
Endif
Endif
End


Ich weiß leider nicht genau, was du mit deinem Script bezwecken willst, also dieser script schließt die erste Türe nach zwei sekunden und öffnet die dritte nach 3 sekunden.

Yoas
01.07.2011, 19:24
die idee: wenn man den schalter "terminal" aktiviert hat soll folgendes passieren;

die tür, die du gerade durchgegangen bist. schliesst sich.
nach 9 sec öffnet sich eine tür "was raus kommt k.A"
danach eine pause von 15 sec "healing pause"
danach geht eine weitere tür auf" hingegen schliesst sich die andere, die gerade geöffnet wurde" bis die dritte und letzte tür geöffnet wird "soll ingesamt zwei durchgänge geben. und am schluss öffnet sich die erste tür wieder und man kann weiter gehn.

Galerion
01.07.2011, 20:31
SCN TimerOpenDoors

; -------------

Short Next
Float Timer

; -------------

Begin OnActivate Player ; diese Begin Block funktioniert auf jeden fall habe ich zig mal verwendet
if (Next == 0)
Activate ; Aktiviert schalter (Animation)
Set Next to 1
EndIf
End

; -------------

; Zuerst gibts du alle vier Türen eine Refenz
;Beispiel
;ZZTüreMonster01ref
;ZZTüreMonster02ref
;ZZTüreMonster03ref
;ZZTüreMonster04ref

; -------------

Begin GameMode
If (Next == 1)
ZZTüreMonster01ref.setopenstate 0 ; Die Eingangs-Türe wird geschlossen
ZZTüreMonster01ref.lock 255 ; Erfordert Schlüssel
arenagreenlight01.disable
arenaalarm.enable
Set Next to 2
Endif
End

; -------------

Begin Gamemode
if (Next == 2)
Set Timer to Timer + GetSecondsPassed
If (Timer >= 9)
TürReference02.unlock
TürReference02.setopenstate 0
Set Timer to 0
Set Next to 3
Endif
Endif
End

; -------------

; Dann gibts du am besten jeden einzelnen Monster im Raum eine Referenz
; Beispiel
;ZZMonster01ref
;ZZMonster02ref
;ZZMonster03ref
;ZZMonster04ref

; -------------

Begin Gamemode
if (Next == 3) && (ZZMonster01ref.Getdead == 1) && (ZZMonster02ref.Getdead == 1)
if (ZZMonster02ref.Getdead == 1) && (ZZMonster03ref.Getdead == 1) ; Abfrage ob alle Monster tot sind
Set Timer to Timer + GetSecondsPassed
If (Timer >= 15) ; 15 sek pause
TürReference02.setopenstate 0
TürReference02.lock 255
TürReference03.unlock
TürReference03.setopenstate 1
Set Timer to 0
Set Next to 4
Endif
Endif
Endif
End

; -------------

; Dann gibts du auch allen Monstern im Nächsten Raum eine Referenz
; Beispiel
;ZZMonster05ref
;ZZMonster06ref
;ZZMonster07ref
;ZZMonster08ref

; -------------

Begin Gamemode
if (Next == 4) && (ZZMonster05ref.Getdead == 1) && (ZZMonster06ref.Getdead == 1)
if (ZZMonster07ref.Getdead == 1) && (ZZMonster08ref.Getdead == 1) ; Abfrage ob alle Monster tot sind
Set Timer to Timer + GetSecondsPassed
If (Timer >= 15) ;wieder 15 sek pause
TürReference03.setopenstate 0
TürReference03.lock 255
TürReference04.unlock
TürReference04.setopenstate 1
Set Timer to 0
Set Next to 5
Endif
Endif
Endif
End

; -------------

; Dann gibts du wieder allen Monstern im Nächsten Raum eine Referenz
; Beispiel
;ZZMonster09ref
;ZZMonster10ref
;ZZMonster11ref
;ZZMonster12ref

; -------------

Begin Gamemode
if (Next == 5) && (ZZMonster09ref.Getdead == 1) && (ZZMonster10ref.Getdead == 1)
if (ZZMonster11ref.Getdead == 1) && (ZZMonster12ref.Getdead == 1) ; Abfrage ob alle Monster tot sind
Set Timer to Timer + GetSecondsPassed
If (Timer >= 5) ;dann wird die erste Türe die am Anfang geschlossen wurde wieder geöffnet.
TürReference04.setopenstate 0
TürReference04.lock 255
TürReference01.unlock
TürReference01.setopenstate 1
arenagreenlight01.enable
arenaalarm.disable
Set Timer to 0
Set Next to -1
Endif
Endif
Endif
End

Mach es ganz einfach so, vielleicht musste noch in jeden raum nen trigger rein machen und ne zusätzliche variable machen damit der Spieler nicht in einen der Räume eingesperrt wird.

Yoas
16.07.2011, 12:23
nun gut. bin wieder mal hier um zu jammern, weil dass zeug nicht klappt why ever.

Carnatics
17.07.2011, 14:00
ich hätte die esp ja schon lange mal irgendwo hochgeladen so das sich die helfer hier mal ein genaues bild davon machen können bzw die script vorschläge direct testen können...nur so ne idee =)

Yoas
17.07.2011, 14:20
wäre vielleicht eine idee! aber bin mir nicht so sicher... ob ich es tun soll "wegen veröffentlichung" und jedem zugänglich machen hmm.. nene dann lieber über icq labern und so.