Problem Papyrus: Zeitdifferenz berechnen wäre das irgendwie zu lösen ?

Daimonicon

Neuankömmling
Hallo,

da es ja eigentlich kaum etwas gibt das man nicht berechnen kann frag ich hier einfach mal ob jemand vll. ne Idee hat.

Ich hab für ein Event eine gewissen Zeitspanne (fHourToEnable = 19.0 / fHourToDisable = 5.0). Momentan hab ich es so gelöst das eine Schleife durchlaufen wird bis die aktuelle Spielstunde der Vorgabe entspricht.

Gäbe es ne Möglichkeit die Differenz zwischen Aktueller Stunde zu Vorgabe auszurechnen ? So das ich das Script pausieren könnte und die Schleife nicht unnötig oft durchlaufen wird oder ggf. überflüssig wird ?

WaitGameTime(Differenz) o.ä
 
Hallöchen, :)
ich nehme mal an du kommst auf diese Frage, weil du eine Lichtquelle (Laterne) an- bzw ausschalten magst? :)
In deinem Fall bräuchtest du dann einen der RegisterForSingleUpdate-Befehle, denn mit diesem Befehlen kannst du ein Zeitevent auslösen. Entweder Real- oder Gamezeit.
Beispiel: "Skript, sage mir in 30 'Game-Minuten bescheid!"
Der Befehl dazu wäre dann RegisterForSingleUpdateGameTime(0.5) zum Beispiel ausgeführt in der OnInit-Funktion.
Nach 30 Game-Minuten, wird dann die Funktion OnUpdateGameTime() ausgeführt.

Und in deinem Fall hat sogar schon jemand dieses Skript programmiert (mit Erklärung zu finden unter: http://www.creationkit.com/Light_Switch) und zwar so:

Code:
ScriptName TimedLightSwitch extends ObjectReference
{Controls a set of lights with a master enable parent marker with this
script attached to turn on and off at the times of the day specified
by the properties LightsOffTime and LightsOnTime}
 
float Property LightsOffTime = 7.0 auto
{The time at which lights should be turned off}
float Property LightsOnTime = 18.0 auto
{The time at which lights should be turned on}
 
float Function GetCurrentHourOfDay() global
{Returns the current time of day in hours since midnight}
 
	float Time = Utility.GetCurrentGameTime()
	Time -= Math.Floor(Time) ; Remove "previous in-game days passed" bit
	Time *= 24 ; Convert from fraction of a day to number of hours
	Return Time
 
EndFunction
 
Function RegisterForSingleUpdateGameTimeAt(float GameTime)
{Registers for a single UpdateGameTime event at the next occurrence
of the specified GameTime (in hours since midnight)}
 
	float CurrentTime = GetCurrentHourOfDay()
	If (GameTime < CurrentTime)
		GameTime += 24
	EndIf
 
	RegisterForSingleUpdateGameTime(GameTime - CurrentTime)
 
EndFunction
 
Event OnInit()
 
	If (GetCurrentHourOfDay() > LightsOffTime)
		GoToState("LightsOff")
	Else
		GoToState("LightsOn")
	EndIf
 
EndEvent
 
State LightsOff
 
	Event OnBeginState()
		Disable()
		RegisterForSingleUpdateGameTimeAt(LightsOnTime)
	EndEvent
 
	Event OnUpdateGameTime()
		GoToState("LightsOn")
	EndEvent
 
EndState
 
State LightsOn
 
	Event OnBeginState()
		Enable()
		RegisterForSingleUpdateGameTimeAt(LightsOffTime)
	EndEvent
 
	Event OnUpdateGameTime()
		GoToState("LightsOff")
	EndEvent
 
EndState

Liebe Grüße
 
Hey ho :)


Nicht ganz ich wollte gerne einen Actor platzieren und zwar nur (Nachts) bzw. wenns allgemein Dunkel ist. Meine Werte wären somit 19:00 - 05:00 Uhr wo der Actor quasi aktiv sein könnte. Momentan halt mit ner Schleife gelöst die immer wieder prüft ob die gewünschte Zeitrange erreicht ist. Beim blossen testen funktioniert das auch ganz gut - Jedoch spring ich immer von Savegame (GameHour ~8:30) mit (set gamehour to 19) zur Zielzeit.

Im tatsächlichen Einsatz wird die Schleife dann wohl verdammt oft durchlaufen - Daher mein Gedanke das Script dann ggf. etwas zu pausieren.

Hilft mir das Lichtscript da trotzdem ? Vieleicht sehe ich vor lauter Zeitangaben die Lösung nicht mehr :huh:



Ah ich glaube ich hab nen Möglichen Weg ;)

ausgehend von SpielzeitAktuell=8 und fHourToEnable=19


If SpielzeitAktuell < fHourToEnable
WaitGameTime(fHourToEnable - SpielzeitAktuell) ; 11 Ingame-Stunden warten
elseif SpielzeitAktuell >= fHourToEnable || SpielzeitAktuell < fHourToDisable
; Zeitrange ok also Fortfahren
endif

Das müsste doch eigentlich gehen oder ? Ok vermutlich müsste ich die Wartezeit beim testen weglassen - Das Script wartet dann wohl auch wirklich 11 Ingame-Stunden ungeachtet meiner Konsoleneingabe "set gamehour to x".
 
Zuletzt bearbeitet von einem Moderator:
Hi,
und japs, mit den richtigen Befehlen, würde das dann so funktionieren wie unten beschrieben.
Viel Spaß dann beim Modden und ausprobieren
Liebe Grüße
:bye: