From f493b2f39373690e3fa325611ad90ff7c1fe4b0d Mon Sep 17 00:00:00 2001 From: Rasmus Kromann-Larsen Date: Wed, 9 Sep 2026 11:59:28 +0200 Subject: [PATCH] Iterate flasks and tinctures in slot order env.flasks and env.tinctures are keyed by item table, so pairs() walks them in memory-address order, which differs between processes. That order reaches the modDB and, for tinctures, the limit loop stops early, so it also decided which tinctures applied. CalcSetup now records each slotted item's slot number in env.itemSlotIndex, and mergeFlasks/mergeTinctures iterate in that order with item.id as the tiebreak. --- src/Modules/CalcPerform.lua | 26 ++++++++++++++++++++++++++ src/Modules/CalcSetup.lua | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index c7f75eda6c4..2c009ad1075 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -1770,7 +1770,20 @@ function calcs.perform(env, skipEHP) end end + local slotIndex = env.itemSlotIndex or { } + local orderedFlasks = { } for item in pairs(flasks) do + t_insert(orderedFlasks, item) + end + table.sort(orderedFlasks, function(a, b) + local posA = slotIndex[a] or 0 + local posB = slotIndex[b] or 0 + if posA ~= posB then + return posA < posB + end + return (a.id or 0) < (b.id or 0) + end) + for _, item in ipairs(orderedFlasks) do flaskBuffsPerBase[item.baseName] = flaskBuffsPerBase[item.baseName] or {} flaskBuffsPerBaseNonPlayer[item.baseName] = flaskBuffsPerBaseNonPlayer[item.baseName] or {} local instantPerc = getFlaskInstantRecovery(item) @@ -1902,7 +1915,20 @@ function calcs.perform(env, skipEHP) mergeBuff(srcList, tinctureBuffsPerBase[item.baseName], key) end end + local slotIndex = env.itemSlotIndex or { } + local orderedTinctures = { } for item in pairs(tinctures) do + t_insert(orderedTinctures, item) + end + table.sort(orderedTinctures, function(a, b) + local posA = slotIndex[a] or 0 + local posB = slotIndex[b] or 0 + if posA ~= posB then + return posA < posB + end + return (a.id or 0) < (b.id or 0) + end) + for _, item in ipairs(orderedTinctures) do if tinctureLimit <= 0 then break end diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index 70301168360..21ad3302f6a 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -1019,12 +1019,16 @@ function calcs.initEnv(build, mode, override, specEnv) end end + env.itemSlotIndex = { } -- Track which flask slot (1-5) each flask is in, for adjacency checks env.flaskSlotMap = { } env.flaskSlotOccupied = { } for _, slot in ipairs(build.itemsTab.orderedSlots) do local slotName = slot.slotName local item = items[slotName] + if item then + env.itemSlotIndex[item] = tonumber(slotName:match("%d+")) or 0 + end if item and item.type == "Flask" then env.itemModDB.conditions["Have"..item.baseName:gsub("%s+", "")] = true if slot.active then