Talk:FindClosestActorFromRef - Game
Revision as of 03:41, 31 December 2017 by imported>Rasikko (→SKSE alternative: Made a better function than the last one I made.)
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)