Skip to content

Commit dc503f8

Browse files
committed
Make source assignment non-mutating
1 parent 322fc5d commit dc503f8

3 files changed

Lines changed: 21 additions & 17 deletions

File tree

src/Modules/CalcPerform.lua

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ local function applyEnemyModifiers(actor, clearCache)
584584
local mod = value.value and value.value.mod
585585
if mod and not cache[mod] then
586586
local source = mod.source or value.mod.source
587-
enemyDB:AddMod(modLib.setSource(mod, source))
587+
enemyDB:AddMod(modLib.withSource(mod, source))
588588
cache[mod] = true
589589
end
590590
end
@@ -1753,8 +1753,7 @@ function calcs.perform(env, skipEHP)
17531753
for _, value in ipairs(env.modDB:Tabulate(nil, nil, "EnemyModifier")) do
17541754
local mod = value.value and value.value.mod
17551755
if mod then
1756-
local copy = copyTable(mod, true)
1757-
env.minion.modDB:AddMod(modLib.setSource(copy, mod.source or value.mod.source))
1756+
env.minion.modDB:AddMod(modLib.withSource(mod, mod.source or value.mod.source))
17581757
end
17591758
end
17601759
end
@@ -2025,23 +2024,20 @@ function calcs.perform(env, skipEHP)
20252024
buffs["Spectre"] = buffs["Spectre"] or new("ModList")
20262025
minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList")
20272026
for _, modValue in pairs(modData.value) do
2028-
local copyModValue = copyTable(modValue)
2029-
copyModValue.source = "Spectre:"..spectreData.name
2027+
local copyModValue = modLib.withSource(modValue, "Spectre:"..spectreData.name)
20302028
t_insert(minionBuffs["Spectre"], copyModValue)
20312029
t_insert(buffs["Spectre"], copyModValue)
20322030
end
20332031
elseif modData.name == "MinionModifier" and modData.type == "LIST" then
20342032
minionBuffs["Spectre"] = minionBuffs["Spectre"] or new("ModList")
20352033
for _, modValue in pairs(modData.value) do
2036-
local copyModValue = copyTable(modValue)
2037-
copyModValue.source = "Spectre:"..spectreData.name
2034+
local copyModValue = modLib.withSource(modValue, "Spectre:"..spectreData.name)
20382035
t_insert(minionBuffs["Spectre"], copyModValue)
20392036
end
20402037
elseif modData.name == "PlayerModifier" and modData.type == "LIST" then
20412038
buffs["Spectre"] = buffs["Spectre"] or new("ModList")
20422039
for _, modValue in pairs(modData.value) do
2043-
local copyModValue = copyTable(modValue)
2044-
copyModValue.source = "Spectre:"..spectreData.name
2040+
local copyModValue = modLib.withSource(modValue, "Spectre:"..spectreData.name)
20452041
t_insert(buffs["Spectre"], copyModValue)
20462042
end
20472043
end
@@ -2557,7 +2553,7 @@ function calcs.perform(env, skipEHP)
25572553
source = source..castingMinion.minionData.name
25582554
end
25592555
for i = 1, #modList do
2560-
modList[i].source = source
2556+
modList[i] = modLib.withSource(modList[i], source)
25612557
end
25622558
end
25632559
end

src/Modules/CalcSetup.lua

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ local function applySocketMods(env, gem, groupCfg, socketNum, modSource)
310310
socketCfg.skillGem = gem
311311
socketCfg.socketNum = socketNum
312312
for _, value in ipairs(env.modDB:List(socketCfg, "SocketProperty")) do
313-
env.player.modDB:AddMod(modLib.setSource(value.value, modSource or groupCfg.slotName or ""))
313+
env.player.modDB:AddMod(modLib.withSource(value.value, modSource or groupCfg.slotName or ""))
314314
end
315315
end
316316

@@ -1054,9 +1054,7 @@ function calcs.initEnv(build, mode, override, specEnv)
10541054
end
10551055
end
10561056

1057-
local modCopy = copyTable(mod)
1058-
modLib.setSource(modCopy, item.modSource)
1059-
env.itemModDB:ScaleAddMod(modCopy, scale)
1057+
env.itemModDB:ScaleAddMod(modLib.withSource(mod, item.modSource), scale)
10601058

10611059
::skip_mod::
10621060
end
@@ -1684,7 +1682,7 @@ function calcs.initEnv(build, mode, override, specEnv)
16841682
}
16851683
local groupCfg = groupCfgList[slotName or "noSlot"][group]
16861684
for _, value in ipairs(env.modDB:List(groupCfg, "GroupProperty")) do
1687-
env.player.modDB:AddMod(modLib.setSource(value.value, groupCfg.slotName or ""))
1685+
env.player.modDB:AddMod(modLib.withSource(value.value, groupCfg.slotName or ""))
16881686
end
16891687

16901688
if index == env.mainSocketGroup and #socketGroupSkillList > 0 then

src/Modules/ModTools.lua

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@ function modLib.formatSourceMod(mod)
214214
return s_format("%s|%s|%s", modLib.formatValue(mod.value), mod.source, modLib.formatModParams(mod))
215215
end
216216

217+
function modLib.withSource(mod, source)
218+
local copy = copyTableSafe(mod, false)
219+
copy.source = source
220+
if type(copy.value) == "table" and copy.value.mod then
221+
copy.value.mod.source = source
222+
end
223+
return copy
224+
end
225+
226+
-- Deprecated: internal-only helper that mutates the provided mod; prefer withSource for shared mods.
217227
function modLib.setSource(mod, source)
218228
mod.source = source
219229
if type(mod.value) == "table" and mod.value.mod then
@@ -230,8 +240,8 @@ function modLib.mergeKeystones(env, modDB)
230240
env.keystonesAdded[modObj.value] = true
231241
local fromTree = modObj.mod.source and not modObj.mod.source:lower():match("tree")
232242
for _, mod in ipairs(env.spec.tree.keystoneMap[modObj.value].modList) do
233-
modDB:AddMod(fromTree and modLib.setSource(mod, modObj.mod.source) or mod)
243+
modDB:AddMod(fromTree and modLib.withSource(mod, modObj.mod.source) or mod)
234244
end
235245
end
236246
end
237-
end
247+
end

0 commit comments

Comments
 (0)