Advertisement
UNOBTANIUM

ComputerCraft Furnace Computer

Jun 17th, 2015
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.52 KB | None | 0 0
  1. local system = "my furnace";
  2. local furnaceCount = 8; -- 8, 16, 24, 32 ect on each side
  3. local useFuel = true;
  4. local useOutput = true;
  5.  
  6. rednet.open("left");
  7. local network = peripheral.wrap("back");
  8. local timerID = os.startTimer(0.1);
  9. local errorMessage = "";
  10. local idleTimer = 0;
  11.  
  12. local furnaceGlobalName = "iron_furnace_";
  13. -- Vanilla Furnace: local methods = {["getFinishedItems"]={["method"]="getStackInSlot", ["parameter"]={3}}, ["getQueuedItems"]={["method"]="getStackInSlot", ["parameter"]={1}}, ["getFuelItems"]={["method"]="getStackInSlot", ["parameter"]={2}}};
  14. -- Iron Furnace:
  15. local methods = {["getFinishedItems"]={["method"]="getStackInSlot", ["parameter"]={2}}, ["getQueuedItems"]={["method"]="getStackInSlot", ["parameter"]={1}}, ["getFuelItems"]={["method"]="getStackInSlot", ["parameter"]={3}}};
  16.  
  17. local furnace = {};
  18. local furnaceGlobalNumber = -1
  19. for x = 1, furnaceCount, 1 do
  20.     table.insert(furnace, {["x"]=x+1, ["y"]=1, ["state"]="empty", ["fuel"]=16, ["finishedItems"]=0, ["queuedItems"]=0, ["furnaceName"]="NONE"});
  21.     table.insert(furnace, {["x"]=x+1, ["y"]=-1, ["state"]="empty", ["fuel"]=16, ["finishedItems"]=0, ["queuedItems"]=0, ["furnaceName"]="NONE"});
  22. end
  23.  
  24.  
  25. local menu = {
  26.         {{"Which type of furnace is in use?"}, {"Standard Furnace","Iron Furnace","Custom"}, {{10,1},{8,1.25}}},
  27.         {{"How should smelted items be handled?"},{"let turtle gather finished items"}, {"take care about items yourself"}, {true, false}},
  28.         {{"How should fuel be handled?"}, {"let the turtle refuel the furnaces"}, {"take care about refueling yourself"}, {true, false}},
  29.         {{"Which fuel type is in use?"}, {"Coal", "Blaze Rod", "Custom"}, {80, 120}},
  30.         {{"Enter the name of this furnace station:"}}
  31. }
  32.  
  33.  
  34. function setSettings()
  35.     local selected = 1;
  36.     for i = 1, 5, 1 do
  37.        
  38.     end
  39. end
  40.  
  41. function loadSettings()
  42.  
  43. end
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. local task = {};
  51.  
  52.  
  53. -- Save and Load
  54.  
  55. function save()
  56.     local file = fs.open("furnacestation","w");
  57.         file.writeLine(string.gsub(textutils.serialize(furnace),"\n%S-",""));
  58.         file.writeLine(string.gsub(textutils.serialize(methods),"\n%S-",""));
  59.         file.writeLine(system);
  60.         file.writeLine(furnaceCount);
  61.         file.writeLine(tostring(useFuel));
  62.         file.writeLine(tostring(useOutput));
  63.     file.close();
  64. end
  65.  
  66. function load()
  67.     if not fs.exists("furnacestation") then return end
  68.     local file = fs.open("furnacestation","r")
  69.         furnace = textutils.unserialize(file.readLine())
  70.         methods = textutils.unserialize(file.readLine())
  71.         system = file.readLine()
  72.         furnaceCount = tonumber(file.readLine())
  73.         if (tostring(file.readLine()) == "true") then
  74.             useFuel = true
  75.         else
  76.             useFuel = false
  77.         end
  78.         if (tostring(file.readLine()) == "true") then
  79.             useOutput = true
  80.         else
  81.             useOutput = false
  82.         end
  83.     file.close();
  84. end
  85.  
  86.  
  87.  
  88. -- Task
  89.  
  90.  
  91. function sendTask(message)
  92.     for i = 1, furnaceCount*2, 1 do
  93.         if (useOutput and furnace[i].state ~= "disconnected" and furnace[i].state == "finished") then
  94.             sendMessage({["taskname"]="retrieveitems", ["furnacenumber"]=i, ["x"]=furnace[i].x, ["y"]=furnace[i].y, ["itemcount"]=furnace[i].finishedItems});
  95.             return;
  96.         elseif (useFuel and furnace[i].state ~= "disconnected" and furnace[i].fuel < 10) then
  97.             sendMessage({["taskname"]="refuel", ["furnacenumber"]=i, ["x"]=furnace[i].x, ["y"]=furnace[i].y});
  98.             return;
  99.         end
  100.     end
  101.     sendMessage({["taskname"]=message});
  102. end
  103.  
  104. function updateFurnaceData()
  105.     term.clear();
  106.     term.setCursorPos(1, 1);
  107.     local sendUpdate = false;
  108.     for i = 1, furnaceCount*2, 1 do
  109.         if (network.isPresentRemote(furnace[i].furnaceName)) then
  110.             local data = network.callRemote(furnace[i].furnaceName, methods.getFinishedItems.method, unpack(methods.getFinishedItems.parameter));
  111.                 if (data == nil) then
  112.                     furnace[i].finishedItems = 0;
  113.                 else
  114.                     furnace[i].finishedItems = data.qty or 0;
  115.                 end
  116.             if (useOutput) then
  117.                 local data = network.callRemote(furnace[i].furnaceName, methods.getQueuedItems.method, unpack(methods.getQueuedItems.parameter));
  118.                 if (data == nil) then
  119.                     furnace[i].queuedItems = 0;
  120.                 else
  121.                     furnace[i].queuedItems = data.qty or 0;
  122.                 end
  123.             else
  124.                 furnace[i].queuedItems = 0;
  125.             end
  126.             if (useFuel) then
  127.                 local data = network.callRemote(furnace[i].furnaceName, methods.getFuelItems.method, unpack(methods.getFuelItems.parameter));
  128.                 if (data == nil) then
  129.                     furnace[i].fuel = 0;
  130.                 else
  131.                     furnace[i].fuel = data.qty or 64;
  132.                 end
  133.                 if (furnace[i].fuel < 10) then
  134.                     sendUpdate = true;
  135.                 end
  136.             else
  137.                 furnace[i].fuel = 64;
  138.             end
  139.             if (furnace[i].queuedItems > 0 and furnace[i].finishedItems >= 0) then
  140.                 furnace[i].state = "smelting";
  141.             elseif (useOutput and furnace[i].finishedItems > 0 and furnace[i].queuedItems == 0) then
  142.                 furnace[i].state = "finished";
  143.                 sendUpdate = true;
  144.             else
  145.                 furnace[i].state = "empty";
  146.             end
  147.  
  148.             print(" " .. i .. " " .. furnace[i].fuel .. " " .. furnace[i].queuedItems .. " " .. furnace[i].finishedItems .. " " .. furnace[i].state);
  149.         elseif (furnace[i].furnaceName == "NONE") then
  150.             furnace[i].state = "disconnected";
  151.             print(" " .. i .. " ?  ?  ? not set yet")
  152.         else
  153.             furnace[i].state = "disconnected";
  154.             print(" " .. i .. " ?  ?  ? "  .. furnace[i].state);
  155.         end
  156.     end
  157.     if (sendUpdate) then
  158.         sendMessage({["taskname"]="update"});
  159.     end
  160.     print(errorMessage);
  161. end
  162.  
  163.  
  164. function checkTimer()
  165.     timerID = os.startTimer(4);
  166.     updateFurnaceData();
  167. end
  168.  
  169. function findEmptyFurnace()
  170.     for i = 1, furnaceCount*2, 1 do
  171.         if (furnace[i].state == "empty" or furnace[i].state == "disconnected") then
  172.             sendMessage({["taskname"]="additems", ["furnacenumber"]=i, ["x"]=furnace[i].x, ["y"]=furnace[i].y});
  173.             return;
  174.         end
  175.     end
  176.     sendTask("noemptyfurnace");
  177. end
  178.  
  179. function setFurnace(message)
  180.     local furnacenumber = message.furnacenumber;
  181.     if (furnace[furnacenumber].furnaceName ~= "NONE") then
  182.         return;
  183.     end
  184.     local itemcount = message.itemcount;
  185.     local units = network.getNamesRemote();
  186.     for i, u in pairs(units) do
  187.         if (string.sub(u, 1, #furnaceGlobalName) == furnaceGlobalName) then
  188.             local dataFinished = network.callRemote(u, methods.getFinishedItems.method, unpack(methods.getFinishedItems.parameter));
  189.             local dataQueued = network.callRemote(u, methods.getQueuedItems.method, unpack(methods.getQueuedItems.parameter));
  190.             if (dataFinished == nil and dataQueued ~= nil and dataQueued.qty == itemcount) then
  191.                 local b = true;
  192.                 for j, f in pairs(furnace) do
  193.                     if (f.furnaceName == u) then
  194.                         b = false;
  195.                     end
  196.                 end
  197.                 if (b) then
  198.                     furnace[furnacenumber].furnaceName = u;
  199.                     return;
  200.                 end
  201.             end
  202.         end
  203.     end
  204. end
  205.  
  206. function sendMessage(message)
  207.     save();
  208.     rednet.broadcast(textutils.serialize(message), system);
  209. end
  210.  
  211. function checkMessage(message)
  212.     if (message.state == "update") then
  213.         updateFurnaceData();
  214.     elseif (message.state == "setfurnace") then
  215.         setFurnace(message);
  216.     elseif (message.state == "getemptyfurnace") then
  217.         findEmptyFurnace();
  218.     elseif (message.state == "idle") then
  219.         sendTask("checkitems");
  220.     elseif (message.state == "error") then
  221.         -- ouput chest full, fuel chest empty
  222.         -- turn on redstone signal, toggle every second?
  223.         errorMessage = message["errormessage"];
  224.     end
  225. end
  226.  
  227. function loop()
  228.     while (true) do
  229.         local e = { os.pullEvent() }
  230.         if ( e[1] == "timer" and timerID == e[2] ) then
  231.             checkTimer();
  232.             save();
  233.         elseif (e[1] == "rednet_message" and e[4] == system) then
  234.             checkMessage(textutils.unserialize(e[3]));
  235.             save();
  236.         end
  237.     end
  238. end
  239.  
  240. load();
  241. sendMessage({["taskname"]="update"});
  242. loop();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement