Implement instant cache adjustment for item movements in inventory
This commit is contained in:
@@ -132,6 +132,66 @@ local activity = {
|
|||||||
smelting = false, -- auto-smelt in progress
|
smelting = false, -- auto-smelt in progress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-------------------------------------------------
|
||||||
|
-- Instant cache adjustment (no scan needed)
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
--- Adjust cached counts for a single item move.
|
||||||
|
-- delta > 0 means items arrived in chestName;
|
||||||
|
-- delta < 0 means items left chestName.
|
||||||
|
local function adjustCache(itemName, chestName, delta)
|
||||||
|
if delta == 0 then return end
|
||||||
|
|
||||||
|
-- 1) catalogue: per-chest totals
|
||||||
|
local cat = cache.catalogue
|
||||||
|
if delta > 0 then
|
||||||
|
-- Items added to a chest
|
||||||
|
if not cat[itemName] then cat[itemName] = {} end
|
||||||
|
local found = false
|
||||||
|
for _, entry in ipairs(cat[itemName]) do
|
||||||
|
if entry.chest == chestName then
|
||||||
|
entry.total = entry.total + delta
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not found then
|
||||||
|
table.insert(cat[itemName], { chest = chestName, total = delta })
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Items removed from a chest
|
||||||
|
if cat[itemName] then
|
||||||
|
for idx, entry in ipairs(cat[itemName]) do
|
||||||
|
if entry.chest == chestName then
|
||||||
|
entry.total = entry.total + delta -- delta is negative
|
||||||
|
if entry.total <= 0 then
|
||||||
|
table.remove(cat[itemName], idx)
|
||||||
|
end
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Remove item from catalogue entirely if no sources left
|
||||||
|
if #cat[itemName] == 0 then
|
||||||
|
cat[itemName] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 2) Rebuild itemList from catalogue (lightweight — just totals)
|
||||||
|
local itemList = {}
|
||||||
|
local grandTotal = 0
|
||||||
|
for name, sources in pairs(cat) do
|
||||||
|
local total = 0
|
||||||
|
for _, s in ipairs(sources) do total = total + s.total end
|
||||||
|
grandTotal = grandTotal + total
|
||||||
|
table.insert(itemList, { name = name, total = total })
|
||||||
|
end
|
||||||
|
table.sort(itemList, function(a, b) return a.total > b.total end)
|
||||||
|
|
||||||
|
cache.itemList = itemList
|
||||||
|
cache.grandTotal = grandTotal
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
-- Inventory helpers
|
-- Inventory helpers
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
@@ -1157,6 +1217,9 @@ local function sortBarrel()
|
|||||||
local n = barrel.pushItems(entry.chest, slot)
|
local n = barrel.pushItems(entry.chest, slot)
|
||||||
if n and n > 0 then
|
if n and n > 0 then
|
||||||
moved = moved + n
|
moved = moved + n
|
||||||
|
adjustCache(item.name, entry.chest, n)
|
||||||
|
needsRedraw = true
|
||||||
|
smelterNeedsRedraw = true
|
||||||
print(string.format("[SORT] %s x%d -> %s", item.name, n, entry.chest))
|
print(string.format("[SORT] %s x%d -> %s", item.name, n, entry.chest))
|
||||||
end
|
end
|
||||||
if moved >= item.count then break end
|
if moved >= item.count then break end
|
||||||
@@ -1168,6 +1231,9 @@ local function sortBarrel()
|
|||||||
local n = barrel.pushItems(chest, slot)
|
local n = barrel.pushItems(chest, slot)
|
||||||
if n and n > 0 then
|
if n and n > 0 then
|
||||||
moved = moved + n
|
moved = moved + n
|
||||||
|
adjustCache(item.name, chest, n)
|
||||||
|
needsRedraw = true
|
||||||
|
smelterNeedsRedraw = true
|
||||||
print(string.format("[SORT] %s x%d -> %s", item.name, n, chest))
|
print(string.format("[SORT] %s x%d -> %s", item.name, n, chest))
|
||||||
end
|
end
|
||||||
if moved >= item.count then break end
|
if moved >= item.count then break end
|
||||||
@@ -1402,6 +1468,9 @@ local function orderItem(itemName, amount)
|
|||||||
local moved = chest.pushItems(DROPPER_NAME, slot, toMove)
|
local moved = chest.pushItems(DROPPER_NAME, slot, toMove)
|
||||||
if moved and moved > 0 then
|
if moved and moved > 0 then
|
||||||
remaining = remaining - moved
|
remaining = remaining - moved
|
||||||
|
adjustCache(itemName, entry.chest, -moved)
|
||||||
|
needsRedraw = true
|
||||||
|
smelterNeedsRedraw = true
|
||||||
print(string.format("[ORDER] %s x%d from %s", itemName, moved, entry.chest))
|
print(string.format("[ORDER] %s x%d from %s", itemName, moved, entry.chest))
|
||||||
end
|
end
|
||||||
if remaining <= 0 then break end
|
if remaining <= 0 then break end
|
||||||
|
|||||||
Reference in New Issue
Block a user