Skip to content

Commit 12259a8

Browse files
author
LocalIdentity
committed
Merge branch 'dev'
2 parents 93f905c + fe3b203 commit 12259a8

17 files changed

Lines changed: 568 additions & 59 deletions

CHANGELOG.md

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

3+
## [v2.53.1](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.53.1) (2025/06/13)
4+
5+
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.53.0...v2.53.1)
6+
7+
## What's Changed
8+
### User Interface
9+
- Enable Sorting of folders by date and inherit the sort order in the build save dialogue [\#8624](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8624) ([Noologos](https://github.com/Noologos))
10+
### Fixed Calculations
11+
- Fix CWC not supporting triggerbots [\#8671](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8671) ([Paliak](https://github.com/Paliak))
12+
### Fixed Behaviours
13+
- Fix Champions' new maximum Fortification mod not working [\#8668](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8668) ([LocalIdentity](https://github.com/LocalIdentity))
14+
- Fix Nebulis and similar mods being treated as uncapped [\#8666](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8666) ([Paliak](https://github.com/Paliak))
15+
16+
317
## [v2.53.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.53.0) (2025/06/13)
418

519
[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.52.3...v2.53.0)

changelog.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
VERSION[2.53.1][2025/06/13]
2+
3+
--- User Interface ---
4+
* Enable Sorting of folders by date and inherit the sort order in the build save dialogue (Noologos)
5+
6+
--- Fixed Calculations ---
7+
* Fix CWC not supporting triggerbots (Paliak)
8+
9+
--- Fixed Behaviours ---
10+
* Fix Champions' new maximum Fortification mod not working (LocalIdentity)
11+
* Fix Nebulis and similar mods being treated as uncapped (Paliak)
12+
113
VERSION[2.53.0][2025/06/13]
214

315
--- 3.26 Mercenaries of Trarthus ---

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.53.0" />
3+
<Version number="2.53.1" />
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/" />

spec/System/TestItemMods_spec.lua

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,4 +509,48 @@ describe("TetsItemMods", function()
509509

510510
assert.are_not.equals(baseLife, build.calcsTab.mainOutput.Life)
511511
end)
512+
513+
it("globalLimit mods", function()
514+
build.configTab.input.customMods = [[
515+
-1000% to cold resistance
516+
]]
517+
build.configTab:BuildModList()
518+
build.itemsTab:CreateDisplayItemFromRaw([[Replica Nebulis
519+
Void Sceptre
520+
League: Heist
521+
Quality: 20
522+
Sockets: B-B-B
523+
LevelReq: 68
524+
Implicits: 1
525+
40% increased Elemental Damage
526+
{fractured}{range:1}(15-20)% increased Cast Speed
527+
{range:1}(15-20)% increased Cold Damage per 1% Missing Cold Resistance, up to a maximum of 300%
528+
{range:1}(15-20)% increased Fire Damage per 1% Missing Fire Resistance, up to a maximum of 300%]])
529+
build.itemsTab:AddDisplayItem()
530+
build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nFireball 20/0 Default 1\n")
531+
runCallback("OnFrame")
532+
533+
assert.are_not.equals(340, build.calcsTab.mainEnv.modDB:Sum("INC", "FireDamage"))
534+
assert.are_not.equals(340, build.calcsTab.mainEnv.modDB:Sum("INC", "ColdDamage"))
535+
536+
newBuild()
537+
538+
build.configTab.input.customMods = [[
539+
Gain 25% increased Armour per 5 Power for 8 seconds when you Warcry, up to a maximum of 100%
540+
Warcries have infinite Power
541+
warcries grant arcane surge to you and allies, with 10% increased effect per 5 power, up to 100%
542+
]]
543+
build.configTab:BuildModList()
544+
build.itemsTab:CreateDisplayItemFromRaw([[
545+
New Item
546+
Plate Vest
547+
Armour: 32
548+
]])
549+
build.itemsTab:AddDisplayItem()
550+
build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1")
551+
552+
assert.are_not.equals(40, build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Cast }, "Speed"))
553+
assert.are_not.equals(64, build.calcsTab.mainOutput.Armour)
554+
runCallback("OnFrame")
555+
end)
512556
end)

