plethora autocrafting wip

This commit is contained in:
kepler155c
2018-10-21 04:44:10 -04:00
parent 782850b94d
commit f56611d957
4 changed files with 217 additions and 39 deletions

View File

@@ -219,7 +219,16 @@ local function safeGoto(x, z, y, h)
local oldStatus = turtle.getStatus()
-- only pathfind above or around other turtles (never down)
Pathing.setBox({ x = turtle.point.x, y = turtle.point.y, z = turtle.point.z, ex = x, ey = y, ez = z })
local box = Point.normalizeBox({ x = turtle.point.x, y = turtle.point.y, z = turtle.point.z,
ex = x, ey = y, ez = z })
box.x = box.x - 1
box.z = box.z - 1
box.ex = box.ex + 1
box.ey = box.ey + 1
box.ez = box.ez + 1
Pathing.setBox(box)
while not turtle.pathfind({ x = x, z = z, y = y or turtle.point.y, heading = h }) do
--status('stuck')
if turtle.isAborted() then

View File

@@ -19,15 +19,11 @@ function NetworkedAdapter:init(args)
if self.modem and self.modem.getNameLocal then
self.localName = self.modem.getNameLocal()
for _, v in pairs(self.modem.getNamesRemote()) do
local remote = Peripheral.get({ name = v })
if remote and
remote.size and
remote.size() >= 27 and
remote.list and
not (self.remoteDefaults[v] and self.remoteDefaults[v].ignore) then
local adapter = InventoryAdapter.wrap({ side = v, direction = self.localName })
for k in pairs(self.remoteDefaults) do
local remote = Peripheral.get({ name = k })
if remote and remote.size and remote.list then
local adapter = InventoryAdapter.wrap({ side = k, direction = self.localName })
if adapter then
table.insert(self.remotes, adapter)
end
@@ -157,6 +153,8 @@ function NetworkedAdapter:insert(slot, qty, toSlot, item)
self:listItems()
end
debug('attempting to insert ' .. item.name)
local function insert(remote)
debug('slot %d -> %s: %s', slot, remote.side, qty)
local amount = remote:insert(slot, qty, toSlot)
@@ -164,13 +162,21 @@ debug('slot %d -> %s: %s', slot, remote.side, qty)
total = total + amount
end
-- found a chest locked with this item
for _, remote in pairs(self.remotes) do
if remote.lockWith == key or remote.lockWith == item.name then
insert(remote)
return total
end
end
if self.cache[key] then -- is this item in some chest
-- low to high priority if the chest already contains that item
for _, remote in Util.rpairs(self.remotes) do
if qty <= 0 then
break
end
if remote.cache and remote.cache[key] then
if remote.cache and remote.cache[key] and not remote.lockWith then
insert(remote)
end
end
@@ -181,7 +187,9 @@ debug('slot %d -> %s: %s', slot, remote.side, qty)
if qty <= 0 then
break
end
insert(remote)
if not remote.lockWith then
insert(remote)
end
end
return total

View File

