Advertisement
lucifersamfr

miner

Mar 15th, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.33 KB | None | 0 0
  1. slotCoalChest = 16
  2. slotSortChest = 15
  3.  
  4. local modem = peripheral.wrap("right")
  5.  
  6. local idChannel = 10
  7. local idRespChannel = 11
  8. local cmdChannel = 12
  9. local cmdRespChannel = 13
  10.  
  11. local myID = os.getComputerID()
  12. local myLabel = os.getComputerLabel()
  13. local myType = "miner"
  14.  
  15. modem.open(idChannel)
  16. modem.open(cmdChannel)
  17.  
  18. function placeChest(chestType)
  19.   if chestType == "coal" then
  20.     print(" [INV] Providing Coal chest.")
  21.     slot = slotCoalChest
  22.     elseif chestType == "sort" then
  23.       print(" [INV] Providing Sorting chest.")
  24.       slot = slotSortChest
  25.       else
  26.         return false
  27.   end
  28.  
  29.   if ( turtle.detect() ) then
  30.       turtle.dig()
  31.   end
  32.   turtle.select(slot)
  33.   local res = turtle.place()
  34.   turtle.select(1)
  35.   return res
  36. end
  37.  
  38. function storeChest(chestType)
  39.   if chestType == "coal" then
  40.     print(" [INV] Storing Coal chest.")
  41.     slot = slotCoalChest
  42.     elseif chestType == "sort" then
  43.       print(" [INV] Storing Sorting chest.")
  44.       slot = slotSortChest
  45.       else
  46.         return false
  47.   end
  48.  
  49.   turtle.select(slot)
  50.  
  51.   while ( turtle.getItemCount(slot) == 0 ) do
  52.     turtle.dig()
  53.     sleep(1)
  54.   end
  55.   turtle.select(1)
  56.   return true
  57. end
  58.  
  59. function sendItems()
  60.   local nbSentItems = 0
  61.   if ( placeChest("sort") ) then
  62.     for i = 1,15 do
  63.       local nbItems = turtle.getItemCount(i)
  64.       if ( nbItems > 0 ) then
  65.         nbSentItems = nbSentItems + turtle.getItemCount(i)
  66.         turtle.select(i)
  67.         turtle.drop()
  68.       end
  69.     end
  70.     turtle.select(1)
  71.     --turtle.dig()
  72.     storeChest("sort")
  73.     print(" [INV] "..nbSentItems.." items sent")
  74.     return nbSentItems
  75.   end
  76.   return 0
  77. end
  78.  
  79. function refuel()
  80.  
  81.   local lastLevel = turtle.getFuelLevel()
  82.   if ( lastLevel < 1000 ) then
  83.     print(" [FUEL] ALERT low level : Refuel turtle with at least 1 stack of coal")
  84.    
  85.     if ( turtle.getItemCount(1) > 0 ) then
  86.       print(" [FUEL] require inventory cleanup!")
  87.       sendItems()
  88.     end
  89.    
  90.     if ( placeChest("coal") ) then
  91.       turtle.select(1)
  92.       --Wait for a full stack and refuel
  93.       while ( turtle.getItemCount(1) < 64 ) do
  94.         turtle.suck()
  95.       end
  96.       turtle.refuel()
  97.       turtle.select(2)
  98.       turtle.refuel()
  99.       --turtle.dig()
  100.       storeChest("coal")
  101.       print(" [FUEL] Level "..lastLevel.." -> "..turtle.getFuelLevel())
  102.     end
  103.   end
  104. end
  105.  
  106. --Sort items when needed
  107. function smartStorage()
  108.   if ( turtle.getItemCount(13) + turtle.getItemCount(14) > 0 ) then
  109.     return sendItems()
  110.   else
  111.     return 0
  112.   end
  113. end
  114.  
  115. function up()
  116.   local hasMoved = false
  117.   if ( turtle.detectUp() ) then
  118.     turtle.digUp()
  119.   end
  120.   if( turtle.up() ) then
  121.     hasMoved = true
  122.   end
  123.   return hasMoved
  124. end
  125.  
  126. function down()
  127.   local hasMoved = false
  128.   if ( turtle.detectDown() ) then
  129.     turtle.digDown()
  130.   end
  131.   if ( turtle.down() ) then
  132.     hasMoved = true
  133.   end
  134.   return hasMoved
  135. end
  136.  
  137. function fTime(t)
  138.   return textutils.formatTime(t, false)
  139. end
  140.  
  141. function startNextRow()
  142.   refuel()
  143.   while ( turtle.detect() ) do
  144.     turtle.dig()
  145.     sleep(1)
  146.   end
  147.   turtle.forward()
  148.   turtle.turnRight()
  149. end
  150.  
  151. --mine a 1x2 or 2x2 dwell
  152. function mine(mode) --mode : 1 or 2 (blocs)
  153.   local startTime = os.time()
  154.   print("[START] @ "..(fTime(startTime)) )
  155.  
  156.   startNextRow()
  157.  
  158.   local depth = 0
  159.   local sentItems = 0
  160.   local lastSentItems = 0
  161.   --descending
  162.   while ( down() ) do
  163.     depth = depth + 1
  164.     lastSentItems =  smartStorage()
  165.     if ( lastSentItems == 0 ) then
  166.       turtle.dig()
  167.     else
  168.       sentItems = sentItems + lastSentItems
  169.     end
  170.   end
  171.  
  172.   --manage inventory before going back up
  173.   sentItems = sentItems + sendItems()
  174.   print(" [INV] "..sentItems.." items mined (2x1x"..depth..").")  
  175.  
  176.   local endJobTime = os.time()
  177.  
  178.   if ( mode == 1 ) then
  179.     print("[MOVE] job finished @ "..(fTime(endJobTime))..". Resetting position...")
  180.     for i=1,depth do
  181.       up()
  182.     end
  183.   elseif ( mode == 2 ) then
  184.  
  185.     print("[MOVE] Starting next row @ "..(fTime(endJobTime)) )
  186.  
  187.     turtle.turnLeft()
  188.     startNextRow()
  189.  
  190.     --ascending
  191.     for i=1,depth do
  192.       lastSentItems =  smartStorage()
  193.       if ( lastSentItems == 0 ) then
  194.         while ( turtle.detect() ) do
  195.           turtle.dig()
  196.           sleep(1)
  197.         end
  198.       else
  199.         sentItems = sentItems + lastSentItems
  200.       end
  201.       while ( up() == false ) do
  202.         print("[ MOVE ] Waiting for going up...")
  203.         sleep(1)
  204.       end
  205.     end
  206.    
  207.     sentItems = sentItems + sendItems()
  208.     print(" [INV] "..sentItems.." items mined(2x"..mode.."x"..depth..").")
  209.   else
  210.     print("[ERROR] Bad parameter :  1 or 2 (blocs)")
  211.   end
  212.  
  213.   turtle.turnLeft()
  214.  
  215.   local endTime = os.time()
  216.   print("[END] @ "..(fTime(endTime)).."("..(endTime-startTime).."s) - depth:"..depth )
  217.   return true
  218. end
  219.  
  220. while true do
  221.   local event, modemSide, senderChannel, replyChannel, message, senderDistance = os.pullEvent("modem_message")
  222.   local op=textutils.unserialize(message)
  223.   if (op.name == "ID" ) then
  224.     print("[REQUEST] Data")
  225.     local rep={name="ID", ID=myID, label=myLabel, wType=myType}
  226.     modem.transmit(idRespChannel,idChannel,textutils.serialize(rep))
  227.     print("[REQUEST] Data sent")
  228.   elseif (op.name == "mine" ) then
  229.     print("[REQUEST] Mining("..op.mode..")")
  230.     if ( mine(op.mode) ) then
  231.       local rep={name="waiting", ID=myID, label=myLabel, wType=myType}
  232.       modem.transmit(cmdRespChannel,cmdChannel,textutils.serialize(rep))
  233.       print("[REQUEST] Mining Done (responded)")
  234.     end
  235.   else
  236.     print("LE MONSIEUR EST UN BOULET")
  237.   end
  238. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement