User:PROXiCiDE/GetSleepStateEx

From the CreationKit Wiki
Jump to navigation Jump to search

Extended version of GetSleepState. Helpful detecting if a actor is sleeping in a interior while the player is in a exterior due to the limitation of GetSleepState. If the actor and player are both in the same location it will return the normal GetSleepState values.

Syntax[edit | edit source]

Int Function GetSleepStateEx(Actor akActor,Package akSleepPackage = None,Location akLocation = None)

Parameters[edit | edit source]

  • akActor: The actor to detect if they are sleeping.
  • akSleepPackage: AI Package that contains the Sleep information.
    • Default: None
  • akLocation : Compare the location of the Actor.
    • Default: None

Return Value[edit | edit source]

The actor's current sleep state.

  • 5 Dead, sleeping with the fishes?
  • 6 Actor has the sleep package
  • 7 Actor has the sleep package and the confirmed location

Following is returned if the actor is waking up or the package has changed during

  • 16 Sleep package has ended / expired
  • 17 Sleep package has ended / expired, actor still remains in the location

Error Codes

  • -1 Invalid Actor

Example[edit | edit source]

Int nSleepResults = GetSleepStateEx(akBalimund,pRiftenBalimundSleep0x6,pRiftenBlacksmithLocation)

;Check for both normal value of GetSleepState incase the player is same location as Actor
;else lets check for Dead or the Sleep Package
If nSleepResults == 3 || nSleepResults == 5 || nSleepResults == 7
	Debug.Trace("Actor is sleeping")
EndIf

Script[edit | edit source]

Int Function GetSleepStateEx(Actor akActor,Package akSleepPackage = None,Location akLocation = None)	
	Int iResults = -1
	
	If akActor == None
		Return iResults
	EndIf
	
	If akActor.IsDead()
		iResults = 5
	Else
		Bool bValidate = False
		
		;Detect normal sleep state
		If akActor.GetCurrentLocation().IsSameLocation(Game.GetPlayer().GetCurrentLocation())
			Return akActor.GetSleepState()
		Else
			;Extended sleep detection
			If akLocation == None && akSleepPackage != None 
				If akActor.GetCurrentPackage() == akSleepPackage
					bValidate = True
					iResults = 6
				EndIf
			EndIf
			
			If akLocation != None && akSleepPackage != None 
				If akActor.GetCurrentPackage() == akSleepPackage && akActor.GetCurrentLocation() == akLocation
					bValidate = True
					iResults = 7
				EndIf
			EndIf
			
			If bValidate
				;Lets check incase the schedule for the package has expired
				akActor.EvaluatePackage()	
				If akActor.GetCurrentPackage() != akSleepPackage
					iResults += 10
				EndIf
			EndIf
		EndIf
		
	EndIf
	
	Return iResults
EndFunction

See Also[edit | edit source]