plethora autocrafting wip
This commit is contained in:
@@ -219,7 +219,16 @@ local function safeGoto(x, z, y, h)
|
|||||||
local oldStatus = turtle.getStatus()
|
local oldStatus = turtle.getStatus()
|
||||||
|
|
||||||
-- only pathfind above or around other turtles (never down)
|
-- 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
|
while not turtle.pathfind({ x = x, z = z, y = y or turtle.point.y, heading = h }) do
|
||||||
--status('stuck')
|
--status('stuck')
|
||||||
if turtle.isAborted() then
|
if turtle.isAborted() then
|
||||||
|
|||||||
@@ -19,15 +19,11 @@ function NetworkedAdapter:init(args)
|
|||||||
|
|
||||||
if self.modem and self.modem.getNameLocal then
|
if self.modem and self.modem.getNameLocal then
|
||||||
self.localName = self.modem.getNameLocal()
|
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
|
if adapter then
|
||||||
table.insert(self.remotes, adapter)
|
table.insert(self.remotes, adapter)
|
||||||
end
|
end
|
||||||
@@ -157,6 +153,8 @@ function NetworkedAdapter:insert(slot, qty, toSlot, item)
|
|||||||
self:listItems()
|
self:listItems()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
debug('attempting to insert ' .. item.name)
|
||||||
|
|
||||||
local function insert(remote)
|
local function insert(remote)
|
||||||
debug('slot %d -> %s: %s', slot, remote.side, qty)
|
debug('slot %d -> %s: %s', slot, remote.side, qty)
|
||||||
local amount = remote:insert(slot, qty, toSlot)
|
local amount = remote:insert(slot, qty, toSlot)
|
||||||
@@ -164,13 +162,21 @@ debug('slot %d -> %s: %s', slot, remote.side, qty)
|
|||||||
total = total + amount
|
total = total + amount
|
||||||
end
|
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
|
if self.cache[key] then -- is this item in some chest
|
||||||
-- low to high priority if the chest already contains that item
|
-- low to high priority if the chest already contains that item
|
||||||
for _, remote in Util.rpairs(self.remotes) do
|
for _, remote in Util.rpairs(self.remotes) do
|
||||||
if qty <= 0 then
|
if qty <= 0 then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
if remote.cache and remote.cache[key] then
|
if remote.cache and remote.cache[key] and not remote.lockWith then
|
||||||
insert(remote)
|
insert(remote)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -181,7 +187,9 @@ debug('slot %d -> %s: %s', slot, remote.side, qty)
|
|||||||
if qty <= 0 then
|
if qty <= 0 then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
insert(remote)
|
if not remote.lockWith then
|
||||||
|
insert(remote)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return total
|
return total
|
||||||
|
|||||||
@@ -90,41 +90,53 @@ if multishell then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local config = {
|
local config = {
|
||||||
computerFacing = 'north', -- direction turtle is facing
|
monitor = 'type/monitor',
|
||||||
|
remoteDefaults = { },
|
||||||
inventory = 'network', -- main inventory
|
|
||||||
|
|
||||||
trashDirection = 'up', -- trash/chest in relation to inventory
|
|
||||||
monitor = 'type/monitor',
|
|
||||||
}
|
}
|
||||||
|
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
|
local feederAdapter
|
||||||
InventoryAdapter.wrap({ remoteDefaults = config.remoteDefaults }) or
|
local controllerAdapter
|
||||||
InventoryAdapter.wrap({ side = config.inventory, facing = config.computerFacing })
|
|
||||||
|
|
||||||
|
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
|
if not inventoryAdapter then
|
||||||
error('Invalid inventory configuration')
|
error('Invalid inventory configuration')
|
||||||
end
|
end
|
||||||
|
|
||||||
local introspectionModule = device['plethora:introspection']
|
local introspectionModule = device['plethora:introspection'] or
|
||||||
|
error('introspection module not found')
|
||||||
|
|
||||||
local controllerAdapter
|
-- TODO: cleanup
|
||||||
if inventoryAdapter.craft then
|
for _, v in pairs(modem.getNamesRemote()) do
|
||||||
controllerAdapter = inventoryAdapter
|
local remote = Peripheral.get({ name = v })
|
||||||
end
|
if remote.pullItems then
|
||||||
|
if not config.remoteDefaults[v] then
|
||||||
local feederAdapter
|
config.remoteDefaults[v] = {
|
||||||
|
name = v,
|
||||||
if config.remoteDefaults then
|
mtype = 'ignore',
|
||||||
for k, v in pairs(config.remoteDefaults) do
|
}
|
||||||
if v.feeder then
|
else
|
||||||
local modem = Peripheral.get('wired_modem')
|
config.remoteDefaults[v].name = v
|
||||||
if modem and modem.getNameLocal then
|
end
|
||||||
feederAdapter = InventoryAdapter.wrap({ side = k, direction = modem.getNameLocal() })
|
if not config.remoteDefaults[v].mtype then
|
||||||
end
|
config.remoteDefaults[v].mtype = 'ignore'
|
||||||
break
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -473,6 +485,13 @@ local function craftItems(craftList, allItems)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function queue(fn)
|
||||||
|
while craftingPaused do
|
||||||
|
os.sleep(1)
|
||||||
|
end
|
||||||
|
fn()
|
||||||
|
end
|
||||||
|
|
||||||
local function eject(item, qty)
|
local function eject(item, qty)
|
||||||
if _G.turtle then
|
if _G.turtle then
|
||||||
local s, m = pcall(function()
|
local s, m = pcall(function()
|
||||||
@@ -674,6 +693,143 @@ local function saveResources()
|
|||||||
Util.writeTable(RESOURCE_FILE, t)
|
Util.writeTable(RESOURCE_FILE, t)
|
||||||
end
|
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 {
|
local itemPage = UI.Page {
|
||||||
titleBar = UI.TitleBar {
|
titleBar = UI.TitleBar {
|
||||||
title = 'Limit Resource',
|
title = 'Limit Resource',
|
||||||
@@ -951,6 +1107,7 @@ local listingPage = UI.Page {
|
|||||||
grid_select_right = 'craft',
|
grid_select_right = 'craft',
|
||||||
[ 'control-e' ] = 'eject',
|
[ 'control-e' ] = 'eject',
|
||||||
[ 'control-s' ] = 'eject_stack',
|
[ 'control-s' ] = 'eject_stack',
|
||||||
|
[ 'control-m' ] = 'machines',
|
||||||
},
|
},
|
||||||
displayMode = 0,
|
displayMode = 0,
|
||||||
}
|
}
|
||||||
@@ -988,15 +1145,18 @@ function listingPage:eventHandler(event)
|
|||||||
elseif event.type == 'eject' then
|
elseif event.type == 'eject' then
|
||||||
local item = self.grid:getSelected()
|
local item = self.grid:getSelected()
|
||||||
if item then
|
if item then
|
||||||
eject(item, 1)
|
queue(function() eject(item, 1) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif event.type == 'eject_stack' then
|
elseif event.type == 'eject_stack' then
|
||||||
local item = self.grid:getSelected()
|
local item = self.grid:getSelected()
|
||||||
if item then
|
if item then
|
||||||
eject(item, itemDB:getMaxCount(item))
|
queue(function() eject(item, itemDB:getMaxCount(item)) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif event.type == 'machines' then
|
||||||
|
UI:setPage('machines')
|
||||||
|
|
||||||
elseif event.type == 'grid_select' then
|
elseif event.type == 'grid_select' then
|
||||||
local selected = event.selected
|
local selected = event.selected
|
||||||
UI:setPage('item', selected)
|
UI:setPage('item', selected)
|
||||||
@@ -1378,6 +1538,7 @@ UI:setPages({
|
|||||||
item = itemPage,
|
item = itemPage,
|
||||||
learn = learnPage,
|
learn = learnPage,
|
||||||
craft = craftPage,
|
craft = craftPage,
|
||||||
|
machines = machinesPage,
|
||||||
})
|
})
|
||||||
|
|
||||||
jobMonitor()
|
jobMonitor()
|
||||||
Reference in New Issue
Block a user