Skip to content

Add Path of Exile 2 BuildPlanner (.build) export#1832

Open
TheClassified wants to merge 1 commit into
PathOfBuildingCommunity:devfrom
TheClassified:feature/poe2-build-export
Open

Add Path of Exile 2 BuildPlanner (.build) export#1832
TheClassified wants to merge 1 commit into
PathOfBuildingCommunity:devfrom
TheClassified:feature/poe2-build-export

Conversation

@TheClassified
Copy link
Copy Markdown

@TheClassified TheClassified commented May 11, 2026

Summary

Adds an Export to Path of Exile 2 BuildPlanner section in the
Import tab that writes a .build JSON file matching GGG's
spec.

Experimental. BuildPlanner isn't in-game yet, so there's no way to
load-test the output. Format conformance is what we can check.

Features

  • Export to Documents/My Games/Path of Exile 2/BuildPlanner/.
  • Tree specs / item sets / skill sets export as level-bracketed
    loadouts via level_interval.
  • Lvl Min/Max per set in each Manage popup, and a range in the
    global New Loadout dialog (propagates to tree / items / skills).
  • Shift+Right-Click on a node or gem to attach an author note.
  • Custom Text markup (<bold>{}, <italic>{}, <red>{}, <rgb()>{})
    preserved on items and notes.
  • New sets auto-preset on a 30-level cadence (1-30, 30-60, etc).

Notes

  • src/Export/Scripts/passivetree.lua now emits stringId, and
    src/TreeData/0_4/tree.lua is regenerated to match. Older tree
    versions (0_1 to 0_3) fall back to numeric IDs with a console
    warning until regenerated.
  • Skill IDs use the Gems.lua table key to bypass the singular
    Metadata/Items/Gem/ typo on the gameId field of ~486 entries.
  • inventory_id values other than Weapon1 are guesses. The dev
    docs only document the one example.

Example output

