From 7b1538aeb3c1eab6ba23f034057b9e8ee83c9379 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Mon, 15 Dec 2025 14:00:41 +0000 Subject: [PATCH 1/2] Apply changes from https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/9306 --- src/Modules/CalcPerform.lua.rej | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/Modules/CalcPerform.lua.rej diff --git a/src/Modules/CalcPerform.lua.rej b/src/Modules/CalcPerform.lua.rej new file mode 100644 index 000000000..42cd2f823 --- /dev/null +++ b/src/Modules/CalcPerform.lua.rej @@ -0,0 +1,77 @@ +diff a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua (rejected hunks) +@@ -1954,35 +1954,47 @@ function calcs.perform(env, skipEHP) + local linkSkills = { } + local allyBuffs = env.partyMembers["Aura"] + local buffExports = { Aura = {}, Curse = {}, Warcry = {}, Link = {}, EnemyMods = {}, EnemyConditions = {}, PlayerMods = {} } +- for spectreId = 1, #env.spec.build.spectreList do +- local spectreData = data.minions[env.spec.build.spectreList[spectreId]] +- for modId = 1, #spectreData.modList do +- local modData = spectreData.modList[modId] +- if modData.name == "EnemyCurseLimit" then +- minionCurses.limit = modData.value + 1 ++ local hasActiveSpectreSkill = false ++ for _, activeSkill in ipairs(env.player.activeSkillList) do ++ if not activeSkill.skillFlags.disable then ++ local skillId = activeSkill.activeEffect.grantedEffect.id ++ if skillId and skillId:match("^RaiseSpectre") then ++ hasActiveSpectreSkill = true + break +- elseif modData.name == "AllyModifier" and modData.type == "LIST" then +- buffs["Spectre"] = buffs["Spectre"] or new("ModList") +- minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") +- for _, modValue in pairs(modData.value) do +- local copyModValue = copyTable(modValue) +- copyModValue.source = "Spectre:"..spectreData.name +- t_insert(minionBuffs["Spectre"], copyModValue) +- t_insert(buffs["Spectre"], copyModValue) +- end +- elseif modData.name == "MinionModifier" and modData.type == "LIST" then +- minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") +- for _, modValue in pairs(modData.value) do +- local copyModValue = copyTable(modValue) +- copyModValue.source = "Spectre:"..spectreData.name +- t_insert(minionBuffs["Spectre"], copyModValue) +- end +- elseif modData.name == "PlayerModifier" and modData.type == "LIST" then +- buffs["Spectre"] = buffs["Spectre"] or new("ModList") +- for _, modValue in pairs(modData.value) do +- local copyModValue = copyTable(modValue) +- copyModValue.source = "Spectre:"..spectreData.name +- t_insert(buffs["Spectre"], copyModValue) ++ end ++ end ++ end ++ if hasActiveSpectreSkill then ++ for spectreId = 1, #env.spec.build.spectreList do ++ local spectreData = data.minions[env.spec.build.spectreList[spectreId]] ++ for modId = 1, #spectreData.modList do ++ local modData = spectreData.modList[modId] ++ if modData.name == "EnemyCurseLimit" then ++ minionCurses.limit = modData.value + 1 ++ break ++ elseif modData.name == "AllyModifier" and modData.type == "LIST" then ++ buffs["Spectre"] = buffs["Spectre"] or new("ModList") ++ minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") ++ for _, modValue in pairs(modData.value) do ++ local copyModValue = copyTable(modValue) ++ copyModValue.source = "Spectre:"..spectreData.name ++ t_insert(minionBuffs["Spectre"], copyModValue) ++ t_insert(buffs["Spectre"], copyModValue) ++ end ++ elseif modData.name == "MinionModifier" and modData.type == "LIST" then ++ minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") ++ for _, modValue in pairs(modData.value) do ++ local copyModValue = copyTable(modValue) ++ copyModValue.source = "Spectre:"..spectreData.name ++ t_insert(minionBuffs["Spectre"], copyModValue) ++ end ++ elseif modData.name == "PlayerModifier" and modData.type == "LIST" then ++ buffs["Spectre"] = buffs["Spectre"] or new("ModList") ++ for _, modValue in pairs(modData.value) do ++ local copyModValue = copyTable(modValue) ++ copyModValue.source = "Spectre:"..spectreData.name ++ t_insert(buffs["Spectre"], copyModValue) ++ end + end + end + end From bfd1d53ece72b43c72a69e438331f82cace9e896 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Tue, 16 Dec 2025 04:11:06 +1100 Subject: [PATCH 2/2] Fix merge issues Had to change the logic for skill flags as for some reason activeSkill.activeEffect.statSet.skillFlags can be nil for some skills --- src/Modules/CalcPerform.lua | 72 ++++++++++++++++++------------ src/Modules/CalcPerform.lua.rej | 77 --------------------------------- 2 files changed, 44 insertions(+), 105 deletions(-) delete mode 100644 src/Modules/CalcPerform.lua.rej diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index c42b5082d..99e186ed1 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1652,35 +1652,51 @@ function calcs.perform(env, skipEHP) local linkSkills = { } local allyBuffs = env.partyMembers["Aura"] local buffExports = { Aura = {}, Curse = {}, Warcry = {}, Link = {}, EnemyMods = {}, EnemyConditions = {}, PlayerMods = {} } - for spectreId = 1, #env.spec.build.spectreList do - local spectreData = data.minions[env.spec.build.spectreList[spectreId]] - for modId = 1, #spectreData.modList do - local modData = spectreData.modList[modId] - if modData.name == "EnemyCurseLimit" or modData.name == "EnemyMarkLimit" then - minionCurses.limit = modData.value + 1 + local hasActiveSpectreSkill = false + for _, activeSkill in ipairs(env.player.activeSkillList) do + local skillFlags = activeSkill.activeEffect.statSet and activeSkill.activeEffect.statSet.skillFlags + if env.mode == "CALCS" then + skillFlags = activeSkill.activeEffect.statSetCalcs and activeSkill.activeEffect.statSetCalcs.skillFlags + end + if not (skillFlags and skillFlags.disable) then + local skillId = activeSkill.activeEffect.grantedEffect.id + if skillId and skillId:match("^SummonSpectre") then + hasActiveSpectreSkill = true break - elseif modData.name == "AllyModifier" and modData.type == "LIST" then - buffs["Spectre"] = buffs["Spectre"] or new("ModList") - minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") - for _, modValue in pairs(modData.value) do - local copyModValue = copyTable(modValue) - copyModValue.source = "Spectre:"..spectreData.name - t_insert(minionBuffs["Spectre"], copyModValue) - t_insert(buffs["Spectre"], copyModValue) - end - elseif modData.name == "MinionModifier" and modData.type == "LIST" then - minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") - for _, modValue in pairs(modData.value) do - local copyModValue = copyTable(modValue) - copyModValue.source = "Spectre:"..spectreData.name - t_insert(minionBuffs["Spectre"], copyModValue) - end - elseif modData.name == "PlayerModifier" and modData.type == "LIST" then - buffs["Spectre"] = buffs["Spectre"] or new("ModList") - for _, modValue in pairs(modData.value) do - local copyModValue = copyTable(modValue) - copyModValue.source = "Spectre:"..spectreData.name - t_insert(buffs["Spectre"], copyModValue) + end + end + end + if hasActiveSpectreSkill then + for spectreId = 1, #env.spec.build.spectreList do + local spectreData = data.minions[env.spec.build.spectreList[spectreId]] + for modId = 1, #spectreData.modList do + local modData = spectreData.modList[modId] + if modData.name == "EnemyCurseLimit" or modData.name == "EnemyMarkLimit" then + minionCurses.limit = modData.value + 1 + break + elseif modData.name == "AllyModifier" and modData.type == "LIST" then + buffs["Spectre"] = buffs["Spectre"] or new("ModList") + minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") + for _, modValue in pairs(modData.value) do + local copyModValue = copyTable(modValue) + copyModValue.source = "Spectre:"..spectreData.name + t_insert(minionBuffs["Spectre"], copyModValue) + t_insert(buffs["Spectre"], copyModValue) + end + elseif modData.name == "MinionModifier" and modData.type == "LIST" then + minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") + for _, modValue in pairs(modData.value) do + local copyModValue = copyTable(modValue) + copyModValue.source = "Spectre:"..spectreData.name + t_insert(minionBuffs["Spectre"], copyModValue) + end + elseif modData.name == "PlayerModifier" and modData.type == "LIST" then + buffs["Spectre"] = buffs["Spectre"] or new("ModList") + for _, modValue in pairs(modData.value) do + local copyModValue = copyTable(modValue) + copyModValue.source = "Spectre:"..spectreData.name + t_insert(buffs["Spectre"], copyModValue) + end end end end diff --git a/src/Modules/CalcPerform.lua.rej b/src/Modules/CalcPerform.lua.rej deleted file mode 100644 index 42cd2f823..000000000 --- a/src/Modules/CalcPerform.lua.rej +++ /dev/null @@ -1,77 +0,0 @@ -diff a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua (rejected hunks) -@@ -1954,35 +1954,47 @@ function calcs.perform(env, skipEHP) - local linkSkills = { } - local allyBuffs = env.partyMembers["Aura"] - local buffExports = { Aura = {}, Curse = {}, Warcry = {}, Link = {}, EnemyMods = {}, EnemyConditions = {}, PlayerMods = {} } -- for spectreId = 1, #env.spec.build.spectreList do -- local spectreData = data.minions[env.spec.build.spectreList[spectreId]] -- for modId = 1, #spectreData.modList do -- local modData = spectreData.modList[modId] -- if modData.name == "EnemyCurseLimit" then -- minionCurses.limit = modData.value + 1 -+ local hasActiveSpectreSkill = false -+ for _, activeSkill in ipairs(env.player.activeSkillList) do -+ if not activeSkill.skillFlags.disable then -+ local skillId = activeSkill.activeEffect.grantedEffect.id -+ if skillId and skillId:match("^RaiseSpectre") then -+ hasActiveSpectreSkill = true - break -- elseif modData.name == "AllyModifier" and modData.type == "LIST" then -- buffs["Spectre"] = buffs["Spectre"] or new("ModList") -- minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") -- for _, modValue in pairs(modData.value) do -- local copyModValue = copyTable(modValue) -- copyModValue.source = "Spectre:"..spectreData.name -- t_insert(minionBuffs["Spectre"], copyModValue) -- t_insert(buffs["Spectre"], copyModValue) -- end -- elseif modData.name == "MinionModifier" and modData.type == "LIST" then -- minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") -- for _, modValue in pairs(modData.value) do -- local copyModValue = copyTable(modValue) -- copyModValue.source = "Spectre:"..spectreData.name -- t_insert(minionBuffs["Spectre"], copyModValue) -- end -- elseif modData.name == "PlayerModifier" and modData.type == "LIST" then -- buffs["Spectre"] = buffs["Spectre"] or new("ModList") -- for _, modValue in pairs(modData.value) do -- local copyModValue = copyTable(modValue) -- copyModValue.source = "Spectre:"..spectreData.name -- t_insert(buffs["Spectre"], copyModValue) -+ end -+ end -+ end -+ if hasActiveSpectreSkill then -+ for spectreId = 1, #env.spec.build.spectreList do -+ local spectreData = data.minions[env.spec.build.spectreList[spectreId]] -+ for modId = 1, #spectreData.modList do -+ local modData = spectreData.modList[modId] -+ if modData.name == "EnemyCurseLimit" then -+ minionCurses.limit = modData.value + 1 -+ break -+ elseif modData.name == "AllyModifier" and modData.type == "LIST" then -+ buffs["Spectre"] = buffs["Spectre"] or new("ModList") -+ minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") -+ for _, modValue in pairs(modData.value) do -+ local copyModValue = copyTable(modValue) -+ copyModValue.source = "Spectre:"..spectreData.name -+ t_insert(minionBuffs["Spectre"], copyModValue) -+ t_insert(buffs["Spectre"], copyModValue) -+ end -+ elseif modData.name == "MinionModifier" and modData.type == "LIST" then -+ minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList") -+ for _, modValue in pairs(modData.value) do -+ local copyModValue = copyTable(modValue) -+ copyModValue.source = "Spectre:"..spectreData.name -+ t_insert(minionBuffs["Spectre"], copyModValue) -+ end -+ elseif modData.name == "PlayerModifier" and modData.type == "LIST" then -+ buffs["Spectre"] = buffs["Spectre"] or new("ModList") -+ for _, modValue in pairs(modData.value) do -+ local copyModValue = copyTable(modValue) -+ copyModValue.source = "Spectre:"..spectreData.name -+ t_insert(buffs["Spectre"], copyModValue) -+ end - end - end - end