Create your own Data File Configurations - Michael-wigontherun/ESLifyEverything GitHub Wiki
Many and most frameworks use Form Keys to find the Form that matches with what needs to happen.
Examples:
DAR: IsEquippedRight("ArteFake.esp" | 0x119DD5)
SPID: Spell = 0xD93~BosmersHaveAntlers.esp|NONE|0x13749,0x88884|NONE|NONE|NONE|100
AutoBody: CaesiaFollower.esp|D62=Caesia
Auto Body needs only one file. SPID and its duplicate frameworks have a lot of different files that all use a set file name structure to find what needs to load and when it is in this structure "[Plugin name]_DISTR.ini". "_DISTR.ini" is always the same. To find them you need to use the "_DISTR.ini" as a filter.
Then there is DAR, DAR uses many different folders to change animations for NPCs. Regular humans use them in one folder while creatures use different folders. There are only 2 things similar between the locations, the _conditions.txt file and the folder names, Example pathing's: "meshes\actors\ambient\chicken\animations\DynamicAnimationReplacer_CustomConditions" and "meshes\actors\character\animations\DynamicAnimationReplacer_CustomConditions" with hundreds of folders for _conditions.txt.
In order for an optimized experience finding all of these they require different ways to enumerate. The single file can just use a direct path to the file, SPID only needs to enumerate the files in top level of the Data folder, but DAR has a lot of places all of which are in the Data folder, So to get the "_conditions.txt" files it doesn't need to enumerate starting in the Data folder over everything, instead it should start in the "meshes" folder, and find the folders "_CustomConditions", and then only search for the "_conditions.txt" files in these folders.
Those were the basic Data structures using Form Keys, but recently much more complex Data Files that need to store a lot more information to interact with. The current list as of writing this are Custom Skills, Precision, True Directional Movement, and POISE - Stagger Overhaul. Custom Skills has a very unique system for there data files, which is why I have kept it using a non modular internally coded system without granting access to ESLify Everything Mod Connections.
Precision, True Directional Movement, and POISE - Stagger Overhaul however use a .toml files to script there data, they do not use Form Keys they use array objects. Example from TDM: This structure starts with an array object header then the FormID variable, then the Plugin variable.
BodyPartDataFormID = 0x13492 # DragonBodyPartData
Plugin = "Skyrim.esm"
BoneNames = ["NPC Head", "NPC LHand", "NPC RHand", "NPC LLegFoot", "NPC RLegFoot", "NPC Tail4"]
So this needs the complexity to search multiple lines but it is not so unique that nothing else is using it currently. So it contains expoture to the ESLify Everything Mod Connections system.
Mod Configuration types
Data File Configurations for ESlify Everything is need to be placed inside of "ESLifyEverything\Properties\DataFileTypes"
Check out my base files for full examples on how to use them.
You are not allowed to overwrite my base files.
Basic Single File
File name scheme: [Name]_BasicSingleFile.json Data structure: is a JSON list, so multiple Connections can be included in a single file.
[
{
"Enabled": false,
"Name": "",
"DataPath": "",
"SeparatorData": {
"FormKeySeparator": "",
"IDIsSecond": false,
"ModNameAsString": false,
"ModNameStringCharater": "\u0022"
},
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": ""
},
{
"Enabled": false,
"Name": "",
"DataPath": "",
"SeparatorData": null,
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": ""
}
]
"Enabled": false, : Enables the connection to be used when imported
"Name": "", : Says what this connection connected to and for the Data File Menu
"DataPath": "", : Direct path to file, Example "autoBody\\Config\\morphs.ini"
"StartingLogLine": "", : Log line string for users to know when it started
"FileAtLogLine": "", : Log line when verbose logging is active to say it was found
"FileUnchangedLogLine": "" : Log line when verbose logging is active to say it was unchanged and not outputted
SeparatorData Property is at the bottom
Basic Direct Folder
File name scheme: [Name]_BasicDirectFolder.json Data structure: is a JSON list, so multiple Connections can be included in a single file.
[
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"SeparatorData": {
"FormKeySeparator": "",
"IDIsSecond": false,
"ModNameAsString": false,
"ModNameStringCharater": "\u0022"
},
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
},
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"SeparatorData": null,
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
}
]
"Enabled": false, : Enables the connection to be used when imported
"Name": "", : Says what this connection connected to and for the Data File Menu
"StartFolder": "", : Folder with all files connected to a Framework like SPID.
"FileNameFilter": "", : Distinct name scheme for the file types, Wild card supported. Wild card = *
"StartingLogLine": "", : Log line string for users to know when it started
"FileAtLogLine": "", : Log line when verbose logging is active to say it was found
"FileUnchangedLogLine": "", : Log line when verbose logging is active to say it was unchanged and not outputted
"SeachLevel": 0 : Integer for the SeachOption enum in C#. See bottom for what Search levels are.
SPID has all of its files in the data folder so it can just stay empty like "StartFolder": "", SPID example "*_DISTR.ini"
SeparatorData Property is at the bottom
Basic Data Subfolder
File name scheme: [Name]_BasicDataSubfolder.json Data structure: is a JSON list, so multiple Connections can be included in a single file.
[
{
"Enabled": false,
"Name": "",
"StartDataSubFolder": "",
"DirectoryFilter": "",
"SeparatorData": {
"FormKeySeparator": "",
"IDIsSecond": false,
"ModNameAsString": false,
"ModNameStringCharater": "\u0022"
},
"FileFilter": "",
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"StartSeachLevel": 1,
"SubFolderSeachLevel": 1
},
{
"Enabled": false,
"Name": "",
"StartDataSubFolder": "",
"DirectoryFilter": "",
"SeparatorData": null,
"FileFilter": "",
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"StartSeachLevel": 1,
"SubFolderSeachLevel": 1
}
]
"Enabled": false, : Enables the connection to be used when imported
"Name": "", : Says what this connection connected to and for the Data File Menu
"StartDataSubFolder": "", : Where to start searching for files that are only inside of only one folder
"DirectoryFilter": "", : Filter for what folders need to be found inside the Start folder, Wild card supported.
"FileFilter": "", : Filter for what files are connected to the Framework, Wild card supported.
"StartingLogLine": "", : Log line string for users to know when it started
"FileAtLogLine": "", : Log line when verbose logging is active to say it was found
"FileUnchangedLogLine": "", : Log line when verbose logging is active to say it was unchanged and not outputted
"StartSeachLevel": 1, : Search level for the start folder. See bottom for what Search levels are.
"SubFolderSeachLevel": 1 : Search level for the sub folders of the start folder. See bottom for what Search levels are.
SeparatorData Property is at the bottom
Complex Toml
File name scheme: [Name]_ComplexTOML.json Data structure: is a JSON list, so multiple Connections can be included in a single file.
[
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"SeparatorData": {
"FormKeySeparator": "",
"IDIsSecond": false,
"ModNameAsString": false,
"ModNameStringCharater": "\u0022"
},
"ArrayStartFilters": [
"[](/Michael-wigontherun/ESLifyEverything/wiki/)",
"[](/Michael-wigontherun/ESLifyEverything/wiki/)"
],
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
},
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"SeparatorData": null,
"ArrayStartFilters": [
"[](/Michael-wigontherun/ESLifyEverything/wiki/)",
"[](/Michael-wigontherun/ESLifyEverything/wiki/)"
],
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
}
]
"Enabled": false, : Enables the connection to be used when imported
"Name": "", : Says what this connection connected to and for the Data File Menu
"StartFolder": "", : Folder with all files connected to a Framework like SPID.
"FileNameFilter": "", : Distinct name scheme for the file types, Wild card supported.
"ArrayStartFilters": [ : toml Array object filters. Multiple arrays can be present in one file and parsed correctly.
"[](/Michael-wigontherun/ESLifyEverything/wiki/)", : Example from TDM: "[TargetPoints](/Michael-wigontherun/ESLifyEverything/wiki/TargetPoints)"
"[](/Michael-wigontherun/ESLifyEverything/wiki/)"
],
"StartingLogLine": "", : Log line string for users to know when it started
"FileAtLogLine": "", : Log line when verbose logging is active to say it was found
"FileUnchangedLogLine": "", : Log line when verbose logging is active to say it was unchanged and not outputted
"SeachLevel": 0 : Integer for the SeachOption enum in C#. See bottom for what Search levels are.
SeparatorData Property is at the bottom
Delimited Form Keys
File name scheme: [Name]_DelimitedFormKeys.json Data structure: is a JSON list, so multiple Connections can be included in a single file.
[
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"Delimiter": "",
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
},
{
"Enabled": false,
"Name": "",
"StartFolder": "",
"FileNameFilter": "",
"Delimiter": "",
"StartingLogLine": "",
"FileAtLogLine": "",
"FileUnchangedLogLine": "",
"SeachLevel": 0
}
]
"Enabled": false, : Enables the connection to be used when imported
"Name": "", : Says what this connection connected to and for the Data File Menu
"StartFolder": "", : Folder with all files connected to a Framework like SPID.
"FileNameFilter": "", : Distinct name scheme for the file types, Wild card supported. Wild card = *
"Delimiter": "", : The char that seperates FormKeys inside the data file type
"StartingLogLine": "", : Log line string for users to know when it started
"FileAtLogLine": "", : Log line when verbose logging is active to say it was found
"FileUnchangedLogLine": "", : Log line when verbose logging is active to say it was unchanged and not outputted
"SeachLevel": 0 : Integer for the SeachOption enum in C#. See bottom for what Search levels are.
Does not contain the SeparatorData property.
Search Levels
Search levels are the level of iteration through files and directories. 0 = it will only search the folder that it directs too, and ignore any files in sub directories 1 = it will search all files and sub directories inside of the starting folder
SeparatorData property
This is same for all Mod Configurations
"SeparatorData": {
"FormKeySeparator": "", : This is the char or string that separates the FormID and the Plugin Name
"IDIsSecond": false, : True means the FormID comes after the separator, and it needs to do extra processing
"ModNameAsString": false, : This means Plugin name needs to be surrounded by the ModNameStringCharater property
"ModNameStringCharater": "\u0022" : A Unicode char that surrounds a string
}
FormKeySeparator Examples:
- DAR
- Line: IsEquippedRight("ArteFake.esp" | 0x119DD5)
- FormKeySeparator: " | "
- AutoBody
- Line: 018Auri.esp|D63=Auri
- FormKeySeparator: "|"
ModNameStringCharater Examples:
- """ = "\u0022"
- "'" = "\u0027"
SeparatorData Regex Version
"SeparatorData": {
"UseRegex": true, : This will tell it to use Regex instead of the base Separator system
"RegexMakeUp": "{{ID}}[ 0]*~[ 0]*{{ModName}}", : This is the Regex Pattern to search for
"FormKeyMakeUp": "{{ID}}~{{ModName}}" : This is the FormKey structure to replace the matched Regex with
}
{{ID}} is the string to look for inside the MakeUps to replace the Searching FormID {{ModName}} is the string to look for inside the MakeUps to replace the Searching ModName
Both are required inside the Regex MakeUps
All Regex syntax is supported by .Net 6 Regular Expressions