spec/System/TestTriggers_spec.lua

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,4 +1359,54 @@ describe("TestTriggers", function()
13591359

13601360
assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
13611361
end)
1362+
1363+
it("Triggerbots CWCHandler", function()
1364+
build.skillsTab:PasteSocketGroup("Arc 20/0 Default 1\nCast while Channelling 20/0 Default 1\nBlight 20/0 Default 1\n")
1365+
runCallback("OnFrame")
1366+
local baseRate = build.calcsTab.mainOutput.SkillTriggerRate
1367+
assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
1368+
1369+
build.configTab.input.customMods = [[
1370+
Triggers Level 20 Summon Triggerbots when Allocated
1371+
]]
1372+
build.configTab:BuildModList()
1373+
runCallback("OnFrame")
1374+
assert.are.not_equals(math.floor(build.calcsTab.mainOutput.SkillTriggerRate * 100), math.floor(baseRate * 100))
1375+
end)
1376+
1377+
it("Triggerbots defaultHandler", function()
1378+
build.itemsTab:CreateDisplayItemFromRaw([[Elemental 1H Sword
1379+
Eternal Sword
1380+
Crafted: true
1381+
Prefix: {range:0.5}WeaponElementalDamageOnWeapons4
1382+
Prefix: None
1383+
Prefix: None
1384+
Suffix: {range:0.5}LocalIncreasedAttackSpeed3
1385+
Suffix: {range:0.5}LocalCriticalStrikeChance3
1386+
Suffix: {range:0.5}LocalCriticalMultiplier4
1387+
Quality: 20
1388+
Sockets: G-G-G
1389+
LevelReq: 66
1390+
Implicits: 1
1391+
{tags:attack}+475 to Accuracy Rating
1392+
12% increased Attack Speed
1393+
22% increased Critical Strike Chance
1394+
+27% to Global Critical Strike Multiplier
1395+
40% increased Elemental Damage with Attack Skills]])
1396+
build.itemsTab:AddDisplayItem()
1397+
runCallback("OnFrame")
1398+
1399+
build.skillsTab:PasteSocketGroup("Cast On Critical Strike 20/0 Default 1\nArc 20/0 Default 1\nCyclone 20/0 Default 1\n")
1400+
runCallback("OnFrame")
1401+
1402+
local baseRate = build.calcsTab.mainOutput.SkillTriggerRate
1403+
assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
1404+
1405+
build.configTab.input.customMods = [[
1406+
Triggers Level 20 Summon Triggerbots when Allocated
1407+
]]
1408+
build.configTab:BuildModList()
1409+
runCallback("OnFrame")
1410+
assert.are.not_equals(math.floor(build.calcsTab.mainOutput.SkillTriggerRate * 100), math.floor(baseRate * 100))
1411+
end)
13621412
end)

