Difference between revisions of "AddForm - FormList"

662 bytes added ,  14:24, 8 March 2022
more RE; figured out list ordering for good
imported>DavidJCobb
(more RE; figured out list ordering for good)
Line 23: Line 23:


== Notes ==
== Notes ==
* It is not clear where in the list the form will be added.
=== Order of items in the list ===
** Code analysis indicates that new forms are appended to a block at the start of the list. This is ''almost'' the same as adding them to the start of the list. If the Creation Kit defines a FormList with elements A and B, and you add elements C, D, and E in that order, then the expected list order based on disassembly of the executable would be ''C D E A B''.
FormLists are divided into three sections. First are all of the forms that are initially present in the FormList per its definition in the Creation Kit. Next are any forms that were not created during play (form ID does not start with 0xFF) and were added to the FormList by scripts. Last are forms that were created during play (form ID starts with 0xFF) and were added to the FormList by scripts. This means that FormLists will not necessarily store forms in the order they were added to the list.
** The same wiki editor who performed that code analysis also ran a simple test in-game, adding three activators to a FormList that already contained two. The resulting order was ''A B C D E''.
 
** Other wiki editors have observed elements being added to the start of the list, although it's not clear whether they tested multiple additions (the difference between prepending, and appending to a block at the start).
Consider a FormList that has forms ''A'', ''B'', ''C'', and ''D'' added to it in the Creation Kit.
 
If a script adds forms ''E'', ''F'', and ''G'' to the list (assuming those forms weren't created during play), then the list will contain: ''A B C D E F G''. Now suppose the user saves the game, updates a mod, and then reloads the game. Suppose that that mod update, in the Creation Kit, adds form ''H'' to the end of the FormList. In-game, after the user loads their save file, the list will contain: ''A B C D '''H''' E F G''.
 
Now, consider a FormList that has forms ''T'', ''U'', and ''V'' added to it in the Creation Kit.
 
Suppose a script adds forms ''W'', ''X'', ''Y'', and ''Z'' to the FormList; however, forms ''W'' and ''X'' are forms that were created during play (e.g. ObjectReferences spawned via PlaceAtMe), while forms ''Y'' and ''Z'' are forms defined in the user's load order. The FormList will now contain: ''T U V Y Z W X''.
 
=== Other notes ===
* FormLists cannot contain duplicate entries. Using AddForm(...) with a form that is already in the list will not add a second copy to the list.
* FormLists cannot contain duplicate entries. Using AddForm(...) with a form that is already in the list will not add a second copy to the list.
* 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.
* 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.
142

edits