Advertisement
Kiliandeca

DecaMiner2: Miner - main

Jan 19th, 2017 (edited)
1,159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.42 KB | None | 0 0
  1. --[[
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 3 of the License, or
  5.    (at your option) any later version.
  6. ]]
  7.  
  8. shell.run("clear")
  9. --shell.run("delete DecaMiner")
  10. xMax = 12
  11.  
  12. if peripheral.getType("right") == "modem" then
  13.         rednet.open("right")
  14.     elseif peripheral.getType("left") == "modem" then
  15.         rednet.open("left")
  16.     else
  17.         error("Error: no modem detected")
  18.     end
  19.  
  20. -------------------
  21. function save()
  22.     print("[save]")
  23.     local h = fs.open("DecaMiner", "w")
  24.     h.writeLine(tostring(x))
  25.     h.writeLine(tostring(y))
  26.     h.writeLine(network)
  27.     h.writeLine(tostring(xMax))
  28.  
  29.     j=1
  30.  
  31.     while turtles[j] ~= nil do
  32.         i=1
  33.         while j<xMax and turtles[j][i] ~= nil do
  34.             h.writeLine(tostring(turtles[j][i]))
  35.             i = i +1
  36.         end
  37.         j = j + 1
  38.     end
  39.  
  40.     h.close()
  41. end
  42.  
  43. --------------------
  44. function init()
  45.    
  46.     state = 0
  47.     print("Waiting instructions")
  48.     rednet.broadcast("","DecaMiner")
  49.     senderID, message, protocol = rednet.receive("DecaMiner")
  50.     network = tostring(message[1])
  51.     print("Network: ", network)
  52.  
  53.    
  54.     if message[2] == "New Miner" then
  55.         isMaster = false
  56.         x = message[3]
  57.         y = message[4]
  58.        
  59.  
  60.         parallel.waitForAny(placement, background)
  61.  
  62.     elseif message[2] == "New Master" then
  63.         x = 0
  64.         y = 0
  65.  
  66.  
  67.         isMaster = true
  68.         parallel.waitForAny(master, background)
  69.     end
  70. end
  71.  
  72.  
  73. --------------------
  74. function master()
  75.     state = 1
  76.     if not turtle.getItemDetail(1) or turtle.getItemDetail(1).name ~= "enderstorage:ender_storage" then
  77.         print("Insert Turtles's enderchest in slot 1")
  78.     end
  79.     while not turtle.getItemDetail(1) or turtle.getItemDetail(1).name ~= "enderstorage:ender_storage" do
  80.         sleep(1)
  81.     end
  82.  
  83.     if turtle.getItemCount(1) ~= 1 then
  84.         print("Error, only 1 enderchest is needed")
  85.     end
  86.     while turtle.getItemCount(1) ~= 1 do
  87.         sleep(1)
  88.     end
  89.  
  90.     if not turtle.getItemDetail(2) or turtle.getItemDetail(2).name ~= "enderstorage:ender_storage" then
  91.         print("Insert Loot's enderchests in slot 2 (at least 1)")
  92.     end
  93.     while not turtle.getItemDetail(2) or turtle.getItemDetail(2).name ~= "enderstorage:ender_storage" do
  94.         sleep(1)
  95.     end
  96.  
  97.     local nombreEnderChestLoot = turtle.getItemCount(2)
  98.     intervaleEnderChestLoot = math.ceil(xMax/nombreEnderChestLoot)
  99.  
  100.     turtle.select(1)
  101.     turtle.digUp()
  102.     turtle.dig()
  103.     turtle.placeUp()
  104.  
  105.     xPlacement = 0
  106.     yPlacement = 0
  107.  
  108.     turtles = {{os.getComputerID()}}
  109.  
  110.  
  111.     while turtle.suckUp() do
  112.         data = turtle.getItemDetail(1)
  113.         if data and (data.name == "computercraft:turtle" or data.name == "computercraft:turtle_expanded") then
  114.             while not turtle.place() do
  115.                 sleep(0.2)
  116.             end
  117.  
  118.             peripheral.wrap("front").turnOn()
  119.             senderID, message, protocol = rednet.receive("DecaMiner", 20)
  120.             if not message then
  121.                 print("Error: turtle not responding")
  122.             else
  123.                 xPlacement = xPlacement+1
  124.                 if xPlacement >= xMax then
  125.                     xPlacement = 0
  126.                     yPlacement = yPlacement + 1
  127.                     table.insert(turtles, {})
  128.                 end
  129.                 if yPlacement == 0 and xPlacement/intervaleEnderChestLoot == math.floor(xPlacement/intervaleEnderChestLoot) then
  130.                     turtle.select(2)
  131.                     turtle.drop(1)
  132.                     turtle.select(1)
  133.                 end
  134.                 print("Sending instructions")
  135.  
  136.                 table.insert(turtles[yPlacement+1], senderID)
  137.  
  138.                 rednet.send(senderID, {network, "New Miner", xPlacement, yPlacement}, "DecaMiner")
  139.             end
  140.             while turtle.detect() do
  141.                 sleep(0.2)
  142.             end
  143.         else
  144.             turtle.select(1)
  145.             for i=3, 16 do
  146.                 if turtle.transferTo(i) then
  147.                     break
  148.                 end
  149.                 if i == 16 then
  150.                     error("Turtle is full and no space left")
  151.                 end
  152.             end
  153.         end
  154.     end
  155.  
  156.     turtle.digUp()
  157.  
  158.     position = {0,0}
  159.     for _=1, 2 do
  160.         while not turtle.forward() do
  161.                 success, data = turtle.inspect()
  162.                 if data and data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded" then
  163.                     turtle.dig()
  164.                 elseif not success then
  165.                     turtle.attack()
  166.                 end
  167.                 sleep(0.2)    
  168.         end
  169.     end
  170.  
  171.     continue = true
  172.     while continue do
  173.         continue = false
  174.         for _, j in pairs(turtles) do
  175.             for _, i in pairs(j) do
  176.                 if 2 == turtleSend(i, {"state"}) then
  177.                     continue = true
  178.                 end
  179.             end
  180.         end
  181.         sleep(2)
  182.     end
  183.  
  184.     print("[M] Sending turtles list")
  185.     rednet.broadcast(turtles, tostring(network).."tl")
  186.     save()
  187.  
  188. end
  189.  
  190.  
  191. --------------------
  192. function placement()
  193.     state = 2
  194.     print("network:", network, " x:", x, " y:", y)
  195.    
  196.     local success, data = turtle.inspect()
  197.     if data and (data.name == "computercraft:turtle" or data.name == "computercraft:turtle_expanded") and not turtle.inspectDown() then
  198.         turtle.turnLeft()
  199.         if x == 0 then turtle.turnLeft() end
  200.     elseif x ~= 0 then
  201.         turtle.turnRight()
  202.     end
  203.  
  204.     for _=1, y*3 do
  205.         while not turtle.up() do
  206.             success, data = turtle.inspectUp()
  207.             if data and data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded" then
  208.                 turtle.digUp()
  209.             elseif not success then
  210.                 turtle.attackUp()
  211.             end
  212.             sleep(0.2)
  213.         end
  214.     end
  215.  
  216.     if x ~= 0 then
  217.         for _=1, x do
  218.             while not turtle.forward() do
  219.                 success, data = turtle.inspect()
  220.                 if data and data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded" then
  221.                     turtle.dig()
  222.                 elseif not success then
  223.                     turtle.attack()
  224.                 end
  225.                 sleep(0.2)
  226.             end
  227.         end
  228.         turtle.turnLeft()
  229.     end
  230.  
  231.     while not turtle.forward() do
  232.             success, data = turtle.inspect()
  233.             if data and data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded" then
  234.                 turtle.dig()
  235.             elseif not success then
  236.                 turtle.attack()
  237.             end
  238.             sleep(0.2)    
  239.     end
  240.  
  241.     print("[P] Waiting turtles list...")
  242.     state = 3
  243.     senderID = nil
  244.     senderID, turtles, protocol = rednet.receive(network.."tl")
  245.     print("[P] Done.")
  246.     save()
  247.  
  248. end
  249.  
  250.  
  251. --------------------
  252. function mining(distance)
  253.     state = 4
  254.     i = 0
  255.     turtle.digDown()
  256.     turtle.digUp()
  257.    
  258.     while i<distance do
  259.         while turtle.detect() do
  260.             turtle.dig()
  261.         end
  262.         if turtle.forward() then
  263.             i = i + 1
  264.             turtle.digDown()
  265.             turtle.digUp()
  266.         else
  267.             turtle.attack()
  268.         end
  269.        
  270.         if turtle.getFuelLevel()<=200 and turtle.getFuelLevel()%50 == 0 then
  271.             print("[Mining] Low fuel, insert fuel !")
  272.             for slot=1, 16 do
  273.                 turtle.select(slot)
  274.                 if turtle.refuel() then
  275.                     turtle.select(1)
  276.                     break
  277.                 end
  278.             end
  279.             turtle.select(1)
  280.            
  281.  
  282.         end
  283.     end
  284. end
  285.  
  286. --------------------
  287. function looting()
  288.  
  289.     refuel(600)
  290.  
  291.     turtle.turnLeft()
  292.  
  293.     for i=1, y*2 do
  294.         while not turtle.down() do
  295.             success, data = turtle.inspectDown()
  296.             if success and data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded" then
  297.                 turtle.digDown()
  298.             else
  299.                 sleep(0.2)              
  300.             end
  301.         end
  302.     end
  303.  
  304.     startingLootingSlot = 1
  305.  
  306.     if turtle.getItemDetail(1) and turtle.getItemDetail(1).name == "enderstorage:ender_storage" then
  307.         isEc = true
  308.         if isMaster then
  309.             startingLootingSlot = 2
  310.         end
  311.     else
  312.         isEc = false
  313.     end
  314.  
  315.     if isEc or y~= 0 then
  316.         sideToDrop = turtle.dropDown
  317.     else
  318.         sideToDrop = turtle.drop
  319.     end
  320.  
  321.        
  322.     if isEc then
  323.         turtle.select(startingLootingSlot)
  324.         while not turtle.placeDown() do turtle.digDown() end
  325.     end
  326.  
  327.     if y~= 0 then
  328.         turtleExistBack = false
  329.         redstoneSide = "bottom"
  330.     else
  331.         turtleExistBack = turtleExist(x+1, y)
  332.         redstoneSide = "front"
  333.     end
  334.  
  335.     turtleExistTop = turtleExist(x, y+1)
  336.  
  337.     empty = false
  338.     while not empty or (turtleExistTop and not redstone.getInput("top")) or (turtleExistBack and not redstone.getInput("back")) do
  339.         empty = true
  340.         for i=startingLootingSlot, 16 do
  341.             turtle.select(i)
  342.             if turtle.getItemCount() ~= 0 then
  343.                 empty = false
  344.                 while not sideToDrop() do sleep(0.2) end
  345.             end
  346.         end
  347.     end
  348.  
  349.  
  350.     turtle.select(1)
  351.     redstone.setOutput("left", true) ------
  352.     redstone.setOutput(redstoneSide, true)
  353.        
  354.     if isMaster then
  355.         rednet.broadcast("", network.."endloot")
  356.     else
  357.         rednet.receive(network.."endloot")
  358.     end
  359.  
  360.     redstone.setOutput("left", false) ------
  361.     redstone.setOutput(redstoneSide, false)
  362.            
  363.     if isEc then
  364.         turtle.select(startingLootingSlot)
  365.         turtle.digDown()
  366.     end
  367.  
  368.     if recup then
  369.         recuperation()
  370.     end
  371.  
  372.     print("Positionning...")   
  373.    
  374.     turtle.turnRight()
  375.  
  376.     for i=1, y*2 do
  377.         while not turtle.up() do
  378.             success, data = turtle.inspectUp()
  379.             if success and (data.name ~= "computercraft:turtle" and data.name ~= "computercraft:turtle_expanded") then
  380.                 turtle.digUp()
  381.             else
  382.                 sleep(0.2)              
  383.             end
  384.         end
  385.     end
  386. end
  387.  
  388.  
  389. -------------------
  390. function recuperation()
  391.     print("recup")
  392.    
  393.     fs.delete("DecaMiner")
  394.  
  395.     turtle.turnRight()
  396.     turtle.turnRight()
  397.  
  398.     if isMaster then
  399.         turtle.select(1)
  400.         while not turtle.placeDown() do sleep(1) end
  401.     end
  402.  
  403.     while (turtleExistTop and not redstone.getInput("top")) or (turtleExistBack and not redstone.getInput("front")) do
  404.         if turtleExistTop and not redstone.getInput("top") then
  405.             turtle.suckUp()
  406.             if isMaster then
  407.                 turtle.dropDown()
  408.             end
  409.         end
  410.         if turtleExistBack and not redstone.getInput("front") then
  411.             turtle.suck()
  412.             if isMaster then
  413.                 if turtle.getItemDetail(1) and turtle.getItemDetail(1).name == "enderstorage:ender_storage" then
  414.                     turtle.transferTo(2)
  415.                 else
  416.                 turtle.dropDown()
  417.                 end
  418.             end
  419.         end
  420.     end
  421.    
  422.     if turtleExistTop then
  423.         turtle.digUp()
  424.         if isMaster then
  425.             turtle.dropDown()
  426.         end
  427.     end
  428.     if turtleExistBack then
  429.         turtle.dig()
  430.         if isMaster then
  431.             turtle.dropDown()
  432.         end
  433.     end
  434.  
  435.     if not isMaster then
  436.         while not isEmpty() do sleep(0.2) end
  437.    
  438.         if redstoneSide == "front" then redstoneSide = "back" end
  439.         redstone.setOutput(redstoneSide, true)
  440.        
  441.         while true do sleep(10) end
  442.  
  443.     else
  444.         turtle.digDown()
  445.         turtle.turnLeft()
  446.         turtle.back()
  447.         os.reboot()
  448.     end
  449.  
  450. end
  451.  
  452. --------------------
  453. function isEmpty()
  454.     for i=1, 16 do
  455.         turtle.select(i)
  456.         if turtle.getItemCount() ~= 0 and turtle.getItemDetail().name ~= "enderstorage:ender_storage" then
  457.           return false
  458.         end
  459.     end
  460.  
  461.     turtle.select(1)
  462.     return true
  463. end
  464.  
  465. --------------------
  466. function turtleExist(turtleX, turtleY)
  467.     if turtles[turtleY+1] and turtles[turtleY+1][turtleX+1] and turtleSend(turtles[turtleY+1][turtleX+1], {"ping"}) == "pong" then
  468.             return true
  469.     else
  470.         return false
  471.     end
  472. end
  473.  
  474. function turtleSend(id, instruction)
  475.     rednet.send(id, instruction, network.."s")
  476.     message = nil
  477.     local senderId, message = rednet.receive(tostring(os.getComputerID()).."r", 2)
  478.     return message
  479. end
  480.  
  481. --------------------
  482. function background()
  483.     while true do
  484.         messageToSend = nil
  485.         senderId, messageReceived= rednet.receive(network.."s")
  486.  
  487.         if type(messageReceived) == "table" then
  488.             if messageReceived[1] == "count" then
  489.                 messageToSend = "count"
  490.             -----
  491.             elseif messageReceived[1] == "empty" then
  492.                 if turtle.getItemDetail(1) and turtle.getItemDetail(1).name == "enderstorage:ender_storage" then
  493.                     isEc = true
  494.                 else
  495.                     isEc = false
  496.                 end
  497.  
  498.                 if isEmpty() and (not turtleExist(x, y+1) or turtleSend(turtles[y+1+1][x+1], {"empty"}, network.."s")) then
  499.                     messageToSend = true
  500.                 else
  501.                     messageToSend = false
  502.                 end
  503.             -----
  504.             elseif messageReceived[1] == "state" then
  505.                 if messageReceived[2] ~= nil then
  506.                     if state == messageReceived[2] then
  507.                         messageToSend = true
  508.                     end
  509.                 else
  510.                     messageToSend = state
  511.                 end
  512.             -----
  513.             elseif messageReceived[1] == "endLoot" then
  514.                 isLooting = false
  515.             -----
  516.             elseif messageReceived[1] == "ping" then
  517.                 messageToSend = "pong"
  518.             end
  519.         end
  520.  
  521.         if messageToSend ~= nil then
  522.             rednet.send(senderId, messageToSend, tostring(senderId).."r")
  523.             print("[Background] Sent: \"", messageToSend, "\" to ", senderId)
  524.         else
  525.             print("[Background] Failed to respond to ", senderId)
  526.         end
  527.     end
  528. end
  529.  
  530. --------------------
  531. function boot()
  532.  
  533.     if not fs.exists("DecaMiner") then
  534.         init()
  535.     else
  536.         local h = fs.open("DecaMiner", "r")
  537.         x = tonumber(h.readLine())
  538.         y = tonumber(h.readLine())
  539.         network = h.readLine()
  540.         xMax = tonumber(h.readLine())
  541.  
  542.         print("Restauration...")
  543.         print("x :", x, " y: ", y, " network: ", network)
  544.         if x == 0 and y == 0 then isMaster = true else isMaster = false end
  545.  
  546.         turtles = {{}}
  547.        
  548.         i = 1
  549.         j = 1
  550.         line = -1
  551.         while line ~= nil do
  552.             line = h.readLine()
  553.             table.insert(turtles[j], tonumber(line))
  554.             if i%xMax == 0 then
  555.                 table.insert(turtles, {})
  556.                 j= j+1
  557.             end
  558.             i = i+1
  559.         end
  560.  
  561.         h.close()
  562.     end
  563.     parallel.waitForAll(main, background)
  564. end
  565.  
  566. --------------------
  567. function main()
  568.     while true do
  569.         state = 5
  570.         senderID, message = rednet.receive(network)
  571.    
  572.         print(message)
  573.    
  574.         if tostring(senderID) == network then
  575.             -- Mining
  576.  
  577.             print(message[1])
  578.  
  579.             if message[1] == "m" then
  580.                 mining(message[2])
  581.             -- Looting
  582.             elseif message[1] == "l" then
  583.                 recup = false
  584.                 looting()
  585.             elseif message[1] == "r" then
  586.                 recup = true
  587.                 looting()
  588.             elseif message[1] == "reboot" then
  589.                 os.reboot()
  590.             elseif message[1] == "s" then
  591.                 os.shutdown()
  592.             elseif message[1] == "f" then
  593.                 turtle.forward()
  594.             elseif message[1] == "b" then
  595.                 turtle.back()
  596.             elseif message[1] == "u" then
  597.                 turtle.up()
  598.             elseif message[1] == "d" then
  599.                 turtle.down()
  600.             elseif message[1] == "tr" then
  601.                 turtle.turnRight()
  602.             elseif message[1] == "tl" then
  603.                 turtle.turnLeft()
  604.             elseif message[1] == "del" then
  605.                 fs.delete("DecaMiner")
  606.             elseif message[1] == "refuel" then
  607.                 refuel(2000)
  608.             elseif message[1] == "du" then
  609.                 turtle.digUp()
  610.             elseif message[1] == "dd" then
  611.                 turtle.digDown()
  612.             end
  613.         end
  614.     end
  615. end
  616.  
  617. function refuel(fuelLevel)
  618.         if turtle.getFuelLevel() <= fuelLevel then
  619.                   print("[Mining] Low fuel, insert fuel !")
  620.                     for slot=1, 16 do
  621.                         turtle.select(slot)
  622.                         if turtle.refuel() then
  623.                             turtle.select(1)
  624.                           break
  625.                       end
  626.                     end
  627.                     turtle.select(1)
  628.            
  629.  
  630.                 end
  631. end
  632.  
  633. boot()
  634.  
  635. print("eof")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement