mirror of
https://github.com/kepler155c/opus
synced 2025-12-14 12:28:06 +00:00
optimize refined storage
This commit is contained in:
@@ -26,22 +26,16 @@ function getItem(items, inItem, ignoreDamage)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function uniqueKey(item)
|
local function uniqueKey(item)
|
||||||
local key = item.name .. ':' .. item.damage
|
return table.concat({ item.name, item.damage, item.nbtHash }, ':')
|
||||||
if item.nbtHash then
|
|
||||||
key = key .. ':' .. item.nbtHash
|
|
||||||
end
|
|
||||||
return key
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mergeResources(t)
|
function mergeResources(t)
|
||||||
local resources = Util.readTable('resource.limits')
|
local resources = Util.readTable('resource.limits') or { }
|
||||||
resources = resources or { }
|
|
||||||
|
|
||||||
for _,v in pairs(resources) do
|
for _,v in pairs(resources) do
|
||||||
local item = getItem(t, v)
|
local item = getItem(t, v)
|
||||||
if item then
|
if item then
|
||||||
item.limit = tonumber(v.limit)
|
item.low = v.low
|
||||||
item.low = tonumber(v.low)
|
|
||||||
item.auto = v.auto
|
item.auto = v.auto
|
||||||
item.ignoreDamage = v.ignoreDamage
|
item.ignoreDamage = v.ignoreDamage
|
||||||
item.rsControl = v.rsControl
|
item.rsControl = v.rsControl
|
||||||
@@ -49,29 +43,27 @@ function mergeResources(t)
|
|||||||
item.rsSide = v.rsSide
|
item.rsSide = v.rsSide
|
||||||
else
|
else
|
||||||
v.count = 0
|
v.count = 0
|
||||||
v.limit = tonumber(v.limit)
|
|
||||||
v.low = tonumber(v.low)
|
|
||||||
v.auto = v.auto
|
|
||||||
v.ignoreDamage = v.ignoreDamage
|
|
||||||
table.insert(t, v)
|
table.insert(t, v)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,v in pairs(t) do
|
||||||
v.lname = v.displayName:lower()
|
v.lname = v.displayName:lower()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function filterItems(t, filter)
|
function filterItems(t, filter)
|
||||||
local r = {}
|
|
||||||
if filter then
|
if filter then
|
||||||
|
local r = {}
|
||||||
filter = filter:lower()
|
filter = filter:lower()
|
||||||
for k,v in pairs(t) do
|
for k,v in pairs(t) do
|
||||||
if string.find(v.lname, filter) then
|
if string.find(v.lname, filter) then
|
||||||
table.insert(r, v)
|
table.insert(r, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
|
||||||
return t
|
|
||||||
end
|
|
||||||
return r
|
return r
|
||||||
|
end
|
||||||
|
return t
|
||||||
end
|
end
|
||||||
|
|
||||||
function craftItems(itemList, allItems)
|
function craftItems(itemList, allItems)
|
||||||
@@ -91,7 +83,7 @@ function craftItems(itemList, allItems)
|
|||||||
while count >= 1 do -- try to request smaller quantities until successful
|
while count >= 1 do -- try to request smaller quantities until successful
|
||||||
local s, m = pcall(function()
|
local s, m = pcall(function()
|
||||||
item.status = '(no recipe)'
|
item.status = '(no recipe)'
|
||||||
if not cItem.craft(count) then
|
if not controller:craft(cItem, count) then
|
||||||
item.status = '(missing ingredients)'
|
item.status = '(missing ingredients)'
|
||||||
error('failed')
|
error('failed')
|
||||||
end
|
end
|
||||||
@@ -106,7 +98,7 @@ function craftItems(itemList, allItems)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function getAutocraftItems(items)
|
function getAutocraftItems()
|
||||||
local t = Util.readTable('resource.limits') or { }
|
local t = Util.readTable('resource.limits') or { }
|
||||||
local itemList = { }
|
local itemList = { }
|
||||||
|
|
||||||
@@ -151,8 +143,6 @@ function watchResources(items)
|
|||||||
local t = Util.readTable('resource.limits') or { }
|
local t = Util.readTable('resource.limits') or { }
|
||||||
for k, res in pairs(t) do
|
for k, res in pairs(t) do
|
||||||
local item = getItemWithQty(items, res, res.ignoreDamage)
|
local item = getItemWithQty(items, res, res.ignoreDamage)
|
||||||
res.limit = tonumber(res.limit)
|
|
||||||
res.low = tonumber(res.low)
|
|
||||||
if not item then
|
if not item then
|
||||||
item = {
|
item = {
|
||||||
damage = res.damage,
|
damage = res.damage,
|
||||||
@@ -179,11 +169,9 @@ function watchResources(items)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if res.rsControl and res.rsDevice and res.rsSide then
|
if res.rsControl and res.rsDevice and res.rsSide then
|
||||||
if item.count < res.low then
|
pcall(function()
|
||||||
pcall(function() device[res.rsDevice].setOutput(res.rsSide, true) end)
|
device[res.rsDevice].setOutput(res.rsSide, item.count < res.low)
|
||||||
else
|
end)
|
||||||
pcall(function() device[res.rsDevice].setOutput(res.rsSide, false) end)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -278,7 +266,6 @@ function itemPage:enable(item)
|
|||||||
|
|
||||||
self.form:setValues(item)
|
self.form:setValues(item)
|
||||||
self.titleBar.title = item.name
|
self.titleBar.title = item.name
|
||||||
self.displayName.value = item.displayName
|
|
||||||
|
|
||||||
local devices = self.form[5].choices
|
local devices = self.form[5].choices
|
||||||
Util.clear(devices)
|
Util.clear(devices)
|
||||||
@@ -307,22 +294,15 @@ function itemPage:eventHandler(event)
|
|||||||
elseif event.type == 'form_complete' then
|
elseif event.type == 'form_complete' then
|
||||||
local values = self.form.values
|
local values = self.form.values
|
||||||
local t = Util.readTable('resource.limits') or { }
|
local t = Util.readTable('resource.limits') or { }
|
||||||
for k,v in pairs(t) do
|
|
||||||
if uniqueKey(v) == uniqueKey(values) then
|
|
||||||
--if v.name == values.name and v.damage == values.damage then
|
|
||||||
t[k] = nil
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local keys = { 'name', 'displayName', 'auto', 'low', 'damage',
|
local keys = { 'name', 'displayName', 'auto', 'low', 'damage',
|
||||||
'maxDamage', 'nbtHash', 'limit', 'ignoreDamage',
|
'maxDamage', 'nbtHash', 'ignoreDamage',
|
||||||
'rsControl', 'rsDevice', 'rsSide', }
|
'rsControl', 'rsDevice', 'rsSide', }
|
||||||
|
|
||||||
local filtered = { }
|
local filtered = { }
|
||||||
for _,key in pairs(keys) do
|
for _,key in pairs(keys) do
|
||||||
filtered[key] = values[key]
|
filtered[key] = values[key]
|
||||||
end
|
end
|
||||||
filtered.low = tonumber(filtered.low)
|
filtered.low = tonumber(filtered.low)
|
||||||
filtered.limit = tonumber(filtered.limit)
|
|
||||||
|
|
||||||
filtered.ignoreDamage = filtered.ignoreDamage == true
|
filtered.ignoreDamage = filtered.ignoreDamage == true
|
||||||
filtered.auto = filtered.auto == true
|
filtered.auto = filtered.auto == true
|
||||||
@@ -333,10 +313,9 @@ function itemPage:eventHandler(event)
|
|||||||
end
|
end
|
||||||
|
|
||||||
t[uniqueKey(filtered)] = filtered
|
t[uniqueKey(filtered)] = filtered
|
||||||
--table.insert(t, filtered)
|
|
||||||
Util.writeTable('resource.limits', t)
|
Util.writeTable('resource.limits', t)
|
||||||
UI:setPreviousPage()
|
|
||||||
|
|
||||||
|
UI:setPreviousPage()
|
||||||
else
|
else
|
||||||
return UI.Page.eventHandler(self, event)
|
return UI.Page.eventHandler(self, event)
|
||||||
end
|
end
|
||||||
@@ -394,9 +373,6 @@ function listingPage.grid:getDisplayValues(row)
|
|||||||
if row.low then
|
if row.low then
|
||||||
row.low = Util.toBytes(row.low)
|
row.low = Util.toBytes(row.low)
|
||||||
end
|
end
|
||||||
if row.limit then
|
|
||||||
row.limit = Util.toBytes(row.limit)
|
|
||||||
end
|
|
||||||
return row
|
return row
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -428,6 +404,7 @@ function listingPage:eventHandler(event)
|
|||||||
elseif event.type == 'refresh' then
|
elseif event.type == 'refresh' then
|
||||||
self:refresh()
|
self:refresh()
|
||||||
self.grid:draw()
|
self.grid:draw()
|
||||||
|
self.statusBar.filter:focus()
|
||||||
|
|
||||||
elseif event.type == 'forget' then
|
elseif event.type == 'forget' then
|
||||||
local item = self.grid:getSelected()
|
local item = self.grid:getSelected()
|
||||||
@@ -539,11 +516,11 @@ function craftingThread()
|
|||||||
jobListGrid:draw()
|
jobListGrid:draw()
|
||||||
jobListGrid:sync()
|
jobListGrid:sync()
|
||||||
craftItems(itemList, items)
|
craftItems(itemList, items)
|
||||||
jobListGrid:update()
|
--jobListGrid:update()
|
||||||
jobListGrid:draw()
|
jobListGrid:draw()
|
||||||
jobListGrid:sync()
|
jobListGrid:sync()
|
||||||
|
|
||||||
itemList = getAutocraftItems(items) -- autocrafted items don't show on job monitor
|
itemList = getAutocraftItems() -- autocrafted items don't show on job monitor
|
||||||
craftItems(itemList, items)
|
craftItems(itemList, items)
|
||||||
end
|
end
|
||||||
--end)
|
--end)
|
||||||
|
|||||||
@@ -1,12 +1,23 @@
|
|||||||
local class = require('class')
|
local class = require('class')
|
||||||
local Peripheral = require('peripheral')
|
local Peripheral = require('peripheral')
|
||||||
|
local TableDB = require('tableDB')
|
||||||
|
|
||||||
local RefinedProvider = class()
|
local RefinedProvider = class()
|
||||||
|
|
||||||
|
local keys = {
|
||||||
|
'fields',
|
||||||
|
'damage',
|
||||||
|
'displayName',
|
||||||
|
'maxCount',
|
||||||
|
'maxDamage',
|
||||||
|
'name',
|
||||||
|
'nbtHash',
|
||||||
|
'rawName',
|
||||||
|
}
|
||||||
|
|
||||||
function RefinedProvider:init(args)
|
function RefinedProvider:init(args)
|
||||||
|
|
||||||
local defaults = {
|
local defaults = {
|
||||||
cache = { },
|
|
||||||
items = { },
|
items = { },
|
||||||
name = 'refinedStorage',
|
name = 'refinedStorage',
|
||||||
}
|
}
|
||||||
@@ -17,6 +28,14 @@ function RefinedProvider:init(args)
|
|||||||
if controller then
|
if controller then
|
||||||
Util.merge(self, controller)
|
Util.merge(self, controller)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if not self.itemInfoDB then
|
||||||
|
self.itemInfoDB = TableDB({
|
||||||
|
fileName = 'items.db'
|
||||||
|
})
|
||||||
|
|
||||||
|
self.itemInfoDB:load()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function RefinedProvider:isValid()
|
function RefinedProvider:isValid()
|
||||||
@@ -30,13 +49,15 @@ end
|
|||||||
function RefinedProvider:getCachedItemDetails(item)
|
function RefinedProvider:getCachedItemDetails(item)
|
||||||
local key = table.concat({ item.name, item.damage, item.nbtHash }, ':')
|
local key = table.concat({ item.name, item.damage, item.nbtHash }, ':')
|
||||||
|
|
||||||
local detail = self.cache[key]
|
local detail = self.itemInfoDB:get(key)
|
||||||
if not detail then
|
if not detail then
|
||||||
detail = self.findItem(item)
|
detail = self.findItem(item)
|
||||||
if detail then
|
if detail then
|
||||||
local meta
|
local meta
|
||||||
pcall(function() meta = detail.getMetadata() end)
|
pcall(function() meta = detail.getMetadata() end)
|
||||||
if meta then
|
if not meta then
|
||||||
|
return
|
||||||
|
end
|
||||||
Util.merge(detail, meta)
|
Util.merge(detail, meta)
|
||||||
if detail.maxDamage and detail.maxDamage > 0 and detail.damage > 0 then
|
if detail.maxDamage and detail.maxDamage > 0 and detail.damage > 0 then
|
||||||
detail.displayName = detail.displayName .. ' (damaged)'
|
detail.displayName = detail.displayName .. ' (damaged)'
|
||||||
@@ -50,8 +71,13 @@ function RefinedProvider:getCachedItemDetails(item)
|
|||||||
detail.display_name = detail.displayName
|
detail.display_name = detail.displayName
|
||||||
detail.nbtHash = item.nbtHash
|
detail.nbtHash = item.nbtHash
|
||||||
|
|
||||||
self.cache[key] = detail
|
local t = { }
|
||||||
|
for _,key in pairs(keys) do
|
||||||
|
t[key] = detail[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
detail = t
|
||||||
|
self.itemInfoDB:add(key, detail)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if detail then
|
if detail then
|
||||||
@@ -76,6 +102,7 @@ function RefinedProvider:listItems()
|
|||||||
table.insert(items, item)
|
table.insert(items, item)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
self.itemInfoDB:flush()
|
||||||
end
|
end
|
||||||
|
|
||||||
return items
|
return items
|
||||||
@@ -85,7 +112,7 @@ function RefinedProvider:getItemInfo(fingerprint)
|
|||||||
|
|
||||||
local key = table.concat({ fingerprint.name, fingerprint.damage, fingerprint.nbtHash }, ':')
|
local key = table.concat({ fingerprint.name, fingerprint.damage, fingerprint.nbtHash }, ':')
|
||||||
|
|
||||||
local item = self.cache[key]
|
local item = self.itemInfoDB:get(key)
|
||||||
if not item then
|
if not item then
|
||||||
return self:getCachedItemDetails(fingerprint)
|
return self:getCachedItemDetails(fingerprint)
|
||||||
end
|
end
|
||||||
@@ -110,8 +137,11 @@ function RefinedProvider:isCrafting(item)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function RefinedProvider:craft(id, dmg, qty)
|
function RefinedProvider:craft(item, qty)
|
||||||
return false
|
local detail = self.findItem(item)
|
||||||
|
if detail then
|
||||||
|
return detail.craft(qty)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function RefinedProvider:craftItems(items)
|
function RefinedProvider:craftItems(items)
|
||||||
|
|||||||
Reference in New Issue
Block a user