Skip to content

Commit b6aa420

Browse files
authored
Fix limited processing flag not persisting through recursions causing crash (#8192)
* FIX: crash due to limited processing flag not persisting between recursive calc.perform calls. This fix may re-introduce #6898 in some cases. * Revert "FIX: crash due to limited processing flag not persisting between" This reverts commit 1a19ab0. * FIX: limited processing flag not persisting through recursions * FIX: spelling
1 parent 2f04fb4 commit b6aa420

File tree

4 files changed

+16
-5
lines changed

4 files changed

+16
-5
lines changed

src/Modules/CalcMirages.lua

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ local function calculateMirage(env, config)
3737
if mirageSkill then
3838
local newSkill, newEnv = calcs.copyActiveSkill(env, env.mode, mirageSkill)
3939
newSkill.skillCfg.skillCond["usedByMirage"] = true
40-
newSkill.skillData.limitedProcessing = true
40+
newEnv.limitedSkills = newEnv.limitedSkills or {}
41+
newEnv.limitedSkills[cacheSkillUUID(newSkill, newEnv)] = true
4142
newSkill.skillData.mirageUses = env.player.mainSkill.skillData.storedUses
4243
newSkill.skillTypes[SkillType.OtherThingUsesSkill] = true
4344

src/Modules/CalcPerform.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -1805,7 +1805,7 @@ function calcs.perform(env, skipEHP)
18051805
-- computed cached versions to satisfy the order of operations.
18061806
-- See: https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/5164
18071807
for _, activeSkill in ipairs(env.player.activeSkillList) do
1808-
if not activeSkill.skillFlags.disable and not activeSkill.skillData.limitedProcessing then
1808+
if not activeSkill.skillFlags.disable and not (env.limitedSkills and env.limitedSkills[cacheSkillUUID(activeSkill, env)]) then
18091809
if (activeSkill.activeEffect.grantedEffect.name == "Blight" or activeSkill.activeEffect.grantedEffect.name == "Blight of Contagion" or activeSkill.activeEffect.grantedEffect.name == "Blight of Atrophy") and activeSkill.skillPart == 2 then
18101810
local rate, duration = getCachedOutputValue(env, activeSkill, "Speed", "Duration")
18111811
local baseMaxStages = activeSkill.skillModList:Sum("BASE", env.player.mainSkill.skillCfg, "BlightBaseMaxStages")

src/Modules/CalcTriggers.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,7 @@ local configTable = {
13061306
end
13071307

13081308
if env.player.mainSkill.activeEffect.grantedEffect.name == "Snipe" then
1309-
if env.player.mainSkill.skillData.limitedProcessing then
1309+
if (env.limitedSkills and env.limitedSkills[cacheSkillUUID(env.player.mainSkill, env)]) then
13101310
-- Snipe is being used by some other skill. In this case snipe does not get more damage mods
13111311
snipeStages = 0
13121312
else
@@ -1420,7 +1420,7 @@ local function getUniqueItemTriggerName(skill)
14201420
end
14211421

14221422
function calcs.triggers(env, actor)
1423-
if actor and not actor.mainSkill.skillFlags.disable and not actor.mainSkill.skillData.limitedProcessing then
1423+
if actor and not actor.mainSkill.skillFlags.disable and not (env.limitedSkills and env.limitedSkills[cacheSkillUUID(actor.mainSkill, env)]) then
14241424
local skillName = actor.mainSkill.activeEffect.grantedEffect.name
14251425
local triggerName = actor.mainSkill.triggeredBy and actor.mainSkill.triggeredBy.grantedEffect.name
14261426
local uniqueName = isTriggered(actor.mainSkill) and getUniqueItemTriggerName(actor.mainSkill)

src/Modules/Calcs.lua

+11-1
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,22 @@ end
403403
-- Process active skill
404404
function calcs.buildActiveSkill(env, mode, skill, targetUUID, limitedProcessingFlags)
405405
local fullEnv, _, _, _ = calcs.initEnv(env.build, mode, env.override)
406+
407+
-- env.limitedSkills contains a map of uuids that should be limited in calculation
408+
-- this is in order to prevent infinite recursion loops
409+
fullEnv.limitedSkills = fullEnv.limitedSkills or {}
410+
for uuid, _ in pairs(env.limitedSkills or {}) do
411+
fullEnv.limitedSkills[uuid] = true
412+
end
413+
for uuid, _ in pairs(limitedProcessingFlags or {}) do
414+
fullEnv.limitedSkills[uuid] = true
415+
end
416+
406417
targetUUID = targetUUID or cacheSkillUUID(skill, env)
407418
for _, activeSkill in ipairs(fullEnv.player.activeSkillList) do
408419
local activeSkillUUID = cacheSkillUUID(activeSkill, fullEnv)
409420
if activeSkillUUID == targetUUID then
410421
fullEnv.player.mainSkill = activeSkill
411-
fullEnv.player.mainSkill.skillData.limitedProcessing = limitedProcessingFlags and limitedProcessingFlags[activeSkillUUID]
412422
calcs.perform(fullEnv, true)
413423
return
414424
end

0 commit comments

Comments
 (0)