{
  "ascendancy":"Witch3",
  "items":[{
      "inventory_id":"Ring",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Andvarius"
    },{
      "inventory_id":"Ring2",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Kalandra's Touch"
    },{
      "inventory_id":"Charm2",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Nascent Hope"
    },{
      "additional_text":"<bold>{Miracle Ward}\nArrayed Focus\n<italic>{+10 to Strength}\n<italic>{Bonded: +10 to maximum Life}\n<italic>{Bonded: +10 to maximum Mana}\n<italic>{+24 to maximum Mana}\n<italic>{14% reduced Attribute Requirements}\nSpell Skills have +1 to maximum number of Summoned Totems\n77% increased Spell Damage\n87% increased Chaos Damage\n+2 to Level of all Spell Skills\n27% increased Cast Speed\n42% increased Energy Shield Recharge Rate",
      "inventory_id":"Weapon2",
      "slot_x":0,
      "slot_y":0,
      "weapon_set":2
    },{
      "inventory_id":"Belt",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Headhunter"
    },{
      "additional_text":"<bold>{Magic Golden Charm}\n<italic>{Used when you kill a Rare or Unique enemy}\nRecover 300 Mana when Used\n68% increased Charges",
      "inventory_id":"Charm3",
      "slot_x":0,
      "slot_y":0
    },{
      "additional_text":"<bold>{Magic Ultimate Mana Flask}\n50% reduced Amount Recovered\nInstant Recovery\n70% increased Charges",
      "inventory_id":"Flask2",
      "slot_x":0,
      "slot_y":0
    },{
      "inventory_id":"Flask1",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Olroth's Resolve"
    },{
      "additional_text":"<bold>{Pandemonium Rosary}\nGold Amulet\n<italic>{18% increased Rarity of Items found}\n<italic>{Allocates Spiral into Insanity}\n33% increased Spell Damage\n+49 to Spirit\n14% increased Rarity of Items found\n+4 to Level of all Spell Skills\n32% increased Cast Speed\n59% increased Mana Regeneration Rate",
      "inventory_id":"Amulet",
      "slot_x":0,
      "slot_y":0
    },{
      "additional_text":"<bold>{Dragon Bane}\nWithered Wand\n<italic>{+1 to Level of all Spell Skills}\n<italic>{Gain 13% of Damage as Extra Chaos Damage}\n<italic>{Bonded: Gain 8% of Damage as Extra Physical Damage}\n<italic>{Bonded: Archon recovery period expires 30% faster}\n<italic>{Grants Skill: Level 18 Chaos Bolt}\n117% increased Spell Damage\n59% increased Critical Hit Chance for Spells\nGain 29% of Damage as Extra Fire Damage\nGain 33% of Damage as Extra Lightning Damage\n+5 to Level of all Spell Skills\n40% increased Cast Speed",
      "inventory_id":"Weapon1",
      "slot_x":0,
      "slot_y":0
    },{
      "inventory_id":"Charm1",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Rite of Passage"
    },{
      "additional_text":"<bold>{Victory Visage}\nAncestral Tiara\n<italic>{+5% to all Elemental Resistances}\n<italic>{+11% to Chaos Resistance}\n<italic>{12% increased Cost Efficiency}\n<italic>{Bonded: Meta Skills have 12% increased Reservation Efficiency}\n19% increased Rarity of Items found\n98% increased Energy Shield\n+73 to maximum Energy Shield\n16% increased Rarity of Items found\n+39% to Cold Resistance\n+40% to Lightning Resistance",
      "inventory_id":"Helm",
      "slot_x":0,
      "slot_y":0
    },{
      "inventory_id":"Weapon2",
      "slot_x":0,
      "slot_y":0,
      "unique_name":"Palm of the Dreamer"
    },{
      "additional_text":"<bold>{Gale Mantle}\nSacrificial Regalia\n<italic>{15% increased Rarity of Items found}\n<italic>{Bonded: 15% increased Quantity of Gold Dropped by Slain Enemies}\n<italic>{+1 to Level of all Corrupted Skill Gems}\n+61 to Spirit\n12% increased Spirit Reservation Efficiency of Skills\n+96 to maximum Energy Shield\n110% increased Armour, Evasion and Energy Shield\n+45% to Fire Resistance\n+45% to Lightning Resistance",
      "inventory_id":"BodyArmour",
      "slot_x":0,
      "slot_y":0
    },{
      "additional_text":"<bold>{Morbid Paw}\nGold Gloves\n<italic>{12% increased Cast Speed}\n<italic>{48% increased Magnitude of Non-Damaging Ailments you inflict}\n<italic>{Each Runic Inscription from your Curse Skills causes you to Regenerate Mana per second equal to 16% of that Skill's Mana Cost}\n<italic>{Bonded: 24% increased Duration of Elemental Ailments on Enemies}\n<italic>{Bonded: 32% increased Mana Cost Efficiency while on Low Mana}\n+57 to maximum Energy Shield\n137% increased Energy Shield\n+42 to maximum Life\n16% increased Rarity of Items found\n+31% to Lightning Resistance\n60% increased effect of Socketed Items",
      "inventory_id":"Gloves",
      "slot_x":0,
      "slot_y":0
    },{
      "additional_text":"<bold>{Behemoth Goad}\nSandsworn Sandals\n<italic>{8% increased Movement Speed}\n<italic>{+34% to Chaos Resistance}\n<italic>{Bonded: 16% increased Cooldown Recovery Rate}\n100% increased Energy Shield\n+60 to maximum Energy Shield\n35% increased Movement Speed\n+44% to Fire Resistance\n+45% to Cold Resistance\n60% increased effect of Socketed Items",
      "inventory_id":"Boots",
      "slot_x":0,
      "slot_y":0
    }],
  "name":"Unnamed build",
  "passives":["triggers4","monkelemental1","criticals85","chaos30","witch595","chill_and_freeze1","intelligence60","jewel_slot1979","intelligence69","energy_shield24","energy_shield38","intelligence85","attributes24","intelligence53_","intelligence41__","physical15","passive_keystone_whispers_of_doom","criticals40","energy_shield11","projectile_spells8","jewel_slot1977","AscendancyWitch3Start_","totems36","projectile_spells2","criticals44","physical17","jewel_slot1972","criticals29","energy_shield14","criticals86","attributes3","intelligence51","energy_shield29","projectile_spells9","totems35","AscendancyWitch3Notable1","totems21","intelligence45","cast_speed18","mana_regeneration45","intelligence72","criticals84","criticals35","intelligence25","cast_speed2","mana_regeneration17","chill_and_freeze8","intelligence78","energy_shield15","intelligence16","energy_shield10_","attributes1","criticals34","intelligence71","spell_criticals5","intelligence8","chill_and_freeze2","physical36","energy_shield12","intelligence84","monkelemental6","energy_shield13","spell_criticals17_","AscendancyWitch3Small6_","triggers2","duration6","dexterity9","energy_shield21","intelligence58","attributes12","spell_criticals14","monkelemental3","intelligence68","cold32","spell_criticals11_","intelligence47","totems52_","jewel_slot1969","mana_regeneration11","physical23_","intelligence46","volatility2","cast_speed38","projectile_spells3","cast_speed1","AscendancyWitch3Notable6","totems33_","cast_speed13","attributes78","shock21","spell_criticals16","intelligence6","intelligence17",{
      "additional_text":"testtestestset",
      "id":"mana_regeneration50_"
    },"jewel_slot1961","intelligence67","cold35","projectile_spells1","criticals32_","energy_shield7","triggers17","intelligence52","intelligence59","energy_shield41","energy_shield27","energy_shield37","spell_criticals18","physical18","AscendancyWitch3Small4","spell_criticals4","cold33","criticals20","spell_criticals10","spell_criticals12_","witch_sorceress_notable2","totems37","intelligence57","mana_regeneration46","spell_criticals3","AscendancyWitch3Notable5","AscendancyWitch3Notable3","attributes21","criticals30","intelligence56","spell_criticals8","intelligence74","cast_speed30","monkchakra24","criticals22","passive_keystone_fire_spells_to_chaos","energy_shield34_","intelligence54","triggers1","monkelemental2","duration10","AscendancyWitch3Small5","energy_shield36","energy_shield23","intelligence79","totems19","physical14","chill_and_freeze3","chaos32","duration12","ranged30_","spell_criticals15","passive_keystone_pain_attunement","strength44","AscendancyWitch3Small9","dexterity7","physical34"],
  "skills":[{
      "additional_text":"Level 21, 23% Quality",
      "id":"Metadata/Items/Gems/SkillGemComet",
      "support_skills":[{
          "additional_text":"Level 21, 23% Quality",
          "id":"Metadata/Items/Gems/SkillGemCastOnCriticalStrike"
        },{
          "additional_text":"Level 21, 23% Quality",
          "id":"Metadata/Items/Gems/SkillGemElementalWeakness"
        },"Metadata/Items/Gems/SkillGemDoedresUndoingSupport","Metadata/Items/Gems/SkillGemSpellCascadeSupport","Metadata/Items/Gems/SkillGemMagnifiedAreaSupportTwo"]
    },{
      "additional_text":"Level 21, 23% Quality",
      "id":"Metadata/Items/Gems/SkillGemBlasphemy",
      "support_skills":["Metadata/Items/Gems/SkillGemMysticismSupport",{
          "additional_text":"Level 21, 23% Quality",
          "id":"Metadata/Items/Gems/SkillGemDespair"
        },"Metadata/Items/Gems/SkillGemMagnifiedAreaSupportTwo","Metadata/Items/Gems/SkillGemRitualisticCurseSupport","Metadata/Items/Gems/SkillGemSlowPotencySupport"]
    },{
      "additional_text":"Level 3, 20% Quality",
      "id":"Metadata/Items/Gems/SkillGemLivingBombPlayer",
      "support_skills":[{
          "additional_text":"Level 21, 23% Quality",
          "id":"Metadata/Items/Gems/SkillGemCastOnElementalAilment"
        },{
          "additional_text":"Level 21, 23% Quality",
          "id":"Metadata/Items/Gems/SkillGemComet"
        },"Metadata/Items/Gems/SkillGemDiallasDesireSupport","Metadata/Items/Gems/SkillGemExecuteSupportThree","Metadata/Items/Gems/SkillGemUhtredAugurySupport"]
    },{
      "additional_text":"Level 21, 20% Quality",
      "id":"Metadata/Items/Gems/SkillGemDarkEffigy",
      "support_skills":["Metadata/Items/Gems/SkillGemIncreaseLimitSupportTwo","Metadata/Items/Gems/SkillGemConcentratedAreaSupport","Metadata/Items/Gems/SkillGemEfficiencySupportTwo","Metadata/Items/Gems/SkillGemChaosMasterySupport","Metadata/Items/Gems/SkillGemUrgentTotemsSupportThree"]
    },{
      "additional_text":"Level 21, 20% Quality",
      "id":"Metadata/Items/Gems/SkillGemEssenceDrain",
      "support_skills":["Metadata/Items/Gems/SkillGemChaoticFreezeSupport","Metadata/Items/Gems/SkillGemXophsPyreSupport","Metadata/Items/Gems/SkillGemArcaneSurgeSupport","Metadata/Items/Gems/SkillGemExecuteSupportThree","Metadata/Items/Gems/SkillGemWildshardsSupportThree"]
    },{
      "additional_text":"Level 21, 23% Quality",
      "id":"Metadata/Items/Gems/SkillGemLivingBombPlayer",
      "support_skills":["Metadata/Items/Gems/SkillGemIgniteSupportThree","Metadata/Items/Gems/SkillGemFirePenetrationSupportTwo","Metadata/Items/Gems/SkillGemFireExposureSupport","Metadata/Items/Gems/SkillGemFleetingRemnantsSupportTwo","Metadata/Items/Gems/SkillGemFreezeSupport"]
    },{
      "additional_text":"Level 18",
      "id":"Metadata/Items/Gems/SkillGemChaosbolt",
      "support_skills":["Metadata/Items/Gems/SkillGemLightningExposureSupport","Metadata/Items/Gems/SkillGemPoisonSupportThree","Metadata/Items/Gems/SkillGemTulsStillnessSupport","Metadata/Items/Gems/SkillGemExtractionSupport"]
    },{
      "additional_text":"Level 18",
      "id":"Metadata/Items/Gems/SkillGemImpurity",
      "support_skills":["Metadata/Items/Gems/SkillGemMysticismSupportTwo","Metadata/Items/Gems/SkillGemClaritySupportTwo","Metadata/Items/Gems/SkillGemHerbalismSupportTwo","Metadata/Items/Gems/SkillGemWarmBloodedSupport"]
    },{
      "additional_text":"Level 21, 22% Quality",
      "id":"Metadata/Items/Gems/SkillGemDespair",
      "support_skills":["Metadata/Items/Gems/SkillGemCurseEffectSupport","Metadata/Items/Gems/SkillGemDecayingHexSupport","Metadata/Items/Gems/SkillGemCursedGroundSupport","Metadata/Items/Gems/SkillGemChaoticFreezeSupport"]
    },{
      "additional_text":"Level 21, 20% Quality",
      "id":"Metadata/Items/Gems/SkillGemConvalescence",
      "support_skills":["Metadata/Items/Gems/SkillGemSecondWindSupportThree","Metadata/Items/Gems/SkillGemCooldownRecoverySupportTwo","Metadata/Items/Gems/SkillGemClaritySupport"]
    },{
      "additional_text":"Level 21, 23% Quality",
      "id":"Metadata/Items/Gems/SkillGemManaRemnants",
      "support_skills":["Metadata/Items/Gems/SkillGemRemnantPotencySupport","Metadata/Items/Gems/SkillGemFleetingRemnantsSupportTwo"]
    },{
      "additional_text":"Level 21, 20% Quality",
      "id":"Metadata/Items/Gems/SkillGemElementalConflux",
      "support_skills":["Metadata/Items/Gems/SkillGemFireMasterySupport","Metadata/Items/Gems/SkillGemUhtredOmenSupport"]
    },{
      "additional_text":"Level 18",
      "id":"Metadata/Items/Gems/SkillGemChaosbolt"
    },{
      "additional_text":"Level 18",
      "id":"Metadata/Items/Gems/SkillGemImpurity"
    }]
}

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.
@TheClassified
Copy link
Copy Markdown
Author

related issue #1829

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant