This SKSE plugin allows you to add Forms to FormLists at game startup using configuration files.
With this mod, you can get rid of conflicts between mods that modify FormLists, and thus avoid creating compatibility patches. Examples of such situations are mods that add new plants to plant, add toys and gifts, new character voices, trophies, hair colors and races for head parts, etc.
As of version 1.3.0, you can use Mod Events to update FormLists on demand during the game.
As of version 1.5.0, you can add filters to entries in order to skip them.
As of version 1.7.0, you can create collections of forms using tags.
Configuration files can have any name, but they must be INI files whose name ends with _FLM. Example: Toys_FLM.ini.
Or they can be any INI files located in the "FLM" directory. Configuration files are processed in alphabetical order. First from the Data directory, then from the Data\FLM.
Keys: Alias, Group, Collection, Filter, ModEvent, FormList, Plant, BToys, GToys, HairColors, AtronachForge, AtronachForgeSigil, DragonbornSpiderCrafting are not case-sensitive. Filters, Aliases and Groups, once defined, remain available for other INI files. Filter is always optional.
FormList = FList|Form, Form, *FormList, #Group, #Collection, etc|Filter
where,
- FList can be: EditorID or FormID~ESP or Alias.
- Form can be: EditorID or FormID~ESP.
- FormID - record ID. Example: 0xD80 or 0x03008246 or 0xFE00080A or 0x8246 (You no longer need to remove any digits from FormID, the plugin will do it automatically).
- ESP - name of the plugin with extension. Not required for base plugins and DLC. Example Unofficial Skyrim Special Edition Patch.esp. Not case-sensitive.
- EditorID - form editorID.
- Adding an asterisk before a list adds its contents instead of the list itself.
- Filter is optional. You can use previously defined filter or create a new filter in place.
- Filter format: Condition,Condition, etc or #NameForFilter. To learn more about the filter format, see the Filters section below.
FList is skipped if is not found. Form is skipped if it already exists in FormList or is not found. You can also use Filters to skip Forms or add them in a specific situation.
Filter = NameForFilter|Condition, Condition, etc
where,
- The condition is the name of the plugin with + if the plugin must be activated or - if not. Example: +Vigilant.esm.
- You can use & to check multiple plugins in one condition. In this case, all plugin states (+ or -) must match for the condition to be true. Example: -Vigilant.esm&+Skyrim Cheat Engine.esp.
- The conditions are combined by alternative, that is, the filter returns true if at least one of the conditions is true.
To use a predefined filter, add the # sign before its name.
Collection = NameForCollection|FormType|Keyword, -Keyword, etc|Filter
where,
- FormType type of form to search for forms with the keyword. Can be (case insensitive): Armor, Weapon, Ammo, MagicEffect, AlchemyItem, Scroll, Location, Ingredient, Book, Misc, Key, Soulgem, Activator, Flora, Furniture, Race, TalkingActivator, Enchantment, NPC, Spell.
- Keyword is FormID or EditorID of keyword. Combined by conjunction. This means that the form must contain all keywords without the minus sign and none with it.
- Filter is optional. You can use previously defined filter or create a new filter in place. Filter format: Condition, Condition, etc or #NameForFilter. To learn more about the filter format, see the Filters section above.
To use a predefined filter, add the # sign before its name.
ModEvent = EventName|FList|Form, Form, *FormList, #Group, #Collection, etc
where,
- EventName is a string of letters A-Z, a-z.
- The rest the same as for general use.
- There can be multiple entries for the same Mod Event.
Adding an event is skipped if it does not contain a single valid FormList and Form. After receiving the event, FLM will add Forms to the indicated FormLists and send a new event with the name of the received event with "OK" (EventNameOK) appended (string sent: EventName|Added Forms|Form duplicates, value sent: Added Forms). The entire procedure is written to the log.
Alias = NameForAlias|FList, FList, etc
Aliases are collections of FormLists. To use an Alias add the # sign before its name. Aliases are processed at the beginning of the configuration file, regardless of their position in the file. Only for FormList and ModEvent keywords.
Group = NameForGroup|Form, Form, *FormList, #Collection, etc
Groups are collections of Forms. To use a Group add the # sign before its name. Groups are processed at the beginning of the configuration file, after collections and filters, regardless of their position in the file. For FormList, ModEvent, BToy, GToy, HairColors, AtronachForge, AtronachForgeSigil keywords. Groups can use the Collections.
Plant = Form|Form|Filter
where,
- first form is for Ingredient/Alchemy Item/Activator,
- second for Flora/Tree/Misc/Activator/Container.
- If you specify a different type of Form, a warning will be thrown into the log, but the Form will be added.
BToys = Form, Form, *FormList, #Group, #Collection, etc|Filter
GToys = Form, Form, #Group, #Collection, etc|Filter
HairColors = Form, Form, *FormList, #Group, #Collection, etc|Filter
AtronachForge = Form|Form|Filter
where,
- first form is for Recipe,
- second for Result,
- filter is optional.
AtronachForgeSigil = Form|Form|Filter
where,
- first form is for Recipe,
- second for Result,
- filter is optional.
DragonbornSpiderCrafting = Form|Form|Filter
where,
- first form is for Recipe,
- second for Result,
- filter is optional.
To reduce the amount of output to the log, debug mode was added. Thus, the log in its normal form is concise. To enable debug mode to see more details, create the FormListManipulator_DEBUG.ini file.
Formlist = #TestAlias|#Dolls
Collection = Irons|Weapon|0x1E718
Collection = WarAxes|Weapon|WeapTypeWarAxe
Collection = IronWarAxes|Weapon|0x0001E718~Skyrim.esm,WeapTypeWarAxe
Collection = IronNotWarAxes|Weapon|WeapMaterialIron,-WeapTypeWarAxe
ModEvent = TestEvent|BYOHRelationshipAdoptionPlayerGiftChildMale|BYOHChefDoll
Alias = TestAlias|0x8246~HearthFires.esm,0x03008246
Group = Dolls|BYOHChefDoll,BYOHDBDoll,BYOHDragonbornDoll,BYOHJesterDoll
FormList = #TestAlias|BYOHBlacksmithDoll,BYOHDragonPriestDoll,BYOHExecutionerDoll
BToys = #Dolls
Plant = zzzCHMountainFlower01White|zzzCHTreeFloraWhiteFlowers
FormList = 0x03008246|0x807~Plantable Animals.esp,PlantableAnimalsAlbinoSpiderNest
Plant = ChaurusEggs|PlantableAnimalsChaurusNest
Filter = AdditionalHearthfireDollsFilter|+AdditionalHearthfireDolls.esp
BTOYS = BYOHChefDoll,BYOHDBDoll,BYOHDragonbornDoll,BYOHJesterDoll|#AdditionalHearthfireDollsFilter
Plant = SF_BunglersBane|SF_BYOHHouseIngrdBunglersBane01|+TechnicolorAlchemy.esp
Take a look at the log: "[PATH to MY Documents]\My Games\Skyrim Special Edition\SKSE\FormListManipulator.log". It contains all the information about the processed files and records.
- KID support. FLM will start working after KID finishes adding tags.
- FLM will send event FLM_SetupDone when it finishes work.
- Created with CommonLibSSE-NG, support SE, AE, VR, but only SE was tested.
- easy of use - config files instead of plugins,
- no need to create compatibility patches for mods modifying the same list,
- instant effect and better performance (DLL instead of scripts),
- dynamic modification - you can close the game, change the contents of the INI file, and when you run game again, everything will be changed according to the contents of the file,
- ability to use Mod Events, to dynamically modify FormLists during the game.
- CMake
- Add this to your
PATH
- Add this to your
- PowerShell
- Vcpkg
- Add the environment variable
VCPKG_ROOT
with the value as the path to the folder containing vcpkg
- Add the environment variable
- Visual Studio Community 2019
- Desktop development with C++
- CommonLibSSE-NG
- Address Library for SKSE
- Needed for SSE/AE
- VR Address Library for SKSEVR
- Needed for VR
- Open
x64 Native Tools Command Prompt
- Run
cmake
- Close the cmd window
git clone https://github.com/MaskedRPGFan/FormList-Manipulator.git
cd FormList-Manipulator
cmake --preset vs2022-windows-vcpkg
cmake --build build --config Release
# built files will be a build/Release