Skip to content

Commit 6358b45

Browse files
author
LocalIdentity
committed
Merge branch 'dev'
2 parents d7402e2 + bb941d8 commit 6358b45

File tree

121 files changed

+99982
-83294
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+99982
-83294
lines changed

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,38 @@
11
# Changelog
22

3+
## [v2.58.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v2.58.0) (2025/11/03)
4+
5+
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.57.0...v2.58.0)
6+
7+
8+
## What's Changed
9+
### Keepers of the Flame
10+
- Update and add new 3.27 skills [\#9142](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9142) ([LocalIdentity](https://github.com/LocalIdentity))
11+
- Add new Wand and Ring item bases [\#9142](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9142) ([LocalIdentity](https://github.com/LocalIdentity))
12+
- Add initial support for Grafts [\#9148](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9148) ([LocalIdentity](https://github.com/LocalIdentity))
13+
- Add initial support for Foulborn unique mods [\#9116](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9116) ([Wires77](https://github.com/Wires77))
14+
- Add Support for new Monster Phys damage conversion logic [\#9150](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9150) ([LocalIdentity](https://github.com/LocalIdentity))
15+
- Add support for "Farewell to Flesh" (Lycia Bloodline Herald Ascendancy Node) [\#9108](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9108) ([majochem](https://github.com/majochem))
16+
- Add instant buyout to search URLs [\#9136](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9136) ([Goufix](https://github.com/Goufix))
17+
### User Interface
18+
- Show Foulborn Icon on new Foulborn uniques and flavour text on new base items [\#9147](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9147) ([Blitz54](https://github.com/Blitz54))
19+
- Sort Replica Dragonfang's Flight mods [\#9096](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9096) ([Wires77](https://github.com/Wires77))
20+
- Fix "The Tactician" missing flavour text [\#9130](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9130) ([Nightblade](https://github.com/Nightblade))
21+
### Fixed Calculations
22+
- Fix Warcry uptime when using Dual Strike of Ambidexterity [\#9145](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9145) ([LocalIdentity](https://github.com/LocalIdentity))
23+
### Fixed Behaviours
24+
- Fix Gem dropdown tooltip not updating when hovering over gems [\#9146](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9146) ([LocalIdentity](https://github.com/LocalIdentity))
25+
- Fix Aul Bloodline Aura nodes always applying [\#9103](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9103) ([LocalIdentity](https://github.com/LocalIdentity))
26+
- Fix Everlasting Sacrifice not showing the config from the Chaos Ascendancy [\#9097](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9097) ([Wires77](https://github.com/Wires77))
27+
- Fix Intuitive Leap, Thread of Hope and Impossible Escape not working [\#9135](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9135) ([n1tr0xs](https://github.com/n1tr0xs))
28+
- Fix legacy Curse cluster not appearing on tree sometimes [\#9141](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9141) ([LocalIdentity](https://github.com/LocalIdentity))
29+
- Fix Overexertion and Echoes of Creation counting duplicate Warcries [\#9144](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9144) ([LocalIdentity](https://github.com/LocalIdentity))
30+
- Fix Chaos Inoculation not disabling Righteous Fire Buff and Degen [\#9110](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9110) ([LocalIdentity](https://github.com/LocalIdentity))
31+
### Accuracy Improvements
32+
- Fix Burning Ground from Replica Siegebreaker not working [\#9102](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9102) ([pabgarbar](https://github.com/pabgarbar))
33+
### Other changes
34+
- Fix broken header images on Linux [\#9092](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9092) ([ZereoX](https://github.com/ZereoX))
35+
336
## [v2.57.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v2.57.0) (2025/10/30)
437

538
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.56.0...v2.57.0)

changelog.txt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,37 @@
1+
VERSION[2.58.0][2025/11/03]
2+
3+
--- Keepers of the Flame ---
4+
- Update and add new 3.27 skills (LocalIdentity)
5+
- Add new Wand and Ring item bases (LocalIdentity)
6+
- Add initial support for Grafts (LocalIdentity)
7+
- Add initial support for Foulborn unique mods (Wires77)
8+
- Add Support for new Monster Phys damage conversion logic (LocalIdentity)
9+
- Add support for "Farewell to Flesh" (Lycia Bloodline Herald Ascendancy Node) (majochem)
10+
- Add instant buyout to search URLs (Goufix)
11+
12+
--- User Interface ---
13+
- Show Foulborn Icon on new Foulborn uniques and flavour text on new base items (Blitz54)
14+
- Sort Replica Dragonfang's Flight mods (Wires77)
15+
- Fix "The Tactician" missing flavour text (Nightblade)
16+
17+
--- Fixed Calculations ---
18+
- Fix Warcry uptime when using Dual Strike of Ambidexterity (LocalIdentity)
19+
20+
--- Fixed Behaviours ---
21+
- Fix Gem dropdown tooltip not updating when hovering over gems (LocalIdentity)
22+
- Fix Aul Bloodline Aura nodes always applying (LocalIdentity)
23+
- Fix Everlasting Sacrifice not showing the config from the Chaos Ascendancy (Wires77)
24+
- Fix Intuitive Leap, Thread of Hope and Impossible Escape not working (n1tr0xs)
25+
- Fix legacy Curse cluster not appearing on tree sometimes (LocalIdentity)
26+
- Fix Overexertion and Echoes of Creation counting duplicate Warcries (LocalIdentity)
27+
- Fix Chaos Inoculation not disabling Righteous Fire Buff and Degen (LocalIdentity)
28+
29+
--- Accuracy Improvements ---
30+
- Fix Burning Ground from Replica Siegebreaker not working (pabgarbar)
31+
32+
--- Other changes ---
33+
- Fix broken header images on Linux (ZereoX)
34+
135
VERSION[2.57.0][2025/10/30]
236

337
--- Keepers of the Flame ---

manifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version='1.0' encoding='UTF-8'?>
22
<PoBVersion>
3-
<Version number="2.57.0" />
3+
<Version number="2.58.0" />
44
<Source part="default" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/" />
55
<Source part="runtime" platform="win32" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/runtime/" />
66
<Source part="program" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/src/" />

src/Assets/BreachIcon.png

7.8 KB
Loading

src/Classes/GemSelectControl.lua

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,23 @@ function GemSelectClass:Draw(viewPort, noTooltip)
480480
local calcFunc, calcBase = self.skillsTab.build.calcsTab:GetMiscCalculator(self.build)
481481
if calcFunc then
482482
self.tooltip:Clear()
483-
local output, gemInstance = self:CalcOutputWithThisGem(calcFunc, self.gems[self.list[self.hoverSel]], self:GetQualityType(self.list[self.hoverSel]), self.skillsTab.sortGemsByDPSField == "FullDPS")
483+
local gemData = self.gems[self.list[self.hoverSel]]
484+
local qualityType = self:GetQualityType(self.list[self.hoverSel])
485+
local output= self:CalcOutputWithThisGem(calcFunc, gemData, qualityType, self.skillsTab.sortGemsByDPSField == "FullDPS")
486+
local gemInstance = {
487+
level = self.skillsTab:ProcessGemLevel(gemData),
488+
qualityId = qualityType,
489+
quality = self.skillsTab.defaultGemQuality or 0,
490+
count = 1,
491+
enabled = true,
492+
enableGlobal1 = true,
493+
enableGlobal2 = true,
494+
gemId = gemData.id,
495+
nameSpec = gemData.name,
496+
skillId = gemData.grantedEffectId,
497+
displayEffect = nil,
498+
gemData = gemData
499+
}
484500
self:AddGemTooltip(gemInstance)
485501
self.tooltip:AddSeparator(10)
486502
self.skillsTab.build:AddStatComparesToTooltip(self.tooltip, calcBase, output, "^7Selecting this gem will give you:")

src/Classes/ImportTab.lua

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,8 @@ function ImportTabClass:ImportItemsAndSkills(json)
815815
end
816816

817817
local rarityMap = { [0] = "NORMAL", "MAGIC", "RARE", "UNIQUE", [9] = "RELIC", [10] = "RELIC" }
818-
local slotMap = { ["Weapon"] = "Weapon 1", ["Offhand"] = "Weapon 2", ["Weapon2"] = "Weapon 1 Swap", ["Offhand2"] = "Weapon 2 Swap", ["Helm"] = "Helmet", ["BodyArmour"] = "Body Armour", ["Gloves"] = "Gloves", ["Boots"] = "Boots", ["Amulet"] = "Amulet", ["Ring"] = "Ring 1", ["Ring2"] = "Ring 2", ["Ring3"] = "Ring 3", ["Belt"] = "Belt" }
818+
local slotMap = { ["Weapon"] = "Weapon 1", ["Offhand"] = "Weapon 2", ["Weapon2"] = "Weapon 1 Swap", ["Offhand2"] = "Weapon 2 Swap", ["Helm"] = "Helmet", ["BodyArmour"] = "Body Armour", ["Gloves"] = "Gloves", ["Boots"] = "Boots",
819+
["Amulet"] = "Amulet", ["Ring"] = "Ring 1", ["Ring2"] = "Ring 2", ["Ring3"] = "Ring 3", ["Belt"] = "Belt", ["BrequelGrafts"] = "Graft 1", ["BrequelGrafts2"] = "Graft 2", }
819820

820821
function ImportTabClass:ImportItem(itemData, slotName)
821822
if not slotName then
@@ -1032,6 +1033,14 @@ function ImportTabClass:ImportItem(itemData, slotName)
10321033
end
10331034
end
10341035
end
1036+
if itemData.mutatedMods then
1037+
for _, line in ipairs(itemData.mutatedMods) do
1038+
for line in line:gmatch("[^\n]+") do
1039+
local modList, extra = modLib.parseMod(line)
1040+
t_insert(item.explicitModLines, { line = line, extra = extra, mods = modList or { }, mutated = true })
1041+
end
1042+
end
1043+
end
10351044
-- Sometimes flavour text has actual mods that PoB cares about
10361045
-- Right now, the only known one is "This item can be anointed by Cassia"
10371046
if itemData.flavourText then

src/Classes/Item.lua

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ end
7171
local lineFlags = {
7272
["crafted"] = true, ["crucible"] = true, ["custom"] = true, ["eater"] = true, ["enchant"] = true,
7373
["exarch"] = true, ["fractured"] = true, ["implicit"] = true, ["scourge"] = true, ["synthesis"] = true,
74+
["mutated"] = true
7475
}
7576

7677
-- Special function to store unique instances of modifier on specific item slots
@@ -682,6 +683,9 @@ function ItemClass:ParseRaw(raw, rarity, highQuality)
682683
if not (self.rarity == "NORMAL" or self.rarity == "MAGIC") then
683684
self.title = self.name
684685
end
686+
if self.title and self.title:find("Foulborn") then
687+
self.foulborn = true
688+
end
685689
self.type = base.type
686690
self.base = base
687691
self.affixes = (self.base.subType and data.itemMods[self.base.type..self.base.subType])
@@ -778,6 +782,27 @@ function ItemClass:ParseRaw(raw, rarity, highQuality)
778782
self.canHaveShieldCrucibleTree = true
779783
elseif lineLower == "has a two handed sword crucible passive skill tree" then
780784
self.canHaveTwoHandedSwordCrucibleTree = true
785+
elseif lineLower == "cannot roll caster modifiers" then
786+
self.restrictTag = true
787+
self.noCaster = true
788+
elseif lineLower == "cannot roll attack modifiers" then
789+
self.restrictTag = true
790+
self.noAttack = true
791+
elseif lineLower == "cannot roll modifiers of non-cold damage types" then
792+
self.restrictDamageType = true
793+
self.onlyColdDamage = true
794+
elseif lineLower == "cannot roll modifiers of non-fire damage types" then
795+
self.restrictDamageType = true
796+
self.onlyFireDamage = true
797+
elseif lineLower == "cannot roll modifiers of non-lightning damage types" then
798+
self.restrictDamageType = true
799+
self.onlyLightningDamage = true
800+
elseif lineLower == "cannot roll modifiers of non-chaos damage types" then
801+
self.restrictDamageType = true
802+
self.onlyChaosDamage = true
803+
elseif lineLower == "cannot roll modifiers of non-physical damage types" then
804+
self.restrictDamageType = true
805+
self.onlyPhysicalDamage = true
781806
end
782807

783808
local modLines
@@ -855,7 +880,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality)
855880
self.affixLimit = 2
856881
end
857882
elseif self.rarity == "RARE" then
858-
self.affixLimit = ((self.type == "Jewel" and not (self.base.subType == "Abyss" and self.corrupted)) and 4 or 6)
883+
self.affixLimit = (((self.type == "Jewel" and not (self.base.subType == "Abyss" and self.corrupted)) or self.type == "Graft") and 4 or 6)
859884
if self.prefixes.limit or self.suffixes.limit then
860885
self.prefixes.limit = m_max(m_min((self.prefixes.limit or 0) + self.affixLimit / 2, self.affixLimit), 0)
861886
self.suffixes.limit = m_max(m_min((self.suffixes.limit or 0) + self.affixLimit / 2, self.affixLimit), 0)
@@ -954,6 +979,32 @@ function ItemClass:GetModSpawnWeight(mod, includeTags, excludeTags)
954979
local function HasMavenInfluence(modAffix)
955980
return modAffix:match("Elevated")
956981
end
982+
if self.restrictTag then
983+
for _, key in ipairs(mod.modTags) do
984+
local flagName = "no" .. key:gsub("^%l", string.upper)
985+
if flagName and self[flagName] then
986+
return 0
987+
end
988+
end
989+
end
990+
if self.restrictDamageType then
991+
local required, restricted = false, {}
992+
for _, element in ipairs({ "fire", "cold", "lightning", "chaos", "physical" }) do
993+
local flagName = "only" .. element:gsub("^%l", string.upper) .. "Damage"
994+
if self[flagName] then
995+
required = true
996+
else
997+
restricted[element] = true
998+
end
999+
end
1000+
if required then
1001+
for _, key in ipairs(mod.modTags) do
1002+
if restricted[key] then
1003+
return 0
1004+
end
1005+
end
1006+
end
1007+
end
9571008

9581009
for i, key in ipairs(mod.weightKey) do
9591010
if (self.base.tags[key] or (includeTags and includeTags[key]) or HasInfluenceTag(key)) and not (excludeTags and excludeTags[key]) then
@@ -1068,6 +1119,9 @@ function ItemClass:BuildRaw()
10681119
if modLine.crucible then
10691120
line = "{crucible}" .. line
10701121
end
1122+
if modLine.mutated then
1123+
line = "{mutated}" .. line
1124+
end
10711125
if modLine.fractured then
10721126
line = "{fractured}" .. line
10731127
end
@@ -1278,6 +1332,8 @@ function ItemClass:GetPrimarySlot()
12781332
return "Flask 1"
12791333
elseif self.type == "Tincture" then
12801334
return "Flask 1"
1335+
elseif self.type == "Graft" then
1336+
return "Graft 1"
12811337
else
12821338
return self.type
12831339
end
@@ -1582,8 +1638,10 @@ function ItemClass:BuildModListForSlotNum(baseList, slotNum)
15821638

15831639
-- Small and Medium Curse Cluster Jewel passive mods are parsed the same so the medium cluster data overwrites small and the skills differ
15841640
-- This changes small curse clusters to have the correct clusterJewelSkill so it passes validation below and works as expected in the tree
1585-
if jewelData.clusterJewelSkill == "affliction_curse_effect" and jewelData.clusterJewelNodeCount and jewelData.clusterJewelNodeCount < 4 then
1641+
if self.clusterJewel.size == "Small" and jewelData.clusterJewelSkill == "affliction_curse_effect" then
15861642
jewelData.clusterJewelSkill = "affliction_curse_effect_small"
1643+
elseif self.clusterJewel.size == "Medium" and jewelData.clusterJewelSkill == "affliction_curse_effect_small" then
1644+
jewelData.clusterJewelSkill = "affliction_curse_effect"
15871645
end
15881646

15891647
-- Validation

src/Classes/ItemDBControl.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ local ItemDBClass = newClass("ItemDBControl", "ListControl", function(self, anch
2626
self.leaguesAndTypesLoaded = false
2727
self.leagueList = { "Any league", "No league" }
2828
self.typeList = { "Any type", "Armour", "Jewellery", "One Handed Melee", "Two Handed Melee" }
29-
self.slotList = { "Any slot", "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring", "Belt", "Jewel", "Flask" }
29+
self.slotList = { "Any slot", "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring", "Belt", "Jewel", "Flask", "Graft 1", "Graft 2" }
3030
local baseY = dbType == "RARE" and -22 or -62
3131
self.controls.slot = new("DropDownControl", {"BOTTOMLEFT",self,"TOPLEFT"}, {0, baseY, 179, 18}, self.slotList, function(index, value)
3232
self.listBuildFlag = true

0 commit comments

Comments
 (0)