Add furniController.lua (#37)

* Update exportTask.lua

Cheap fix to stop cascading storage updates from eating up all the working time available after failing exports, this needs to be more fleshed out better, if the chest is full, scan the slots for any that match and are not full, stop blindly exporting

* Create furniController.lua

(Super)MultiFurnace Controller (did I mention, it's SUPER!?)
This app is designed to wrap up to 4 of kepler155c's MultiFurnace (multiFurni) arrays and divide up workload, it functions as a straight drop-in for furni.lua and no other adjustments are required to make it work. Additionally, you get the ability to target any one multiFurni array for smelting when creating the machine recipe in Milo. Further uses for this direct targeting can be limited-scope auto-smelting, using anywhere from 1/2 to 1/4 of your total capacity to auto-smelt, leaving the rest of the cluster available for you when you want it, great for multi-user bases!

Setup: Plug this turtle into a modem on your Milo network, and another modem leading to 2-4 turtles running furni.lua (or even furniController.lua for chained setups), configure useSlot4 on line 20, map in Milo and go!

* Update furniController.lua

Cleaned up bad reference naming to avoid confusion. Additionally moved relevant variables to local scope, cleaned up a few other minor things.

* Update exportTask.lua

Fleshed out the exportItems function which was blindly firing items into full chests. Made it a little more sensitive, slight increase in average processing time, but no more erroneous hits to export causing perf issues.

* Update exportTask.lua

Clean up cached .list() after done, accidentally left it in, bloating storage config sizes

* Update exportTask.lua

Fixing some logic, make less plethora calls

* Update exportTask.lua

* Update exportTask.lua

Last fix, was making a call to Util when it wasn't defined, and left the export function completely dead. Defined correctly, now exporting as expected, whoops.

* Update exportTask.lua

So uhh, yeah, the looped getItemMeta calls cost me a LOT of time. Figured out most of the relevant data I wanted was already being provided elsewhere, no extra calls to make, it's as fast as I can make it now. Now it's dependent on the storage optimizations as they stand, this does not speed anything up, just makes it more accurate.

* Sync with kepler155c's branch

* Another resync
This commit was merged in pull request #37.
This commit is contained in:
cynagen
2020-05-23 21:09:22 -07:00
committed by GitHub
parent cb58a553f5
commit f07302588c

View File

@@ -0,0 +1,174 @@
-- (Super)MultiFurnace Controller (did I mention, it's SUPER!?)
-- This app is designed to wrap up to 4 of kepler155c's furni.lua (multiFurni) arrays and divide up workload,
-- it functions as a straight drop-in for furni.lua and no other adjustments are required to make it work.
-- Additionally, you get the ability to target any one multiFurni array for smelting when creating the machine recipe in Milo
-- Further uses for this direct targeting can be limited-scope auto-smelting, using anywhere from 1/2 to 1/4 of your total
-- capacity to auto-smelt, leaving the rest of the cluster available for you when you want it, great for multi-user bases!
-- Plug this turtle into a modem on your Milo network, and another modem leading to 2-4 turtles running furni.lua (or even furniController.lua for chained setups)
-- Slots are as follows:
-- 1: Master Furnace Input
-- 2: Master Furnace Fuel Input
-- 3: Master Furnace Output
-- 4: Optional (Options: "fuel"/"input"/"output"/nil (Default: nil [ignore]))
-- 5-8: Furnace Inputs for 2 to 4 furni.lua arrays (slots mapped in order ascending, T1_Input=4, T2_Input=5, etc)
-- 9-12: Furnace Fuels for 2 to 4 furni.lua arrays
-- 13-16: Furnace Outputs for 2 to 4 furni.lua arrays
-- Only user option, slot 4, what to use it for?
local useSlot4=nil
-- Begin main program code
-- Find modem with -only- turtles attached (these should be our furni/furniController arrays)
local devModem=""
for nDev,modem in ipairs({peripheral.find("modem")}) do
if #modem.getNamesRemote() > 1 then -- We're only looking for 2 or more devices on a network segment, ignore anything less
nTurtles=0
for nDev,dev in ipairs(modem.getNamesRemote()) do
if modem.getTypeRemote(dev) == "turtle" then nTurtles=nTurtles+1 end
end
if nTurtles==#modem.getNamesRemote() then
devModem=modem
break
end
end
end
if devModem ~= "" then
print("Found turtle-only modem, detected",#devModem.getNamesRemote(),"turtles",(#devModem.getNamesRemote() > 4 and "(Max 4 will be mapped)" or "(All will be mapped)"))
else
print("Did not find a modem with only turtles connected. Please check your networking cables/modems and devices, then try again.")
return -- We don't have a modem, halt
end
local devTurtles={}
for nDev,dev in ipairs(devModem.getNamesRemote()) do
if #devTurtles >= 4 then break end
devTurtles[#devTurtles+1]=peripheral.wrap(dev)
print("Mapping",devTurtles[#devTurtles].getLabel(),"("..dev..")","as device",#devTurtles)
devTurtles[#devTurtles].inputSlot=#devTurtles+4 -- Set the input for this device on second row
devTurtles[#devTurtles].fuelSlot=#devTurtles+8 -- Set the fuel for this device on third row
devTurtles[#devTurtles].outputSlot=#devTurtles+12 -- Set the output for this device on fourth row
if devTurtles[#devTurtles].isOn() then
print("Resynchronizing",devTurtles[#devTurtles].getLabel())
devTurtles[#devTurtles].reboot()
else
print("Powering",devTurtles[#devTurtles].getLabel(),"on")
devTurtles[#devTurtles].turnOn()
end
end
local turtle.list = function () -- Supplement a local .list()-like function
local tList={}
for i=1,16 do
local slotData=turtle.getItemDetail(i) -- DWGFJTLR
if slotData ~= nil then
slotData.maxStack=turtle.getItemCount(i) + turtle.getItemSpace(i)
tList[i]=slotData
end
end
return tList
end
function manageLocalResources()
--print("Input found")
local itemCount=turtle.getItemCount(1)/#devTurtles
if itemCount < 1 then itemCount = 1 end -- Patch for single items fed into master slot
if turtle.getItemCount(1) > 0 then -- Input
for nDev,dev in ipairs(devTurtles) do
local devList=dev.list()
if turtle.select(1) and ((turtle.compareTo(dev.inputSlot) and turtle.getItemSpace(dev.inputSlot) > 0) or turtle.getItemCount(dev.inputSlot) == 0) then -- Move Input
turtle.transferTo(dev.inputSlot,itemCount)
end
if useSlot4 == "input" and turtle.select(4) and ((turtle.compareTo(dev.inputSlot) and turtle.getItemSpace(dev.inputSlot) > 0) or turtle.getItemCount(dev.inputSlot) == 0) then -- Move Input
turtle.transferTo(dev.inputSlot,itemCount)
end --Slot 4 input
end
end
if turtle.select(2) and turtle.getSelectedSlot() == 2 then -- Fuel
for nDev,dev in ipairs(devTurtles) do
local devList=dev.list()
if turtle.compareTo(dev.fuelSlot) or turtle.getItemCount(dev.fuelSlot) == 0 then turtle.transferTo(dev.fuelSlot,64) end -- Move fuel into slot
end
end
if useSlot4 == "fuel" and turtle.select(4) and turtle.getSelectedSlot() == 4 then -- Fuel
for nDev,dev in ipairs(devTurtles) do
local devList=dev.list()
if turtle.compareTo(dev.fuelSlot) or turtle.getItemCount(dev.fuelSlot) == 0 then turtle.transferTo(dev.fuelSlot,64) end -- Move fuel into slot
end
end -- Slot 4 fuel
for nDev,dev in ipairs(devTurtles) do
local devList=dev.list()
if turtle.getItemCount(3) == 0 and turtle.getItemCount(dev.outputSlot) > 0 then
turtle.select(dev.outputSlot)
turtle.transferTo(3,64)
elseif turtle.getItemCount(dev.outputSlot) > 0 and turtle.select(3) and turtle.compareTo(dev.outputSlot) then -- Move output
--turtle.setStatus("moving")
turtle.select(dev.outputSlot)
turtle.transferTo(3,64)
end
if useSlot4 == "output" then -- Slot 4 output
if turtle.getItemCount(4) == 0 and turtle.getItemCount(dev.outputSlot) > 0 then
turtle.select(dev.outputSlot)
turtle.transferTo(4,64)
elseif turtle.getItemCount(dev.outputSlot) > 0 and turtle.select(4) and turtle.compareTo(dev.outputSlot) then
turtle.select(dev.outputSlot)
turtle.transferTo(4,64)
end
end
end
end
function manageRemoteResources()
local localList=turtle.list()
for nDev,dev in ipairs(devTurtles) do
local devList=dev.list()
--print(textutils.serialize(devList))
if devList[2] == nil then
if localList[dev.fuelSlot] ~= nil then
turtle.setStatus("fueling")
dev.pullItems(devModem.getNameLocal(),dev.fuelSlot,64,2)
end
else
if localList[dev.fuelSlot] ~= nil and localList[dev.fuelSlot].name == devList[2].name then
turtle.setStatus("fueling")
dev.pullItems(devModem.getNameLocal(),dev.fuelSlot,64,2)
end
end
if devList[1] == nil then
if localList[dev.inputSlot] ~= nil then
turtle.setStatus("pushing")
dev.pullItems(devModem.getNameLocal(),dev.inputSlot,64,1)
end
else
if localList[dev.inputSlot] ~= nil and localList[dev.inputSlot].name == devList[1].name then
turtle.setStatus("pushing")
dev.pullItems(devModem.getNameLocal(),dev.inputSlot,64,1)
end
end -- Move input
if devList[3] ~= nil then
if localList[dev.outputSlot] == nil then
turtle.setStatus("pulling")
dev.pushItems(devModem.getNameLocal(),3,64,dev.outputSlot)
end
else
if localList[dev.outputSlot] ~= nil then
if devList[3] ~= nil and localList[dev.outputSlot].name == devList[3].name then
turtle.setStatus("pulling")
dev.pushItems(devModem.getNameLocal(),3,64,dev.outputSlot)
end
end
end
end
end
local lastList={}
while true do -- Main Loop
local turtleList=turtle.list()
if turtleList[1]~=nil or turtleList[13]~=nil or turtleList[14]~=nil or turtleList[15]~=nil or turtleList[16]~=nil or ((useSlot4=="input" or useSlot4=="fuel") and turtleList[4]~=nil) then
manageLocalResources()
end
manageRemoteResources()
turtle.setStatus("sleeping")
os.sleep(1)
end