Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- slotCoalChest = 16
- slotSortChest = 15
- local modem = peripheral.wrap("right")
- local idChannel = 10
- local idRespChannel = 11
- local cmdChannel = 12
- local cmdRespChannel = 13
- local myID = os.getComputerID()
- local myLabel = os.getComputerLabel()
- local myType = "miner"
- modem.open(idChannel)
- modem.open(cmdChannel)
- function placeChest(chestType)
- if chestType == "coal" then
- print(" [INV] Providing Coal chest.")
- slot = slotCoalChest
- elseif chestType == "sort" then
- print(" [INV] Providing Sorting chest.")
- slot = slotSortChest
- else
- return false
- end
- if ( turtle.detect() ) then
- turtle.dig()
- end
- turtle.select(slot)
- local res = turtle.place()
- turtle.select(1)
- return res
- end
- function storeChest(chestType)
- if chestType == "coal" then
- print(" [INV] Storing Coal chest.")
- slot = slotCoalChest
- elseif chestType == "sort" then
- print(" [INV] Storing Sorting chest.")
- slot = slotSortChest
- else
- return false
- end
- turtle.select(slot)
- while ( turtle.getItemCount(slot) == 0 ) do
- turtle.dig()
- sleep(1)
- end
- turtle.select(1)
- return true
- end
- function sendItems()
- local nbSentItems = 0
- if ( placeChest("sort") ) then
- for i = 1,15 do
- local nbItems = turtle.getItemCount(i)
- if ( nbItems > 0 ) then
- nbSentItems = nbSentItems + turtle.getItemCount(i)
- turtle.select(i)
- turtle.drop()
- end
- end
- turtle.select(1)
- --turtle.dig()
- storeChest("sort")
- print(" [INV] "..nbSentItems.." items sent")
- return nbSentItems
- end
- return 0
- end
- function refuel()
- local lastLevel = turtle.getFuelLevel()
- if ( lastLevel < 1000 ) then
- print(" [FUEL] ALERT low level : Refuel turtle with at least 1 stack of coal")
- if ( turtle.getItemCount(1) > 0 ) then
- print(" [FUEL] require inventory cleanup!")
- sendItems()
- end
- if ( placeChest("coal") ) then
- turtle.select(1)
- --Wait for a full stack and refuel
- while ( turtle.getItemCount(1) < 64 ) do
- turtle.suck()
- end
- turtle.refuel()
- turtle.select(2)
- turtle.refuel()
- --turtle.dig()
- storeChest("coal")
- print(" [FUEL] Level "..lastLevel.." -> "..turtle.getFuelLevel())
- end
- end
- end
- --Sort items when needed
- function smartStorage()
- if ( turtle.getItemCount(13) + turtle.getItemCount(14) > 0 ) then
- return sendItems()
- else
- return 0
- end
- end
- function up()
- local hasMoved = false
- if ( turtle.detectUp() ) then
- turtle.digUp()
- end
- if( turtle.up() ) then
- hasMoved = true
- end
- return hasMoved
- end
- function down()
- local hasMoved = false
- if ( turtle.detectDown() ) then
- turtle.digDown()
- end
- if ( turtle.down() ) then
- hasMoved = true
- end
- return hasMoved
- end
- function fTime(t)
- return textutils.formatTime(t, false)
- end
- function startNextRow()
- refuel()
- while ( turtle.detect() ) do
- turtle.dig()
- sleep(1)
- end
- turtle.forward()
- turtle.turnRight()
- end
- --mine a 1x2 or 2x2 dwell
- function mine(mode) --mode : 1 or 2 (blocs)
- local startTime = os.time()
- print("[START] @ "..(fTime(startTime)) )
- startNextRow()
- local depth = 0
- local sentItems = 0
- local lastSentItems = 0
- --descending
- while ( down() ) do
- depth = depth + 1
- lastSentItems = smartStorage()
- if ( lastSentItems == 0 ) then
- turtle.dig()
- else
- sentItems = sentItems + lastSentItems
- end
- end
- --manage inventory before going back up
- sentItems = sentItems + sendItems()
- print(" [INV] "..sentItems.." items mined (2x1x"..depth..").")
- local endJobTime = os.time()
- if ( mode == 1 ) then
- print("[MOVE] job finished @ "..(fTime(endJobTime))..". Resetting position...")
- for i=1,depth do
- up()
- end
- elseif ( mode == 2 ) then
- print("[MOVE] Starting next row @ "..(fTime(endJobTime)) )
- turtle.turnLeft()
- startNextRow()
- --ascending
- for i=1,depth do
- lastSentItems = smartStorage()
- if ( lastSentItems == 0 ) then
- while ( turtle.detect() ) do
- turtle.dig()
- sleep(1)
- end
- else
- sentItems = sentItems + lastSentItems
- end
- while ( up() == false ) do
- print("[ MOVE ] Waiting for going up...")
- sleep(1)
- end
- end
- sentItems = sentItems + sendItems()
- print(" [INV] "..sentItems.." items mined(2x"..mode.."x"..depth..").")
- else
- print("[ERROR] Bad parameter : 1 or 2 (blocs)")
- end
- turtle.turnLeft()
- local endTime = os.time()
- print("[END] @ "..(fTime(endTime)).."("..(endTime-startTime).."s) - depth:"..depth )
- return true
- end
- while true do
- local event, modemSide, senderChannel, replyChannel, message, senderDistance = os.pullEvent("modem_message")
- local op=textutils.unserialize(message)
- if (op.name == "ID" ) then
- print("[REQUEST] Data")
- local rep={name="ID", ID=myID, label=myLabel, wType=myType}
- modem.transmit(idRespChannel,idChannel,textutils.serialize(rep))
- print("[REQUEST] Data sent")
- elseif (op.name == "mine" ) then
- print("[REQUEST] Mining("..op.mode..")")
- if ( mine(op.mode) ) then
- local rep={name="waiting", ID=myID, label=myLabel, wType=myType}
- modem.transmit(cmdRespChannel,cmdChannel,textutils.serialize(rep))
- print("[REQUEST] Mining Done (responded)")
- end
- else
- print("LE MONSIEUR EST UN BOULET")
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement