Skip to content

Commit 8fdb686

Browse files
author
LocalIdentity
committed
Merge branch 'dev'
2 parents 84ef615 + c2386b2 commit 8fdb686

File tree

89 files changed

+18985
-17253
lines changed

Some content is hidden

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

89 files changed

+18985
-17253
lines changed

CHANGELOG.md

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

3+
## [v0.14.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v0.14.0) (2025/12/19)
4+
5+
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/compare/v0.13.0...v0.14.0)
6+
7+
8+
## What's Changed
9+
### New to Path of Building
10+
- Add support for while Shapeshifted and add Shapeshift base stats [\#1636](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1636) ([LocalIdentity](https://github.com/LocalIdentity))
11+
- Add support for Entwined Realities [\#1642](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1642) ([Wires77](https://github.com/Wires77))
12+
- Add support for Disciples reduced Focus Effect Ascendancy [\#1647](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1647) ([LocalIdentity](https://github.com/LocalIdentity))
13+
- Add support for changed Smith of Kitava nodes [\#1640](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1640) ([LocalIdentity](https://github.com/LocalIdentity))
14+
- Add support for Warbringer Imploding Impacts [\#1624](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1624) ([user-74](https://github.com/user-74))
15+
- Support for many changed Ascendancy nodes [\#1650](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1650) ([LocalIdentity](https://github.com/LocalIdentity))
16+
- Add support Garukhan's Resolve and Oisín's Oath [\#1651](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1651) ([LocalIdentity](https://github.com/LocalIdentity))
17+
- Add support for a many new tree mods [\#1649](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1649) ([LocalIdentity](https://github.com/LocalIdentity))
18+
- Add support for Instruments of Power + Lord of the Wilds weapon mods [\#1646](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1646) ([LocalIdentity](https://github.com/LocalIdentity))
19+
- Add support for Surpassing Chance for additional projectiles [\#1655](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1655) ([LocalIdentity](https://github.com/LocalIdentity))
20+
- Update Tailwind and basic attack rate from 0.4 patch notes [\#1639](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1639) ([LocalIdentity](https://github.com/LocalIdentity))
21+
### Fixed Crashes
22+
- Fix Crash when using importing build with radius jewel [\#1621](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1621) ([LocalIdentity](https://github.com/LocalIdentity))
23+
### User Interface
24+
- Fix Small Passive effect mod not visually changing mods on the tree [\#1653](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1653) ([LocalIdentity](https://github.com/LocalIdentity))
25+
- Show Vaal item icon, colour mutated mods and fix import of mutated mods [\#1629](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1629) ([Blitz54](https://github.com/Blitz54))
26+
- Fix font for Elemental Damage on weapon [\#1628](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1628) ([Blitz54](https://github.com/Blitz54))
27+
### Fixed Behaviours
28+
- Fix Pathfinder's alternate start nodes not connecting [\#1618](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1618) ([Wires77](https://github.com/Wires77))
29+
- Fix Quest import on low level characters [\#1641](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1641) ([LocalIdentity](https://github.com/LocalIdentity))
30+
- Fix fully broken armour's damage increase not applying to negative armour [\#1624](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1624) ([user-74](https://github.com/user-74))
31+
- Fix Talisman's not appearing in Trader [\#1626](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1626) ([LocalIdentity](https://github.com/LocalIdentity))
32+
- Fix Poison III, Admixture and Poisonburst Arrow Poison Magnitude mods not working [\#1630](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/pull/1630) ([LocalIdentity](https://github.com/LocalIdentity))
33+
34+
335
## [v0.13.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v0.13.0) (2025/12/15)
436

537
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/compare/v0.12.2...v0.13.0)

changelog.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,33 @@
1+
VERSION[0.14.0][2025/12/19]
2+
3+
--- New to Path of Building ---
4+
* Add support for while Shapeshifted and add Shapeshift base stats (LocalIdentity)
5+
* Add support for Entwined Realities (Wires77)
6+
* Add support for Disciples reduced Focus Effect Ascendancy (LocalIdentity)
7+
* Add support for changed Smith of Kitava nodes (LocalIdentity)
8+
* Add support for Warbringer Imploding Impacts (user-74)
9+
* Support for many changed Ascendancy nodes (LocalIdentity)
10+
* Add support Garukhan's Resolve and Oisín's Oath (LocalIdentity)
11+
* Add support for a many new tree mods (LocalIdentity)
12+
* Add support for Instruments of Power + Lord of the Wilds weapon mods (LocalIdentity)
13+
* Add support for Surpassing Chance for additional projectiles (LocalIdentity)
14+
* Update Tailwind and basic attack rate from 0.4 patch notes (LocalIdentity)
15+
16+
--- Fixed Crashes ---
17+
* Fix Crash when using importing build with radius jewel (LocalIdentity)
18+
19+
--- User Interface ---
20+
* Fix Small Passive effect mod not visually changing mods on the tree (LocalIdentity)
21+
* Show Vaal item icon, colour mutated mods and fix import of mutated mods (Blitz54)
22+
* Fix font for Elemental Damage on weapon (Blitz54)
23+
24+
--- Fixed Behaviours ---
25+
* Fix Pathfinder's alternate start nodes not connecting (Wires77)
26+
* Fix Quest import on low level characters (LocalIdentity)
27+
* Fix fully broken armour's damage increase not applying to negative armour (user-74)
28+
* Fix Talisman's not appearing in Trader (LocalIdentity)
29+
* Fix Poison III, Admixture and Poisonburst Arrow Poison Magnitude mods not working (LocalIdentity)
30+
131
VERSION[0.13.0][2025/12/15]
232

333
--- The Last of the Druids ---

manifest.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ exclude-directories = src/Export,src/TreeData,src/Builds,src/luacov.stats.out,sr
1515

1616
[tree]
1717
path = src
18-
exclude-files = export_lines.bat,extract_lines.scm,log_lines_extract.txt,script_lines_extract_orbit_active.scm,script_lines_extract_orbit_intermediate.scm,script_lines_extract_orbit_normal.scm,missingStats.txt
18+
exclude-files = *.scm,export_lines.bat,log_lines_extract.txt,missingStats.txt
1919
include-directories = src/TreeData

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="0.13.0" />
3+
<Version number="0.14.0" />
44
<Source part="default" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/{branch}/" />
55
<Source part="runtime" platform="win32" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/{branch}/runtime/" />
66
<Source part="program" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/{branch}/src/" />

runtime/lua/dkjson.lua

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,26 @@ local function escapeutf8 (uchar)
130130
end
131131
end
132132

133+
local function sortedkeys(tbl)
134+
local keys = {}
135+
for k in pairs(tbl) do
136+
keys[#keys + 1] = k
137+
end
138+
table.sort(keys, function(a, b)
139+
local ta, tb = type(a), type(b)
140+
if ta == tb then
141+
return a < b
142+
end
143+
if ta == "number" then
144+
return true
145+
elseif tb == "number" then
146+
return false
147+
end
148+
return ta < tb
149+
end)
150+
return keys
151+
end
152+
133153
local function fsub (str, pattern, repl)
134154
-- gsub always builds a new string in a buffer, even when no match
135155
-- exists. First using find should be more efficient when most strings
@@ -333,7 +353,10 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
333353
end
334354
end
335355
else -- unordered
336-
for k,v in pairs (value) do
356+
local keys = sortedkeys(value)
357+
for i = 1, #keys do
358+
local k = keys[i]
359+
local v = value[k]
337360
buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
338361
if not buflen then return nil, msg end
339362
prev = true -- add a seperator before the next element
@@ -711,4 +734,3 @@ if always_try_using_lpeg then
711734
end
712735

713736
return json
714-

src/Assets/vaalitemicon.png

5.11 KB
Loading

src/Classes/CalcBreakdownControl.lua

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -470,14 +470,15 @@ function CalcBreakdownClass:AddModSection(sectionData, modList)
470470
elseif tag.type == "SkillId" then
471471
desc = "Skill: "..build.data.skills[tag.skillId].name
472472
elseif tag.type == "SkillType" then
473-
for name, type in pairs(SkillType) do
474-
if type == tag.skillType then
475-
desc = "Skill type: "..(tag.neg and "Not " or "")..self:FormatModName(name)
476-
break
473+
if tag.skillTypeList then
474+
local typeNames = { }
475+
for _, skillType in ipairs(tag.skillTypeList) do
476+
local formattedSkillType = self:FormatModName(SkillTypeName[skillType] or tostring(skillType))
477+
t_insert(typeNames, formattedSkillType)
477478
end
478-
end
479-
if not desc then
480-
desc = "Skill type: "..(tag.neg and "Not " or "").."?"
479+
desc = "Skill type: "..(tag.neg and "Not " or "")..table.concat(typeNames, " / ")
480+
else
481+
desc = "Skill type: "..(tag.neg and "Not " or "")..self:FormatModName(SkillTypeName[tag.skillType])
481482
end
482483
elseif tag.type == "SlotNumber" then
483484
desc = "When in slot #"..tag.num

src/Classes/ImportTab.lua

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -624,9 +624,6 @@ function ImportTabClass:ImportQuestRewardConfig(questStats)
624624

625625
local updated = false
626626
for _, quest in ipairs(data.questRewards) do
627-
if #statLines == 0 then
628-
break
629-
end
630627
if quest.useConfig == true then
631628
local var = "quest" .. quest.Description .. quest.Area .. quest.Info
632629
if quest.Stat then
@@ -1038,6 +1035,7 @@ function ImportTabClass:ImportItem(itemData, slotName)
10381035
item.corrupted = itemData.corrupted
10391036
item.fractured = itemData.fractured
10401037
item.desecrated = itemData.desecrated
1038+
item.mutated = itemData.mutated
10411039
if itemData.sockets and itemData.sockets[1] then
10421040
item.sockets = { }
10431041
item.itemSocketCount = 0
@@ -1117,6 +1115,14 @@ function ImportTabClass:ImportItem(itemData, slotName)
11171115
end
11181116
end
11191117
end
1118+
if itemData.mutatedMods then
1119+
for _, line in ipairs(itemData.mutatedMods) do
1120+
for line in line:gmatch("[^\n]+") do
1121+
local modList, extra = modLib.parseMod(line)
1122+
t_insert(item.explicitModLines, { line = line, extra = extra, mods = modList or { }, mutated = true })
1123+
end
1124+
end
1125+
end
11201126

11211127
if itemData.grantedSkills then
11221128
for _, grantedSkillInfo in ipairs(itemData.grantedSkills) do

src/Classes/Item.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ local ItemClass = newClass("Item", function(self, raw, rarity, highQuality)
5959
end)
6060

6161
local lineFlags = {
62-
["custom"] = true, ["fractured"] = true, ["desecrated"] = true, ["enchant"] = true, ["implicit"] = true, ["rune"] = true,
62+
["custom"] = true, ["fractured"] = true, ["desecrated"] = true, ["mutated"] = true, ["enchant"] = true, ["implicit"] = true, ["rune"] = true,
6363
}
6464

6565
-- Special function to store unique instances of modifier on specific item slots
@@ -643,6 +643,9 @@ function ItemClass:ParseRaw(raw, rarity, highQuality)
643643
if modLine.desecrated then
644644
self.desecrated = true
645645
end
646+
if modLine.mutated then
647+
self.mutated = true
648+
end
646649
if modLine.fractured then
647650
self.fractured = true
648651
end
@@ -1198,6 +1201,9 @@ function ItemClass:BuildRaw()
11981201
if modLine.desecrated then
11991202
line = "{desecrated}" .. line
12001203
end
1204+
if modLine.mutated then
1205+
line = "{mutated}" .. line
1206+
end
12011207
if modLine.variantList then
12021208
local varSpec
12031209
for varId in pairs(modLine.variantList) do

src/Classes/ItemsTab.lua

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,7 +1886,7 @@ end
18861886

18871887
-- Check if the given item could be equipped in the given slot, taking into account possible conflicts with currently equipped items
18881888
-- For example, a shield is not valid for Weapon 2 if Weapon 1 is a staff, and a wand is not valid for Weapon 2 if Weapon 1 is a dagger
1889-
function ItemsTabClass:IsItemValidForSlot(item, slotName, itemSet)
1889+
function ItemsTabClass:IsItemValidForSlot(item, slotName, itemSet, flagState)
18901890
itemSet = itemSet or self.activeItemSet
18911891
local slotType, slotId = slotName:match("^([%a ]+) (%d+)$")
18921892
if not slotType then
@@ -1934,12 +1934,22 @@ function ItemsTabClass:IsItemValidForSlot(item, slotName, itemSet)
19341934
local weapon1Sel = itemSet[slotName == "Weapon 2" and "Weapon 1" or "Weapon 1 Swap"].selItemId or 0
19351935
local weapon1Base = self.items[weapon1Sel] and self.items[weapon1Sel].base or "Unarmed"
19361936
-- Calcs tab isn't loaded yet when the items tab gets loaded, so assume we have Giant's Blood until proven wrong
1937-
local giantsBlood = true
1938-
if self.build.calcsTab and self.build.calcsTab.mainEnv then
1937+
local giantsBlood, instrumentsOfPower, lordOfTheWilds = true, true, true
1938+
if flagState then
1939+
giantsBlood = flagState.giantsBlood
1940+
instrumentsOfPower = flagState.instrumentsOfPower
1941+
lordOfTheWilds = flagState.lordOfTheWilds
1942+
elseif self.build.calcsTab and self.build.calcsTab.mainEnv then
19391943
giantsBlood = self.build.calcsTab.mainEnv.modDB:Flag(nil, "GiantsBlood")
1944+
instrumentsOfPower = self.build.calcsTab.mainEnv.modDB:Flag(nil, "InstrumentsOfPower")
1945+
lordOfTheWilds = self.build.calcsTab.mainEnv.modDB:Flag(nil, "LordOfTheWilds")
19401946
end
19411947
if weapon1Base.type == "Bow" then
19421948
return item.type == "Quiver"
1949+
elseif weapon1Base.type == "Talisman" and lordOfTheWilds then
1950+
return item.type == "Sceptre" and item.rarity ~= "UNIQUE" and item.rarity ~= "RELIC"
1951+
elseif weapon1Base.type == "Staff" and instrumentsOfPower then
1952+
return item.type == "Focus"
19431953
elseif weapon1Base == "Unarmed" or weapon1Base.tags.onehand or (giantsBlood and (weapon1Base.tags.axe or weapon1Base.tags.mace or weapon1Base.tags.sword)) then
19441954
return item.type == "Shield" or item.type == "Focus" or item.type == "Sceptre"
19451955
or (item.base.tags.one_hand_weapon and weapon1Base.type ~= "Wand" and weapon1Base.type ~= "Sceptre")
@@ -1948,6 +1958,28 @@ function ItemsTabClass:IsItemValidForSlot(item, slotName, itemSet)
19481958
end
19491959
end
19501960

1961+
-- Ensure weapon 2 slots remain valid if keystone-dependent restrictions change
1962+
function ItemsTabClass:ValidateWeaponSlots(flagState)
1963+
local activeSetChanged = false
1964+
local itemSet = self.activeItemSet
1965+
if itemSet then
1966+
local slotName = itemSet.useSecondWeaponSet and "Weapon 2 Swap" or "Weapon 2"
1967+
local slotData = itemSet[slotName]
1968+
if slotData and slotData.selItemId and slotData.selItemId ~= 0 then
1969+
local item = self.items[slotData.selItemId]
1970+
if not item or not self:IsItemValidForSlot(item, slotName, itemSet, flagState) then
1971+
if self.slots[slotName] then
1972+
self.slots[slotName]:SetSelItemId(0)
1973+
else
1974+
slotData.selItemId = 0
1975+
end
1976+
activeSetChanged = true
1977+
end
1978+
end
1979+
end
1980+
return activeSetChanged
1981+
end
1982+
19511983
-- Opens the item set manager
19521984
function ItemsTabClass:OpenItemSetManagePopup()
19531985
local controls = { }
@@ -2678,7 +2710,13 @@ function ItemsTabClass:SetTooltipHeaderInfluence(tooltip, item)
26782710
tooltip.influenceHeader2 = "Desecrated"
26792711
end
26802712
end
2681-
2713+
if item.mutated then
2714+
if not tooltip.influenceHeader1 then
2715+
tooltip.influenceHeader1 = "Mutated"
2716+
else
2717+
tooltip.influenceHeader2 = "Mutated"
2718+
end
2719+
end
26822720
-- If only one influence, we copy to second header. Preparing for dual influence mods like in first game.
26832721
if tooltip.influenceHeader1 and not tooltip.influenceHeader2 then
26842722
tooltip.influenceHeader2 = tooltip.influenceHeader1
@@ -2770,7 +2808,7 @@ function ItemsTabClass:AddItemTooltip(tooltip, item, slot, dbMode)
27702808
elemLine = elemLine..s_format("%s%d-%d", colorCodes[var:upper()], weaponData[var.."Min"], weaponData[var.."Max"], "FONTIN SC")
27712809
end
27722810
end
2773-
tooltip:AddLine(fontSizeBig, elemLine)
2811+
tooltip:AddLine(fontSizeBig, elemLine, "FONTIN SC")
27742812
tooltip:AddLine(fontSizeBig, s_format("^x7F7F7FElemental DPS: "..colorCodes.MAGIC.."%.1f", weaponData.ElementalDPS), "FONTIN SC")
27752813
totalDamageTypes = totalDamageTypes + 1
27762814
end

0 commit comments

Comments
 (0)