1
0
mirror of https://github.com/kepler155c/opus synced 2025-12-14 12:28:06 +00:00

optimize refined storage

This commit is contained in:
kepler155c@gmail.com
2017-04-23 10:06:35 -04:00
parent 2297353215
commit 78c5cc2818
2 changed files with 72 additions and 65 deletions

View File

@@ -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)

View File

@@ -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)