About this mod
SKSE framework for the manipulation of perk descriptions, positions, and even adding new perks in trees without conflicts.
- Requirements
- Permissions and credits
- Changelogs

The other part of the framework is more of a "proof of concept" mod that allows you to place new perks on existing trees. Fewer use cases for that, though, but think of Pilgrim - A Religion Overhaul. It adds 2 new perks to conjuration and restoration, and perk overhauls not named "Adamant" need a patch. In theory, this framework addresses that issue.

Requirements and runtimes:
1. Skyrim SE version 1.6.1130+
2. Skyrim Script Extender
3. Address Library for SKSE Plugins
A note on the Address Library:
This mod needs the All in one Address Library (Anniversary Edition) version, regardless of whether or not you have purchased the AE DLC.
A note on runtime:
As stated above, this requires Skyrim SE version 1.6.1130+, sometimes called Skyrim AE. Please do not ask me to support older versions, I
don't want to have multiple Skyrim installations. The mod is licensed under MIT, meaning that you are more than free to port it.

Getting Started
{
"descriptions": [
{
"plugins": [ //Plugins that MUST be enabled in the load order for the
//changes to occur.
"Plugin1.esm" //Plugin name, array of strings.
],
"changes": [ //The actual changes. Array of objects.
{
"perk": "0xFormID|PluginSource.esp", //Target perk. usual format is "0x123|coolmod.esp", but
//can be just "PerkEditorID" if powerofthree's tweaks are on.
"newDescription": "..." //New description, string.
}
]
}
],
"additions": [ //Additions adds a perk to a specified tree. Array of objects.
{
"perk": "0xFormID|PluginSource.esp", //Perk to add. See changes perk for specifications.
"skill": "0xFormID|PluginSource.esp", //Skill to add to, see perk for format.
"x": 1.0, //X position of the perk. Float.
"y": 0.5, //Y position of the perk. Float.
"parents": [ //Perk parents. Connecting lines are drawn from parents to
//children.
"0xFormID|PluginSource.esp"
],
"children": [ //Perk children, same as parents.
"0xFormID|PluginSource.esp"
]
}
]
}
Papyrus:
As of 2.1.0, the plugin comes with 3 new functions for manipulating perk trees via Papyrus. The three new functions are as follows:
Int[] Function GetVersion()
Bool Function AddPerkToTree(Perk a_kPerk, ActorValueInfo a_kAV, Float a_x, Float a_y,\
Perk[] a_parents = NONE, Perk[] a_children = NONE)
Bool Function RemoveFromPerkTree(Perk a_kPerk, ActorValueInfo a_kAV)
GetVersion returns an array of integers that allows you to verify what version of the plugin is installed. For example, as of version 2.1.0, it returns [2, 1, 0].
AddPerkToTree is the function that adds perks to the perk tree. It returns true if it successfully adds, false otherwise. The arguments it takes are as such:
a_kPerk: The perk to add
a_kAV: The ActorValueInfo to add the perk to. To access it, use the SKSE function ActorValueInfo.GetActorValueInfoByName("Alchemy")
a_x: The x position to place the perk in.
a_y: The y position to place the perk in.
a_parents: An array of perks that the perk will be connected to.
a_children: An array of perks that will connect to the perk.
RemoveFromPerkTree is the function used for removing perks from trees. It returns true if it manages to remove the perk, false otherwise. Note that only perks added by AddPerkToTree are remove-able with this function. This is a design decision to prevent headaches.
a_kPerk: The perk to remove.
a_kAV: The ActorValueInfo to remove the perk from. See AddPerkToTree for how to access it.

Source Code:
Github
Acknowledgements:
NoahBoddie - Offset for perk description.
Every gigabrain that worked on Commonlib.