id upgrade fixes

This commit is contained in:
kepler155c
2017-10-05 17:43:57 -04:00
parent 33bf4f4d7a
commit 0ee71157d5
5 changed files with 229 additions and 169 deletions

View File

@@ -1,111 +1,152 @@
local class = require('class') local class = require('class')
local Logger = require('logger') local itemDB = require('itemDB')
local Peripheral = require('peripheral')
local Util = require('util')
local ChestProvider = class() local ChestAdapter = class()
function ChestProvider:init(args)
args = args or { }
self.stacks = {} local convertNames = {
self.name = 'chest' name = 'id',
self.direction = args.direction or 'up' damage = 'dmg',
self.wrapSide = args.wrapSide or 'bottom' maxCount = 'max_size',
self.p = peripheral.wrap(self.wrapSide) count = 'qty',
displayName = 'display_name',
maxDamage = 'max_dmg',
}
local keys = {
'damage',
'displayName',
'maxCount',
'maxDamage',
'name',
'nbtHash',
}
-- Strip off color prefix
local function safeString(text)
local val = text:byte(1)
if val < 32 or val > 128 then
local newText = {}
for i = 4, #text do
local val = text:byte(i)
newText[i - 3] = (val > 31 and val < 127) and val or 63
end
return string.char(unpack(newText))
end
return text
end
local function convertItem(item)
for k,v in pairs(convertNames) do
item[k] = item[v]
item[v] = nil
end
item.displayName = safeString(item.displayName)
end
function ChestAdapter:init(args)
local defaults = {
name = 'chest',
direction = 'up',
wrapSide = 'bottom',
}
Util.merge(self, defaults)
Util.merge(self, args)
local chest = Peripheral.getBySide(self.wrapSide)
if not chest then
chest = Peripheral.getByMethod('getAllStacks')
end
if chest then
Util.merge(self, chest)
end
end end
function ChestProvider:isValid() function ChestAdapter:isValid()
return self.p and self.p.getAllStacks return not not self.getAllStacks
end end
function ChestProvider:refresh() function ChestAdapter:refresh(throttle)
if self.p then return self:listItems(throttle)
self.p.condenseItems() end
self.stacks = self.p.getAllStacks(false)
local t = { } -- provide a consolidated list of items
for _,s in ipairs(self.stacks) do function ChestAdapter:listItems(throttle)
local key = s.id .. ':' .. s.dmg self.cache = { }
if t[key] and t[key].qty < 64 then
t[key].max_size = t[key].qty for _,v in pairs(self.getAllStacks(false)) do
else convertItem(v)
t[key] = { local key = table.concat({ v.name, v.damage, v.nbtHash }, ':')
qty = s.qty
} local entry = self.cache[key]
end if not entry then
end self.cache[key] = v
for _,s in ipairs(self.stacks) do
local key = s.id .. ':' .. s.dmg local ikey = { v.name, v.damage, v.nbtHash }
if t[key].max_size then if not itemDB:get(ikey) then
s.max_size = t[key].qty local t = { }
else for _,k in pairs(keys) do
s.max_size = 64 t[k] = v[k]
end
itemDB:add(ikey, t)
end end
else
entry.count = entry.count + v.count
end end
end end
return self.stacks itemDB:flush()
return self.cache
end
function ChestAdapter:getItemInfo(item)
if not self.cache then
self:listItems()
end
local key = table.concat({ item.name, item.damage, item.nbtHash }, ':')
return self.cache[key]
end end
function ChestProvider:getItemInfo(id, dmg) function ChestAdapter:craft(id, dmg, qty)
local item = { id = id, dmg = dmg, qty = 0, max_size = 64 }
for _,stack in pairs(self.stacks) do
if stack.id == id and stack.dmg == dmg then
item.name = stack.display_name
item.qty = item.qty + stack.qty
item.max_size = stack.max_size
end
end
if item.name then
return item
end
end
function ChestProvider:craft(id, dmg, qty)
return false return false
end end
function ChestProvider:craftItems(items) function ChestAdapter:craftItems(items)
end end
function ChestProvider:provide(item, qty, slot) function ChestAdapter:provide(item, qty, slot, direction)
if self.p then for key,stack in pairs(self.getAllStacks(false)) do
self.stacks = self.p.getAllStacks(false) if stack.id == item.name and
for key,stack in pairs(self.stacks) do stack.dmg == item.damage and
if stack.id == item.id and stack.dmg == item.dmg then stack.nbt_hash == item.nbtHash then
local amount = math.min(qty, stack.qty)
self.p.pushItemIntoSlot(self.direction, key, amount, slot) local amount = math.min(qty, stack.qty)
qty = qty - amount self.pushItemIntoSlot(direction or self.direction, key, amount, slot)
if qty <= 0 then qty = qty - amount
break if qty <= 0 then
end break
end end
end end
end end
end end
function ChestProvider:extract(slot, qty) function ChestAdapter:extract(slot, qty, toSlot)
if self.p then if toSlot then
self.p.pushItem(self.direction, slot, qty) self.pushItemIntoSlot(self.direction, slot, qty, toSlot)
else
self.pushItem(self.direction, slot, qty)
end end
end end
function ChestProvider:insert(slot, qty) function ChestAdapter:insert(slot, qty)
if self.p then local s, m = pcall(function() self.pullItem(self.direction, slot, qty) end)
local s, m = pcall(function() self.p.pullItem(self.direction, slot, qty) end) if not s and m then
if not s and m then sleep(1)
print('chestProvider:pullItem') pcall(function() self.pullItem(self.direction, slot, qty) end)
print(m)
Logger.log('chestProvider', 'Insert failed, trying again')
sleep(1)
s, m = pcall(function() self.p.pullItem(self.direction, slot, qty) end)
if not s and m then
print('chestProvider:pullItem')
print(m)
Logger.log('chestProvider', 'Insert failed again')
else
Logger.log('chestProvider', 'Insert successful')
end
end
end end
end end
return ChestProvider return ChestAdapter

