Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# Changelog

## [v2.67.2](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v2.67.2) (2026/08/07)

[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.67.1...v2.67.2)


## What's Changed
### Fixed Calculations
- Fix Scornful Herald not counting buffs as affecting you [\#10158](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/10158) ([Wires77](https://github.com/Wires77))
- Fix The Unblinking Eye increased evasion not applying to Attacks with Arcane Might [\#10155](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/10155) ([andyli00](https://github.com/andyli00))
### Fixed Behaviours
- Fix Foulborn icon display on Linux [\#10160](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/10160) ([cupkax](https://github.com/cupkax))
- Fix double clicking and dragging items causing issues [\#10149](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/10149) ([vaisest](https://github.com/vaisest))



## [v2.67.1](https://github.com/PathOfBuildingCommunity/PathOfBuilding-PoE2/tree/v2.67.1) (2026/08/06)

[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.67.0...v2.67.1)
Expand Down
11 changes: 11 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
VERSION[2.67.2][2026/08/07]

--- Fixed Calculations ---
* Fix Scornful Herald not counting buffs as affecting you (Wires77)
* Fix The Unblinking Eye increased evasion not applying to Attacks with Arcane Might (andyli00)

--- Fixed Behaviours ---
* Fix Foulborn icon display on Linux (cupkax)
* Fix double-clicking and dragging items causing issues (vaisest)


VERSION[2.67.1][2026/08/06]

--- New to Path of Building ---
Expand Down
52 changes: 26 additions & 26 deletions manifest.xml

Large diffs are not rendered by default.

15 changes: 15 additions & 0 deletions spec/System/TestSkills_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,21 @@ describe("TestSkills", function()
assert.True(preAdrenalineMaxStages < build.calcsTab.mainEnv.player.activeSkillList[1].skillModList:Sum("BASE", nil, "Multiplier:BlightMaxStages"))
end)

it("calculates added resistance from heralds even when using scornful herald", function()
build.skillsTab:PasteSocketGroup("Cyclone 20/0 1\n")
build.skillsTab:PasteSocketGroup("Herald of Thunder 20/0 1\nScornful Herald 20/0 1\n")
build.itemsTab:CreateDisplayItemFromRaw([[Circle of Regret
Topaz Ring
{tags:resistance}+(50-60)% to Lightning Resistance while affected by Herald of Thunder
]])
build.itemsTab:AddDisplayItem()

runCallback("OnFrame")

assert.are.equals(0, build.calcsTab.mainEnv.player.modDB:Sum("BASE", nil, "LightningMin"))
assert.are.equals(-5, build.calcsTab.mainEnv.player.modDB:Sum("BASE", nil, "LightningResist"))
end)

it("calculates Wintertide Brand average damage for attached brands and Wintertide's End", function()
local function getAverageDamageMultiplier()
for _, mod in ipairs(build.calcsTab.mainEnv.player.mainSkill.skillModList) do
Expand Down
File renamed without changes
52 changes: 40 additions & 12 deletions src/Classes/CalcBreakdownControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,14 @@ local CalcBreakdownClass = newClass("CalcBreakdownControl", "Control", "ControlH
self.rangeGuide:Load("Assets/range_guide.png")
self.uiOverlay = NewImageHandle()
self.uiOverlay:Load("Assets/game_ui_small.png")
self.borderThickness = 2
self.controls.scrollBar = new("ScrollBarControl", {"RIGHT",self,"RIGHT"}, {-2, 0, 18, 0}, 80, "VERTICAL", true)
-- keep the scroll bar inside the border
self.controls.scrollBar.x = function()
return -self.borderThickness
end
self.pinnedColour = { 0.25, 1, 0.25 }
self.borderColour = { 0.33, 0.66, 0.33 }
end)

function CalcBreakdownClass:IsMouseOver()
Expand All @@ -34,21 +41,34 @@ function CalcBreakdownClass:IsMouseOver()
return self:IsMouseInBounds() or self:GetMouseOverControl()
end

function CalcBreakdownClass:SetBreakdownData(displayData, pinned)
function CalcBreakdownClass:GetActor()
local env = self.calcsTab[self.envName or "calcsEnv"]
local actor = self.calcsTab.input.showMinion and env.minion or env.player
if self.forceActor then
actor = env[self.forceActor]
end
return actor, env
end
---@param displayData any
---@param pinned any
---@param forceActor "player"|"minion"|nil
function CalcBreakdownClass:SetBreakdownData(displayData, pinned, forceActor)
self.pinned = pinned
if displayData == self.sourceData then
return
end
self.sourceData = displayData
self.forceActor = forceActor
self.shown = false
if not displayData then
return
end

-- Build list of sections
local actor, env = self:GetActor()
self.sectionList = wipeTable(self.sectionList)
for _, sectionData in ipairs(displayData) do
if self.calcsTab:CheckFlag(sectionData) then
if self.calcsTab:CheckFlag(sectionData, actor, env.player) then
if sectionData.breakdown then
self:AddBreakdownSection(sectionData)
elseif sectionData.modName then
Expand All @@ -57,7 +77,11 @@ function CalcBreakdownClass:SetBreakdownData(displayData, pinned)
end
end
if #self.sectionList == 0 then
self.calcsTab:ClearDisplayStat()
if self.clearDisplayFunc then
self.clearDisplayFunc()
else
self.calcsTab:ClearDisplayStat()
end
return
end

Expand Down Expand Up @@ -116,7 +140,7 @@ end

-- Add sections based on the breakdown data generated by the Calcs module
function CalcBreakdownClass:AddBreakdownSection(sectionData)
local actor = self.calcsTab.input.showMinion and self.calcsTab.calcsEnv.minion or self.calcsTab.calcsEnv.player
local actor = self:GetActor()
local breakdown
local ns, name = sectionData.breakdown:match("^(%a+)%.(%a+)$")
if ns then
Expand Down Expand Up @@ -269,7 +293,7 @@ end

-- Add a table section showing a list of modifiers
function CalcBreakdownClass:AddModSection(sectionData, modList)
local actor = self.calcsTab.input.showMinion and self.calcsTab.calcsEnv.minion or self.calcsTab.calcsEnv.player
local actor = self:GetActor()
local build = self.calcsTab.build

-- Build list of modifiers to display
Expand Down Expand Up @@ -663,12 +687,13 @@ function CalcBreakdownClass:Draw(viewPort)
local scrollBar = self.controls.scrollBar
local width = self.contentWidth
local height = self.contentHeight
local borderThickness = self.borderThickness
if self.contentHeight > viewPort.height then
-- Content won't fit the screen height, so set the scrollbar
width = self.contentWidth + scrollBar.width
height = viewPort.height
scrollBar.height = height - 4
scrollBar:SetContentDimension(self.contentHeight - 4, viewPort.height - 4)
scrollBar.height = height - borderThickness * 2
scrollBar:SetContentDimension(self.contentHeight - borderThickness * 2, viewPort.height - borderThickness * 2)
else
scrollBar:SetContentDimension(0, 0)
end
Expand All @@ -685,15 +710,14 @@ function CalcBreakdownClass:Draw(viewPort)
-- Draw background
SetDrawLayer(nil, 10)
SetDrawColor(0, 0, 0, 0.9)
DrawImage(nil, x + 2, y + 2, width - 4, height - 4)
DrawImage(nil, x + borderThickness, y + borderThickness, width - borderThickness * 2, height - borderThickness * 2)
-- Draw border (this is put in sub layer 11 so it draws over the contents, in case they don't fit the screen)
SetDrawLayer(nil, 11)
if self.pinned then
SetDrawColor(0.25, 1, 0.25)
SetDrawColor(unpack(self.pinnedColour))
else
SetDrawColor(0.33, 0.66, 0.33)
SetDrawColor(unpack(self.borderColour))
end
local borderThickness = 2
DrawImage(nil, x, y, width, borderThickness)
DrawImage(nil, x, y + height - borderThickness, width, borderThickness)
DrawImage(nil, x, y, borderThickness, height)
Expand Down Expand Up @@ -735,7 +759,11 @@ function CalcBreakdownClass:OnKeyDown(key, doubleClick)
if key:match("BUTTON") then
if not mOver then
-- Mouse click outside the control, hide the breakdown
self.calcsTab:ClearDisplayStat()
if self.clearDisplayFunc then
self.clearDisplayFunc()
else
self.calcsTab:ClearDisplayStat()
end
self.shown = false
return
end
Expand Down
4 changes: 2 additions & 2 deletions src/Classes/CalcsTab.lua
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ function CalcsTabClass:SetDisplayStat(displayData, pin)
self.controls.breakdown:SetBreakdownData(displayData, pin)
end

function CalcsTabClass:CheckFlag(obj, actor)
function CalcsTabClass:CheckFlag(obj, actor, player)
actor = actor or (self.input.showMinion and self.calcsEnv.minion or self.calcsEnv.player)
local skillFlags = actor.mainSkill.skillFlags
if obj.flag and not skillFlags[obj.flag] then
Expand All @@ -399,7 +399,7 @@ function CalcsTabClass:CheckFlag(obj, actor)
end
end
end
if obj.playerFlag and not self.calcsEnv.player.mainSkill.skillFlags[obj.playerFlag] then
if obj.playerFlag and not (player or self.calcsEnv.player).mainSkill.skillFlags[obj.playerFlag] then
return
end
if obj.notFlag and skillFlags[obj.notFlag] then
Expand Down
3 changes: 3 additions & 0 deletions src/Classes/ItemListControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,9 @@ function ItemListClass:OnSelClick(index, itemId, doubleClick)
self.itemsTab.build.buildFlag = true
end
elseif doubleClick then
-- disallow dragging since if the cursor is outside the selection after
-- the second click, the item will be stuck onto the cursor
self.selDragging = false
local newItem = new("Item", item:BuildRaw())
newItem.id = item.id
self.itemsTab:SetDisplayItem(newItem)
Expand Down
31 changes: 30 additions & 1 deletion src/Classes/TextListControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,47 @@ function TextListClass:Draw(viewPort)
local lineY = -scrollBar.offset
for _, lineInfo in ipairs(self.list) do
if lineInfo[colIndex] then
DrawString(lineInfo.x or colInfo.x, lineY, lineInfo.align or colInfo.align, lineInfo.height, lineInfo.font or "VAR", lineInfo[colIndex])
local textX = lineInfo.x or colInfo.x
local align = lineInfo.align or colInfo.align
DrawString(textX, lineY, align, lineInfo.height, lineInfo.font or "VAR", lineInfo[colIndex])
if lineInfo.underline and lineInfo.underline[colIndex] then
local width = DrawStringWidth(lineInfo.height, "VAR", StripEscapes(lineInfo[colIndex]))
-- note: not fully handled. this is currently only used for
-- the side bar stats
if align == "RIGHT_X" then
textX = textX - width
end
SetDrawColor(0.5, 0.5, 0.5)
DrawImage(nil, textX, lineY + lineInfo.height, width, 1)
end
end
lineY = lineY + lineInfo.height
end
end
-- determine which line the user is hovering over
self.hoveredLine = nil
local cursorX, cursorY = GetCursorPos()
if cursorX >= x + 2 and cursorX < x + width - 18 and cursorY >= y + 2 and cursorY < y + height - 2 then
local rowY = y - scrollBar.offset + 2
-- suboptimal. should do binary search if this causes performance problems
for _, lineInfo in ipairs(self.list) do
if cursorY >= rowY and cursorY < rowY + lineInfo.height then
self.hoveredLine = { line = lineInfo, x = x, y = rowY, width = width }
break
end
rowY = rowY + lineInfo.height
end
end
SetViewport()
end

function TextListClass:OnKeyDown(key, doubleClick)
if not self:IsShown() or not self:IsEnabled() then
return
end
if key == "LEFTBUTTON" and self.onClick then
self.onClick(self.hoveredLine)
end
local mOverControl = self:GetMouseOverControl()
if mOverControl and mOverControl.OnKeyDown then
return mOverControl:OnKeyDown(key)
Expand Down
3 changes: 2 additions & 1 deletion src/Data/Global.lua
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,9 @@ function updateColorCode(code, color)
end

function hexToRGB(hex)
hex = hex:gsub("%^x", "") -- Remove "^x" prefix
hex = hex:gsub("0x", "") -- Remove "0x" prefix
hex = hex:gsub("#","") -- Remove '#' if present
hex = hex:gsub("#", "") -- Remove '#' if present
if #hex ~= 6 then
return nil
end
Expand Down
3 changes: 2 additions & 1 deletion src/Data/Skills/sup_int.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5968,7 +5968,8 @@ skills["SupportScornfulHerald"] = {
statDescriptionScope = "gem_stat_descriptions",
statMap = {
["herald_no_buff_effect"] = {
flag("DisableBuff", { type = "SkillType", skillType = SkillType.Herald }),
mod("BuffEffect", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Herald }),
value = -100,
},
},
qualityStats = {
Expand Down
3 changes: 2 additions & 1 deletion src/Export/Skills/sup_int.txt
Original file line number Diff line number Diff line change
Expand Up @@ -828,7 +828,8 @@ local skills, mod, flag, skill = ...
#skill SupportScornfulHerald
statMap = {
["herald_no_buff_effect"] = {
flag("DisableBuff", { type = "SkillType", skillType = SkillType.Herald }),
mod("BuffEffect", "MORE", nil, 0, 0, { type = "SkillType", skillType = SkillType.Herald }),
value = -100,
},
},
#mods
Expand Down
Loading
Loading