@@ -90,41 +90,53 @@ if multishell then
end
local config = {
computerFacing = 'north', -- direction turtle is facing
inventory = 'network', -- main inventory
trashDirection = 'up', -- trash/chest in relation to inventory
monitor = 'type/monitor',
monitor = 'type/monitor',
remoteDefaults = { },
}
Config.load('inventoryManager', config)
Config.loadWithCheck('inventoryManager', config)
local modem = Peripheral.get('wired_modem')
if not modem or not modem.getNameLocal then
error('Wired modem is not connected')
end
local inventoryAdapter = config.inventory == 'network' and
InventoryAdapter.wrap({ remoteDefaults = config.remoteDefaults }) or
InventoryAdapter.wrap({ side = config.inventory, facing = config.computerFacing })
local feederAdapter
local controllerAdapter
local storage = { }
for k,v in pairs(config.remoteDefaults) do
if v.mtype == 'storage' then
storage[k] = v
elseif v.mtype == 'input' then
feederAdapter = InventoryAdapter.wrap({ side = k, direction = modem.getNameLocal() })
elseif v.mtype == 'controller' then
-- TODO: look for controller
end
end
debug(storage)
local inventoryAdapter = InventoryAdapter.wrap({ remoteDefaults = storage })
if not inventoryAdapter then
error('Invalid inventory configuration')
end
local introspectionModule = device['plethora:introspection']
local introspectionModule = device['plethora:introspection'] or
error('introspection module not found')
local controllerAdapter
if inventoryAdapter.craft then
controllerAdapter = inventoryAdapter
end
local feederAdapter
if config.remoteDefaults then
for k, v in pairs(config.remoteDefaults) do
if v.feeder then
local modem = Peripheral.get('wired_modem')
if modem and modem.getNameLocal then
feederAdapter = InventoryAdapter.wrap({ side = k, direction = modem.getNameLocal() })
end
break
-- TODO: cleanup
for _, v in pairs(modem.getNamesRemote()) do
local remote = Peripheral.get({ name = v })
if remote.pullItems then
if not config.remoteDefaults[v] then
config.remoteDefaults[v] = {
name = v,
mtype = 'ignore',
}
else
config.remoteDefaults[v].name = v
end
if not config.remoteDefaults[v].mtype then
config.remoteDefaults[v].mtype = 'ignore'
end
end
end
@@ -473,6 +485,13 @@ local function craftItems(craftList, allItems)
end
end
local function queue(fn)
while craftingPaused do
os.sleep(1)
end
fn()
end
local function eject(item, qty)
if _G.turtle then
local s, m = pcall(function()
@@ -674,6 +693,143 @@ local function saveResources()
Util.writeTable(RESOURCE_FILE, t)
end
local machinesPage = UI.Page {
titleBar = UI.TitleBar {
previousPage = true,
title = 'Machines',
},
grid = UI.ScrollingGrid {
y = 2, ey = -2,
values = config.remoteDefaults,
columns = {
{ heading = 'Name', key = 'displayName' },
{ heading = 'Priority', key = 'priority', width = 5 },
{ heading = 'Type', key = 'mtype', width = 5 },
},
sortColumn = 'name',
},
detail = UI.SlideOut {
backgroundColor = colors.cyan,
form = UI.Form {
x = 1, y = 2, ex = -1, ey = -2,
[7] = UI.Text {
x = 12, y = 1,
width = 20,
value = 'test',
},
[1] = UI.TextEntry {
formLabel = 'Name', formKey = 'displayName', help = '...',
limit = 64,
},
[2] = UI.Chooser {
width = 15,
formLabel = 'Type', formKey = 'mtype',
nochoice = 'Storage',
choices = {
{ name = 'Storage', value = 'storage' },
{ name = 'Trashcan', value = 'trashcan' },
{ name = 'Input chest', value = 'input' },
{ name = 'Ignore', value = 'ignore' },
},
help = 'Check if machine is empty before crafting'
},
[3] = UI.Chooser {
width = 7,
formLabel = 'Empty', formKey = 'empty',
nochoice = 'No',
choices = {
{ name = 'Yes', value = true },
{ name = 'No', value = false },
},
help = 'Check if machine is empty before crafting'
},
[4] = UI.TextEntry {
formLabel = 'Priority', formKey = 'priority', help = '...',
limit = 4,
},
[5] = UI.TextEntry {
formLabel = 'Max Craft', formKey = 'maxCount', help = '...',
limit = 4,
},
[6] = UI.TextEntry {
formLabel = 'Lock to', formKey = 'lockWith', help = '...',
limit = 64,
},
},
statusBar = UI.StatusBar(),
},
statusBar = UI.StatusBar {
values = 'Select Machine',
},
accelerators = {
h = 'toggle_hidden',
}
}
function machinesPage:enable()
self.grid:update()
UI.Page.enable(self)
end
function machinesPage.detail:eventHandler(event)
if event.type == 'focus_change' then
self.statusBar:setStatus(event.focused.help)
end
return UI.SlideOut.eventHandler(self, event)
end
function machinesPage.grid:getDisplayValues(row)
row = Util.shallowCopy(row)
row.displayName = row.displayName or row.name
return row
end
function machinesPage.grid:getRowTextColor(row, selected)
if row.mtype == 'ignore' then
return colors.lightGray
end
return UI.Grid:getRowTextColor(row, selected)
end
function machinesPage:eventHandler(event)
if event.type == 'grid_select' then
self.detail.form:setValues(event.selected)
self.detail.form[7].value = event.selected.name
debug(event.selected)
self.detail:show()
elseif event.type == 'toggle_hidden' then
local selected = self.grid:getSelected()
if selected then
selected.ignore = not selected.ignore
-- Util.writeTable(MACHINES_FILE, machines)
self:draw()
end
elseif event.type == 'form_complete' then
self.detail.form.values.empty = self.detail.form.values.empty == true or nil
self.detail.form.values.ignore = self.detail.form.values.ignore == true or nil
self.detail.form.values.priority = tonumber(self.detail.form.values.priority)
self.detail.form.values.maxCount = tonumber(self.detail.form.values.maxCount)
if #self.detail.form.values.displayName == 0 then
self.detail.form.values.displayName = nil
end
if #self.detail.form.values.lockWith == 0 then
self.detail.form.values.lockWith = nil
end
Config.update('inventoryManager', config)
self.detail:hide()
self.grid:update()
elseif event.type == 'form_cancel' then
self.detail:hide()
else
UI.Page.eventHandler(self, event)
end
return true
end
local itemPage = UI.Page {
titleBar = UI.TitleBar {
title = 'Limit Resource',
@@ -951,6 +1107,7 @@ local listingPage = UI.Page {
grid_select_right = 'craft',
[ 'control-e' ] = 'eject',
[ 'control-s' ] = 'eject_stack',
[ 'control-m' ] = 'machines',
},
displayMode = 0,
}
@@ -988,15 +1145,18 @@ function listingPage:eventHandler(event)
elseif event.type == 'eject' then
local item = self.grid:getSelected()
if item then
eject(item, 1)
queue(function() eject(item, 1) end)
end
elseif event.type == 'eject_stack' then
local item = self.grid:getSelected()
if item then
eject(item, itemDB:getMaxCount(item))
queue(function() eject(item, itemDB:getMaxCount(item)) end)
end
elseif event.type == 'machines' then
UI:setPage('machines')
elseif event.type == 'grid_select' then
local selected = event.selected
UI:setPage('item', selected)
@@ -1378,6 +1538,7 @@ UI:setPages({
item = itemPage,
learn = learnPage,
craft = craftPage,
machines = machinesPage,
})
jobMonitor()