Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
LocalIdentity committed Jul 29, 2024
2 parents 341436b + 51185c9 commit 5a0b297
Show file tree
Hide file tree
Showing 130 changed files with 280,188 additions and 297,291 deletions.
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
# Changelog

## [v2.47.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.47.0) (2024/07/29)

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

<!-- Release notes generated using configuration in .github/release.yml at dev -->

## What's Changed
### New to Path of Building
- Update existing gems [\#7970](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7970) ([Wires77](https://github.com/Wires77), [Regisle](https://github.com/Regisle), [Nostrademous](https://github.com/Nostrademous), [LocalIdentity](https://github.com/LocalIdentity))
- Add support for new 3.25 Gems [\#7988](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7988) ([LocalIdentity](https://github.com/LocalIdentity))
- Add support for new 3.25 Uniques [\#8000](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8000), [\#7993](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7993) ([Paliak](https://github.com/Paliak), [Nostrademous](https://github.com/Nostrademous), [LocalIdentity](https://github.com/LocalIdentity))
- Add support for Warcries to affect Minions [\#7960](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7960) ([Regisle](https://github.com/Regisle))
- Add support for Echoes of Creation [\#7999](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7999) ([LocalIdentity](https://github.com/LocalIdentity))
- Fix numerous issues in bleed calculations [\#7771](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7771) ([CelestiaTheDryad](https://github.com/CelestiaTheDryad))
### Fixed Crashes
- Fix crash when importing a build where empty configs were not loaded properly [\#7996](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7996) ([Wires77](https://github.com/Wires77))
### User Interface
- Remove remote build list functionality pending redesign [\#7995](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7995) ([Wires77](https://github.com/Wires77))
- Fix breakdown for DoT Multiplier [\#7969](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7969) ([Rybadour](https://github.com/Rybadour))
### Fixed Calculations
- Fix DoT Multi when using Maligaro's Virtuosity and Perfect Agony [\#7965](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7965) ([DieMango](https://github.com/DieMango))
- Fix Scorch chance on Crit when using Warden's Oath of Summer [\#7975](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7975) ([ConnorThelin](https://github.com/ConnorThelin))
- Fix Gladiator Determined Survivor Shield Block calculation [\#7979](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7979) ([Regisle](https://github.com/Regisle))
- Fix Ignite divide by 0 error [\#7954](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7954) ([NL908](https://github.com/NL908))
### Fixed Behaviours
- Fix Quality on Tinctures to apply More effect instead of Increased [\#7967](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7967) ([nexus671](https://github.com/nexus671))
- Fix non-instant Life Leech incorrectly applying with Strength of Blood [\#7937](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7937) ([greatnameincoming](https://github.com/greatnameincoming))
- Fix Ravenous Passion helmet not granting Spell damage from Rage [\#7936](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7936) ([LocalIdentity](https://github.com/LocalIdentity))
- Fix Rallying Cry Exerted damage mod incorrectly working with Autoexertion [\#8001](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8001) ([LocalIdentity](https://github.com/LocalIdentity))
- Improve Militant Faith Notable Protection [\#7990](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7990) ([Peechey](https://github.com/Peechey))
### Accuracy Improvements
- Fix Dark Seer missing global Chance to Blind on Hit [\#7950](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/7950) ([NL908](https://github.com/NL908))
- Add tag to Legacy Watchers eye mods [\#8002](https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/8002) ([LocalIdentity](https://github.com/LocalIdentity))


## [v2.46.0](https://github.com/PathOfBuildingCommunity/PathOfBuilding/tree/v2.46.0) (2024/07/25)

[Full Changelog](https://github.com/PathOfBuildingCommunity/PathOfBuilding/compare/v2.45.0...v2.46.0)
Expand Down
34 changes: 34 additions & 0 deletions changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,37 @@
VERSION[2.47.0][2024/07/29]

--- New to Path of Building ---
* Update existing gems (Wires77, Regisle, Nostrademous, LocalIdentity)
* Add support for new 3.25 Gems (LocalIdentity)
* Add support for new 3.25 Uniques (LocalIdentity, Paliak, Nostrademous)
* Add support for Warcries to affect Minions (Regisle)
* Add support for Echoes of Creation (LocalIdentity)
* Fix numerous issues in bleed calculations (CelestiaTheDryad)

--- Fixed Crashes ---
* Fix crash when importing a build where empty configs were not loaded properly (Wires77)

--- User Interface ---
* Remove remote build list functionality pending redesign (Wires77)
* Fix breakdown for DoT Multiplier (Rybadour)

--- Fixed Calculations ---
* Fix DoT Multi when using Maligaro's Virtuosity and Perfect Agony (DieMango)
* Fix Scorch chance on Crit when using Warden's Oath of Summer (ConnorThelin)
* Fix Gladiator Determined Survivor Shield Block calculation (Regisle)
* Fix Ignite divide by 0 error (NL908)

--- Fixed Behaviours ---
* Fix Quality on Tinctures to apply More effect instead of Increased (nexus671)
* Fix non-instant Life Leech incorrectly applying with Strength of Blood (greatnameincoming)
* Fix Ravenous Passion helmet not granting Spell damage from Rage (LocalIdentity)
* Fix Rallying Cry Exerted damage mod incorrectly working with Autoexertion (LocalIdentity)
* Improve Militant Faith Notable Protection (Peechey)

--- Accuracy Improvements ---
* Fix Dark Seer missing global Chance to Blind on Hit (NL908)
* Add tag to Legacy Watchers eye mods (LocalIdentity)

VERSION[2.46.0][2024/07/25]

--- New to Path of Building ---
Expand Down
2 changes: 1 addition & 1 deletion manifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<PoBVersion>
<Version number="2.46.0" />
<Version number="2.47.0" />
<Source part="default" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/" />
<Source part="runtime" platform="win32" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/runtime/" />
<Source part="program" url="https://raw.githubusercontent.com/PathOfBuildingCommunity/PathOfBuilding/{branch}/src/" />
Expand Down
20 changes: 20 additions & 0 deletions spec/System/TestAilments_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,24 @@ describe("TestAilments", function()
runCallback("OnFrame")
assert.are.equals(round(50 + 10 + 40), build.calcsTab.mainOutput.MaximumShock)
end)

it("bleed is buffed by bleed chance", function()
build.itemsTab:CreateDisplayItemFromRaw("New Item\nKarui Chopper")
build.itemsTab:AddDisplayItem()
build.skillsTab:PasteSocketGroup("Slot: Weapon 1\nHeavy Strike 1/0 Default 1\n")
build.configTab.input.customMods = "\z
attacks have 10% chance to cause bleeding\n\z
"
build.configTab:BuildModList()
runCallback("OnFrame")
local badDps = build.calcsTab.mainOutput.BleedDPS

build.configTab.input.customMods = "\z
attacks have 100% chance to cause bleeding\n\z
"
build.configTab:BuildModList()
runCallback("OnFrame")
local goodDps = build.calcsTab.mainOutput.BleedDPS
assert.True(goodDps > badDps)
end)
end)
30 changes: 15 additions & 15 deletions spec/System/TestImpale_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe("TestAttacks", function()
assert.are.equals(100, build.calcsTab.mainOutput.MainHand.ImpaleChanceOnCrit)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(100*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second

-- 50% crit
Expand All @@ -41,7 +41,7 @@ describe("TestAttacks", function()
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(300, build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(250, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(250, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(250, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(125*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second

-- 100% crit
Expand All @@ -54,7 +54,7 @@ describe("TestAttacks", function()
runCallback("OnFrame")

assert.are.equals(300, build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(300, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(300, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(150*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second
end)

Expand All @@ -71,7 +71,7 @@ describe("TestAttacks", function()

assert.are.equals(400, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(200*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second

-- 50% crit
Expand All @@ -87,7 +87,7 @@ describe("TestAttacks", function()
assert.are.equals(400, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(600, build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(250, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(250, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(250, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(250*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second

-- 100% crit
Expand All @@ -103,7 +103,7 @@ describe("TestAttacks", function()
assert.are.equals(400, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(600, build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(300, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(300, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(300, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.equals(300*1.3, build.calcsTab.mainOutput.ImpaleDPS) -- 5 impales * 10% stored damage * 1.3 attacks per second
end)

Expand All @@ -120,7 +120,7 @@ describe("TestAttacks", function()
-- dam * (1 - (armourDR + additionalDR)
assert.are.equals(200 * (1 - (0.5 + 0.1)), build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- [5 impales * 10% stored damage] * 1.3 attacks * (armour mod - phys DR)
assert.are.near(100 * 1.3 * (1 - (2/3 + 0.1)), build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- floating point math

Expand All @@ -137,7 +137,7 @@ describe("TestAttacks", function()
-- dam * (1 - (armourDR + additionalDR)
assert.are.equals(300 * (1 - (0.5 + 0.1)), build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(300, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(300, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(300, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- [5 impales * 10% stored damage] * 1.3 attacks * (armour mod - phys DR)
assert.are.near(150 * 1.3 * (1 - (2/3 + 0.1)), build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- floating point math

Expand All @@ -157,7 +157,7 @@ describe("TestAttacks", function()
-- taken * dam * (1 - (armourDR + additionalDR)
assert.are.equals(2 * 200 * (1 - (0.5 + 0.1)), build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- taken * [5 impales * 10% stored damage] * 1.3 attacks * (armour mod - phys DR)
assert.are.near(2 * 100 * 1.3 * (1 - (2/3 + 0.1)), build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- floating point math

Expand All @@ -175,7 +175,7 @@ describe("TestAttacks", function()
-- taken * dam * (1 - (armourDR + additionalDR)
assert.are.equals(2 * 300 * (1 - (0.5 + 0.1)), build.calcsTab.mainOutput.MainHand.PhysicalCritAverage)
assert.are.equals(300, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(300, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(300, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- taken * [5 impales * 10% stored damage] * 1.3 attacks * (armour mod - phys DR)
assert.are.near(2 * 150 * 1.3 * (1 - (2/3 + 0.1)), build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- floating point math

Expand Down Expand Up @@ -212,7 +212,7 @@ describe("TestAttacks", function()
assert.are.equals(100, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.OffHand.impaleStoredHitAvg)

assert.are.equals(150, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(150, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- 5 impales * 10% stored damage * 1.3 attacks per second * 1.1 dual wield modifier
assert.are.near(75*1.3*1.1, build.calcsTab.mainOutput.ImpaleDPS, 0.0000001)

Expand All @@ -229,7 +229,7 @@ describe("TestAttacks", function()
assert.are.equals(125, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(250, build.calcsTab.mainOutput.OffHand.impaleStoredHitAvg)

assert.are.equals(187.5, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(187.5, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- 5 impales * 10% stored damage * 1.3 attacks per second * 1.1 dual wield modifier
assert.are.near(187.5/2*1.3*1.1, build.calcsTab.mainOutput.ImpaleDPS, 0.0000001)

Expand All @@ -246,7 +246,7 @@ describe("TestAttacks", function()
assert.are.equals(150, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(300, build.calcsTab.mainOutput.OffHand.impaleStoredHitAvg)

assert.are.equals(225, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(225, build.calcsTab.mainOutput.impaleStoredHitAvg)
-- 5 impales * 10% stored damage * 1.3 attacks per second * 1.1 dual wield modifier
assert.are.near(225/2*1.3*1.1, build.calcsTab.mainOutput.ImpaleDPS, 0.0000001)

Expand All @@ -265,7 +265,7 @@ describe("TestAttacks", function()

assert.are.equals(200, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.near(100*1.3*1.5, build.calcsTab.mainOutput.ImpaleDPS, 0.00000001) -- 5 impales * 10% stored damage * 1.3 attacks per second * 1.5 impale effect

-- last 1 extra hit
Expand All @@ -280,7 +280,7 @@ describe("TestAttacks", function()

assert.are.equals(200, build.calcsTab.mainOutput.MainHand.PhysicalHitAverage)
assert.are.equals(200, build.calcsTab.mainOutput.MainHand.impaleStoredHitAvg)
assert.are.equals(200, build.calcsTab.mainOutput.ImpaleHit)
assert.are.equals(200, build.calcsTab.mainOutput.impaleStoredHitAvg)
assert.are.near(120*1.3, build.calcsTab.mainOutput.ImpaleDPS, 0.0000001) -- 6 impales * 10% stored damage * 1.3 attacks per second
end)

Expand Down
93 changes: 29 additions & 64 deletions spec/System/TestTriggers_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1160,70 +1160,6 @@ describe("TestTriggers", function()
assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)

it("Trigger Riposte", function()
build.skillsTab:PasteSocketGroup("Riposte 20/0 Default 1\n")
runCallback("OnFrame")

assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)

it("Trigger Reckoning", function()
build.itemsTab:CreateDisplayItemFromRaw([[Armour Shield
Heat-attuned Tower Shield
Armour: 819
ArmourBasePercentile: 0
Crafted: true
Prefix: {range:0.5}LocalIncreasedPhysicalDamageReductionRating5
Prefix: {range:0.5}LocalIncreasedPhysicalDamageReductionRatingPercent5
Prefix: {range:0.5}IncreasedLife8
Suffix: None
Suffix: None
Suffix: None
Quality: 20
Sockets: R-R-R
LevelReq: 70
Implicits: 1
Scorch Enemies when you Block their Damage
+92 to Armour
74% increased Armour
+85 to maximum Life]])
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")

build.skillsTab:PasteSocketGroup("Reckoning 20/0 Default 1\n")
runCallback("OnFrame")

assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)

it("Trigger Vengeance", function()
build.itemsTab:CreateDisplayItemFromRaw([[Elemental 1H Sword
Jewelled Foil
Crafted: true
Prefix: {range:0.5}WeaponElementalDamageOnWeapons4
Prefix: None
Prefix: None
Suffix: {range:0.5}LocalIncreasedAttackSpeed3
Suffix: {range:0.5}LocalCriticalStrikeChance3
Suffix: {range:0.5}LocalCriticalMultiplier4
Quality: 20
Sockets: G-G-G
LevelReq: 68
Implicits: 1
{tags:damage,critical}+25% to Global Critical Strike Multiplier
12% increased Attack Speed
22% increased Critical Strike Chance
+27% to Global Critical Strike Multiplier
40% increased Elemental Damage with Attack Skills]])
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")

build.skillsTab:PasteSocketGroup("Vengeance 20/0 Default 1\n")
runCallback("OnFrame")

assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)

it("Trigger Combust", function()
build.skillsTab:PasteSocketGroup("Infernal Cry 20/0 Default 1\n")
runCallback("OnFrame")
Expand Down Expand Up @@ -1374,4 +1310,33 @@ describe("TestTriggers", function()

assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)

it("Trigger Svalinn", function()
build.itemsTab:CreateDisplayItemFromRaw([[Rarity: UNIQUE
Svalinn Girded
Colossal Tower Shield
Armour: 721
ArmourBasePercentile: 1
Ward: 163
WardBasePercentile: 1
League: Settlers of Kalguur
Quality: 20
Sockets: R-R-R
LevelReq: 50
Implicits: 1
{range:0.5}+(10-20) to maximum Life
13% Chance to Block Spell Damage
+136 to Ward
-10% to maximum Chance to Block Attack Damage
-10% to maximum Chance to Block Spell Damage
Chance To Block is Lucky
Trigger a Socketed Elemental Spell on Block, with a 0.25 Second Cooldown]])
build.itemsTab:AddDisplayItem()
runCallback("OnFrame")

build.skillsTab:PasteSocketGroup("Slot: Weapon 2\nArc 20/0 Default 1\n")
runCallback("OnFrame")

assert.True(build.calcsTab.mainOutput.SkillTriggerRate ~= nil)
end)
end)
5 changes: 5 additions & 0 deletions src/Classes/ConfigTab.lua
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,11 @@ function ConfigTabClass:Load(xml, fileName)
end
end
end

-- Catch special case of empty Config
if xml.empty then
self:NewConfigSet(1, "Default")
end
for index, node in ipairs(xml) do
if node.elem ~= "ConfigSet" then
if not self.configSets[1] then
Expand Down
Loading

0 comments on commit 5a0b297

Please sign in to comment.