-- Furnace control -- Setup: -- (from above) -- Comp - Outp -- Inpu - Furn -- the second computer under the furnace, -- and a wired modem connecting the 2 computers -- Computer 1: (this one) http://pastebin.com/06cjixf9 -- Computer 2: http://pastebin.com/RjyREdT2 -- Screenshots of setup: -- 1 http://i.imgur.com/t9GFE2r.png -- 2 http://i.imgur.com/WjnunBC.png -- how often computer shall retry local updaterate = 2 -- times a sec -- where the chests are in relation to the furnace local outputToFurnace = "north" local inputToFurnace = "west" -- directions: north,south,east,west,up,down -- slots in the furnace inventory local inputSlot = 0 local fuelSlot = 1 local outputSlot = 2 -- 1 for normal furnace -- 1.25 for IC2 iron furnace local furnaceModifier = 1 local fuel = { -- {id,dmg,burntime}, {id=263,dmg=0,burn=8},--coal {id=263,dmg=1,burn=8},--charcoal {id=5,dmg=-1,burn=1.5},--planks --{id=17,dmg=-1,burn=1.5},--wood {id=6,dmg=-1,burn=.5},--sapling {id=280,dmg=0,burn=.5},--stick } local input = peripheral.wrap("front") or error("Unable to wrap input chest!",0) local output = peripheral.wrap("right") or error("Unable to wrap output chest!",0) local modemside = "bottom" local modem if peripheral.getType(modemside) == "modem" then modem = peripheral.wrap(modemside) or error("Unable to wrap modem!",0) else error("No modem found, please correct!",0) end local function getAllStacks(inv) local t = {} local size = inv.getInventorySize() for slot = 1,size do local item = inv.getStackInSlot(slot) or {} item.rawName = item.rawName or "" item.qty = item.qty or 0 item.dmg = item.dmg or 0 item.name = item.name or "" item.id = item.id or 0 t[slot] = item end return t end -- statement = boolean -- fuel = table local function isFuel(item) for _,fuel in pairs(fuel) do if item.id == fuel.id and (item.dmg == fuel.dmg or fuel.dmg == -1) then return true,fuel end end return false end -- returns slot,fuel,item local function findFuel() local items = getAllStacks(input) for slot,item in pairs(items) do local state,fuel = isFuel(item) if state then return slot,fuel,item end end end -- returns slot,item local function findItem() local slot,fuel = findFuel() if slot and fuel then local items = getAllStacks(input) for slot,item in pairs(items) do local state = isFuel(item) if not state then if item.qty >= fuel.burn then return slot,item end end end end end local function emptyFurnace() output.pullItem(outputToFurnace,outputSlot,64) end local function isFurnaceEmpty() local timeout = os.startTimer(2) modem.open(1) local msg = textutils.serialize({task="furnace",value="question"}) modem.transmit(1,1,msg) local state = false while true do local ev,p1,p2,p3,p4,p5 = os.pullEvent() if ev == "modem_message" and p1 == modemside and p2 == 1 then local msg = textutils.unserialize(p4) if type(msg) == "table" then if msg.task == "furnace" and type(msg.value) == "boolean" then state = msg.value break end end elseif ev == "timer" then if p1 == timeout then state = false break end end end modem.close(1) return state end local function cook() -- check with computer if isFurnaceEmpty() then -- get fuel and item local fuelslot,fuel,fuelitem = findFuel() local itemslot,item = findItem() -- no fuel/item found: cancel out if not fuel then return end if not item then return end local maxburn = fuelitem.qty*fuel.burn local fuelmove,itemmove if item.qty > maxburn * furnaceModifier then -- # of items are more then we can burn fuelmove = fuelitem.qty itemmove = maxburn else -- we have more or enough fuel for all items fuelmove = math.floor(item.qty/(fuel.burn*furnaceModifier)) itemmove = item.qty - (item.qty%(fuel.burn*furnaceModifier)) end -- debugging print("Moving "..tostring(fuelmove).." peices of "..tostring(fuelitem.name).." to fuel slot.") print("Moving "..tostring(itemmove).." peices of "..tostring(item.name).." to input slot.") -- move items -- pushItemItemIntoSlot(direction, fromSlot, maxQuantity, intoSlot) input.pushItemIntoSlot(inputToFurnace,fuelslot,fuelmove,fuelSlot) input.pushItemIntoSlot(inputToFurnace,itemslot,itemmove,inputSlot) else emptyFurnace() end end print("Checks input chest for valid fuel and items to burn.") print("If theres items in the furnace i shall not insert more.") print("Checks "..updaterate.." times a second,") print("i.e. "..1/updaterate.." seconds between each update.") while true do cook() sleep(1/updaterate) end