Talk:FindClosestActorFromRef - Game

From the CreationKit Wiki
Revision as of 03:41, 31 December 2017 by imported>Rasikko (→‎SKSE alternative: Made a better function than the last one I made.)
Jump to navigation Jump to search

SKSE alternative

You basically have to make your own version of this function with SKSE, if you want to avoid certain references, but especially the player because it's so easy for it to be the return value.

Actor Function GetClosestActorFromRef(ObjectReference akCenter) Global
	; returns the closest actor to akCenter. akCenter is excluded from the search.
		
	; Arrays
	ObjectReference[] kRefs = new ObjectReference[128]
	Float[] fDistances = new Float[128]
		
	; Forms
	Cell kCell = akCenter.GetParentCell()
		
	; Values
	Int CellRefs = kCell.GetNumRefs(43) ; 43 = kNPC, 62 = kCharacter
	Int i 
	Float fLowestValue = 1000000.0
		
		
	; Bail if the cell contains more actors than an array can hold.
	if (CellRefs >= 129 || CellRefs == 0)
		return none
	endif
		
	while i < CellRefs
		ObjectReference kActors = kCell.GetNthRef(i, 43)
		if kActors != akCenter
			kRefs[i] = kActors
			fDistances[i] = kActors.GetDistance(akCenter)
			
			Float fCurrentValue = fDistances[i]
		        if fCurrentValue <= fLowestValue
				fLowestValue = fCurrentValue
			endif
		endif
		i += 1
	endWhile
		
	; get the index of the actor that had the smallest distance from akCenter.
        Int refIndex = fDistances.Find(fLowestValue)
		
	return kRefs[refIndex] as Actor
EndFunction

This will return the closest actor. How fast this function returns, depends on how many actors are in the cell. --Rasikko (talk) 2017-12-15T14:47:39 (EST)