GetAt - FormList

From the CreationKit Wiki
Revision as of 01:46, 4 October 2016 by imported>DavidJCobb (→‎Notes: created refs aren't made persistent by membership in form lists!)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Member of: FormList Script

Returns the form at a specified index in the list.

Syntax[edit | edit source]

Form Function GetAt(int aiIndex) native

Parameters[edit | edit source]

  • aiIndex: The index in the list we want to fetch the form from
    • The index is 0-based. If a list has 3 items in it, valid indices are: 0, 1 and 2

Return Value[edit | edit source]

Returns the form at index aiIndex, none in case of error (such as wrong index value)

Examples[edit | edit source]

  • Print out the forms in the list
Int iIndex = kFormList.GetSize()
While iIndex > 0
	iIndex -= 1
	Debug.Trace("Form " + iIndex + " is " + kFormList.GetAt(iIndex))
EndWhile
  • Get the index of member in list. Return -1 if member is not found.
Int Function iGetFormIndex(FormList akList, Form akMember) Global
	If akList.HasForm(akMember)
		Int iIndex = akList.GetSize() ; Will always return a finite value
		While iIndex > 0
			iIndex -= 1
			If akList.GetAt(iIndex) == akMember
				Return iIndex
			EndIf
		EndWhile
	EndIf
	Return -1 ; Either the form is not in the list, is not currently loaded if non-persistent
EndFunction
  • Search a LONG FormList of ORDERED FORMS (by FormID) and return. -1 if not found. Binary Search Method adapted to Papyrus from Wikipedia's detection of equality example.
Int Function GetFormIndexOrdered(FormList akList, Form akMember) Global

	Int iFormID = akMember.GetFormID()
	Int iMin = 0
	Int iMax = akList.GetSize() - 1

	While iMax > iMin
		Int iMid = (iMin + iMax) / 2
		If iFormID > akList.GetAt(iMid).GetFormID()
			iMin = iMid + 1
		Else
			iMax = iMid
		EndIf
	EndWhile
	
	If (iMax == iMin) && (iFormID == akList.GetAt(iMin).GetFormID())
		Return iMin
	Else
		Return -1
	EndIf
EndFunction

Notes[edit | edit source]

  • Keep in mind that if you don't need the exact index of a formlist entry, the native HasForm() will always be the quickest method to find out whether the list contains an entry--far quicker even than a binary search like the one above.
  • A created reference does not become persistent by virtue of being added to a FormList. If you try to retrieve the reference from the FormList when it is not loaded and not persistent, you will get an incorrect result or no result.

See Also[edit | edit source]