src/Classes/FolderListControl.lua

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,38 @@ local t_insert = table.insert
99
local FolderListClass = newClass("FolderListControl", "ListControl", function(self, anchor, rect, subPath, onChange)
1010
self.ListControl(anchor, rect, 16, "VERTICAL", false, { })
1111
self.subPath = subPath or ""
12-
self.controls.path = new("PathControl", {"BOTTOM",self,"TOP"}, {0, -2, self.width, 24}, main.buildPath, self.subPath, function(subPath)
13-
self.subPath = subPath
12+
self.onChangeCallback = onChange
13+
14+
self.controls.path = new("PathControl", {"BOTTOM",self,"TOP"}, {0, -2, self.width, 24}, main.buildPath, self.subPath, function(newSubPath)
15+
self.subPath = newSubPath
1416
self:BuildList()
1517
self.selIndex = nil
1618
self.selValue = nil
17-
if onChange then
18-
onChange(subPath)
19+
if self.onChangeCallback then
20+
self.onChangeCallback(newSubPath)
1921
end
2022
end)
2123
self:BuildList()
2224
end)
2325

26+
function FolderListClass:SortList()
27+
if not self.list then return end
28+
local sortMode = main.buildSortMode or "NAME"
29+
30+
table.sort(self.list, function(a, b)
31+
if sortMode == "EDITED" then
32+
local modA = a.modified or 0
33+
local modB = b.modified or 0
34+
if modA ~= modB then
35+
return modA > modB
36+
end
37+
return naturalSortCompare(a.name, b.name)
38+
else
39+
return naturalSortCompare(a.name, b.name)
40+
end
41+
end)
42+
end
43+
2444
function FolderListClass:BuildList()
2545
wipeTable(self.list)
2646
local handle = NewFileSearch(main.buildPath..self.subPath.."*", true)
@@ -29,11 +49,17 @@ function FolderListClass:BuildList()
2949
t_insert(self.list, {
3050
name = fileName,
3151
fullFileName = main.buildPath..self.subPath..fileName,
52+
modified = handle:GetFileModifiedTime()
3253
})
3354
if not handle:NextFile() then
3455
break
3556
end
3657
end
58+
if handle and handle.Close then handle:Close() end
59+
60+
self:SortList()
61+
if self.UpdateScrollbar then self:UpdateScrollbar() end
62+
if self.Redraw then self:Redraw() end
3763
end
3864

3965
function FolderListClass:OpenFolder(folderName)
@@ -61,7 +87,7 @@ function FolderListClass:OnSelDelete(index, folder)
6187
main:OpenMessagePopup("Error", "Couldn't delete '"..folder.fullFileName.."': "..msg)
6288
return
6389
end
64-
self:BuildList()
90+
self:BuildList()
6591
self.selIndex = nil
6692
self.selValue = nil
6793
end

src/Classes/ListControl.lua

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,10 +346,12 @@ function ListClass:OnKeyDown(key, doubleClick)
346346
newSelect = index
347347
end
348348
else
349+
local scrollOffsetH = self.controls.scrollBarH.offset
349350
for colIndex, column in ipairs(self.colList) do
350351
local relX = cursorX - (x + 2)
351352
local relY = cursorY - (y + 2)
352-
local mOver = relX >= column._offset and relX <= column._offset + column._width and relY >= 0 and relY <= 18
353+
local adjustedRelX = relX + scrollOffsetH
354+
local mOver = adjustedRelX >= column._offset and adjustedRelX <= column._offset + column._width and relY >= 0 and relY <= 18
353355
if self:GetColumnProperty(column, "sortable") and mOver and self.ReSort then
354356
self:ReSort(colIndex)
355357
end

src/Classes/ModStore.lua

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,6 @@ function ModStoreClass:EvalMod(mod, cfg, globalLimits)
267267
local target = self
268268
local limitTarget = self
269269

270-
if globalLimits and tag.globalLimit and tag.globalLimitKey then
271-
value = value or 0
272-
globalLimits[tag.globalLimitKey] = globalLimits[tag.globalLimitKey] or 0
273-
if globalLimits[tag.globalLimitKey] + value > tag.globalLimit then
274-
value = tag.globalLimit - globalLimits[tag.globalLimitKey]
275-
end
276-
globalLimits[tag.globalLimitKey] = globalLimits[tag.globalLimitKey] + value
277-
end
278-
279270
-- Allow limiting a self multiplier on a parent multiplier (eg. Agony Crawler on player virulence)
280271
-- This explicit target is necessary because even though the GetMultiplier method does call self.parent.GetMultiplier, it does so with noMod = true,
281272
-- disabling the summation (3rd part): (not noMod and self:Sum("BASE", cfg, multiplierName[var]) or 0)
@@ -824,6 +815,18 @@ function ModStoreClass:EvalMod(mod, cfg, globalLimits)
824815
return
825816
end
826817
end
827-
end
818+
end
819+
820+
-- Apply global limits
821+
for _, tag in ipairs(mod) do
822+
if globalLimits and tag.globalLimit and tag.globalLimitKey then
823+
value = value or 0
824+
globalLimits[tag.globalLimitKey] = globalLimits[tag.globalLimitKey] or 0
825+
if globalLimits[tag.globalLimitKey] + value > tag.globalLimit then
826+
value = tag.globalLimit - globalLimits[tag.globalLimitKey]
827+
end
828+
globalLimits[tag.globalLimitKey] = globalLimits[tag.globalLimitKey] + value
829+
end
830+
end
828831
return value
829832
end

src/Data/ModCache.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11920,7 +11920,7 @@ c["You have Zealot's Oath if you haven't been hit recently"]={{[1]={[1]={neg=tru
1192011920
c["You have no Armour or Maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="MORE",value=-100},[2]={flags=0,keywordFlags=0,name="EnergyShield",type="MORE",value=-100}},nil}
1192111921
c["You have no Intelligence"]={{[1]={flags=0,keywordFlags=0,name="Int",type="MORE",value=-100}},nil}
1192211922
c["You have no Life Regeneration"]={{[1]={flags=0,keywordFlags=0,name="NoLifeRegen",type="FLAG",value=true}},nil}
11923-
c["You have your maximum Fortification"]={nil,"your maximum Fortification "}
11923+
c["You have your maximum Fortification"]={{[1]={flags=0,keywordFlags=0,name="Condition:Fortified",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="Condition:HaveMaxFortification",type="FLAG",value=true}},nil}
1192411924
c["You lose all Endurance Charges on reaching maximum Endurance Charges"]={nil,"You lose all Endurance Charges on reaching maximum Endurance Charges "}
1192511925
c["You lose all Endurance Charges on reaching maximum Endurance Charges Cannot Block"]={nil,"You lose all Endurance Charges on reaching maximum Endurance Charges Cannot Block "}
1192611926
c["You lose all Endurance Charges when Hit"]={nil,"You lose all Endurance Charges when Hit "}

src/Export/Classes/DatListControl.lua

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,27 @@
44
-- Dat list control.
55
--
66
local DatListClass = newClass("DatListControl", "ListControl", function(self, anchor, rect)
7-
self.ListControl(anchor, rect, 14, "VERTICAL", false, main.datFileList)
7+
self.originalList = main.datFileList
8+
self.searchBuf = ""
9+
self.filteredList = self.originalList
10+
self.ListControl(anchor, rect, 14, "VERTICAL", false, self.filteredList)
811
end)
912

13+
function DatListClass:BuildFilteredList()
14+
local search = self.searchBuf:lower()
15+
if search == "" then
16+
self.filteredList = self.originalList
17+
else
18+
self.filteredList = {}
19+
for _, file in ipairs(self.originalList) do
20+
if file.name:lower():find(search, 1, true) then
21+
table.insert(self.filteredList, file)
22+
end
23+
end
24+
end
25+
self.list = self.filteredList
26+
end
27+
1028
function DatListClass:GetRowValue(column, index, datFile)
1129
if column == 1 then
1230
return "^7"..datFile.name

0 commit comments

Comments
 (0)