Talk:GetDialogueTarget - Actor

From the CreationKit Wiki
Revision as of 14:00, 18 February 2013 by imported>Zartar
Jump to navigation Jump to search

Obtains the actor the player is currently in dialogue with.

Syntax

Actor Function GetPlayerDialogueTarget() non-native

Source:

Actor Function GetPlayerDialogueTarget()
	Actor kPlayerDialogueTarget
        Actor kPlayerRef = Game.GetPlayer()
	Int iLoopCount = 10
	While iLoopCount > 0
		iLoopCount -= 1
		kPlayerDialogueTarget = Game.FindRandomActorFromRef(kPlayerRef , 200.0)
		If kPlayerDialogueTarget != kPlayerRef && kPlayerDialogueTarget.IsInDialogueWithPlayer() 
			Return kPlayerDialogueTarget
		EndIf
	EndWhile
        Return None
EndFunction

Parameters

None.

Return Value

The actor the player is currently in dialogue with (if any).

Examples

;This is a custom function so you have to include it in your script.
Actor Function GetPlayerDialogueTarget()
	Actor kPlayerDialogueTarget
        Actor kPlayerRef = Game.GetPlayer()
	Int iLoopCount = 10
	While iLoopCount > 0
		iLoopCount -= 1
		kPlayerDialogueTarget = Game.FindRandomActorFromRef(kPlayerRef , 200.0)
		If kPlayerDialogueTarget != kPlayerRef && kPlayerDialogueTarget.IsInDialogueWithPlayer() 
			Return kPlayerDialogueTarget
		EndIf
	EndWhile
        Return None
EndFunction

Event SomeEvent()
        ; Print a message if the player is in dialogue with Bob.
        if (GetPlayerDialogueTarget() == Bob)
                Debug.Trace("The player is in dialogue with Bob!")
        endIf
EndEvent

Notes

This usually finds the actor the player is in dialogue with but more testing is required. It works very well for me, so far... I tend to modify this by passing in the player's reference and lowering iLoopCount but the version I posted is safe and convenient.

EDIT: jbezorg's alternate method is flawless in interior cells, I would recommend it but it is worth noting that the method may fail in exterior cells if the player is speaking to an NPC that is in another cell (this could happen if the player is standing very close to a cell border). For exterior cells it may be safer to use my method but increase both the loop count and the radius of the find random actor function. ~Zartar

Alternative Method

Same usage, slower, but in theory the examples above could miss the Dialogue target by testing the same NPC several times. Unlikely with a 200 unit radius but it also cannot test outside the 200 unit radius and I've had arresting city guards enter dialogue with the player at a much greater distance. ~jbezorg

;Requires SKSE.
Actor Function GetPlayerDialogueTarget() global
	Actor kPlayerRef = Game.GetPlayer()
	Actor kTargetRef = None
	Actor kNthRef    = None

	Cell kCell       = kPlayerRef.GetParentCell()
	Int iType        = 43 ; kNPC = 43
	Int iIndex       = kCell.GetNumRefs( iType ) 
	
	While iIndex && !kTargetRef
		iIndex -= 1
		kNthRef = kCell.GetNthRef( iIndex, iType ) as Actor
		If kNthRef != kPlayerRef && kNthRef.IsInDialogueWithPlayer()
			kTargetRef = kNthRef
		EndIf
	EndWhile
	
	Return kTargetRef
EndFunction

See Also