--pastebin get q354743w botminer --Last Update: 03.04.2023-20:27 term.clear() term.setCursorPos(1,1) local ignore = {"minecraft:stone", "minecraft:dirt", "minecraft:andesite", "minecraft:granite", "minecraft:diorite", "minecraft:gravel", "minecraft:deepslate", "minecraft:cobbled_deepslate", "minecraft:tuff", "minecraft:calcite", "minecraft:smooth_basalt", "minecraft:amethyst_block", "soul_ice:lightstone", "quark:limestone", "create:weathered_limestone", "create:limestone", "create:dolomite", "create:gabbro", "create:natural_scoria", "create:dark_scoria", "create:scoria", "appliedenergistics2:charged_quartz_ore", "minecraft:obsidian", "minecraft:sand", "minecraft:cobblestone", "minecraft:grass_block", "minecraft:bedrock", "minecraft:oak_planks", "minecraft:chest", "minecraft:torch", "computercraft:turtle_advanced", "computercraft:turtle_normal"} local backupignore = {"minecraft:stone", "minecraft:chest", "minecraft:torch", "minecraft:cobblestone", "minecraft:sand", "minecraft:grass_block", "minecraft:dirt", "minecraft:gravel", "minecraft:obsidian", "minecraft:andesite", "minecraft:granite", "minecraft:diorite", "minecraft:bedrock", "computercraft:turtle_advanced", "computercraft:turtle_normal", "quark:marble", "quark:limestone", "quark:slate", "quark:deepslate", "forbidden_arcanus:dark_stone", "forbidden_arcanus:petrified_root", "silentgems:hardened_netherrack", "silentgems:hardened_end_stone", "create:weathered_limestone", "create:limestone", "create:dolomite", "create:gabbro", "create:natural_scoria", "create:dark_scoria", "create:scoria", "astralsorcery:marble_raw", "chisel:basalt2", "rustic:slate", "chisel:limestone2", "chisel:marble2", "chisel:stonebrick", "chisel:stonebrick1", "chisel:stonebrick2", "chisel:cobblestone"} local modemFound = false local programReset = false local programInspect = false local returnedStep = false local skipShafts = false local cancelProgram = false local oreFound = false local maxOreLimitHit = false local posDforward = 0 local shaft = 0 local skipShaftsNum = 0 local amountOreTotal = 0 local startShaft = 1 local maxOres = 100 --max amount of ores in one vein; if reached bot will stop vein mining and return to shaft, at next drop off at chest bot will display message that the limit was hit. local startTime = 0 local endTime = 0 local differenceTime = 0 local firstDropSlot = 1 local foundOre="" local BotStatus = "Booting" local monitorMessage ="" local posX = 0 local posY = 0 local posZ = 0 local posD = 0 local posXhome = 0 local posYhome = 0 local posZhome = 0 local posDhome = 0 local posXsave = {} local posYsave = {} local posZsave = {} local posDsave = {} local posXgps = 0 local posYgps = 0 local posZgps = 0 local posDgps = 0 local posXgps2 = 0 local posYgps2 = 0 local posZgps2 = 0 local posXgpshome = 0 local posYgpshome = 0 local posZgpshome = 0 local posDgpshome = 0 --Filnames: Config,DisplayID,GPS,DisplaySave local filenames={"bmconfig","bmsave","bmgps","bmdispsave"} local statusText = {"Running", --1 "Need Fuel", --2 "Mining Vein", --3 +oreamount "Return Vein", --4 "Heading Home", --5 "Leaving Home", --6 after heading home "Deposit Stuff", --7 "Moved GPS-Home", --8 "At GPS-Home", --9 "No GPS!", --10 "Chest Full", --11 "Max Ore Limit", --12 "Chest Full"} --13 local arg={...} local saveTable = {} local gpsTable = {} local DisplayHeaderTable = {"BotID : ", "Fuel : ", "PosX : ", "PosY : ", "PosZ : ", "PosD : ", "Shaft : ", "Status: "} local DisplayDataTable = {} local DisplayTable = {} local configText = {"Length of Shafts", "Number of Shafts", "Slot for checking if full", "Minimum amount of Fuel", "Direction for Shafts 1=Right 3=Left", "Use GPS? 1=Yes 0=No", "Use Ender Chest Drop? 1=Yes 0=No", "Use Charged Certus detection? 1=Yes 0=No"} local config={} --Default config for 5x5 chunks loaded starting in the middle of the edge chunck config[1] = 60 --length of shafts config[2] = 22 --num of shafts config[3] = 13 --checkslot for full config[4] = 500 --minFuel config[5] = 1 --Shaft direction 1=Right 3=Left config[6] = 0 --GPS config[7] = 0 --EnderChestDrop config[8] = 0 --Charged Ore function useArgs() readParams = 0 while readParams < #arg do if string.lower(arg[readParams+1]) == "-skip" then if not (readParams+1 < #arg) or tonumber(readParams+2) == nil then print('Bad Argument! Type "botminer -help" for help!') return false else skipShafts = true skipShaftsNum = tonumber(arg[readParams+2]) readParams=readParams+2 end elseif string.lower(arg[readParams+1]) == "-reset" then programReset = true readParams=readParams+1 elseif string.lower(arg[readParams+1]) == "-inspect" then programInspect = true readParams=readParams+1 elseif string.lower(arg[readParams+1]) == "-refuel" then firstDropSlot = 1 while true do advRefuel() end elseif string.lower(arg[readParams+1]) == "-help" then print("Help-Page:") print("botminer -skip 3 -> Amount of shafts the bot will skip.") print("botminer -reset -> Will reset the config of the bot.") print("botminer -inspect -> Shows block name in front of bot.") return false else print('Bad Argument! Type "botminer -help" for help!') return false end end return true end function GPSfile() if not fs.exists(filenames[3]) then gpsTable = {posXgps, posYgps, posZgps, posDgps} f = fs.open(filenames[3], "w") f.write(textutils.serialize(gpsTable)) f.close() createStartup(true) return false else f = fs.open(filenames[3], "r") gpsTable =textutils.unserialize(f.readAll()) f.close() posXgpshome = gpsTable[1] posYgpshome = gpsTable[2] posZgpshome = gpsTable[3] posDgpshome = gpsTable[4] return true end end function DisplaySavefile() if not fs.exists(filenames[4]) then createStartup(true) return false else f = fs.open(filenames[4], "r") DisplayDataTable = textutils.unserialize(f.readAll()) f.close() return true end end function bot_getGPSpos() posXgps, posYgps, posZgps = gps.locate() if not posXgps then return false end while turtle.forward() == false do turtle.dig() turtle.attack() end posXgps2, posYgps2, posZgps2 = gps.locate() if posXgps < posXgps2 then posDgps = 0 elseif posYgps < posYgps2 then posDgps = 1 elseif posXgps > posXgps2 then posDgps = 2 elseif posYgps > posYgps2 then posDgps = 3 end while turtle.back() == false do bot_turnRight() bot_turnRight() turtle.dig() turtle.attack() bot_turnRight() bot_turnRight() end return true end function bot_checkGPShome() if posXgps == posXgpshome then if posYgps == posYgpshome then if posZgps == posZgpshome then if posDgps == posDgpshome then return true else return false end else return false end else return false end else return false end end function bot_returnhomeGPS() posX = posXgps posY = posYgps posZ = posZgps posD = posDgps local calcXgps = posXgps - posXgpshome local calcYgps = posYgps - posYgpshome while posZ ~= posZgpshome do if posZ > posZgpshome then bot_down() elseif posZ < posZgpshome then bot_up() end end if calcXgps <= calcYgps then if posX > posXgpshome then while posD ~= 2 do bot_turnRight() end while posX ~= posXgpshome do bot_forward() end elseif posX < posXgpshome then while posD ~= 0 do bot_turnRight() end while posX ~= posXgpshome do bot_forward() end end if posY > posYgpshome then while posD ~= 3 do bot_turnRight() end while posY ~= posYgpshome do bot_forward() end elseif posY < posYgpshome then while posD ~= 1 do bot_turnRight() end while posY ~= posYgpshome do bot_forward() end end elseif calcYgps <= calcXgps then if posY > posYgpshome then while posD ~= 3 do bot_turnRight() end while posY ~= posYgpshome do bot_forward() end elseif posY < posYgpshome then while posD ~= 1 do bot_turnRight() end while posY ~= posYgpshome do bot_forward() end end if posX > posXgpshome then while posD ~= 2 do bot_turnRight() end while posX ~= posXgpshome do bot_forward() end elseif posX < posXgpshome then while posD ~= 0 do bot_turnRight() end while posX ~= posXgpshome do bot_forward() end end end while posD ~= posDgpshome do bot_turnRight() end posX = 0 posY = 0 posZ = 0 posD = 0 end function configFile() if not fs.exists(filenames[1]) then configInput() f = fs.open(filenames[1], "w") f.write(textutils.serialize(config)) f.close() else f = fs.open(filenames[1], "r") config = textutils.unserialize(f.readAll()) f.close() end for i=1, #config do config[i] = tonumber(config[i]) end end function configInput() for i=1, #config do local IOinput = "" term.clear() term.setCursorPos(1,1) print("Default is for 5x5 chunks loaded;") print("starting at middle of edge chunk.") print(configText[i].." - Default: "..config[i]) IOinput = tonumber(io.read()) if type( IOinput ) == "number" then config[i] = IOinput print("Used input: "..config[i]) else print("Used default value!") end sleep(1) end configCheck() end function configCheck() term.clear() term.setCursorPos(1,1) if config[1] < 1 then --length print("Wrong Input at: "..configText[1].." Press ENTER!") io.read() configInput() elseif config[2] < 1 or config[2] > 99 then --shafts print("Wrong Input at: "..configText[2].." Press ENTER!") io.read() configInput() elseif config[3] < 1 or config[3] > 16 then --checkslot print("Wrong Input at: "..configText[3].." Press ENTER!") io.read() configInput() elseif config[4] < 1 then --minFuel print("Wrong Input at: "..configText[4].." Press ENTER!") io.read() configInput() elseif config[5] ~= 1 and config[5] ~= 3 then --Shaft direction print("Wrong Input at: "..configText[5].." Press ENTER!") io.read() configInput() elseif config[6] ~= 0 and config[6] ~= 1 then --GPS print("Wrong Input at: "..configText[6].." Press ENTER!") io.read() configInput() end end function wlanDisplay() for _,side in ipairs({"left", "right"}) do if peripheral.isPresent(side) and peripheral.getType(side) == "modem" then rednet.open(side) modemFound = true -- if not fs.exists(filenames[2]) then -- print("WLAN-Display-ID?") -- saveTable[1] = tonumber(io.read()) -- f = fs.open(filenames[2], "w") -- f.write(textutils.serialize(saveTable)) -- f.close() -- else -- f = fs.open(filenames[2], "r") -- saveTable =textutils.unserialize(f.readAll()) -- f.close() -- end break end end end function displayUpdate(reboot) -- DisplayHeaderTable[1] = "BotID : " -- DisplayHeaderTable[2] = "Fuel : " -- DisplayHeaderTable[3] = "PosX : " -- DisplayHeaderTable[4] = "PosY : " -- DisplayHeaderTable[5] = "PosZ : " -- DisplayHeaderTable[6] = "PosD : " -- DisplayHeaderTable[7] = "Shaft : " -- DisplayHeaderTable[8] = "Status: " --Prepare and save Display Data if reboot == false then DisplayDataTable[1] = os.getComputerID() DisplayDataTable[2] = turtle.getFuelLevel() DisplayDataTable[3] = posX DisplayDataTable[4] = posY DisplayDataTable[5] = posZ DisplayDataTable[6] = posD DisplayDataTable[7] = shaft DisplayDataTable[8] = BotStatus DisplayDataTable[9] = turtle.getFuelLimit() DisplayDataTable[10] = config[2] --num of shafts if fs.exists(filenames[4]) then fs.delete(filenames[4]) end f = fs.open(filenames[4], "w") f.write(textutils.serialize(DisplayDataTable)) f.close() end --Display Info in Bot Terminal DisplayTable[1] = DisplayHeaderTable[1]..DisplayDataTable[1] DisplayTable[2] = DisplayHeaderTable[2]..DisplayDataTable[2].." / "..DisplayDataTable[9] DisplayTable[3] = DisplayHeaderTable[3]..DisplayDataTable[3] DisplayTable[4] = DisplayHeaderTable[4]..DisplayDataTable[4] DisplayTable[5] = DisplayHeaderTable[5]..DisplayDataTable[5] DisplayTable[6] = DisplayHeaderTable[6]..DisplayDataTable[6] DisplayTable[7] = DisplayHeaderTable[7]..DisplayDataTable[7].."/"..DisplayDataTable[10] DisplayTable[8] = DisplayHeaderTable[8]..DisplayDataTable[8] term.clear() term.setCursorPos(1,1) for i=1, #DisplayTable do print(DisplayTable[i]) end if modemFound then modemSend() -- modemReceive() end end function modemSend() local dataTable = { tostring(DisplayDataTable[1]), tostring(DisplayDataTable[2]), tostring(DisplayDataTable[3]), tostring(DisplayDataTable[4]), tostring(DisplayDataTable[5]), tostring(DisplayDataTable[6]), tostring(DisplayDataTable[8]), tostring(DisplayDataTable[7]), tostring(DisplayDataTable[10])} --rednet.send(tonumber(saveTable[1]),textutils.serialize(dataTable),"BOT") rednet.broadcast(textutils.serialize(dataTable),"BOT") end -- function modemReceive() -- local senderId, message, protocol = rednet.receive("BOT",0.01) -- if senderId == saveTable[1] then -- monitorMessage = message -- if message == "cancel" then -- cancelProgram = true -- end -- else -- monitorMessage = "" -- end -- end function bot_digTunnel() while turtle.forward() == false do turtle.dig() turtle.attack() end if posD == 0 then posX = posX+1 elseif posD == 1 then posY = posY+1 elseif posD == 2 then posX = posX-1 elseif posD == 3 then posY = posY-1 end displayUpdate(false) turtle.digUp() end function bot_returnTunnel() --WHY!!!!!!!!!!!!!!!!!!! while turtle.forward() == false do turtle.dig() turtle.attack() end posX = posX-1 displayUpdate(false) end function bot_forward() while turtle.forward() == false do turtle.dig() turtle.attack() end if posD == 0 then posX = posX+1 elseif posD == 1 then posY = posY+1 elseif posD == 2 then posX = posX-1 elseif posD == 3 then posY = posY-1 end displayUpdate(false) end function bot_back() while turtle.back() == false do bot_turnRight() bot_turnRight() turtle.dig() turtle.attack() bot_turnRight() bot_turnRight() end if posD == 0 then posX = posX-1 elseif posD == 1 then posY = posY-1 elseif posD == 2 then posX = posX+1 elseif posD == 3 then posY = posY+1 end displayUpdate(false) end function bot_up() while turtle.up() == false do turtle.digUp() turtle.attackUp() end posZ = posZ+1 displayUpdate(false) end function bot_down() while turtle.down() == false do turtle.digDown() turtle.attackDown() end posZ = posZ-1 displayUpdate(false) end function bot_turnRight() if turtle.turnRight() then posD = posD + 1 if posD > 3 then posD = 0 end end end function bot_turnLeft() if turtle.turnLeft() then posD = posD - 1 if posD < 0 then posD = 3 end end end function bot_checkoresUp() if turtle.detectUp() then local successUp, dataUp = turtle.inspectUp() if successUp then for i=1,#ignore do if dataUp.name == ignore[i] then if dataUp.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end return false end end foundOre = "Up" return true end end end function bot_checkoresDown() if turtle.detectDown() then local successDown, dataDown = turtle.inspectDown() if successDown then for i=1,#ignore do if dataDown.name == ignore[i] then if dataDown.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end return false end end foundOre = "Down" return true end end end function bot_checkoresRight() bot_turnRight() if turtle.detect() then local successRight, dataRight = turtle.inspect() if successRight then for i=1,#ignore do if dataRight.name == ignore[i] then if dataRight.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end bot_turnLeft() return false end end foundOre = "Right" bot_turnLeft() return true end end bot_turnLeft() end function bot_checkoresLeft() bot_turnLeft() if turtle.detect() then local successLeft, dataLeft = turtle.inspect() if successLeft then for i=1,#ignore do if dataLeft.name == ignore[i] then if dataLeft.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end bot_turnRight() return false end end foundOre = "Left" bot_turnRight() return true end end bot_turnRight() end function bot_checkoresBack() bot_turnLeft() bot_turnLeft() if turtle.detect() then local successBack, dataBack = turtle.inspect() if successBack then for i=1,#ignore do if dataBack.name == ignore[i] then if dataBack.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end bot_turnRight() bot_turnRight() return false end end foundOre = "Back" bot_turnRight() bot_turnRight() return true end end bot_turnRight() bot_turnRight() end function bot_checkoresFornt() if turtle.detect() then local successFront, dataFront = turtle.inspect() if successFront then for i=1,#ignore do if dataFront.name == ignore[i] then if dataFront.name == "appliedenergistics2:charged_quartz_ore" then chargedOre() end return false end end foundOre = "Front" return true end end end function chargedOre() if config[8] == 1 then BotStatus = statusText[13] term.clear() term.setCursorPos(1,1) print("Found Charged Certus Quartz! Press ENTER.") io.read() BotStatus = statusText[1] end end function bot_savePos() table.insert(posXsave,posX) table.insert(posYsave,posY) table.insert(posZsave,posZ) table.insert(posDsave,posD) end function bot_turntoOre() if foundOre == "Right" then bot_turnRight() elseif foundOre == "Left" then bot_turnLeft() elseif foundOre == "Back" then bot_turnLeft() bot_turnLeft() end end function bot_digOre() if foundOre == "Up" then bot_up() elseif foundOre == "Down" then bot_down() elseif foundOre == "Right" then bot_forward() elseif foundOre == "Left" then bot_forward() elseif foundOre == "Front" then bot_forward() end end function mineOresCheck() if returnedStep then returnedStep = false if bot_checkoresUp() or bot_checkoresDown() or bot_checkoresFornt() or bot_checkoresRight() or bot_checkoresLeft() or bot_checkoresBack() then oreFound = true return true else oreFound = false return false end else if bot_checkoresUp() or bot_checkoresDown() or bot_checkoresFornt() or bot_checkoresRight() or bot_checkoresLeft() then oreFound = true return true else oreFound = false return false end end end function bot_returnStep() --while posX ~= posXsave or posY ~= posYsave or posZ ~= posZsave or posD ~= posDsave do local x = #posXsave if posZ > posZsave[x] then bot_down() end if posZ < posZsave[x] then bot_up() end if posD == 0 then if posX > posXsave[x] then bot_back() end if posX < posXsave[x] then bot_forward() end elseif posD == 1 then if posY > posYsave[x] then bot_back() end if posY < posYsave[x] then bot_forward() end elseif posD == 2 then if posX < posXsave[x] then bot_back() end if posX > posXsave[x] then bot_forward() end elseif posD == 3 then if posY < posYsave[x] then bot_back() end if posY > posYsave[x] then bot_forward() end end while posD ~= posDsave[x] do bot_turnRight() end if posD == 0 then if posX > posXsave[x] then bot_back() end if posX < posXsave[x] then bot_forward() end elseif posD == 1 then if posY > posYsave[x] then bot_back() end if posY < posYsave[x] then bot_forward() end elseif posD == 2 then if posX < posXsave[x] then bot_back() end if posX > posXsave[x] then bot_forward() end elseif posD == 3 then if posY < posYsave[x] then bot_back() end if posY > posYsave[x] then bot_forward() end end --end table.remove(posXsave,x) table.remove(posYsave,x) table.remove(posZsave,x) table.remove(posDsave,x) end function bot_mineOres() local mineores = true local amountOreVein = 0 while mineores do if config[7] == 1 then if bot_StatusInventory() then bot_dropStuffEnder() end end BotStatus = statusText[3]..": "..amountOreVein displayUpdate(false) if amountOreVein < maxOres then bot_turntoOre() bot_savePos() bot_digOre() amountOreVein = amountOreVein + 1 displayUpdate(false) while mineOresCheck() == false and #posXsave > 0 do bot_returnStep() returnedStep = true BotStatus = statusText[4]..": "..amountOreVein end else while #posXsave > 0 do bot_returnStep() returnedStep = true BotStatus = statusText[4]..": "..amountOreVein end oreFound = false maxOreLimitHit = true end if #posXsave == 0 and oreFound == false then mineores = false amountOreTotal = amountOreTotal + amountOreVein BotStatus = statusText[1] turnDforward(posDforward) -- if bot_checkoresRight() or bot_checkoresLeft() then -- bot_mineOres() -- end end end end function bot_returnhome() BotStatus = statusText[5] posXhome = posX posYhome = posY posZhome = posZ posDhome = posD while posZ ~= 1 do if posZ > 1 then bot_down() elseif posZ < 1 then bot_up() end end while posD ~= 2 do bot_turnRight() end while posX ~= 0 do bot_forward() end if posY ~= 0 then if config[5] == 1 then while posD ~= 3 do bot_turnRight() end elseif config[5] == 3 then while posD ~= 1 do bot_turnRight() end end while posY ~= 0 do bot_forward() end while posD ~= 2 do bot_turnRight() end end bot_down() end function bot_leavehome() BotStatus = statusText[6] bot_up() if posYhome ~= 0 then while posD ~= config[5] do bot_turnRight() end while posY ~= posYhome do bot_forward() end end while posD ~= 0 do bot_turnRight() end while posX ~= posXhome do bot_forward() end while posZ ~= posZhome do if posZ > posZhome then bot_down() elseif posZ < posZhome then bot_up() end end while posD ~= posDhome do bot_turnRight() end posXhome = 0 posYhome = 0 posZhome = 0 posDhome = 0 BotStatus = statusText[1] end function bot_StatusFuel() if turtle.getFuelLevel() < config[4] then return true else return false end end function bot_StatusInventory() if turtle.getItemCount(config[3]) > 0 then return true else return false end end function bot_checkStatus() if bot_StatusFuel() then bot_home("Fuel") elseif bot_StatusInventory() then bot_home("Inv") elseif cancelProgram then bot_returnhome() bot_dropStuff() programEnd() end end function bot_dropStuffHome() bot_checkMaxOreLimitHit() BotStatus = statusText[7] displayUpdate(false) for i=firstDropSlot,16 do turtle.select(i) if turtle.getItemCount() > 0 then while not turtle.drop() do BotStatus = statusText[11] displayUpdate(false) term.clear() term.setCursorPos(1,1) print("Empty chest and press ENTER.") io.read() BotStatus = statusText[7] displayUpdate(false) end end end turtle.select(firstDropSlot) BotStatus = statusText[1] end function bot_dropStuffEnder() bot_checkMaxOreLimitHit() BotStatus = statusText[7] displayUpdate(false) turtle.dig() turtle.select(1) turtle.place() for i=firstDropSlot,16 do turtle.select(i) if turtle.getItemCount() > 0 then while not turtle.drop() do BotStatus = statusText[11] displayUpdate(false) term.clear() term.setCursorPos(1,1) print("Empty chest!") end BotStatus = statusText[7] displayUpdate(false) end end turtle.select(1) turtle.dig() BotStatus = statusText[1] end function bot_checkMaxOreLimitHit() if maxOreLimitHit == true then BotStatus = statusText[12] displayUpdate(false) term.clear() term.setCursorPos(1,1) print("Bot hit max Ore Limit("..maxOres.."Ores) for one vein, maybe there is a new material which needs to be added to the ignore list?") print("Press ENTER to resume") io.read() maxOreLimitHit = false end end function bot_refuel(minimum) BotStatus = statusText[2] displayUpdate(false) while turtle.getFuelLevel() < minimum do advRefuel() end turtle.select(firstDropSlot) BotStatus = statusText[1] end function bot_home(reason) if config[7] == 0 then bot_returnhome() bot_dropStuffHome() bot_refuel(config[4]) bot_leavehome() else if reason == "Fuel" then bot_returnhome() bot_refuel(config[4]) bot_leavehome() elseif reason == "Inv" then bot_dropStuffEnder() end end end function nextShaft() bot_up() posDforward = config[5] turnDforward(posDforward) for i=1,3 do bot_digTunnel() turtle.digDown() end posDforward = 0 turnDforward(posDforward) bot_down() end function skipShaft() bot_up() posDforward = config[5] turnDforward(posDforward) for i=1, skipShaftsNum do for i=1,3 do bot_digTunnel() turtle.digDown() end end posDforward = 0 turnDforward(posDforward) bot_down() end function programEnd() endTime = os.clock() differenceTime = endTime - startTime differenceTime = math.floor (differenceTime) BotStatus = differenceTime.."s / "..amountOreTotal.." Ores" if fs.exists(filenames[3]) then fs.delete(filenames[3]) end displayUpdate(false) print("END") end function programStop() while true do displayUpdate(false) print("STOP") sleep(5) end end function programTerminate() print("Terminated") sleep(1) os.reboot() end function turnDforward(pos) while posD ~= pos do if posD == 0 and pos == 1 then bot_turnRight() elseif posD == 0 and pos == 3 then bot_turnLeft() elseif posD == 1 and pos == 0 then bot_turnLeft() elseif posD == 1 and pos == 2 then bot_turnRight() elseif posD == 2 and pos == 1 then bot_turnLeft() elseif posD == 2 and pos == 3 then bot_turnRight() elseif posD == 3 and pos == 2 then bot_turnLeft() elseif posD == 3 and pos == 0 then bot_turnRight() else bot_turnRight() end end end function bot_GPSreboot() if bot_getGPSpos() then if GPSfile() then if not bot_checkGPShome() then bot_returnhomeGPS() createStartup(false) if fs.exists(filenames[3]) then fs.delete(filenames[3]) end BotStatus = statusText[8] programStop() end createStartup(false) if fs.exists(filenames[3]) then fs.delete(filenames[3]) end BotStatus = statusText[9] programStop() else main() end else BotStatus = statusText[10] print("No GPS found!") print("To start without GPS press ENTER.") io.read() createStartup(false) if fs.exists(filenames[3]) then fs.delete(filenames[3]) end main() end end function createStartup(autostart) if fs.exists("startup") then fs.delete("startup") end L1 = "fs.delete('botminer')" L2 = "shell.run('pastebin','get','q354743w','botminer')" L3 = "shell.run('botminer')" startup = fs.open("startup", "w") startup.writeLine(L1) startup.writeLine(L2) if autostart then startup.writeLine(L3) end startup.close() end function advRefuel() local neededLavaBuckets = (turtle.getFuelLimit() - turtle.getFuelLevel()) / 1000 local neededCoal = (turtle.getFuelLimit() - turtle.getFuelLevel()) / 80 local neededCoalStacks = neededCoal / 64 turtle.select(firstDropSlot) term.clear() term.setCursorPos(1,1) print("Refuel Overview") print("Fuel Level: "..turtle.getFuelLevel().." / "..turtle.getFuelLimit()) print("-------------------------------------") print("Needed Material for full refuel: ") print("Lava Buckets : ".. neededLavaBuckets) print("Coal / Charcoal: ".. neededCoal.." ("..neededCoalStacks.." Stacks)") print("-------------------------------------") print("Put fuel in any slot and press ENTER.") io.read() for i=firstDropSlot, 16 do if turtle.getFuelLevel() >= turtle.getFuelLimit() then break end turtle.select(i) turtle.refuel() term.clear() term.setCursorPos(1,1) print("Fuel: "..turtle.getFuelLevel().." / "..turtle.getFuelLimit()) end print("Remove Buckets and Press ENTER.") io.read() end function bot_EnderChest() while turtle.getItemCount(1) ~= 1 do term.clear() term.setCursorPos(1,1) print("Put EnderChest in first slot and press ENTER.") io.read() end firstDropSlot = 2 end function main() if config[7] == 1 then bot_EnderChest() end advRefuel() bot_refuel(config[4]) startTime = os.clock() if skipShafts then skipShaft() skipShafts = false startShaft = skipShaftsNum + 1 end for x=startShaft, config[2] do shaft = x if shaft > skipShaftsNum then for i=1, config[1] do displayUpdate(false) bot_checkStatus() bot_digTunnel() if bot_checkoresUp() or bot_checkoresDown() or bot_checkoresRight() or bot_checkoresLeft() then bot_mineOres() end end if bot_checkoresFornt() then bot_mineOres() end posDforward = 2 bot_up() if bot_checkoresFornt() or bot_checkoresRight() or bot_checkoresLeft() then bot_mineOres() end turnDforward(posDforward) while posX > 0 do displayUpdate(false) bot_checkStatus() bot_returnTunnel() if bot_checkoresUp() or bot_checkoresDown() or bot_checkoresRight() or bot_checkoresLeft() then bot_mineOres() end end bot_down() displayUpdate(false) end if shaft < config[2] then nextShaft() end end if config[7] == 1 then bot_dropStuffEnder() end bot_returnhome() if config[7] == 0 then bot_dropStuffHome() end programEnd() end function detectENTER() local sEvent, param = os.pullEvent("key") if sEvent == "key" then if param == 28 then print("Enter detected") end end end function RebootDisplayUpdate() while true do displayUpdate(true) print("Press ENTER.") sleep(2) end end if useArgs() then if programInspect then while true do local has_block, data = turtle.inspect() if has_block then print(data.name) else print("No block") end sleep(0.5) end end if programReset then for i=1, #filenames do if fs.exists(filenames[i]) then fs.delete(filenames[i]) end end end wlanDisplay() configFile() if config[6] == 1 and fs.exists(filenames[3]) then bot_GPSreboot() --reboot script if GPS is used else if DisplaySavefile() then DisplayDataTable[8] = "X-"..DisplayDataTable[8] parallel.waitForAny(RebootDisplayUpdate,detectENTER) createStartup(false) if fs.exists(filenames[4]) then fs.delete(filenames[4]) end programTerminate() end main() end end