UNOBTANIUM

chopper

Jun 19th, 2015
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.76 KB | None | 0 0
  1.  
  2.  
  3. local farmsize = {["x"]=4, ["y"]=8, ["dx"]=3, ["dy"]=3};
  4. local waitTime = 300;
  5. local countdown = 300;
  6.  
  7. local stats = {["wood"]=0, ["tree"]=0};
  8. local pos = {["x"]=-2, ["y"]=0, ["z"]=0, ["r"]=1, ["treex"]=1, ["treey"]=1, ["state"]="idle"};
  9. local slot = {};
  10. for i = 1, 16, 1 do
  11.     table.insert(slot, {["state"]="empty"});
  12. end
  13. --state: idle, moveToTree, chop, moveDown, plant, furnace
  14.  
  15. local EM = "";
  16.  
  17. -- SAVE FILES
  18.  
  19. function saveVar()
  20.     local file = fs.open("unobtanium_chopper_var","w");
  21.         file.writeLine(string.gsub(textutils.serialize(farmsize),"\n%S-",""));
  22.         file.writeLine(waitTime);
  23.         file.writeLine(countdown);
  24.     file.close();
  25. end
  26.  
  27. function loadVar()
  28.     if not fs.exists("unobtanium_chopper_var") then return end
  29.     local file = fs.open("unobtanium_chopper_var","r")
  30.         farmsize = textutils.unserialize(file.readLine())
  31.         waitTime = tonumber(file.readLine());
  32.         countdown = tonumber(file.readLine());
  33.     file.close();
  34. end
  35.  
  36. function savePos()
  37.     drawGUI();
  38.     local file = fs.open("pos","w");
  39.         file.writeLine(string.gsub(textutils.serialize(pos),"\n%S-",""));
  40.         file.writeLine(string.gsub(textutils.serialize(slot),"\n%S-",""));
  41.         file.writeLine(string.gsub(textutils.serialize(stats),"\n%S-",""));
  42.     file.close();
  43. end
  44.  
  45. function loadPos()
  46.     if not fs.exists("pos") then return end
  47.     local file = fs.open("pos","r")
  48.         pos = textutils.unserialize(file.readLine())
  49.         slot = textutils.unserialize(file.readLine())
  50.         stats = textutils.unserialize(file.readLine())
  51.     file.close();
  52. end
  53.  
  54.  
  55. -- MOVEMENT
  56.  
  57. function turnLeft()
  58.     if (pos.r == 0) then
  59.         pos.r = 3;
  60.     else
  61.         pos.r = pos.r - 1;
  62.     end
  63.     savePos();
  64.     turtle.turnLeft();
  65. end
  66.  
  67. function turnRight()
  68.     pos.r = (pos.r + 1) % 4;
  69.     savePos();
  70.     turtle.turnRight();
  71. end
  72.  
  73. function rotate(r)
  74.     while (not (pos.r == r)) do
  75.         if (r == pos.r-1 or (r == 3 and pos.r == 0)) then
  76.             turnLeft();
  77.         elseif (r == pos.r+1 or (r == 0 and pos.r == 3)) then
  78.             turnRight();
  79.         elseif math.ceil(math.random()) < 0.5 then
  80.             turnLeft()
  81.         else
  82.             turnRight();
  83.         end
  84.     end
  85. end
  86.  
  87. function forward()
  88.     if (pos.r == 0) then
  89.         pos.y = pos.y - 1;
  90.     elseif (pos.r == 1) then
  91.         pos.x = pos.x + 1;
  92.     elseif (pos.r == 2) then
  93.         pos.y = pos.y + 1;
  94.     elseif (pos.r == 3) then
  95.         pos.x = pos.x - 1;
  96.     end
  97.     savePos();
  98.     turtle.forward();
  99. end
  100.  
  101. function up()
  102.     pos.z = pos.z + 1;
  103.     savePos();
  104.     turtle.up();
  105. end
  106.  
  107. function down()
  108.     pos.z = pos.z - 1;
  109.     savePos();
  110.     turtle.down();
  111. end
  112.  
  113. function moveTo(x,y,z)
  114.     z = z or 0;
  115.     while (not (x == pos.x and y == pos.y and z == pos.z)) do
  116.         if not (z == pos.z) and ((z > pos.z and not turtle.detectUp()) or (z < pos.z and not turtle.detectDown())) then
  117.             while (z > pos.z) do
  118.                 up();
  119.             end
  120.             while (z < pos.z) do
  121.                 down();
  122.             end
  123.         elseif (not (pos.x == x)) then
  124.             local dir = table.remove({0,2},math.random(1,2));
  125.             if (pos.x < x) then
  126.                 rotate(1);
  127.                 if (turtle.detect()) then -- new route around the obstacle
  128.                     rotate(dir);
  129.                 end
  130.             elseif (pos.x > x) then
  131.                 rotate(3);
  132.                 if (turtle.detect()) then -- new route around the obstacle
  133.                     rotate(dir);
  134.                 end
  135.             end
  136.             forward();
  137.         elseif (not (pos.y == y) and pos.x >= 0) then
  138.             local dir = table.remove({1,3},math.random(1,2))
  139.             if (pos.y > y) then
  140.                 rotate(0);
  141.                 if (turtle.detect()) then -- new route around the obstacle
  142.                     rotate(dir);
  143.                 end
  144.             elseif (pos.y < y) then
  145.                 rotate(2);
  146.                 if (turtle.detect()) then -- new route around the obstacle
  147.                     rotate(dir);
  148.                 end
  149.             end
  150.             forward();
  151.         end
  152.     end
  153. end
  154.  
  155. -- GUI
  156.  
  157. function drawGUI()
  158.     term.clear();
  159.     local w, h = term.getSize();
  160.     write(1, 1, string.rep("#",w));
  161.     write(1, 2, "# State: " .. pos.state);
  162.     write(1, 3, "# Pos: " .. pos.x .. " | " .. pos.y .. " | " .. pos.z);
  163.     write(1, 4, "# Tree: " .. pos.treex .. " | " .. pos.treey);
  164.     write(1, 5, "# Fuel: " .. turtle.getFuelLevel());
  165.     write(1, 6, string.rep("#",w));
  166.     write(1, 7, "# Wood: " .. stats.wood);
  167.     write(1, 8, "# Trees: " .. stats.tree);
  168.     write(1, 9, string.rep("#",w));
  169.     write(1, 10, "# Farm Size: " .. farmsize.x .. " | " .. farmsize.y);
  170.     write(1, 11, "# Tree Spacing: " .. farmsize.dx .. " | " .. farmsize.dy);
  171.     write(1, 12, string.rep("#",w));
  172.     if (countdown < waitTime) then
  173.         write(1, 13, "Countdown: " .. waitTime-countdown .. " / " .. waitTime);
  174.     end
  175.     write(1, 13, tostring(EM));
  176. end
  177.  
  178. function write(x, y, text)
  179.     term.setCursorPos(x, y);
  180.     term.write(text);
  181. end
  182.  
  183. function setErrorMessage(message)
  184.     EM = message;
  185.     drawGUI();
  186. end
  187.  
  188.  
  189. -- PROCEDURE
  190.  
  191. function checkCurrentSlot()
  192.     if (slot[turtle.getSelectedSlot()].state ~= "wood") then
  193.         if (turtle.getItemCount(turtle.getSelectedSlot()) > 0) then
  194.             if (countSlots("wood") > 0) then
  195.                 local woodSlots = findSlots("wood");
  196.                 for i, s in pairs(woodSlots) do
  197.                     if (turtle.getItemCount(s) < 64) then
  198.                         turtle.select(s);
  199.                         return;
  200.                     end
  201.                 end
  202.                 turtle.select(woodSlots[1]);
  203.             else
  204.                 local emptySlots = findSlots("empty");
  205.                 turtle.select(emptySlots[1]);
  206.                 slot[emptySlots[1]].state = "wood";
  207.                 return;
  208.             end
  209.         else
  210.             slot[turtle.getSelectedSlot()].state = "wood";
  211.             return;
  212.         end
  213.     end
  214.     if (turtle.getItemCount(turtle.getSelectedSlot()) == 64) then
  215.         local woodSlots = findSlots("wood");
  216.         for i, s in pairs(woodSlots) do
  217.             if (turtle.getItemCount(s) < 64) then
  218.                 turtle.select(s);
  219.                 return;
  220.             end
  221.         end
  222.         turtle.select(woodSlots[1]);
  223.         if (turtle.getItemCount(turtle.getSelectedSlot()) == 64) then
  224.             local emptySlots = findSlots("empty");
  225.             turtle.select(emptySlots[1]);
  226.             slot[emptySlots[1]].state = "wood";
  227.             return;
  228.         end
  229.     end
  230. end
  231.  
  232. function countSlots(type)
  233.     local count = 0;
  234.     for i = 1, 16, 1 do
  235.         if (slot[i].state == type) then
  236.             count = count + 1;
  237.         end
  238.     end
  239.     return count;
  240. end
  241.  
  242. function findSlots(type)
  243.     local a = {};
  244.     for i = 1, 16, 1 do
  245.         if (slot[i].state == type) then
  246.             table.insert(a, i);
  247.         end
  248.     end
  249.     return a;
  250. end
  251.  
  252. function dropItems(itemtype, direction, errormessage)
  253.     errormessage = errormessage or "Unknown Error";
  254.     if (countSlots(itemtype) == 0) then
  255.         return;
  256.     end
  257.     slots = findSlots(itemtype);
  258.     for i, s in pairs(slots) do
  259.         if (turtle.getItemCount(s) > 0) then
  260.             turtle.select(s);
  261.             local b = drop(direction);
  262.             if (not b or (b and turtle.getItemCount(s) > 0)) then
  263.                 for i = 1, 5, 1 do
  264.                     drop(direction);
  265.                 end
  266.                 if (turtle.getItemCount(s) > 0) then
  267.                     setErrorMessage(errormessage);
  268.                     while (turtle.getItemCount(s) > 0) do
  269.                         os.sleep(15);
  270.                         drop(direction);
  271.                     end
  272.                     setErrorMessage("");
  273.                 end
  274.             end
  275.         end
  276.         slot[s].state = "empty";
  277.         savePos();
  278.     end
  279. end
  280.  
  281. function drop(direction)
  282.     if (direction == "front") then
  283.         return turtle.drop();
  284.     elseif (direction == "down") then
  285.         return turtle.dropDown();
  286.     elseif (direction == "up") then
  287.         return turtle.dropUp();
  288.     end
  289. end
  290.  
  291.  
  292. function checkInventory(allways) -- check if there is enough space and a sapling left
  293.     allways = allways or false;
  294.     if (allways or (countSlots("empty") == 0 or countSlots("sapling") == 0 or turtle.getFuelLevel() < 400)) then
  295.         if (not (pos.x == -2 or pos.x == -1 and pos.y == 0 and pos.z == 0) or turtle.getFuelLevel() < 400) then
  296.             moveTo(0,0);
  297.             rotate(3);
  298.             forward();
  299.             if (turtle.getFuelLevel() < 1000) then
  300.                 up(); up();
  301.                 forward();
  302.                 local woodSlot = findSlots("wood");
  303.                 local amount = 0;
  304.                 for i, s in pairs(woodSlot) do
  305.                     amount = amount + turtle.getItemCount(s);
  306.                     turtle.select(s);
  307.                     turtle.dropDown();
  308.                     if (turtle.getItemCount(s) > 0) then
  309.                         break;
  310.                     end
  311.                     slot[s].state = "empty";
  312.                     savePos();
  313.                     if (amount == 64) then
  314.                         break;
  315.                     elseif (amount > 64) then
  316.                         slot[s].state = "wood";
  317.                         savePos();
  318.                         break;
  319.                     end
  320.                 end
  321.                 rotate(1);
  322.                 forward();
  323.                 down();
  324.                 down();
  325.                 rotate(3);
  326.                 forward()
  327.                 local emptySlots = findSlots("empty");
  328.                 local s = emptySlots[1];
  329.                 slot[s].state = "coal";
  330.                 turtle.select(s);
  331.                 turtle.suckUp();
  332.                 savePos();
  333.                 if (turtle.getItemCount(s) > 8) then
  334.                     turtle.refuel(turtle.getItemCount(s)-8);
  335.                 end
  336.                 rotate(1);
  337.                 forward();
  338.                 up()
  339.                 rotate(3);
  340.                 turtle.select(s);
  341.                 slot[s].state = "empty";
  342.                 turtle.drop();
  343.                 turtle.refuel();
  344.                 savePos();
  345.                 down();
  346.                 forward();
  347.             end
  348.         end
  349.         moveTo(-2, 0);
  350.         rotate(3);
  351.         while (countSlots("wood") > 0) do
  352.             dropItems("wood", "front", "ERROR: Wood chest is filled up!");
  353.             if (countSlots("wood") > 0) then
  354.                 os.sleep(10);
  355.             end
  356.         end
  357.         savePos();
  358.         rotate(0);
  359.         while (countSlots("sapling") > 0) do
  360.             dropItems("sapling","front", "ERROR: Sapling chest is filled up!");
  361.             if (countSlots("sapling") > 0) then
  362.                 os.sleep(10);
  363.             end
  364.         end
  365.         savePos();
  366.         local emptySlots = findSlots("empty");
  367.         local s = emptySlots[1];
  368.         turtle.select(s);
  369.         while (turtle.getItemCount(s) == 0) do
  370.             turtle.suck();
  371.             if (turtle.getItemCount(s) == 0) then
  372.                 os.sleep(10);
  373.                 setErrorMessage("ERROR: Not enough saplings!");
  374.             end
  375.         end
  376.         slot[s].state = "sapling";
  377.         savePos();
  378.         rotate(1);
  379.     end
  380.     for i = 1, 16, 1 do
  381.         if (turtle.getItemCount(i) == 0) then
  382.             slot[i].state = "empty";
  383.         end
  384.     end
  385.     savePos();
  386. end
  387.  
  388. function nextTree()
  389.     pos.state = "moveToTree";
  390.     if (pos.treey % 2 == 1) then
  391.         pos.treex = pos.treex + 1;
  392.         if (pos.treex > farmsize.x) then
  393.             pos.treey = pos.treey + 1;
  394.             pos.treex = farmsize.x;
  395.         end
  396.     else
  397.         pos.treex = pos.treex - 1;
  398.         if (pos.treex <= 0) then
  399.             pos.treey = pos.treey + 1;
  400.             pos.treex = 1;
  401.         end
  402.     end
  403.     if (pos.treey > farmsize.y) then
  404.         pos.treey = 1;
  405.         pos.state = "finished";
  406.     end
  407. end
  408.  
  409. function harvest()
  410.     local x = pos.treex*farmsize.dx + (pos.treex-1);
  411.     local y = pos.treey*farmsize.dy + (pos.treey-1);
  412.     if (pos.state == "moveToTree") then
  413.         checkInventory();
  414.         if (pos.treey % 2 == 1) then
  415.             moveTo(x-1, y);
  416.             rotate(1);
  417.         else
  418.             moveTo(x+1, y);
  419.             rotate(3);
  420.         end
  421.         pos.state = "chop";
  422.     elseif (pos.state == "chop") then
  423.         if (pos.x ~= x and pos.z == 0) then
  424.             if (countSlots("wood") > 0) then
  425.                 local woodSlot = findSlots("wood");
  426.                 turtle.select(woodSlot[1]);
  427.                 if (not turtle.compare()) then
  428.                     if (not turtle.detect()) then
  429.                         pos.state = "plant";
  430.                         return;
  431.                     else
  432.                         nextTree();
  433.                         return;
  434.                     end
  435.                 end
  436.             else
  437.                 local saplingSlot = findSlots("sapling");
  438.                 turtle.select(saplingSlot[1]);
  439.                 if (turtle.compare()) then
  440.                     nextTree();
  441.                     return;
  442.                 elseif (not turtle.detect()) then
  443.                     pos.state = "plant";
  444.                     return;
  445.                 end
  446.             end
  447.             checkCurrentSlot();
  448.             turtle.dig();
  449.             stats.wood = stats.wood + 1;
  450.             forward();
  451.         end
  452.         if (pos.state == "chop") then
  453.             while (turtle.compareUp()) do
  454.                 checkCurrentSlot();
  455.                 turtle.digUp();
  456.                 stats.wood = stats.wood + 1;
  457.                 up();
  458.             end
  459.             pos.state = "moveDown";
  460.         end
  461.     elseif (pos.state == "moveDown") then
  462.         while (not turtle.detectDown()) do
  463.             down();
  464.         end
  465.         pos.state = "plant";
  466.         stats.tree = stats.tree + 1;
  467.     elseif (pos.state == "plant") then
  468.         if (pos.treey % 2 == 1) then
  469.             moveTo(x+1, y);
  470.             rotate(3);
  471.         else
  472.             moveTo(x-1, y);
  473.             rotate(1);
  474.         end
  475.         local saplingSlots = findSlots("sapling");
  476.         local s = saplingSlots[1];
  477.         turtle.select(s);
  478.         turtle.place();
  479.         turtle.suck();
  480.         if (turtle.getItemCount(s) == 0) then
  481.             slot[s].state = "empty";
  482.         end
  483.         nextTree();
  484.     elseif (pos.state == "finished") then
  485.         checkInventory(true);
  486.         pos.state = "idle";
  487.         countdown = 0;
  488.     end
  489. end
  490.  
  491.  
  492. function main()
  493.     while (true) do
  494.         savePos();
  495.         if (pos.state == "idle") then
  496.             if (countdown >= waitTime) then
  497.                 pos.treex = 1;
  498.                 pos.treey = 1;
  499.                 pos.state = "moveToTree";
  500.             else
  501.                 delay = os.startTimer(1);
  502.                 local event = { os.pullEvent() };
  503.                 if (event[1] == "timer" and event[2] == delay) then
  504.                     countdown = countdown + 1;
  505.                     saveVar();
  506.                 end
  507.             end
  508.         else
  509.             setErrorMessage("");
  510.             harvest();
  511.         end
  512.     end
  513. end
  514.  
  515.  
  516. loadVar();
  517. loadPos();
  518. main();
Advertisement
Add Comment
Please, Sign In to add comment