View File

@@ -16,10 +16,9 @@ local keys = Util.transpose({
function ChestAdapter:init(args) function ChestAdapter:init(args)
local defaults = { local defaults = {
items = { }, name = 'chest',
name = 'chest',
direction = 'up', direction = 'up',
wrapSide = 'bottom', wrapSide = 'bottom',
} }
Util.merge(self, defaults) Util.merge(self, defaults)
Util.merge(self, args) Util.merge(self, args)
@@ -99,11 +98,11 @@ function ChestAdapter:listItems(throttle)
return items return items
end end
function ChestAdapter:getItemInfo(name, damage, nbtHash) function ChestAdapter:getItemInfo(item)
if not self.cache then if not self.cache then
self:listItems() self:listItems()
end end
local key = table.concat({ name, damage, nbtHash }, ':') local key = table.concat({ item.name, item.damage, item.nbtHash }, ':')
return self.cache[key] return self.cache[key]
end end

View File

@@ -5,6 +5,49 @@ local Util = require('util')
local MEAdapter = class() local MEAdapter = class()
local convertNames = {
name = 'id',
damage = 'dmg',
maxCount = 'max_size',
count = 'qty',
displayName = 'display_name',
maxDamage = 'max_dmg',
}
local keys = {
'damage',
'displayName',
'maxCount',
'maxDamage',
'name',
'nbtHash',
}
-- Strip off color prefix
local function safeString(text)
local val = text:byte(1)
if val < 32 or val > 128 then
local newText = {}
for i = 4, #text do
local val = text:byte(i)
newText[i - 3] = (val > 31 and val < 127) and val or 63
end
return string.char(unpack(newText))
end
return text
end
local function convertItem(item)
for k,v in pairs(convertNames) do
item[k] = item[v]
item[v] = nil
end
item.displayName = safeString(item.displayName)
end
function MEAdapter:init(args) function MEAdapter:init(args)
local defaults = { local defaults = {
items = { }, items = { },
@@ -34,50 +77,8 @@ function MEAdapter:isValid()
return self.getAvailableItems and self.getAvailableItems() return self.getAvailableItems and self.getAvailableItems()
end end
-- Strip off color prefix
local function safeString(text)
local val = text:byte(1)
if val < 32 or val > 128 then
local newText = {}
for i = 4, #text do
local val = text:byte(i)
newText[i - 3] = (val > 31 and val < 127) and val or 63
end
return string.char(unpack(newText))
end
return text
end
local convertNames = {
name = 'id',
damage = 'dmg',
maxCount = 'max_size',
count = 'qty',
displayName = 'display_name',
maxDamage = 'max_dmg',
}
local function convertItem(item)
for k,v in pairs(convertNames) do
item[k] = item[v]
item[v] = nil
end
item.displayName = safeString(item.displayName)
end
function MEAdapter:refresh() function MEAdapter:refresh()
local keys = {
'damage',
'displayName',
'maxCount',
'maxDamage',
'name',
'nbtHash',
}
self.items = self.getAvailableItems('all') self.items = self.getAvailableItems('all')
for _,v in pairs(self.items) do for _,v in pairs(self.items) do
Util.merge(v, v.item) Util.merge(v, v.item)
@@ -105,7 +106,7 @@ end
function MEAdapter:getItemInfo(item) function MEAdapter:getItemInfo(item)
for key,i in pairs(self.items) do for key,i in pairs(self.items) do
if item.name == i.name and item.damage == i.damage and item.nbtHash == i.nbtHash then if item.name == i.name and item.damage == i.damage and item.nbtHash == i.nbtHash then
return item return i
end end
end end
end end
@@ -143,7 +144,7 @@ function MEAdapter:craft(item, count)
dmg = item.damage, dmg = item.damage,
nbt_hash = item.nbtHash, nbt_hash = item.nbtHash,
}, },
qty or 1, count or 1,
cpu cpu
) )
@@ -207,8 +208,10 @@ function MEAdapter:craftItems(items)
if count >= #cpus then if count >= #cpus then
break break
end end
if self:craft(item.name, item.damage, item.count) then if not self:isCrafting(item) then
count = count + 1 if self:craft(item, item.count) then
count = count + 1
end
end end
end end
end end

View File

@@ -7,6 +7,7 @@ requireInjector(getfenv(1))
local Blocks = require('blocks') local Blocks = require('blocks')
local class = require('class') local class = require('class')
local Event = require('event') local Event = require('event')
local itemDB = require('itemDB')
local MEAdapter = require('meAdapter') local MEAdapter = require('meAdapter')
local Message = require('message') local Message = require('message')
local Point = require('point') local Point = require('point')
@@ -44,9 +45,10 @@ local pistonFacings
-- Temp functions until conversion to new adapters is complete -- Temp functions until conversion to new adapters is complete
local function convertSingleForward(item) local function convertSingleForward(item)
item.displayName = item.display_name
item.name = item.id item.name = item.id
item.damage = item.dmg item.damage = item.dmg
item.count = item.count item.count = item.qty
item.maxCount = item.max_size item.maxCount = item.max_size
return item return item
end end
@@ -65,6 +67,7 @@ local function convertSingleBack(item)
item.qty = item.count item.qty = item.count
item.max_size = item.maxCount item.max_size = item.maxCount
item.display_name = item.displayName item.display_name = item.displayName
--item.name = item.displayName
end end
return item return item
end end
@@ -395,7 +398,7 @@ function Builder:getGenericSupplyList(blockIndex)
for _,s in pairs(slots) do for _,s in pairs(slots) do
if s.id then if s.id then
s.name = blocks.nameDB:getName(s.id, s.dmg) s.display_name = itemDB:getName({ name = s.id, damage = s.dmg })
end end
end end
@@ -476,9 +479,13 @@ function Builder:getSupplies()
local t = { } local t = { }
for _,s in ipairs(self.slots) do for _,s in ipairs(self.slots) do
if s.need > 0 then if s.need > 0 then
local item = convertSingleBack(self.itemAdapter:getItemInfo(s.id, s.dmg)) local item = convertSingleBack(self.itemAdapter:getItemInfo({
name = s.id,
damage = s.dmg,
nbtHash = s.nbt_hash,
}))
if item then if item then
s.name = item.display_name s.display_name = item.display_name
local qty = math.min(s.need - s.qty, item.qty) local qty = math.min(s.need - s.qty, item.qty)
@@ -494,7 +501,7 @@ function Builder:getSupplies()
s.qty = turtle.getItemCount(s.index) s.qty = turtle.getItemCount(s.index)
end end
else else
s.name = blocks.nameDB:getName(s.id, s.dmg) s.display_name = itemDB:getName({ name = s.id, damage = s.dmg })
end end
end end
if s.qty < s.need then if s.qty < s.need then
@@ -1463,10 +1470,10 @@ substitutionPage.menuBar:add({
function substitutionPage.info:draw() function substitutionPage.info:draw()
local sub = self.parent.sub local sub = self.parent.sub
local inName = blocks.nameDB:getName(sub.id, sub.dmg) local inName = itemDB:getName({ name = sub.id, damage = sub.dmg })
local outName = '' local outName = ''
if sub.sid then if sub.sid then
outName = blocks.nameDB:getName(sub.sid, sub.sdmg) outName = itemDB:getName({ name = sub.sid, damage = sub.sdmg })
end end
self:clear() self:clear()
@@ -1513,10 +1520,10 @@ function substitutionPage:eventHandler(event)
self.statusBar:draw() self.statusBar:draw()
elseif event.type == 'grid_select' then elseif event.type == 'grid_select' then
if not blocks.nameDB:lookupName(event.selected.id, event.selected.dmg) then -- if not item:lookupName(event.selected.id, event.selected.dmg) then
blocks.nameDB:add({event.selected.id, event.selected.dmg}, event.selected.name) -- blocks.nameDB:add({event.selected.id, event.selected.dmg}, event.selected.name)
blocks.nameDB:flush() -- blocks.nameDB:flush()
end -- end
self:applySubstitute(event.selected.id, event.selected.dmg) self:applySubstitute(event.selected.id, event.selected.dmg)
self.info:draw() self.info:draw()
@@ -1581,15 +1588,15 @@ supplyPage = UI.Page {
--{ text = 'Refresh', event = 'refresh', help = 'Refresh inventory' }, --{ text = 'Refresh', event = 'refresh', help = 'Refresh inventory' },
{ text = 'Continue', event = 'build', help = 'Continue building' }, { text = 'Continue', event = 'build', help = 'Continue building' },
{ text = 'Menu', event = 'menu', help = 'Return to main menu' }, { text = 'Menu', event = 'menu', help = 'Return to main menu' },
{ text = 'Force Craft', event = 'craft', help = 'Request crafting (again)' }, -- { text = 'Force Craft', event = 'craft', help = 'Request crafting (again)' },
} }
}, },
grid = UI.Grid { grid = UI.Grid {
columns = { columns = {
{ heading = 'Name', key = 'name', width = UI.term.width - 7 }, { heading = 'Name', key = 'display_name', width = UI.term.width - 7 },
{ heading = 'Need', key = 'need', width = 4 }, { heading = 'Need', key = 'need', width = 4 },
}, },
sortColumn = 'name', sortColumn = 'display_name',
y = 3, y = 3,
width = UI.term.width, width = UI.term.width,
height = UI.term.height - 3 height = UI.term.height - 3
@@ -1610,10 +1617,11 @@ supplyPage = UI.Page {
function supplyPage:eventHandler(event) function supplyPage:eventHandler(event)
--[[
if event.type == 'craft' then if event.type == 'craft' then
local s = self.grid:getSelected() local s = self.grid:getSelected()
if Builder.itemAdapter:craft(s.id, s.dmg, s.need-s.qty) then if Builder.itemAdapter:craftItems({{ name = s.id, damage = s.dmg, nbtHash = s.nbt_hash }}, s.need-s.qty) then
local name = s.name or '' local name = s.display_name or ''
self.statusBar:timedStatus('Requested ' .. s.need-s.qty .. ' ' .. name, 3) self.statusBar:timedStatus('Requested ' .. s.need-s.qty .. ' ' .. name, 3)
else else
self.statusBar:timedStatus('Unable to craft') self.statusBar:timedStatus('Unable to craft')
@@ -1621,8 +1629,9 @@ function supplyPage:eventHandler(event)
elseif event.type == 'refresh' then elseif event.type == 'refresh' then
self:refresh() self:refresh()
]]
elseif event.type == 'build' then if event.type == 'build' then
Builder:build() Builder:build()
elseif event.type == 'menu' then elseif event.type == 'menu' then
@@ -1709,11 +1718,11 @@ listingPage = UI.Page({
}), }),
grid = UI.ScrollingGrid({ grid = UI.ScrollingGrid({
columns = { columns = {
{ heading = 'Name', key = 'name', width = UI.term.width - 14 }, { heading = 'Name', key = 'display_name', width = UI.term.width - 14 },
{ heading = 'Need', key = 'need', width = 5 }, { heading = 'Need', key = 'need', width = 5 },
{ heading = 'Have', key = 'qty', width = 5 }, { heading = 'Have', key = 'qty', width = 5 },
}, },
sortColumn = 'name', sortColumn = 'display_name',
y = 3, y = 3,
height = UI.term.height-3, height = UI.term.height-3,
help = 'Set a block type or pick a substitute block' help = 'Set a block type or pick a substitute block'
@@ -1737,13 +1746,17 @@ function listingPage:eventHandler(event)
if event.type == 'craft' then if event.type == 'craft' then
local s = self.grid:getSelected() local s = self.grid:getSelected()
local item = convertSingleBack(Builder.itemAdapter:getItemInfo(s.id, s.dmg)) local item = convertSingleBack(Builder.itemAdapter:getItemInfo({
name = s.id,
damage = s.dmg,
nbtHash = s.nbt_hash,
}))
if item and item.is_craftable then if item and item.is_craftable then
local qty = math.max(0, s.need - item.qty) local qty = math.max(0, s.need - item.qty)
if item then if item then
Builder.itemAdapter:craft(s.id, s.dmg, qty) Builder.itemAdapter:craftItems({{ name = s.id, damage = s.dmg, nbtHash = s.nbt_hash, count = qty }})
local name = s.name or s.key local name = s.display_name or s.id
self.statusBar:timedStatus('Requested ' .. qty .. ' ' .. name, 3) self.statusBar:timedStatus('Requested ' .. qty .. ' ' .. name, 3)
end end
else else
@@ -1801,27 +1814,31 @@ function listingPage:refresh(throttle)
for _,b in pairs(supplyList) do for _,b in pairs(supplyList) do
if b.need > 0 then if b.need > 0 then
local item = convertSingleBack(Builder.itemAdapter:getItemInfo(b.id, b.dmg)) local item = convertSingleBack(Builder.itemAdapter:getItemInfo({
name = b.id,
damage = b.dmg,
nbtHash = b.nbt_hash,
}))
if item then if item then
local block = blocks.blockDB:lookup(b.id, b.dmg) -- local block = blocks.blockDB:lookup(b.id, b.dmg)
if not block then -- if not block then
blocks.nameDB:add({b.id, b.dmg}, item.display_name) -- blocks.nameDB:add({b.id, b.dmg}, item.display_name)
elseif not block.name and item.display_name then -- elseif not block.name and item.display_name then
blocks.nameDB:add({b.id, b.dmg}, item.display_name) -- blocks.nameDB:add({b.id, b.dmg}, item.display_name)
end -- end
b.name = item.display_name b.display_name = item.display_name
b.qty = item.qty b.qty = item.qty
b.is_craftable = item.is_craftable b.is_craftable = item.is_craftable
else else
b.name = blocks.nameDB:getName(b.id, b.dmg) b.display_name = itemDB:getName({ name = b.id, damage = b.dmg })
end end
end end
if throttle then if throttle then
throttle() throttle()
end end
end end
blocks.nameDB:flush() --blocks.nameDB:flush()
if self.fullList then if self.fullList then
self.grid:setValues(supplyList) self.grid:setValues(supplyList)

View File

@@ -139,7 +139,7 @@ function Builder:getSupplies()
local t = { } local t = { }
for _,s in ipairs(self.slots) do for _,s in ipairs(self.slots) do
if s.need > 0 then if s.need > 0 then
local item = Builder.itemProvider:getItemInfo(s.id, s.dmg) local item = Builder.itemProvider:getItemInfo(s)
if item then if item then
if item.name then if item.name then
s.name = item.name s.name = item.name