diff --git a/milo/plugins/importTask.lua b/milo/plugins/importTask.lua index 1ed4290..1e70ff2 100644 --- a/milo/plugins/importTask.lua +++ b/milo/plugins/importTask.lua @@ -1,6 +1,8 @@ local itemDB = require('core.itemDB') local Milo = require('milo') +local parallel = _G.parallel + local ImportTask = { name = 'importer', priority = 20, @@ -11,63 +13,73 @@ local function filter(a) end function ImportTask:cycle(context) - for node in context.storage:filterActive('machine', filter) do - local s, m = pcall(function() - for _, entry in pairs(node.imports) do + local tasks = { } - local function itemMatchesFilter(item) - if not entry.ignoreDamage and not entry.ignoreNbtHash then - local key = itemDB:makeKey(item) - return entry.filter[key] + for node in context.storage:filterActive('machine', filter) do + table.insert(tasks, function() + local s, m = pcall(function() + for _, entry in pairs(node.imports) do + + local function itemMatchesFilter(item) + if not entry.ignoreDamage and not entry.ignoreNbtHash then + local key = itemDB:makeKey(item) + return entry.filter[key] + end + + for key in pairs(entry.filter) do + local v = itemDB:splitKey(key) + if item.name == v.name and + (entry.ignoreDamage or item.damage == v.damage) and + (entry.ignoreNbtHash or item.nbtHash == v.nbtHash) then + return true + end + end end - for key in pairs(entry.filter) do - local v = itemDB:splitKey(key) - if item.name == v.name and - (entry.ignoreDamage or item.damage == v.damage) and - (entry.ignoreNbtHash or item.nbtHash == v.nbtHash) then + local function matchesFilter(item) + if not entry.filter then return true end + + if entry.blacklist then + return not itemMatchesFilter(item) + end + + return itemMatchesFilter(item) + end + + local list = node.adapter.list() + + local function importSlot(slotNo) + local item = itemDB:get(list[slotNo], function() + return node.adapter.getItemMeta(slotNo) + end) + if item and matchesFilter(item) then + context.storage:import(node, slotNo, item.count, item) + end + end + + if type(entry.slot) == 'number' then + if list[entry.slot] then + importSlot(entry.slot) + end + else + for i in pairs(list) do + importSlot(i) + end end end + end) - local function matchesFilter(item) - if not entry.filter then - return true - end - - if entry.blacklist then - return not itemMatchesFilter(item) - end - - return itemMatchesFilter(item) - end - - local list = node.adapter.list() - - local function importSlot(slotNo) - local item = itemDB:get(list[slotNo], function() - return node.adapter.getItemMeta(slotNo) - end) - if item and matchesFilter(item) then - context.storage:import(node, slotNo, item.count, item) - end - end - - if type(entry.slot) == 'number' then - if list[entry.slot] then - importSlot(entry.slot) - end - else - for i in pairs(list) do - importSlot(i) - end - end + if not s and m then + _G._debug('IMPORTER error: ' .. m) end + end) - if not s and m then - _G._debug('IMPORTER error: ' .. m) - end + end + + if #tasks > 0 then + parallel.waitForAll(table.unpack(tasks)) end end diff --git a/milo/plugins/statsView.lua b/milo/plugins/statsView.lua index 5cdcca4..b617075 100644 --- a/milo/plugins/statsView.lua +++ b/milo/plugins/statsView.lua @@ -446,7 +446,9 @@ Unlocked Slots : %d of %d (%d%%) end end) - UI:setPage(page) + Event.onTimeout(0, function() + UI:setPage(page) + end) return page end diff --git a/milo/plugins/trashcanView.lua b/milo/plugins/trashcanView.lua index 43b7a6f..33a0ab7 100644 --- a/milo/plugins/trashcanView.lua +++ b/milo/plugins/trashcanView.lua @@ -1,3 +1,4 @@ +local Event = require('event') local Milo = require('milo') local UI = require('ui') @@ -76,10 +77,14 @@ end function task:cycle(context) for node in context.storage:filterActive('trashcan', filter) do - for k in pairs(node.adapter.list()) do - local direction = node.dropDirection or 'down' - node.adapter.drop(k, 64, direction) - end + Event.onTimeout(0, function() -- run on a background thread + pcall(function() + for k in pairs(node.adapter.list()) do + local direction = node.dropDirection or 'down' + node.adapter.drop(k, 64, direction) + end + end) + end) end end