From ca1fdd615cd79bf51537f31a8ef022453200ed70 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Fri, 19 Jun 2026 10:10:31 +0300 Subject: [PATCH 1/7] Fix item parsing for 0.5.3 update and filter items based on slot --- src/Classes/TradeQuery.lua | 26 +++++++++++++++++--------- src/Classes/TradeQueryRequests.lua | 21 +++++++++------------ src/Modules/CalcSetup.lua | 2 +- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index d7ad205284..8d4cf64640 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -950,6 +950,20 @@ function TradeQueryClass:SortFetchResults(row_idx, mode) return newTbl end +-- ensure we only take in items that parse properly to avoid crash issues and fit in the +-- provided slotName +---@param itemEntries table +---@param slotName string +function TradeQueryClass:FilterToSafeItems(itemEntries, slotName) + local itemsSafe = {} + for _, entry in ipairs(itemEntries) do + local item = new("Item", entry.item_string) + if item.base and self.itemsTab:IsItemValidForSlot(item, slotName) then + t_insert(itemsSafe, entry) + end + end + return itemsSafe +end -- Method to generate pane elements for each item slot function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, row_vertical_padding, row_height) local controls = self.controls @@ -987,14 +1001,7 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro self:SetNotice(context.controls.pbNotice, "") end - -- ensure we only take in items that parse properly to avoid crash issues. - local itemsSafe = {} - for _, entry in ipairs(items) do - local item = new("Item", entry.item_string) - if item.base then - t_insert(itemsSafe, entry) - end - end + local itemsSafe = self:FilterToSafeItems(items, activeSlot.slotName) if self.tradeQueryGenerator.lastAugmentBehaviour == "Copy Current" or self.tradeQueryGenerator.lastAnointBehaviour == "Copy Current" then for i, _ in ipairs(itemsSafe) do @@ -1079,7 +1086,8 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite else self:SetNotice(controls.pbNotice, "") self.lastQueries[row_idx] = query - self.resultTbl[row_idx] = items + local itemsSafe = self:FilterToSafeItems(items, activeSlot.slotName) + self.resultTbl[row_idx] = itemsSafe self:UpdateControlsWithItems(row_idx) end controls["priceButton"..row_idx].label = "Price Item" diff --git a/src/Classes/TradeQueryRequests.lua b/src/Classes/TradeQueryRequests.lua index 5f714af4d7..8a042c3670 100644 --- a/src/Classes/TradeQueryRequests.lua +++ b/src/Classes/TradeQueryRequests.lua @@ -398,25 +398,22 @@ function TradeQueryRequestsClass:FetchResultBlock(url, callback) t_insert(rawLines, "Implicits: " .. (#item.enchantMods + #item.runeMods + #item.implicitMods)) for _, modLine in ipairs(item.enchantMods) do - t_insert(rawLines, "{enchant}" .. escapeGGGString(modLine)) + t_insert(rawLines, "{enchant}" .. escapeGGGString(modLine)) end for _, modLine in ipairs(item.runeMods) do - t_insert(rawLines, "{enchant}{rune}" .. escapeGGGString(modLine)) + t_insert(rawLines, "{enchant}{rune}" .. escapeGGGString(modLine)) end for _, modLine in ipairs(item.implicitMods) do t_insert(rawLines, escapeGGGString(modLine)) end - for _, modLine in ipairs(item.fracturedMods) do - t_insert(rawLines, "{fractured}" .. escapeGGGString(modLine)) - end for _, modLine in ipairs(item.explicitMods) do - t_insert(rawLines, escapeGGGString(modLine)) - end - for _, modLine in ipairs(item.desecratedMods) do - t_insert(rawLines, "{desecrated}" .. escapeGGGString(modLine)) - end - for _, modLine in ipairs(item.craftedMods) do - t_insert(rawLines, "{crafted}" .. escapeGGGString(modLine)) + local s = "" + for flagName, flag in pairs(modLine.flags or {}) do + if flag then + s = s .. string.format("{%s}", flagName) + end + end + t_insert(rawLines, s .. escapeGGGString(modLine.description)) end if item.mirrored then t_insert(rawLines, "Mirrored") diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index 62d1f816c7..949bc3d508 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -963,7 +963,7 @@ function calcs.initEnv(build, mode, override, specEnv) for _, slot in pairs(build.itemsTab.orderedSlots) do local slotName = slot.slotName if items[slotName] then - local srcList = items[slotName].modList or items[slotName].slotModList[slot.slotNum] + local srcList = items[slotName].modList or items[slotName].slotModList[slot.slotNum] or {} for _, mod in ipairs(srcList) do -- checks if it disables another slot for _, tag in ipairs(mod) do From 166001cdaf696b1227169223b82748acf3aa8202 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Fri, 19 Jun 2026 12:20:50 +0300 Subject: [PATCH 2/7] Fix sorting for trade site stats and regenerate it --- src/Classes/TradeQueryGenerator.lua | 3 + src/Data/QueryMods.lua | 73 ++-- src/Data/TradeSiteStats.lua | 505 ++++++++++++++++++++++++---- 3 files changed, 499 insertions(+), 82 deletions(-) diff --git a/src/Classes/TradeQueryGenerator.lua b/src/Classes/TradeQueryGenerator.lua index fb62cd748f..6c742fee09 100644 --- a/src/Classes/TradeQueryGenerator.lua +++ b/src/Classes/TradeQueryGenerator.lua @@ -399,6 +399,9 @@ function TradeQueryGeneratorClass:InitMods() for catIdx, _ in ipairs(body.result) do table.sort(body.result[catIdx].entries, function(a, b) + if a.text == b.text then + return a.id < b.id + end return a.text < b.text end) end diff --git a/src/Data/QueryMods.lua b/src/Data/QueryMods.lua index 0ffdec27f3..489cdff37a 100644 --- a/src/Data/QueryMods.lua +++ b/src/Data/QueryMods.lua @@ -27696,18 +27696,10 @@ return { ["max"] = 300, ["min"] = 100, }, - ["2HWeapon"] = { - ["max"] = 50, - ["min"] = 30, - }, ["Amulet"] = { ["max"] = 40, ["min"] = 30, }, - ["Quarterstaff"] = { - ["max"] = 50, - ["min"] = 30, - }, ["Wand"] = { ["max"] = 300, ["min"] = 300, @@ -27767,20 +27759,6 @@ return { ["type"] = "implicit", }, }, - ["3489782002"] = { - ["Amulet"] = { - ["max"] = 30, - ["min"] = 20, - }, - ["specialCaseData"] = { - }, - ["tradeMod"] = { - ["id"] = "implicit.stat_3489782002", - ["text"] = "# to maximum Energy Shield", - ["type"] = "implicit", - }, - ["usePositiveSign"] = true, - }, ["3544800472"] = { ["Chest"] = { ["max"] = 40, @@ -28248,10 +28226,18 @@ return { }, }, ["774059442"] = { + ["2HWeapon"] = { + ["max"] = 50, + ["min"] = 30, + }, ["Chest"] = { ["max"] = 1000, ["min"] = 750, }, + ["Quarterstaff"] = { + ["max"] = 50, + ["min"] = 30, + }, ["specialCaseData"] = { }, ["tradeMod"] = { @@ -29900,6 +29886,23 @@ return { ["type"] = "augment", }, }, + ["1936645603"] = { + ["2HWeapon"] = { + ["max"] = 30, + ["min"] = 30, + }, + ["Staff"] = { + ["max"] = 30, + ["min"] = 30, + }, + ["specialCaseData"] = { + }, + ["tradeMod"] = { + ["id"] = "rune.stat_1936645603", + ["text"] = "Gain #% of Physical Damage as Extra Fire Damage", + ["type"] = "augment", + }, + }, ["1937310173"] = { ["Chest"] = { ["max"] = 50, @@ -30996,6 +30999,19 @@ return { ["type"] = "augment", }, }, + ["258955603"] = { + ["Helmet"] = { + ["max"] = 20, + ["min"] = 20, + }, + ["specialCaseData"] = { + }, + ["tradeMod"] = { + ["id"] = "rune.stat_258955603", + ["text"] = "Alternating every 5 seconds:Take #% more Damage from HitsTake #% more Damage over time", + ["type"] = "augment", + }, + }, ["2608793552"] = { ["1HMace"] = { ["max"] = 15, @@ -32971,6 +32987,19 @@ return { ["type"] = "augment", }, }, + ["352044736"] = { + ["Helmet"] = { + ["max"] = 1, + ["min"] = 1, + }, + ["specialCaseData"] = { + }, + ["tradeMod"] = { + ["id"] = "rune.stat_352044736", + ["text"] = "Every Rage also grants #% increased Stun Threshold", + ["type"] = "augment", + }, + }, ["3523867985"] = { ["Boots"] = { ["max"] = 20, diff --git a/src/Data/TradeSiteStats.lua b/src/Data/TradeSiteStats.lua index 5fb3dd49fa..770c2b1ae4 100644 --- a/src/Data/TradeSiteStats.lua +++ b/src/Data/TradeSiteStats.lua @@ -587,12 +587,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2897413282", + ["id"] = "explicit.stat_1379411836", ["text"] = "# to all Attributes", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1379411836", + ["id"] = "explicit.stat_2897413282", ["text"] = "# to all Attributes", ["type"] = "explicit", }, @@ -906,6 +906,11 @@ return { ["text"] = "#% chance to gain Nature's Archon when your Plants Overgrow", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_3451259830", + ["text"] = "#% chance to gain Onslaught for 3 seconds when you kill an enemy affected by Abyssal Wasting", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_1881230714", ["text"] = "#% chance to gain Onslaught on Killing Hits with this Weapon", @@ -946,6 +951,11 @@ return { ["text"] = "#% chance to inflict Exposure on Hit", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_2614251226", + ["text"] = "#% chance to inflict Withered with Hits against targets affected by Abyssal Wasting", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_3823990000", ["text"] = "#% chance to load a bolt into all Crossbow skills on Kill", @@ -956,6 +966,11 @@ return { ["text"] = "#% chance to not destroy Corpses when Consuming Corpses", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_19819865", + ["text"] = "#% chance to revive one of your Persistent Minions when you kill an enemy affected by Abyssal Wasting", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_1949851472", ["text"] = "#% chance when a Charm is used to use another Charm without consuming Charges", @@ -1797,12 +1812,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_57434274", + ["id"] = "explicit.stat_3666934677", ["text"] = "#% increased Experience gain", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3666934677", + ["id"] = "explicit.stat_57434274", ["text"] = "#% increased Experience gain", ["type"] = "explicit", }, @@ -2006,6 +2021,11 @@ return { ["text"] = "#% increased Immobilisation buildup", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_3893409915", + ["text"] = "#% increased Immobilisation buildup against targets affected by Abyssal Wasting", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_656461285", ["text"] = "#% increased Intelligence", @@ -2477,12 +2497,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2261942307", + ["id"] = "explicit.stat_1602191394", ["text"] = "#% increased Rarity of Items foundYour other Modifiers to Rarity of Items found do not apply", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1602191394", + ["id"] = "explicit.stat_2261942307", ["text"] = "#% increased Rarity of Items foundYour other Modifiers to Rarity of Items found do not apply", ["type"] = "explicit", }, @@ -2632,12 +2652,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3984865854", + ["id"] = "explicit.stat_1416406066", ["text"] = "#% increased Spirit", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1416406066", + ["id"] = "explicit.stat_3984865854", ["text"] = "#% increased Spirit", ["type"] = "explicit", }, @@ -4117,12 +4137,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|199", + ["id"] = "explicit.stat_448592698|186", ["text"] = "+# to Level of all Herald of Blood Skills", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|186", + ["id"] = "explicit.stat_448592698|199", ["text"] = "+# to Level of all Herald of Blood Skills", ["type"] = "explicit", }, @@ -4522,12 +4542,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|161", + ["id"] = "explicit.stat_448592698|160", ["text"] = "+# to Level of all Skeletal Sniper Skills", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|160", + ["id"] = "explicit.stat_448592698|161", ["text"] = "+# to Level of all Skeletal Sniper Skills", ["type"] = "explicit", }, @@ -4632,12 +4652,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|201", + ["id"] = "explicit.stat_448592698|193", ["text"] = "+# to Level of all Tamed Companion Skills", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_448592698|193", + ["id"] = "explicit.stat_448592698|201", ["text"] = "+# to Level of all Tamed Companion Skills", ["type"] = "explicit", }, @@ -4901,6 +4921,21 @@ return { ["text"] = "Abyssal Wasting also applies #% to Lightning Resistance", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_3134931479", + ["text"] = "Abyssal Wasting you inflict also gives targets 10% chance to explode on death, dealing a tenth of their life as Physical Damage", + ["type"] = "explicit", + }, + { + ["id"] = "explicit.stat_1986082444", + ["text"] = "Abyssal Wasting you inflict also prevents targets from dealing Critical Hits", + ["type"] = "explicit", + }, + { + ["id"] = "explicit.stat_4149923257", + ["text"] = "Abyssal Wasting you inflict also prevents targets from inflicting Elemental Ailments", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_1679776108", ["text"] = "Abyssal Wasting you inflict has Infinite Duration", @@ -7451,6 +7486,11 @@ return { ["text"] = "Allocates Knight of Izaro", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_2954116742|1861", + ["text"] = "Allocates Knight of Tarcus", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_2954116742|2397", ["text"] = "Allocates Last Stand", @@ -8147,12 +8187,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2954116742|62210", + ["id"] = "explicit.stat_2954116742|14258", ["text"] = "Allocates Puppet Master chance", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2954116742|14258", + ["id"] = "explicit.stat_2954116742|62210", ["text"] = "Allocates Puppet Master chance", ["type"] = "explicit", }, @@ -8266,6 +8306,11 @@ return { ["text"] = "Allocates Repeating Explosives", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_2954116742|21251", + ["text"] = "Allocates Replenishing Horde", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_2954116742|20414", ["text"] = "Allocates Reprisal", @@ -9962,12 +10007,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3831171903|5", + ["id"] = "explicit.stat_2801937280", ["text"] = "Blood Magic", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2801937280", + ["id"] = "explicit.stat_3831171903|5", ["text"] = "Blood Magic", ["type"] = "explicit", }, @@ -10607,12 +10652,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3146310524", + ["id"] = "explicit.stat_2933846633", ["text"] = "Dazes on Hit", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2933846633", + ["id"] = "explicit.stat_3146310524", ["text"] = "Dazes on Hit", ["type"] = "explicit", }, @@ -10721,6 +10766,11 @@ return { ["text"] = "Delirium Encounters in affected Map have #% chance to generate an additional Reward", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_1769611692", + ["text"] = "Delirium Fog in Area applies #% increased Deliriousness to Players", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_3350944114", ["text"] = "Delirium Fog in Area dissipates #% faster", @@ -10741,18 +10791,23 @@ return { ["text"] = "Delirium Fog in Area spawns #% increased Fracturing Mirrors", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_1769611692", + ["text"] = "Delirium Fog in Map applies #% increased Deliriousness to Players", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_3350944114", ["text"] = "Delirium Fog in Map dissipates #% faster", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3226351972", + ["id"] = "explicit.stat_1174954559", ["text"] = "Delirium Fog in Map lasts # additional seconds before dissipating", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1174954559", + ["id"] = "explicit.stat_3226351972", ["text"] = "Delirium Fog in Map lasts # additional seconds before dissipating", ["type"] = "explicit", }, @@ -10781,16 +10836,6 @@ return { ["text"] = "Delirium Monsters in Map have #% increased Pack Size", ["type"] = "explicit", }, - { - ["id"] = "explicit.stat_1769611692", - ["text"] = "Delirium in Area increases #% faster with distance from the mirror", - ["type"] = "explicit", - }, - { - ["id"] = "explicit.stat_1769611692", - ["text"] = "Delirium in Map increases #% faster with distance from the mirror", - ["type"] = "explicit", - }, { ["id"] = "explicit.stat_2971398565", ["text"] = "Divine Flight", @@ -10932,12 +10977,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_2080373320", + ["id"] = "explicit.stat_1464727508", ["text"] = "Enemies in your Presence are Blinded", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1464727508", + ["id"] = "explicit.stat_2080373320", ["text"] = "Enemies in your Presence are Blinded", ["type"] = "explicit", }, @@ -11026,6 +11071,11 @@ return { ["text"] = "Enemies you kill have a #% chance to explode, dealing a quarter of their maximum Life as Chaos damage", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_2051332707", + ["text"] = "Enemies you kill while they are affected by Abyssal Wasting grant #% increased Flask Charges", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_793801176", ["text"] = "Energy Generation is doubled", @@ -11276,6 +11326,16 @@ return { ["text"] = "Gain # Rage when Hit by an Enemy during effect", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_2934385135", + ["text"] = "Gain # Rage when you kill an enemy affected by Abyssal Wasting", + ["type"] = "explicit", + }, + { + ["id"] = "explicit.stat_2952939159", + ["text"] = "Gain # Volatility when you kill an enemy affected by Abyssal Wasting", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_2469544361", ["text"] = "Gain #% of Cold damage as Extra Fire damage per 1% Chill Magnitude on enemy", @@ -11907,12 +11967,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3831171903|21", + ["id"] = "explicit.stat_326965591", ["text"] = "Iron Reflexes", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_326965591", + ["id"] = "explicit.stat_3831171903|21", ["text"] = "Iron Reflexes", ["type"] = "explicit", }, @@ -12337,12 +12397,12 @@ return { ["type"] = "explicit", }, { - ["id"] = "explicit.stat_3042527515", + ["id"] = "explicit.stat_1468737867", ["text"] = "Map contains an additional Shrine", ["type"] = "explicit", }, { - ["id"] = "explicit.stat_1468737867", + ["id"] = "explicit.stat_3042527515", ["text"] = "Map contains an additional Shrine", ["type"] = "explicit", }, @@ -15041,6 +15101,21 @@ return { ["text"] = "Take no Extra Damage from Critical Hits", ["type"] = "explicit", }, + { + ["id"] = "explicit.stat_3963171183", + ["text"] = "Targets affected by Abyssal Wasting you inflict are Blinded", + ["type"] = "explicit", + }, + { + ["id"] = "explicit.stat_2668499289", + ["text"] = "Targets affected by Abyssal Wasting you inflict are Debilitated", + ["type"] = "explicit", + }, + { + ["id"] = "explicit.stat_4097102799", + ["text"] = "Targets affected by Abyssal Wasting you inflict are Hindered", + ["type"] = "explicit", + }, { ["id"] = "explicit.stat_1755296234", ["text"] = "Targets can be affected by # of your Poisons at the same time", @@ -15668,12 +15743,12 @@ return { ["type"] = "implicit", }, { - ["id"] = "implicit.stat_774059442", + ["id"] = "implicit.stat_3336230913", ["text"] = "# to maximum Runic Ward", ["type"] = "implicit", }, { - ["id"] = "implicit.stat_3336230913", + ["id"] = "implicit.stat_774059442", ["text"] = "# to maximum Runic Ward", ["type"] = "implicit", }, @@ -16619,12 +16694,12 @@ return { ["type"] = "fractured", }, { - ["id"] = "fractured.stat_3981240776", + ["id"] = "fractured.stat_2704225257", ["text"] = "# to Spirit", ["type"] = "fractured", }, { - ["id"] = "fractured.stat_2704225257", + ["id"] = "fractured.stat_3981240776", ["text"] = "# to Spirit", ["type"] = "fractured", }, @@ -16639,12 +16714,12 @@ return { ["type"] = "fractured", }, { - ["id"] = "fractured.stat_2897413282", + ["id"] = "fractured.stat_1379411836", ["text"] = "# to all Attributes", ["type"] = "fractured", }, { - ["id"] = "fractured.stat_1379411836", + ["id"] = "fractured.stat_2897413282", ["text"] = "# to all Attributes", ["type"] = "fractured", }, @@ -16673,6 +16748,11 @@ return { ["text"] = "# to maximum Runic Ward", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_4097212302", + ["text"] = "# to maximum number of Elemental Infusions", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_1823942939", ["text"] = "# to maximum number of Summoned Ballista Totems", @@ -17163,6 +17243,11 @@ return { ["text"] = "#% increased Explicit Critical Modifier magnitudes", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_231689132", + ["text"] = "#% increased Explicit Elemental Damage Modifier magnitudes", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_3574578302", ["text"] = "#% increased Explicit Fire Modifier magnitudes", @@ -17529,12 +17614,12 @@ return { ["type"] = "fractured", }, { - ["id"] = "fractured.stat_3984865854", + ["id"] = "fractured.stat_1416406066", ["text"] = "#% increased Spirit", ["type"] = "fractured", }, { - ["id"] = "fractured.stat_1416406066", + ["id"] = "fractured.stat_3984865854", ["text"] = "#% increased Spirit", ["type"] = "fractured", }, @@ -18243,6 +18328,11 @@ return { ["text"] = "Allocates Bolstering Yell", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|5191", + ["text"] = "Allocates Bond of the Wolf", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|17725", ["text"] = "Allocates Bonded Precision", @@ -18263,6 +18353,11 @@ return { ["text"] = "Allocates Bounty Hunter", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|50498", + ["text"] = "Allocates Brain Storm", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|37806", ["text"] = "Allocates Branching Bolts", @@ -18408,6 +18503,11 @@ return { ["text"] = "Allocates Chilled to the Bone", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|5686", + ["text"] = "Allocates Chillproof", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|39990", ["text"] = "Allocates Chronomancy", @@ -19763,6 +19863,11 @@ return { ["text"] = "Allocates Mental Toughness", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|45632", + ["text"] = "Allocates Mind Eraser", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|11392", ["text"] = "Allocates Molten Being", @@ -19778,6 +19883,11 @@ return { ["text"] = "Allocates Momentum", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|47560", + ["text"] = "Allocates Multi Shot", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|8810", ["text"] = "Allocates Multitasking", @@ -19858,6 +19968,11 @@ return { ["text"] = "Allocates Overzealous", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|20686", + ["text"] = "Allocates Paragon", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|62230", ["text"] = "Allocates Patient Barrier", @@ -20888,6 +21003,11 @@ return { ["text"] = "Allocates Vulgar Methods", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_2954116742|25211", + ["text"] = "Allocates Waning Hindrances", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_2954116742|47418", ["text"] = "Allocates Warding Potions", @@ -21108,6 +21228,11 @@ return { ["text"] = "Gain #% of Damage as Extra Fire Damage while you are missing Runic Ward", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_1321054058", + ["text"] = "Gain #% of Damage as Extra Fire Damage with Spells", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_3278136794", ["text"] = "Gain #% of Damage as Extra Lightning Damage", @@ -21178,6 +21303,11 @@ return { ["text"] = "Increases and Reductions to Fire and Lightning Damage in Radius are transformed to apply to Cold Damage", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_971590056", + ["text"] = "Inflict Anaemia on HitAnaemia allows # Corrupted Blood debuffs to be inflicted on enemies", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_3987691524", ["text"] = "Inherent Rage loss starts 1 second later", @@ -21308,6 +21438,11 @@ return { ["text"] = "Minions have #% increased Movement Speed", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_73032170", + ["text"] = "Minions have #% increased Skill Speed with Command Skills", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_770672621", ["text"] = "Minions have #% increased maximum Life", @@ -21908,6 +22043,11 @@ return { ["text"] = "Recover #% of maximum Life on Kill", ["type"] = "fractured", }, + { + ["id"] = "fractured.stat_1040141381", + ["text"] = "Recover #% of maximum Life when you use a Warcry", + ["type"] = "fractured", + }, { ["id"] = "fractured.stat_1604736568", ["text"] = "Recover #% of maximum Mana on Kill (Jewel)", @@ -22939,6 +23079,11 @@ return { ["text"] = "#% to Lightning Resistance", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_1301765461", + ["text"] = "#% to Maximum Chaos Resistance", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_3676141501", ["text"] = "#% to Maximum Cold Resistance", @@ -22949,6 +23094,11 @@ return { ["text"] = "#% to Maximum Fire Resistance", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_1011760251", + ["text"] = "#% to Maximum Lightning Resistance", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2039822488", ["text"] = "#% to Maximum Quality", @@ -23119,6 +23269,11 @@ return { ["text"] = "Allocates Ancestral Mending", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|43396", + ["text"] = "Allocates Ancestral Reach", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|62609", ["text"] = "Allocates Ancestral Unity", @@ -23185,12 +23340,12 @@ return { ["type"] = "crafted", }, { - ["id"] = "crafted.stat_2954116742|14265", + ["id"] = "crafted.stat_2954116742|12245", ["text"] = "Allocates Arsonist", ["type"] = "crafted", }, { - ["id"] = "crafted.stat_2954116742|12245", + ["id"] = "crafted.stat_2954116742|14265", ["text"] = "Allocates Arsonist", ["type"] = "crafted", }, @@ -23419,6 +23574,11 @@ return { ["text"] = "Allocates Bonded Precision", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|26563", + ["text"] = "Allocates Bone Chains", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|52618", ["text"] = "Allocates Boon of the Beast", @@ -23449,6 +23609,11 @@ return { ["text"] = "Allocates Branching Bolts", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|14777", + ["text"] = "Allocates Bravado", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|21453", ["text"] = "Allocates Breakage", @@ -23469,6 +23634,11 @@ return { ["text"] = "Allocates Breath of Fire", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|18086", + ["text"] = "Allocates Breath of Ice", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|61338", ["text"] = "Allocates Breath of Lightning", @@ -23579,6 +23749,11 @@ return { ["text"] = "Allocates Chakra of Elements", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|25362", + ["text"] = "Allocates Chakra of Impact", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|35031", ["text"] = "Allocates Chakra of Life", @@ -23639,6 +23814,11 @@ return { ["text"] = "Allocates Climate Change", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|38479", + ["text"] = "Allocates Close Confines", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|29514", ["text"] = "Allocates Cluster Bombs", @@ -23774,6 +23954,11 @@ return { ["text"] = "Allocates Cross Strike", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|42981", + ["text"] = "Allocates Cruel Methods", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|35739", ["text"] = "Allocates Crushing Judgement", @@ -23874,6 +24059,11 @@ return { ["text"] = "Allocates Decisive Retreat", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|5594", + ["text"] = "Allocates Decrepifying Curse", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|16142", ["text"] = "Allocates Deep Freeze", @@ -24284,6 +24474,11 @@ return { ["text"] = "Allocates Escalating Mayhem", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|38628", + ["text"] = "Allocates Escalating Toxins", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|9187", ["text"] = "Allocates Escalation", @@ -24329,6 +24524,11 @@ return { ["text"] = "Allocates Expendable Army", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|39050", + ["text"] = "Allocates Exploit", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|48581", ["text"] = "Allocates Exploit the Elements", @@ -24379,6 +24579,11 @@ return { ["text"] = "Allocates Fast Acting Toxins", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|8827", + ["text"] = "Allocates Fast Metabolism", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|3921", ["text"] = "Allocates Fate Finding", @@ -24394,6 +24599,11 @@ return { ["text"] = "Allocates Favourable Odds", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|22532", + ["text"] = "Allocates Fearful Paralysis", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|60764", ["text"] = "Allocates Feathered Fletching", @@ -24604,6 +24814,11 @@ return { ["text"] = "Allocates Full Recovery", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|33887", + ["text"] = "Allocates Full Salvo", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|24630", ["text"] = "Allocates Fulmination", @@ -24699,6 +24914,11 @@ return { ["text"] = "Allocates Growing Swarm", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|4331", + ["text"] = "Allocates Guided Hand", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|46499", ["text"] = "Allocates Guts", @@ -24794,6 +25014,11 @@ return { ["text"] = "Allocates Heavy Ammunition", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|59589", + ["text"] = "Allocates Heavy Armour", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|27491", ["text"] = "Allocates Heavy Buffer", @@ -24819,6 +25044,11 @@ return { ["text"] = "Allocates Heavy Weaponry", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|48418", + ["text"] = "Allocates Hefty Unit", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|45777", ["text"] = "Allocates Hidden Barb", @@ -24889,6 +25119,11 @@ return { ["text"] = "Allocates Ice Storm", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|55847", + ["text"] = "Allocates Ice Walls", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|4031", ["text"] = "Allocates Icebreaker", @@ -24909,6 +25144,11 @@ return { ["text"] = "Allocates Illuminated Crown", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|50912", + ["text"] = "Allocates Imbibed Power", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|19156", ["text"] = "Allocates Immaterial", @@ -25089,6 +25329,11 @@ return { ["text"] = "Allocates Invigorating Grandeur", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|28408", + ["text"] = "Allocates Invigorating Hate", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|24491", ["text"] = "Allocates Invocated Echoes", @@ -25154,6 +25399,11 @@ return { ["text"] = "Allocates Knight of Izaro", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|1861", + ["text"] = "Allocates Knight of Tarcus", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|2397", ["text"] = "Allocates Last Stand", @@ -25164,6 +25414,11 @@ return { ["text"] = "Allocates Lasting Boons", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|58096", + ["text"] = "Allocates Lasting Incantations", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|61741", ["text"] = "Allocates Lasting Toxins", @@ -25214,6 +25469,11 @@ return { ["text"] = "Allocates Left Ventricle", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|55375", + ["text"] = "Allocates Licking Wounds", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|31129", ["text"] = "Allocates Lifelong Friend", @@ -25544,6 +25804,11 @@ return { ["text"] = "Allocates Off-Balancing Retort", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|35918", + ["text"] = "Allocates One For All", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|44753", ["text"] = "Allocates One With Flame", @@ -25584,6 +25849,11 @@ return { ["text"] = "Allocates Overwhelming Strike", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|10295", + ["text"] = "Allocates Overzealous", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|21784", ["text"] = "Allocates Pack Encouragement", @@ -25679,6 +25949,11 @@ return { ["text"] = "Allocates Pocket Sand", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|27950", + ["text"] = "Allocates Polished Iron", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|57047", ["text"] = "Allocates Polymathy", @@ -25699,6 +25974,11 @@ return { ["text"] = "Allocates Power Shots", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|49150", + ["text"] = "Allocates Precise Invocations", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|13895", ["text"] = "Allocates Precise Point", @@ -25810,12 +26090,12 @@ return { ["type"] = "crafted", }, { - ["id"] = "crafted.stat_2954116742|62210", + ["id"] = "crafted.stat_2954116742|14258", ["text"] = "Allocates Puppet Master chance", ["type"] = "crafted", }, { - ["id"] = "crafted.stat_2954116742|14258", + ["id"] = "crafted.stat_2954116742|62210", ["text"] = "Allocates Puppet Master chance", ["type"] = "crafted", }, @@ -25904,6 +26184,11 @@ return { ["text"] = "Allocates Regenerative Flesh", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|56388", + ["text"] = "Allocates Reinforced Rallying", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|35809", ["text"] = "Allocates Reinvigoration", @@ -25924,6 +26209,11 @@ return { ["text"] = "Allocates Repeating Explosives", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|21251", + ["text"] = "Allocates Replenishing Horde", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|20414", ["text"] = "Allocates Reprisal", @@ -26099,6 +26389,11 @@ return { ["text"] = "Allocates Scales of the Wyvern", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|39884", + ["text"] = "Allocates Searing Heat", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|52229", ["text"] = "Allocates Secrets of the Orb", @@ -26124,6 +26419,11 @@ return { ["text"] = "Allocates Serrated Edges", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|13457", + ["text"] = "Allocates Shadow Dancing", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|53150", ["text"] = "Allocates Sharp Sight", @@ -26149,6 +26449,11 @@ return { ["text"] = "Allocates Shattering", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|53527", + ["text"] = "Allocates Shattering Blow", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|64415", ["text"] = "Allocates Shattering Daze", @@ -26339,6 +26644,11 @@ return { ["text"] = "Allocates Spiral into Mania", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|51105", + ["text"] = "Allocates Spirit Bond", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|9328", ["text"] = "Allocates Spirit of the Bear", @@ -26704,6 +27014,11 @@ return { ["text"] = "Allocates The Wild Cat", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|53185", + ["text"] = "Allocates The Winter Owl", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|35849", ["text"] = "Allocates Thickened Arteries", @@ -26794,6 +27109,11 @@ return { ["text"] = "Allocates Touch the Arcane", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|53823", + ["text"] = "Allocates Towering Shield", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|261", ["text"] = "Allocates Toxic Sludge", @@ -26889,6 +27209,11 @@ return { ["text"] = "Allocates Unforgiving", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|32543", + ["text"] = "Allocates Unhindered", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|51394", ["text"] = "Allocates Unimpeded", @@ -26919,6 +27244,16 @@ return { ["text"] = "Allocates Unstable Bond", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|33978", + ["text"] = "Allocates Unstoppable Barrier", + ["type"] = "crafted", + }, + { + ["id"] = "crafted.stat_2954116742|10774", + ["text"] = "Allocates Unyielding", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|1169", ["text"] = "Allocates Urgent Call", @@ -26944,6 +27279,11 @@ return { ["text"] = "Allocates Vengeance", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|54937", + ["text"] = "Allocates Vengeful Fury", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|4238", ["text"] = "Allocates Versatile Arms", @@ -26979,6 +27319,11 @@ return { ["text"] = "Allocates Void", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|17882", + ["text"] = "Allocates Volatile Grenades", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|11366", ["text"] = "Allocates Volcanic Skin", @@ -26999,6 +27344,11 @@ return { ["text"] = "Allocates Vulgar Methods", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|25211", + ["text"] = "Allocates Waning Hindrances", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|31925", ["text"] = "Allocates Warding Fetish", @@ -27064,6 +27414,11 @@ return { ["text"] = "Allocates Whirling Assault", ["type"] = "crafted", }, + { + ["id"] = "crafted.stat_2954116742|46384", + ["text"] = "Allocates Wide Barrier", + ["type"] = "crafted", + }, { ["id"] = "crafted.stat_2954116742|65256", ["text"] = "Allocates Widespread Coverage", @@ -28181,12 +28536,12 @@ return { ["type"] = "enchant", }, { - ["id"] = "enchant.stat_2954116742|14265", + ["id"] = "enchant.stat_2954116742|12245", ["text"] = "Allocates Arsonist", ["type"] = "enchant", }, { - ["id"] = "enchant.stat_2954116742|12245", + ["id"] = "enchant.stat_2954116742|14265", ["text"] = "Allocates Arsonist", ["type"] = "enchant", }, @@ -30976,12 +31331,12 @@ return { ["type"] = "enchant", }, { - ["id"] = "enchant.stat_2954116742|62210", + ["id"] = "enchant.stat_2954116742|14258", ["text"] = "Allocates Puppet Master chance", ["type"] = "enchant", }, { - ["id"] = "enchant.stat_2954116742|14258", + ["id"] = "enchant.stat_2954116742|62210", ["text"] = "Allocates Puppet Master chance", ["type"] = "enchant", }, @@ -32617,12 +32972,12 @@ return { ["type"] = "augment", }, { - ["id"] = "rune.stat_3981240776", + ["id"] = "rune.stat_2704225257", ["text"] = "# to Spirit", ["type"] = "augment", }, { - ["id"] = "rune.stat_2704225257", + ["id"] = "rune.stat_3981240776", ["text"] = "# to Spirit", ["type"] = "augment", }, @@ -33471,6 +33826,11 @@ return { ["text"] = "Allies in your Presence share Charges with you", ["type"] = "augment", }, + { + ["id"] = "rune.stat_258955603", + ["text"] = "Alternating every 5 seconds:Take #% more Damage from HitsTake #% more Damage over time", + ["type"] = "augment", + }, { ["id"] = "rune.stat_2586152168", ["text"] = "Archon recovery period expires #% faster", @@ -34306,6 +34666,11 @@ return { ["text"] = "Bonded: Every Rage also grants #% increased Spell Damage", ["type"] = "augment", }, + { + ["id"] = "rune.stat_2291075173", + ["text"] = "Bonded: Every five Rage also grants you #% increased Movement Speed", + ["type"] = "augment", + }, { ["id"] = "rune.stat_1482283017", ["text"] = "Bonded: Fissure Skills have +# to Limit", @@ -34481,6 +34846,11 @@ return { ["text"] = "Bonded: Temporary Minion Skills have # to Limit of Minions summoned", ["type"] = "augment", }, + { + ["id"] = "rune.stat_1651083789", + ["text"] = "Bonded: Triggered Spells deal #% increased Spell Damage", + ["type"] = "augment", + }, { ["id"] = "rune.stat_2248594298", ["text"] = "Bonded: When Volatility on you explodes, you regain an equivalent amount of Volatility", @@ -34671,6 +35041,11 @@ return { ["text"] = "Every 5 Rage also grants #% of Damage taken Recouped as Life", ["type"] = "augment", }, + { + ["id"] = "rune.stat_352044736", + ["text"] = "Every Rage also grants #% increased Stun Threshold", + ["type"] = "augment", + }, { ["id"] = "rune.stat_1540254896", ["text"] = "Flammability Magnitude is doubled", @@ -34756,6 +35131,11 @@ return { ["text"] = "Gain #% of Damage as Extra Physical Damage per ten percent missing Mana", ["type"] = "augment", }, + { + ["id"] = "rune.stat_1936645603", + ["text"] = "Gain #% of Physical Damage as Extra Fire Damage", + ["type"] = "augment", + }, { ["id"] = "rune.stat_386720106", ["text"] = "Gain #% of maximum Life as Extra maximum Runic Ward", @@ -35278,12 +35658,12 @@ return { ["type"] = "desecrated", }, { - ["id"] = "desecrated.stat_3981240776", + ["id"] = "desecrated.stat_2704225257", ["text"] = "# to Spirit", ["type"] = "desecrated", }, { - ["id"] = "desecrated.stat_2704225257", + ["id"] = "desecrated.stat_3981240776", ["text"] = "# to Spirit", ["type"] = "desecrated", }, @@ -36827,6 +37207,11 @@ return { ["text"] = "#% to maximum Block chance", ["type"] = "desecrated", }, + { + ["id"] = "desecrated.stat_1484026495", + ["text"] = "+# maximum stacks of Puppet Master", + ["type"] = "desecrated", + }, { ["id"] = "desecrated.stat_1054098949", ["text"] = "+#% Monster Elemental Resistances", @@ -40085,12 +40470,12 @@ return { ["type"] = "skill", }, { - ["id"] = "skill.unique_breach_lightning_bolt", + ["id"] = "skill.lightning_bolt", ["text"] = "Grants Skill: Level # Lightning Bolt", ["type"] = "skill", }, { - ["id"] = "skill.lightning_bolt", + ["id"] = "skill.unique_breach_lightning_bolt", ["text"] = "Grants Skill: Level # Lightning Bolt", ["type"] = "skill", }, From 05219ede54f638b8f30d39561c6c4b7949c4931a Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Fri, 19 Jun 2026 21:02:11 +0300 Subject: [PATCH 3/7] Fix colour leaking into total price label --- src/Classes/TradeQuery.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index 8d4cf64640..e68013e9ce 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -859,7 +859,7 @@ function TradeQueryClass:UpdateControlsWithItems(row_idx) currency = self.resultTbl[row_idx][pb_index].currency, amount = self.resultTbl[row_idx][pb_index].amount, } - self.controls.fullPrice.label = "Total Price: " .. self:GetTotalPriceString() + self.controls.fullPrice.label = "^7Total Price: " .. self:GetTotalPriceString() self:UpdateDropdownList(row_idx) end @@ -870,7 +870,7 @@ function TradeQueryClass:SetFetchResultReturn(row_idx, index) currency = self.resultTbl[row_idx][index].currency, amount = self.resultTbl[row_idx][index].amount, } - self.controls.fullPrice.label = "Total Price: " .. self:GetTotalPriceString() + self.controls.fullPrice.label = "^7Total Price: " .. self:GetTotalPriceString() end end @@ -1120,7 +1120,7 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite self.sortedResultTbl[row_idx] = nil self.resultTbl[row_idx] = nil self.totalPrice[row_idx] = nil - self.controls.fullPrice.label = "Total Price: " .. self:GetTotalPriceString() + self.controls.fullPrice.label = "^7Total Price: " .. self:GetTotalPriceString() end) controls["changeButton"..row_idx].shown = function() return self.resultTbl[row_idx] end controls["resultDropdown"..row_idx] = new("DropDownControl", { "TOPLEFT", controls["changeButton"..row_idx], "TOPRIGHT"}, {8, 0, 351, row_height}, {}, function(index) From 84433c9b14449cc5374c133dc7df35f3de1d4cfe Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Fri, 19 Jun 2026 23:51:26 +0300 Subject: [PATCH 4/7] Fix heart of the well slot crash --- src/Classes/TradeQuery.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index e68013e9ce..6881ec1d9b 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -969,7 +969,8 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro local controls = self.controls local slotTbl = self.slotTables[row_idx] local activeSlotRef = slotTbl.nodeId and self.itemsTab.activeItemSet[slotTbl.nodeId] or self.itemsTab.activeItemSet[slotTbl.slotName] - local activeSlot = slotTbl.nodeId and self.itemsTab.sockets[slotTbl.nodeId] or + local nodeId = slotTbl.nodeId or slotTbl.selectedJewelNodeId + local activeSlot = nodeId and self.itemsTab.sockets[nodeId] or slotTbl.slotName and (self.itemsTab.slots[slotTbl.slotName] or slotTbl.slotName == "Watcher's Eye" and self:findValidSlotForWatchersEye() or slotTbl.fullName and self.itemsTab.slots[slotTbl.fullName]) -- fullName for Abyssal Sockets From 0a581a2d757ebdb81de9dac370af90baa80c9b62 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Sat, 20 Jun 2026 00:23:53 +0300 Subject: [PATCH 5/7] Fix megalomaniac trader --- src/Classes/TradeQuery.lua | 4 ++-- src/Classes/TradeQueryGenerator.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index 6881ec1d9b..d5847ea5de 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -958,7 +958,7 @@ function TradeQueryClass:FilterToSafeItems(itemEntries, slotName) local itemsSafe = {} for _, entry in ipairs(itemEntries) do local item = new("Item", entry.item_string) - if item.base and self.itemsTab:IsItemValidForSlot(item, slotName) then + if item.base and ((not slotName) or self.itemsTab:IsItemValidForSlot(item, slotName)) then t_insert(itemsSafe, entry) end end @@ -1002,7 +1002,7 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro self:SetNotice(context.controls.pbNotice, "") end - local itemsSafe = self:FilterToSafeItems(items, activeSlot.slotName) + local itemsSafe = self:FilterToSafeItems(items, activeSlot and activeSlot.slotName) if self.tradeQueryGenerator.lastAugmentBehaviour == "Copy Current" or self.tradeQueryGenerator.lastAnointBehaviour == "Copy Current" then for i, _ in ipairs(itemsSafe) do diff --git a/src/Classes/TradeQueryGenerator.lua b/src/Classes/TradeQueryGenerator.lua index 6c742fee09..3bf1bc8078 100644 --- a/src/Classes/TradeQueryGenerator.lua +++ b/src/Classes/TradeQueryGenerator.lua @@ -1187,7 +1187,7 @@ Remove: anoints are completely ignored, and removed from items.]] end - if isJewelSlot then + if isJewelSlot and not context.slotTbl.unique then controls.jewelType = new("DropDownControl", {"TOPLEFT",lastItemAnchor,"BOTTOMLEFT"}, {0, 5, 100, 18}, { "Base", "Radius" }, function(index, value) end) controls.jewelType.selIndex = self.lastJewelType or 1 controls.jewelTypeLabel = new("LabelControl", {"RIGHT",controls.jewelType,"LEFT"}, {-5, 0, 0, 16}, "Jewel Type:") From 7335f79aac0e2b93d5db09f08f5568c98864544f Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Sat, 20 Jun 2026 01:18:38 +0300 Subject: [PATCH 6/7] Fix megalomaniac crash on manual price items --- src/Classes/TradeQuery.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index d5847ea5de..109cc503af 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -1087,7 +1087,7 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite else self:SetNotice(controls.pbNotice, "") self.lastQueries[row_idx] = query - local itemsSafe = self:FilterToSafeItems(items, activeSlot.slotName) + local itemsSafe = self:FilterToSafeItems(items, activeSlot and activeSlot.slotName) self.resultTbl[row_idx] = itemsSafe self:UpdateControlsWithItems(row_idx) end From 96977bf56d1f970108e3867764fffab8ae57752e Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Sat, 20 Jun 2026 16:15:22 +1000 Subject: [PATCH 7/7] Fix crash on empty table Also fixes unique jewels being able to search for the lich socket that can't have unique jewels Will be more relevant when we add sinister sockets Fix socket selection logic --- src/Classes/TradeQuery.lua | 37 +++++++++++++++++++++-------- src/Classes/TradeQueryGenerator.lua | 4 ++-- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index 109cc503af..14fd688222 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -469,7 +469,11 @@ Highest Weight - Displays the order retrieved from trade]] end end table.sort(activeSocketList) + local activeUniqueJewelSocket for _, nodeId in ipairs(activeSocketList) do + if not activeUniqueJewelSocket and not self.itemsTab.build.spec.nodes[nodeId].containJewelSocket then + activeUniqueJewelSocket = nodeId + end t_insert(slotTables, { slotName = self.itemsTab.sockets[nodeId].label, nodeId = nodeId }) end @@ -525,7 +529,7 @@ Highest Weight - Displays the order retrieved from trade]] return hideRowFunc(self, #slotTables+1) end local row_count = #slotTables + 1 - self.slotTables[row_count] = { slotName = "Megalomaniac", unique = true, alreadyCorrupted = true } + self.slotTables[row_count] = { slotName = "Megalomaniac", unique = true, alreadyCorrupted = true, selectedJewelNodeId = activeUniqueJewelSocket } self:PriceItemRowDisplay(row_count, top_pane_alignment_ref, row_vertical_padding, row_height) self.controls["name"..row_count].y = self.controls["name"..row_count].y + (row_height + row_vertical_padding) -- Megalomaniac needs to drop an extra row for "Other Trades" self.controls["name"..row_count].shown = function() @@ -533,7 +537,7 @@ Highest Weight - Displays the order retrieved from trade]] end row_count = row_count + 1 - self.slotTables[row_count] = { slotName = "Heart of the Well", unique = true, selectedJewelNodeId = activeSocketList[1] } + self.slotTables[row_count] = { slotName = "Heart of the Well", unique = true, selectedJewelNodeId = activeUniqueJewelSocket } self:PriceItemRowDisplay(row_count, top_pane_alignment_ref, row_vertical_padding, row_height) self.controls["name"..row_count].y = self.controls["name"..row_count].y + (row_height + row_vertical_padding) self.controls["name"..row_count].shown = function() @@ -541,7 +545,7 @@ Highest Weight - Displays the order retrieved from trade]] end row_count = row_count + 1 - self.slotTables[row_count] = { slotName = "Against the Darkness", unique = true, selectedJewelNodeId = activeSocketList[1] } + self.slotTables[row_count] = { slotName = "Against the Darkness", unique = true, selectedJewelNodeId = activeUniqueJewelSocket } self:PriceItemRowDisplay(row_count, top_pane_alignment_ref, row_vertical_padding, row_height) self.controls["name"..row_count].y = self.controls["name"..row_count].y + (row_height + row_vertical_padding) self.controls["name"..row_count].shown = function() @@ -798,7 +802,7 @@ function TradeQueryClass:GetResultEvaluation(row_idx, result_index, calcFunc, ba local slotTbl = self.slotTables[row_idx] local jewelNodeId = slotTbl.nodeId or slotTbl.selectedJewelNodeId local slotName = jewelNodeId and "Jewel " .. tostring(jewelNodeId) or slotTbl.slotName - if slotName == "Megalomaniac" then + if slotTbl.slotName == "Megalomaniac" then local addedNodes = {} for nodeName in (result.item_string.."\r\n"):gmatch("Allocates (.-)\r?\n") do local node = self.itemsTab.build.spec.tree.notableMap[nodeName:lower()] @@ -852,7 +856,15 @@ function TradeQueryClass:UpdateControlsWithItems(row_idx) end self.sortedResultTbl[row_idx] = sortedItems - local pb_index = self.sortedResultTbl[row_idx][1].index + if not sortedItems[1] then + self.itemIndexTbl[row_idx] = nil + self.totalPrice[row_idx] = nil + self.controls.fullPrice.label = "Total Price: " .. self:GetTotalPriceString() + self:UpdateDropdownList(row_idx) + self:SetNotice(self.controls.pbNotice, "^4No compatible items found for this slot.") + return + end + local pb_index = sortedItems[1].index self.itemIndexTbl[row_idx] = pb_index self.controls["priceButton".. row_idx].tooltipText = "Sorted by " .. self.itemSortSelectionList[self.pbItemSortSelectionIndex] self.totalPrice[row_idx] = { @@ -974,6 +986,10 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro slotTbl.slotName and (self.itemsTab.slots[slotTbl.slotName] or slotTbl.slotName == "Watcher's Eye" and self:findValidSlotForWatchersEye() or slotTbl.fullName and self.itemsTab.slots[slotTbl.fullName]) -- fullName for Abyssal Sockets + local function getSelectedSlot() + local selectedNodeId = slotTbl.nodeId or slotTbl.selectedJewelNodeId + return selectedNodeId and self.itemsTab.sockets[selectedNodeId] or activeSlot + end local nameColor = slotTbl.unique and colorCodes.UNIQUE or "^7" controls["name"..row_idx] = new("LabelControl", top_pane_alignment_ref, {0, row_idx*(row_height + row_vertical_padding), 135, row_height - 4}, nameColor..slotTbl.slotName) controls["bestButton"..row_idx] = new("ButtonControl", { "LEFT", controls["name"..row_idx], "LEFT"}, {135 + 8, 0, 80, row_height}, "Find best", function() @@ -1002,7 +1018,8 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro self:SetNotice(context.controls.pbNotice, "") end - local itemsSafe = self:FilterToSafeItems(items, activeSlot and activeSlot.slotName) + local selectedSlot = getSelectedSlot() + local itemsSafe = self:FilterToSafeItems(items, selectedSlot and selectedSlot.slotName) if self.tradeQueryGenerator.lastAugmentBehaviour == "Copy Current" or self.tradeQueryGenerator.lastAnointBehaviour == "Copy Current" then for i, _ in ipairs(itemsSafe) do @@ -1087,7 +1104,8 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite else self:SetNotice(controls.pbNotice, "") self.lastQueries[row_idx] = query - local itemsSafe = self:FilterToSafeItems(items, activeSlot and activeSlot.slotName) + local selectedSlot = getSelectedSlot() + local itemsSafe = self:FilterToSafeItems(items, selectedSlot and selectedSlot.slotName) self.resultTbl[row_idx] = itemsSafe self:UpdateControlsWithItems(row_idx) end @@ -1099,7 +1117,7 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite local validURL = controls["uri"..row_idx].validURL local isSearching = controls["priceButton"..row_idx].label == "Searching..." local selectedJewelSlot = slotTbl.selectedJewelNodeId and self.itemsTab.sockets[slotTbl.selectedJewelNodeId] - local hasRequiredJewelSlot = not slotTbl.unique or slotTbl.slotName == "Megalomaniac" or selectedJewelSlot and not selectedJewelSlot.inactive + local hasRequiredJewelSlot = not slotTbl.unique or selectedJewelSlot and not selectedJewelSlot.inactive return isAuthorized and validURL and not isSearching and hasRequiredJewelSlot end controls["priceButton"..row_idx].tooltipFunc = function(tooltip) @@ -1108,8 +1126,7 @@ you can add them, copy the link here, and press "Price Item" to evaluate the ite tooltip:AddLine(16, "You must log in to use the search feature") elseif not controls["uri"..row_idx].validURL then tooltip:AddLine(16, "Enter a valid trade URL") - elseif slotTbl.unique and slotTbl.slotName ~= "Megalomaniac" - and (not slotTbl.selectedJewelNodeId or not self.itemsTab.sockets[slotTbl.selectedJewelNodeId] or self.itemsTab.sockets[slotTbl.selectedJewelNodeId].inactive) then + elseif slotTbl.unique and (not slotTbl.selectedJewelNodeId or not self.itemsTab.sockets[slotTbl.selectedJewelNodeId] or self.itemsTab.sockets[slotTbl.selectedJewelNodeId].inactive) then tooltip:AddLine(16, "Requires an active Jewel Socket") end end diff --git a/src/Classes/TradeQueryGenerator.lua b/src/Classes/TradeQueryGenerator.lua index 3bf1bc8078..ee5b5f23fa 100644 --- a/src/Classes/TradeQueryGenerator.lua +++ b/src/Classes/TradeQueryGenerator.lua @@ -1165,10 +1165,10 @@ Remove: anoints are completely ignored, and removed from items.]] options.special = { itemName = context.slotTbl.slotName } end - if context.slotTbl.slotName == "Heart of the Well" or context.slotTbl.slotName == "Against the Darkness" then + if context.slotTbl.slotName == "Megalomaniac" or context.slotTbl.slotName == "Heart of the Well" or context.slotTbl.slotName == "Against the Darkness" then local activeSocketList = { } for nodeId, jewelSlot in pairs(self.itemsTab.sockets) do - if not jewelSlot.inactive then + if not jewelSlot.inactive and not self.itemsTab.build.spec.nodes[nodeId].containJewelSocket then t_insert(activeSocketList, jewelSlot) end end