· 6 years ago · Apr 13, 2020, 10:54 AM
1for key, value in pairs({ ["os/programs/superMiner/data/copy.set"] = "return{enderChest=true,trashWhiteList=true,mineMode=true,size=16}\n",["os/programs/superMiner/main.lua"] = "ui.input.term=term\nlocal _x,_y,_w,_h=1,1,term.getSize()local input=ui.input.new()local drawer=ui.drawer.new(input,_x,_y,_w,_h)ui.buffer.fill(drawer.buffer,\" \",colors.white,colors.white)local text=\"[tc=red]Super Miner[tc=clear] is a program wrapped around [tc=red]Advance Excavate[tc=clear] to create a self building quarry working till infinity.\\n\\n[tc=red]9 Mining Turtles[tc=clear] will excavate a [tc=red]3x3 chunk square[tc=clear] where every [tc=red]Turtle[tc=clear] will excavate one [tc=red]chunk[tc=clear].\\n\\nThe [tc=red]Leader[tc=clear] is responsible for building up the [tc=red]quarry[tc=clear] by placing the [tc=red]Minions[tc=clear] and the [tc=red]chunk loader[tc=clear]. After every [tc=red]Mining Turtle[tc=clear] is finished the [tc=red]Leader[tc=clear] will collect all placed objects and move to the next position.\\n\\nTo launch the [tc=red]quarry[tc=clear] correctly every [tc=red]Turtle[tc=clear] must have installed [tc=red]Super Miner[tc=clear] and [tc=red]Advance Excavate[tc=clear]. [tc=red]8 Turtle[tc=clear] have to be set as [tc=red]Minion[tc=clear] through [tc=red]Super Miner[tc=clear] the last [tc=red]Turtle[tc=clear] hast to be also a [tc=red]Chunky Turtle[tc=clear] (Mod: PeripheralPlusOne) and the [tc=red]inventory[tc=clear] filled like, described later. Then it can be set as [tc=red]Leader[tc=clear] and start.\\n\\nThe [tc=red]inventory[tc=clear] gets filled like the following:\\n[tc=red]Slot 1: 64x Coal\\nSlot 2: 9x Ender Chest\\nSlot 3 - 6: 64x Coal\\nSlot 8: 1x Chunk Loader\\nSlot 9 - 16: 1x Mining Turtle (Minion)[tc=clear]\\n\\nTotal item list:\\n[tc=red]320x (5 Stacks) Coal\\n9x Ender Chest\\n1x Chunk Loader\\n8x Mining Turtle (Minion)[tc=clear]\"local tBox_text=ui.textBox.new(drawer,nil,text,theme.tBox2,_x,_y,_w,_h)ui.label.new(tBox_text,\"Super Miner\",theme.label1,_x,_y,_w-3,1)local button_exit=ui.button.new(tBox_text,\"<\",theme.button2,_x+_w-3,_y,3,1)ui.label.new(tBox_text,\"\",theme.label1,_x,_y+_h-1,_w,1)local button_minion=ui.button.new(tBox_text,\"Minion\",theme.button1,_x+_w-16,_y+_h-1,8,1)local button_leader=ui.button.new(tBox_text,\"Leader\",theme.button1,_x+_w-8,_y+_h-1,8,1)local group_main=tBox_text.selectionGroup\ndrawer.selectionManager:addGroup(group_main)local group_top=drawer.selectionManager:addNewGroup(nil,nil,group_main.listener)local group_bottom=drawer.selectionManager:addNewGroup(nil,nil,group_main.listener)group_top.next,group_top.previous=group_bottom,group_bottom\ngroup_bottom.next,group_bottom.previous=group_top,group_top\ngroup_top:addElement(button_exit,nil,nil,nil,group_bottom)group_bottom:addElement(button_minion,nil,group_top,button_leader,nil)group_bottom:addElement(button_leader,button_minion,group_top,nil,nil)group_top.current=button_exit\ndrawer.selectionManager:select(button_minion,\"code\",not term.isColor())local function clearData()local files= {\"os/startup/50-superMiner.lua\",\"os/programs/superMiner/data/move.set\",\"os/programs/advanceExcavate/data/data.set\",\"os/programs/advanceExcavate/data/move.set\"\n}for i,v in ipairs(files)do\nif fs.exists(v)then\nfs.delete(v)end\nend\nend\nclearData()function button_exit:onClick(event)input:exit()end\nfunction button_minion:onClick(event)input:callFunction(function()clearData()dofile(\"os/programs/superMiner/minion.lua\")input:exit()end)end\nfunction button_leader:onClick(event)input:callFunction(function()clearData()dofile(\"os/programs/superMiner/leader.lua\")input:exit()end)end\ndrawer:draw()input:eventLoop({[term] =drawer.event})\n",["os/programs/superMiner/leader.lua"] = "ui.input.term=term\nlocal _x,_y,_w,_h=1,1,term.getSize()local size=16\nlocal threshold=math.floor(size^0.5)local placesPath,movePath,program=\"os/programs/superMiner/data/places.set\",\"os/programs/superMiner/data/move.set\",\"os/programs/advanceExcavate/\"local places,move\nlocal inMove=false\nlocal function getData()if fs.exists(placesPath)then\nplaces=dofile(placesPath)for i,v in ipairs(places.turtles)do\nvector.convert(v)end\nif places.chunkLoader then\nvector.convert(places.chunkLoader)end\nelse\nplaces= {turtles= {},chunkLoader=nil}end\nif fs.exists(movePath)then\nmove=dofile(movePath)vector.convert(move.pos)vector.convert(move.facing)vector.convert(move.oldPos)else\nmove= {}move.pos=vector.zero:copy()move.oldPos=vector.zero:copy()move.facing=vector.forward:copy()move.mode=1\nmove.lastTurtle=0\nend\nend\ngetData()local function getFacingText()if move.facing.x>0 then\nreturn \"Forward\"elseif move.facing.x<0 then\nreturn \"Back\"elseif move.facing.y>0 then\nreturn \"Right\"else\nreturn \"Left\"end\nend\nlocal input=ui.input.new()local drawer=ui.drawer.new(input,_x,_y,_w,_h)ui.buffer.fill(drawer.buffer,\" \",colors.white,colors.white)ui.label.new(drawer,\"Super Miner Leader\",theme.label1,_x,_y,_w,1)local label_pos=ui.label.new(drawer,\"Position: \",theme.label2,_x,_y+1,10,1)local label_posX=ui.label.new(drawer,\"X: \" ..move.oldPos.x+move.pos.x,theme.label2,_x+10,_y+1,8,1)local label_posY=ui.label.new(drawer,\"Y: \" ..move.oldPos.y+move.pos.y,theme.label2,_x+19,_y+1,8,1)local label_posZ=ui.label.new(drawer,\"Z: \" ..move.oldPos.z+move.pos.z,theme.label2,_x+28,_y+1,8,1)local label_facing=ui.label.new(drawer,\"Facing: \" ..getFacingText(),theme.label2,_x,_y+2,_w,1)ui.label.new(drawer,\"Fuel Level:\",theme.label2,_x,_y+3,11,1)local label_fuelLevel=ui.label.new(drawer,\"0 / 0\",theme.label2,_x+12,_y+3,_w-12,1)local text_mode=ui.text.new(drawer,\"Mode:\\n\\n\\n\\n\\n\",theme.label2,_x,_h-6,_w,3)text_mode.scaleH=false\nfunction text_mode:setText(text)self.text=text\nself:recalculate()self:repaint(\"this\")end\nui.label.new(drawer,\"\",theme.label1,_x,_h,_w,1)local button_exit=ui.button.new(drawer,\"Exit\",theme.button1,_x+_w-6,_h,6,1)local group_main=drawer.selectionManager:addNewGroup()group_main:addElement(button_exit,nil,nil,nil,nil)drawer.selectionManager:select(button_exit,\"code\",not term.isColor())local function save()table.save(move,movePath)end\nlocal function savePositions()table.save(places,placesPath)end\nlocal function update(f,p,m)if m then\ninMove=true\nend\nif f then\nmove.facing:set(move.facing.y*f.x,move.facing.x*f.y)save()label_facing.text=\"Facing: \" ..getFacingText()label_facing:recalculate()label_facing:repaint(\"this\")end\nif p then\nmove.pos:set(move.pos.x+ (p.x*move.facing.x+p.y*move.facing.y),move.pos.y+ (p.x*move.facing.y+p.y*move.facing.x),move.pos.z+p.z)save()label_posX.text=\"X: \" .. (move.oldPos.x+move.pos.x)label_posY.text=\"Y: \" .. (move.oldPos.y+move.pos.y)label_posZ.text=\"Z: \" .. (move.oldPos.y+move.pos.z)label_posX:recalculate()label_posY:recalculate()label_posZ:recalculate()label_posX:repaint(\"this\")label_posY:repaint(\"this\")label_posZ:repaint(\"this\")end\ninMove=m\nend\nlocal function gotoDestination(v)return turtle.move.go(v-move.pos,update,move.facing)end\nlocal function checkHeight()local threshold=math.floor((move.pos.x^2+move.pos.y^2) ^0.5/size+1) *threshold\nif move.pos.z>=threshold then\nreturn \"top\"end\nturtle.move.up(update)if turtle.digUp()then\nif move.pos.z>=threshold then\nreturn \"top\"end\nturtle.move.up(update)while move.pos.z<=threshold and turtle.digUp()do\nturtle.move.up(update)end\nreturn \"top\"else\nprint(\"down\")while move.pos.z>= -threshold and not turtle.digDown()do\nturtle.move.down(update)end\nreturn \"bottom\"end\nend\nlocal function placeFuel(Dir)local amount=move.coal\nfor i=3,6 do\nlocal data=turtle.getItemDetail(i)if data and data.name==\"minecraft:coal\"then\nturtle.select(i)turtle[\"drop\" ..Dir](math.min(data.count,amount))amount=amount-data.count\nend\nif amount<=0 then\nbreak\nend\nend\nend\nlocal function placeTurtle(i,dir)print(\"place turtle\")local slot=8+i\nlocal Dir\nlocal pos=places.turtles[i]if dir==\"top\"then\nDir=\"Up\"else\nDir=\"Down\"end\nturtle.select(1)local inspect,data=turtle[\"inspect\" ..Dir]()if inspect and data.name:find(\"computercraft:turtle\")then\nwhile turtle[\"suck\" ..Dir]()do\nend\nelse\nturtle.select(slot)while not turtle[\"place\" ..Dir]()and turtle.getItemCount(slot) >0 do\nturtle[\"dig\" ..Dir]()turtle[\"attack\" ..Dir]()end\nend\nplaceFuel(Dir)turtle.select(2)turtle[\"drop\" ..Dir](1)peripheral.wrap(dir).turnOn()sleep(0.2)redstone.setAnalogOutput(dir,1)sleep(0.2)redstone.setAnalogOutput(dir,0)end\nlocal function placeChuckLoader()gotoDestination(places.chunkLoader+vector.down)turtle.select(8)while not turtle.placeUp()do\nturtle.digUp()turtle.attackUp()end\nend\nlocal function moveToNext(v)local next=vector.new(v[1],v[2],0)gotoDestination(next)end\nlocal function checkInventory()turtle.select(2)turtle.place()local removeSlots= {7,8}local coalSlots= {1,3,4,5,6}for i,v in ipairs(coalSlots)do\nlocal data=turtle.getItemDetail(v)if data and data.name~=\"minecraft:coal\"then\ntable.insert(removeSlots,v)end\nend\nfor i=9,16 do\nlocal data=turtle.getItemDetail(i)if data and not data.name:find(\"computercraft:turtle\")then\ntable.insert(removeSlots,i)end\nend\nfor i,v in ipairs(removeSlots)do\nturtle.select(v)local data=turtle.getItemDetail()if data then\nif data.name==\"minecraft:coal\"then\nfor j,v2 in ipairs(coalSlots)do\nturtle.transferTo(v2)if turtle.getItemCount(v) ==0 then\nbreak\nend\nend\nelseif data.name:find(\"computercraft:turtle\")then\nfor j=9,16 do\nturtle.transferTo(j)if turtle.getItemCount(j) ==0 then\nbreak\nend\nend\nelseif data.name==\"enderstorage:ender_storage\"then\nturtle.transferTo(2)end\nturtle.drop()end\nend\nturtle.select(2)turtle.dig()end\nlocal positions= {\n{0,0},\n{size,0},\n{size*2,0},\n{size*2,size},\n{size*2,size*2},\n{size,size*2},\n{0,size*2},\n{0,size}\n}local function loop()while true do\nif move.mode==1 then\ntext_mode:setText(\"Refuel\")if turtle.getFuelLimit() >0 then\nlocal neededFuel=size*8+threshold*9+80\nwhile turtle.getFuelLevel() <neededFuel do\nturtle.select(1)turtle.refuel(1)end\nlocal amount=0\nfor i=3,6 do\nturtle.select(i)amount=amount+turtle.getItemCount()end\nmove.coal=math.floor(amount/8)move.mode=2\nsave()end\nelseif move.mode==2 then\ntext_mode:setText(\"Place Minions\")local i=move.lastTurtle+1\nmoveToNext(positions[i])local dir\nif i==1 then\ndir=\"bottom\"else\ndir=checkHeight()end\nplaces.turtles[i] =move.pos:copy() +IF(dir==\"bottom\",vector.down,vector.up)savePositions()turtle.move.look(\"forward\",move.facing,update)placeTurtle(i,dir)move.lastTurtle=i\nif i>=8 then\nmove.mode=3\nend\nsave()elseif move.mode==3 then\ntext_mode:setText(\"Go to destination.\")moveToNext({size,size})checkHeight()places.turtles[9] =move.pos:copy()savePositions()move.mode=4\nsave()elseif move.mode==4 then\ntext_mode:setText(\"Place Chunk Loader\")local maxZ=move.pos.z\nfor i,v in ipairs(places.turtles)do\nmaxZ=math.max(v.z,maxZ)end\nplaces.chunkLoader=vector.new(move.pos.x,move.pos.y,maxZ+4)savePositions()placeChuckLoader()move.mode=5\nsave()elseif move.mode==5 then\ntext_mode:setText(\"Go to destination\")gotoDestination(places.turtles[9])turtle.move.look(\"forward\",move.facing,update)move.mode=6\nmove.lastTurtle=0\nsave()elseif move.mode==6 then\ntext_mode:setText(\"Create Data\")local movePath=program..\"data/data.set\"if fs.exists(movePath)then\nfs.delete(movePath)end\nlocal dataPath=program..\"data/data.set\"if fs.exists(dataPath)then\nfs.delete(dataPath)end\nfs.copy(\"os/programs/superMiner/data/copy.set\",dataPath)local startPath=\"os/startup/50-superMiner.lua\"if not fs.exists(startPath)then\nlocal file=fs.open(startPath,\"w\")file.write('dofile(\"os/programs/superMiner/leader.lua\")')file.close()end\nmove.mode=7\nsave()elseif move.mode==7 then\ntext_mode:setText(\"Mine\")dofile(program..\"excavate.lua\")move.mode=8\nsave()elseif move.mode==8 then\ntext_mode:setText(\"Refuel\")if turtle.getFuelLimit() >0 then\nlocal neededFuel=size*11+threshold*9+20\nturtle.select(1)while turtle.getFuelLevel() <=neededFuel do\nturtle.refuel(1)end\nend\nmove.mode=9\nsave()elseif move.mode==9 then\ntext_mode:setText(\"Remove Minions\")local i=move.lastTurtle+1\ngotoDestination(places.turtles[9-i] +vector.up*3)local inspect,data=turtle.inspectDown()while not(inspect and data.name:find(\"computercraft:turtle\"))do\nsleep(3)inspect,data=turtle.inspectDown()end\nturtle.dig()checkInventory()turtle.select(1)while turtle.suckDown()do\nend\nturtle.select(8+i)turtle.digDown()move.lastTurtle=i\nif i>=8 then\nmove.mode=10\nend\nsave()elseif move.mode==10 then\ntext_mode:setText(\"Remove Chunk Loader\")gotoDestination(places.chunkLoader+vector.down)turtle.dig()checkInventory()turtle.select(8)turtle.digUp()move.mode=11\nsave()elseif move.mode==11 then\ntext_mode:setText(\"Go to next position\")gotoDestination(vector.new(size*3,0,0))checkHeight()move.oldPos=move.pos:copy()move.pos=vector.zero:copy()move.mode=1\nmove.lastTurtle=0\nplaces.turtles= {}places.chunkLoader=nil\nsavePositions()save()end\nend\nend\nfunction button_exit:onClick(event)local files= {\"os/startup/50-superMiner.lua\",\"os/programs/superMiner/data/move.set\",\"os/programs/advanceExcavate/data/data.set\",\"os/programs/advanceExcavate/data/move.set\"\n}for i,v in ipairs(files)do\nif fs.exists(v)then\nfs.delete(v)end\nend\ninput:exit()end\ndrawer:draw()parallel.waitForAny(function()input:eventLoop({[term] =drawer.event})end,loop)\n",["os/programs/superMiner/minion.lua"] = "ui.input.term=term\nlocal _x,_y,_w,_h=1,1,term.getSize()local movePath=\"os/programs/superMiner/data/move.set\"local program=\"os/programs/advanceExcavate/\"local move\nlocal inMove=false\nlocal function getData()if fs.exists(movePath)then\nmove=dofile(movePath)vector.convert(move.pos)vector.convert(move.facing)else\nmove= {}move.pos=vector.zero:copy()move.facing=vector.forward:copy()move.mode=1\nend\nend\ngetData()local function getFacingText()if move.facing.x>0 then\nreturn \"Forward\"elseif move.facing.x<0 then\nreturn \"Back\"elseif move.facing.y>0 then\nreturn \"Right\"else\nreturn \"Left\"end\nend\nlocal input=ui.input.new()local drawer=ui.drawer.new(input,_x,_y,_w,_h)ui.buffer.fill(drawer.buffer,\" \",colors.white,colors.white)ui.label.new(drawer,\"Super Miner Minion\",theme.label1,_x,_y,_w,1)local label_pos=ui.label.new(drawer,\"Position: \",theme.label2,_x,_y+1,10,1)local label_posX=ui.label.new(drawer,\"X: \" ..move.pos.x,theme.label2,_x+10,_y+1,8,1)local label_posY=ui.label.new(drawer,\"Y: \" ..move.pos.y,theme.label2,_x+19,_y+1,8,1)local label_posZ=ui.label.new(drawer,\"Z: \" ..move.pos.z,theme.label2,_x+28,_y+1,8,1)local label_facing=ui.label.new(drawer,\"Facing: \" ..getFacingText(),theme.label2,_x,_y+2,_w,1)ui.label.new(drawer,\"Fuel Level:\",theme.label2,_x,_y+3,11,1)local label_fuelLevel=ui.label.new(drawer,\"0 / 0\",theme.label2,_x+12,_y+3,_w-12,1)local text_mode=ui.text.new(drawer,\"Mode:\\n\\n\\n\\n\\n\",theme.label2,_x,_h-6,_w,3)text_mode.scaleH=false\nfunction text_mode:setText(text)self.text=text\nself:recalculate()self:repaint(\"this\")end\nui.label.new(drawer,\"\",theme.label1,_x,_h,_w,1)local button_exit=ui.button.new(drawer,\"Exit\",theme.button1,_x+_w-6,_h,6,1)local group_main=drawer.selectionManager:addNewGroup()group_main:addElement(button_exit,nil,nil,nil,nil)drawer.selectionManager:select(button_exit,\"code\",not term.isColor())local function save()table.save(move,movePath)end\nlocal function update(f,p,m)if m then\ninMove=true\nend\nif f then\nmove.facing:set(move.facing.y*f.x,move.facing.x*f.y)save()label_facing.text=\"Facing: \" ..getFacingText()label_facing:recalculate()label_facing:repaint(\"this\")end\nif p then\nmove.pos:set(move.pos.x+ (p.x*move.facing.x+p.y*move.facing.y),move.pos.y+ (p.x*move.facing.y+p.y*move.facing.x),move.pos.z+p.z)save()label_posX.text=\"X: \" ..move.pos.x\nlabel_posY.text=\"Y: \" ..move.pos.y\nlabel_posZ.text=\"Z: \" ..move.pos.z\nlabel_posX:recalculate()label_posY:recalculate()label_posZ:recalculate()label_posX:repaint(\"this\")label_posY:repaint(\"this\")label_posZ:repaint(\"this\")end\ninMove=m\nend\nlocal function loop()while true do\nif move.mode==1 then\ntext_mode:setText(\"Create data\")local startPath=\"os/startup/50-superMiner.lua\"if not fs.exists(startPath)then\nlocal file=fs.open(startPath,\"w\")file.write('dofile(\"os/programs/superMiner/minion.lua\")')file.close()end\nmove.mode=2\nsave()elseif move.mode==2 then\ntext_mode:setText(\"Wait for start signal\")os.pullEvent(\"redstone\")move.mode=3\nsave()elseif move.mode==3 then\nsleep(3)move.mode=4\nsave()elseif move.mode==4 then\ntext_mode:setText(\"Create data\")local movePath=program..\"data/data.set\"if fs.exists(movePath)then\nfs.delete(movePath)end\nlocal dataPath=program..\"data/data.set\"if fs.exists(dataPath)then\nfs.delete(dataPath)end\nfs.copy(\"os/programs/superMiner/data/copy.set\",dataPath)move.mode=5\nsave()elseif move.mode==5 then\ntext_mode:setText(\"Mine\")dofile(program..\"excavate.lua\")move.mode=6\nsave()elseif move.mode==6 then\ntext_mode:setText(\"Refuel\")if turtle.getFuelLimit() >0 and turtle.getFuelLevel() <4 then\nturtle.select(1)turtle.refuel(1)end\nmove.mode=7\nsave()elseif move.mode==7 then\ntext_mode:setText(\"Go to position\")turtle.move.go(vector.up*2-move.pos,update,move.facing)if fs.exists(movePath)then\nfs.delete(movePath)end\nmove.pos=vector.zero:copy()move.mode=1\nsave()text_mode:setText(\"Wait for leader\")while true do\nsleep(100)end\nend\nend\nend\nfunction button_exit:onClick(event)local files= {\"os/startup/50-superMiner.lua\",\"os/programs/superMiner/data/move.set\",\"os/programs/advanceExcavate/data/data.set\",\"os/programs/advanceExcavate/data/move.set\"\n}for i,v in ipairs(files)do\nif fs.exists(v)then\nfs.delete(v)end\nend\ninput:exit()end\ndrawer:draw()parallel.waitForAny(function()input:eventLoop({[term] =drawer.event})end,loop)\n" }) do
2local s, e = key:find(".*/")
3if s then
4local path = key:sub(s, e)
5if not fs.exists(path) then
6fs.makeDir(path)
7end
8end
9local file = io.open(key, "w+")
10file:write(value)
11file:close()
12end
13sys.require("[1.0.1]Turtle Move API") sys.require("[1.0.5]Advance Excavate")