Add Path of Exile 2 BuildPlanner (.build) export - #2432
Merged
Conversation
Writes a .build JSON file to the in-game BuildPlanner folder
(Documents/My Games/Path of Exile 2/BuildPlanner/) from a new section in
the Import tab. Tree specs, item sets and skill sets export as
level-bracketed loadouts via the format's level_interval field, with
per-set Lvl Min/Max in each tab's Manage popup. The New Loadout dialog
also takes a level range that propagates across the matching tree spec,
item set and skill set on save. New sets auto-preset on a 30-level
cadence (1-30, 30-60, 60-90, 90-100).
Per-passive and per-gem author notes via Shift+Right-Click on the Tree
and Skills tabs. The keybind hint and any existing note are shown in
the respective tooltips. Notes flow into the exported additional_text;
the format's Custom Text markup (<bold>{}, <italic>{}, <red>{},
<rgb(R,G,B)>{}) is preserved in the input.
Non-unique items render rolled title + base type + mod list using the
same markup (italic implicits, plain explicits). Active skills carry a
"Level N[, Q% Quality]" hint when no note is set; trivial Level 1 /
0% Quality on uncustomised support gems is suppressed to avoid noise.
Skill IDs use the Gems.lua table key to work around the singular
"Metadata/Items/Gem/" typo on the gameId field of ~486 auto-generated
entries.
Passive IDs are emitted as PassiveSkills.Id strings (e.g.
"projectiles18", "AscendancyMercenary2Notable5"). This required adding
stringId to src/Export/Scripts/passivetree.lua and regenerating
src/TreeData/0_4/tree.lua against GGPK. Older tree versions (0_1, 0_2,
0_3) still carry numeric IDs and fall back accordingly with a one-time
console warning until they're regenerated too.
- Add markup buttons to note menu - Fix thorns crashing due to missing gem data - Avoid notes overwriting item text - Add colour to item text (quality, magic mod colour, fractured etc) - Remove a lot of dead code - Convert exporting to export single loadouts. This happens either by selecting specific sets, or by exporting all loadouts. The GGG file format is not really compatible with putting a whole leveling experience in one file due to level interval limitations. This now matches what build sites are currently doing more closely.
vaisest
marked this pull request as draft
August 25, 2026 19:37
vaisest
marked this pull request as ready for review
August 26, 2026 19:04
added 4 commits
August 27, 2026 06:57
If a build was saved while you had the the 2nd skill part selected, on load it would not export the skill id for the main stat set of the skill gem
e.g. Add a second skill set and select Shattering Palm as the gem. Select Freezing Explosion as the active set then go back to your first set of skills and reopen the build. On export it wont include Shattering palm anymore
If a build used the {1} way to link loadouts it could only create 1 build file when the name before the {1} was the same
e.g Leveling {a} and Leveling {b} as different loadouts would only make 1 build file
Made the default names for the build name and aurthor name use place holder text so that it's easy for people to write their own without having to delete the text first
Adds a bunch of tests for the export too
Passive node notes now survive tree copying and conversion via undo state. Socket slots without note buttons no longer clear item tooltips. PoE2 exports now exclude inactive item variants using CheckModLineVariant. Duplicate variants now use GetModLineVariantCount, preserving repeated Mageblood selections while excluding inactive variants New item sets no longer inherit notes from the active set The gem note tooltip isn't shown while searching for gems in the dropdown list anymore, only when you have a gem actually in your build Added regression tests for all three fixes.
LocalIdentity
approved these changes
Aug 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1829. This is an extension of and an update to #1832 by @TheClassified and @Wires77.
Description of the problem being solved:
See #1832. This makes many changes to the previous PR:
This happens either by selecting specific sets,
or by exporting all loadouts. The GGG file format
is not really compatible with putting a whole leveling
experience in one file due to level interval limitations.
This now matches what build sites are currently doing more closely.
The changes mean that this feature does NOT include any level details in the build file. The previous approach of putting multiple loadouts in one file and filtering them using the level intervals does not work. We could add per-node/item/gem level filters, but I don't really see how they are helpful. As far as I know they only hide things in-game, which isn't really helpful. It is imo a better idea to just point out level pathing in notes if it is important.
The
unique_namefield was removed as it seemed useless. If this is shown in a special way somewhere on the UI, it can be added back.Opinions welcome. I am not a build guide author. Code opinions are also welcome. This PR has gone through a lot of iteration and some parts of it may not be in line with others.
Steps taken to verify a working solution:
Todo:
Link to a build that showcases this PR:
https://poe.ninja/poe2/pob/278b8
After screenshot: