Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -----------------------------------------
- -- Vrill's 3D printer for turtle 1.0.0 --
- -----------------------------------------
- function getSchemeList()
- local allFiles
- local selectedFiles={}
- local i
- local n=1
- local strlen
- selectedFiles[1]="No-Files-Found"
- allFiles=shell.programs(true)
- for i=1,#allFiles do
- strlen=string.len(allFiles[i])
- --print( allFiles[i]," len=",strlen )
- if strlen > 4 then
- if string.lower(string.sub(allFiles[i], strlen-3)) == ".3dp" then
- selectedFiles[n]=allFiles[i]
- n=n+1
- end
- end
- end
- for i=1,#selectedFiles do
- --print( selectedFiles[i])
- end
- return selectedFiles
- end
- function GUIopenFile()
- local fileName="noFile"
- local posX,posY=2,1
- local i
- local schemes
- local event, key
- local line=1
- local page=0
- schemes=getSchemeList()
- ------
- term.clear()
- term.setTextColor(colors.white)
- term.setCursorPos(posX,posY)
- term.write("+--- Select scheme file: -----------+")
- for i=2,12 do
- term.setCursorPos(posX,i)
- term.write("| |")
- end
- term.setCursorPos(posX,13)
- term.write("+-----------------------------------+")
- term.setTextColor(colors.lime)
- for i=1,math.min(#schemes-page,10) do
- term.setCursorPos(posX+1,posY+i+1)
- term.write(i+page)
- term.write(": ")
- term.write(schemes[i+page])
- end
- term.setTextColor(colors.yellow)
- term.setCursorPos(1+5,line+2)
- term.write(">")
- term.setTextColor(colors.white)
- term.write(schemes[line+page])
- term.write(" ")
- ------
- while true do
- event, key = os.pullEvent( "key" )
- if key == keys.enter then
- term.setTextColor(colors.white)
- term.setCursorPos(1,1)
- term.clear()
- fileName=schemes[line+page]
- break
- end
- if key == keys.up then
- if line == 1 and page >= 10 then
- line=10
- page=page-10
- ------
- term.clear()
- term.setTextColor(colors.white)
- term.setCursorPos(posX,posY)
- term.write("+--- Select scheme file: -----------+")
- for i=2,12 do
- term.setCursorPos(posX,i)
- term.write("| |")
- end
- term.setCursorPos(posX,13)
- term.write("+-----------------------------------+")
- term.setTextColor(colors.lime)
- for i=1,math.min(#schemes-page,10) do
- term.setCursorPos(posX+1,posY+i+1)
- term.write(i+page)
- term.write(": ")
- term.write(schemes[i+page])
- end
- term.setTextColor(colors.yellow)
- term.setCursorPos(1+5,line+2)
- term.write(">")
- term.setTextColor(colors.white)
- term.write(schemes[line+page])
- term.write(" ")
- ------
- else
- term.setCursorPos(1+5,line+2)
- term.write(" ")
- term.setTextColor(colors.lime)
- term.write(schemes[line+page])
- term.write(" ")
- if line > 1 then line=line-1 end
- term.setCursorPos(1+5,line+2)
- term.setTextColor(colors.yellow)
- term.write(">")
- term.setTextColor(colors.white)
- term.write(schemes[line+page])
- term.write(" ")
- end
- end
- if key == keys.down then
- if line == 10 and page+line < #schemes then
- line=1
- page=page+10
- ------
- term.clear()
- term.setTextColor(colors.white)
- term.setCursorPos(posX,posY)
- term.write("+--- Select scheme file: -----------+")
- for i=2,12 do
- term.setCursorPos(posX,i)
- term.write("| |")
- end
- term.setCursorPos(posX,13)
- term.write("+-----------------------------------+")
- term.setTextColor(colors.lime)
- for i=1,math.min(#schemes-page,10) do
- term.setCursorPos(posX+1,posY+i+1)
- term.write(i+page)
- term.write(": ")
- term.write(schemes[i+page])
- end
- term.setTextColor(colors.yellow)
- term.setCursorPos(1+5,line+2)
- term.write(">")
- term.setTextColor(colors.white)
- term.write(schemes[line+page])
- term.write(" ")
- ------
- else
- term.setCursorPos(1+5,line+2)
- term.write(" ")
- term.setTextColor(colors.lime)
- term.write(schemes[line+page])
- term.write(" ")
- if line < math.min(#schemes-page,10) then line=line+1 end
- term.setCursorPos(1+5,line+2)
- term.setTextColor(colors.yellow)
- term.write(">")
- term.setTextColor(colors.white)
- term.write(schemes[line+page])
- term.write(" ")
- end
- end
- end
- return fileName
- end
- function createSchemeFile(filename,slotsNameTable,sX,sY,sZ,matrix)
- local i,x,y,z
- local file
- file = io.open(filename, "w")
- file:write("3dp -> 3D printer scheme file for ComputerCraft turtle\n")
- file:write("title = '")
- file:write(filename)
- file:write("'\n")
- for i=1,16 do
- file:write("slot")
- file:write(tostring(i))
- file:write(" = '")
- file:write(slotsNameTable[i])
- file:write("'\n")
- end
- file:write("sizeX = ")
- file:write(tostring(sX))
- file:write("\n")
- file:write("sizeY = ")
- file:write(tostring(sY))
- file:write("\n")
- file:write("sizeZ = ")
- file:write(tostring(sZ))
- file:write("\n")
- file:write("--Use 0123456789ABCDEFG chars --\n")
- for z=1,sZ do
- file:write("--layer")
- file:write(tostring(z))
- file:write("--\n")
- for y=1,sY do
- for x=1,sX do
- if matrix[z][sY-y+1][x] >=0 and matrix[z][sY-y+1][x] <=9 then
- file:write(tostring(matrix[z][sY-y+1][x]))
- elseif matrix[z][sY-y+1][x] == 10 then
- file:write("A")
- elseif matrix[z][sY-y+1][x] == 11 then
- file:write("B")
- elseif matrix[z][sY-y+1][x] == 12 then
- file:write("C")
- elseif matrix[z][sY-y+1][x] == 13 then
- file:write("D")
- elseif matrix[z][sY-y+1][x] == 14 then
- file:write("E")
- elseif matrix[z][sY-y+1][x] == 15 then
- file:write("F")
- elseif matrix[z][sY-y+1][x] == 16 then
- file:write("G")
- end
- end
- file:write("\n")
- end
- end
- file:close()
- end
- function findText(textString)
- local str,i,j
- i, j = string.find(textString, "'")
- str = string.sub(textString,i+1)
- i, j = string.find(str, "'")
- str = string.sub(str,1,i-1)
- return str
- end
- function getInfoFromSchemeFile(filename)
- local slotsNameTable={}
- local x,y,z,sX,sY,sZ
- local matr={}
- local file,str,i,j,num
- local tmpTable={}
- file = io.open(filename, "r")
- file:read() -- first string
- str = file:read()
- str=findText(str)
- -- 1 -> title --
- tmpTable[1]=str
- --print(str)
- for i=1,16 do
- str = file:read()
- str=findText(str)
- slotsNameTable[i]=str
- --print(str)
- end
- -- 2 -> slotsName --
- tmpTable[2]=slotsNameTable
- str = file:read()
- i, j = string.find(str, "sizeX = ")
- str = string.sub(str,j)
- -- 3 -> sizeX --
- sX=tonumber(str)
- tmpTable[3]=sX
- --print(sX)
- str = file:read()
- i, j = string.find(str, "sizeY = ")
- str = string.sub(str,j)
- -- 4 -> sizeY --
- sY=tonumber(str)
- tmpTable[4]=sY
- --print(sY)
- str = file:read()
- i, j = string.find(str, "sizeZ = ")
- str = string.sub(str,j)
- -- 5 -> sizeZ --
- sZ=tonumber(str)
- tmpTable[5]=sZ
- --print(sZ)
- file:read() --Use 0123456789ABCDEFG chars --
- for z=1,sZ do
- matr[z]={}
- file:read() --layer i--
- for y=1,sY do
- matr[z][sY-y+1]={}
- str = file:read()
- for x=1,sX do
- num=string.sub(str,x,x)
- if num == "A" then
- num=10
- elseif num == "B" then
- num=11
- elseif num == "C" then
- num=12
- elseif num == "D" then
- num=13
- elseif num == "E" then
- num=14
- elseif num == "F" then
- num=15
- elseif num == "G" then
- num=16
- else
- num=tonumber(num)
- end
- --io.write(num)
- matr[z][sY-y+1][x]=num
- end
- end
- end
- -- 6 -> the matrix --
- tmpTable[6]=matr
- file:close()
- return tmpTable
- end
- function calculateBlockSum()
- local i, x, y, z
- for i=1,16 do
- blockSum[i]=0
- end
- for z=1,sizeZ do
- for y=1,sizeY do
- for x=1,sizeX do
- if matr[z][y][x] ~= 0 then
- blockSum[matr[z][y][x]] = blockSum[matr[z][y][x]] + 1
- end
- end
- end
- end
- totalSum=0
- for i=1,16 do
- totalSum = totalSum + blockSum[i]
- end
- end
- function buildGUI()
- local i
- local curentSum={}
- local addX,addY=0,0
- IAmReady = true
- term.clear()
- term.setTextColor(colors.white)
- term.setCursorPos(1,1)
- term.write("---------------------------------------")
- term.setTextColor(colors.yellow)
- term.setCursorPos(14,1)
- term.write("[Height=" .. workHeight .. "]")
- term.setTextColor(colors.white)
- for i=1,16 do
- if i>8 and addX==0 then
- addX,addY=20,-8
- end
- curentSum[i]=turtle.getItemCount(i)
- term.setCursorPos(1+addX,2+i+addY)
- term.write(i .. ": ")
- end
- term.setTextColor(colors.lime)
- addX,addY=0,0
- for i=1,16 do
- if i>8 and addX==0 then
- addX,addY=20,-8
- end
- if blockSum[i] == 0 then
- term.setTextColor(colors.gray)
- elseif blockSum[i] > 0 and curentSum[i] == 0 then
- term.setTextColor(colors.red)
- IAmReady = false
- elseif blockSum[i] > 0 and curentSum[i] > 0 then
- term.setTextColor(colors.lime)
- end
- if blockSum[i] > 1 and curentSum[i] == 1 then
- term.setTextColor(colors.yellow)
- end
- term.setCursorPos(4+addX,2+i+addY)
- term.write(string.sub(slotName[i],1,8) .. " ")
- term.write(curentSum[i])
- term.write("/")
- term.write(blockSum[i])
- end
- term.setCursorPos(3,13)
- term.setTextColor(colors.cyan)
- term.write("[ENTER]")
- term.setTextColor(colors.white)
- term.write("-start ")
- term.setTextColor(colors.cyan)
- term.write("[BACKSPACE]")
- term.setTextColor(colors.white)
- term.write("-exit")
- term.setCursorPos(1,12)
- term.setTextColor(colors.white)
- term.write("---------------------------------------")
- term.setCursorPos(10,12)
- term.setTextColor(colors.green)
- term.write("[Build progress:")
- term.write(math.floor ((blockPlaced/totalSum)*100))
- term.write("%]")
- term.setTextColor(colors.white)
- term.setCursorPos(1,1)
- end
- function imFull()
- local i
- local result=true
- local num1, num2
- local res
- for i=1,16 do
- num1=turtle.getItemCount(i)
- num2=turtle.getItemSpace(i)
- if num1 >= blockSum[i] or num2 == 0 then
- res=true
- else
- res=false
- end
- result = result and res
- end
- return result
- end
- function keyWaiting()
- local event,key
- local keyPressed=""
- while true do
- event, key = os.pullEvent()
- if event=="key" then
- --ENTER
- if key == keys.enter then
- if IAmReady == true then
- keyPressed="enter"
- break
- else
- term.setCursorPos(1,12)
- term.setTextColor(colors.white)
- term.write("---------------------------------------")
- term.setCursorPos(3,12)
- term.setTextColor(colors.red)
- term.write(" Not enough build blocks to start! ")
- term.setTextColor(colors.white)
- sleep(5)
- buildGUI()
- end
- end
- --BACKSPACE
- if key == keys.backspace then
- keyPressed="backspace"
- break
- end
- end
- if event=="turtle_inventory" then
- buildGUI()
- --autostart
- if imFull() then
- keyPressed="enter"
- break
- end
- --
- end
- end
- return keyPressed
- end
- function findeNearestPlot(height)
- local x,y
- local res={-1,-1}
- local mindist=math.huge
- local dist=0
- for y=1,sizeY do
- for x=1,sizeX do
- if matr[height][y][x] ~= 0 then
- dist=(x-tX)*(x-tX) + (y-tY)*(y-tY)
- if dist<mindist then
- mindist=dist
- res[1],res[2]=x,y
- end
- end
- end
- end
- return res
- end
- function forceMoveForward()
- local can_move=true
- can_move=turtle.forward()
- while not can_move do
- --print("ERR: There is a something on my way!")
- sleep(0.5)
- --
- turtle.dig()
- turtle.attack()
- --
- can_move=turtle.forward()
- end
- end
- function forceMoveBack()
- local can_move=true
- can_move=turtle.back()
- while not can_move do
- --print("ERR: There is a something on my way!")
- sleep(0.5)
- can_move=turtle.back()
- end
- end
- function forceMoveUp()
- local can_move=true
- can_move=turtle.up()
- while not can_move do
- --print("ERR: There is a something on my way!")
- sleep(0.5)
- --
- turtle.digUp()
- turtle.attackUp()
- --
- can_move=turtle.up()
- end
- end
- function forceMoveDown()
- local can_move=true
- can_move=turtle.down()
- while not can_move do
- --print("ERR: There is a something on my way!")
- sleep(0.5)
- --
- turtle.digDown()
- turtle.attackDown()
- --
- can_move=turtle.down()
- end
- end
- function left()
- if tD[1]==1 and tD[2]==0 then
- tD[1]=0
- tD[2]=-1
- elseif tD[1]==0 and tD[2]==-1 then
- tD[1]=-1
- tD[2]=0
- elseif tD[1]==-1 and tD[2]==0 then
- tD[1]=0
- tD[2]=1
- elseif tD[1]==0 and tD[2]==1 then
- tD[1]=1
- tD[2]=0
- end
- turtle.turnLeft()
- end
- function right()
- if tD[1]==1 and tD[2]==0 then
- tD[1]=0
- tD[2]=1
- elseif tD[1]==0 and tD[2]==1 then
- tD[1]=-1
- tD[2]=0
- elseif tD[1]==-1 and tD[2]==0 then
- tD[1]=0
- tD[2]=-1
- elseif tD[1]==0 and tD[2]==-1 then
- tD[1]=1
- tD[2]=0
- end
- turtle.turnRight()
- end
- function turnL(num1,num2)
- while tD[1]~=num1 or tD[2]~=num2 do
- left()
- end
- end
- function turnR(num1,num2)
- while tD[1]~=num1 or tD[2]~=num2 do
- right()
- end
- end
- function turnB(num1,num2)
- if math.abs(num1-tD[1])==2 then
- turnR(num1,num2)
- elseif math.abs(num2-tD[2])==2 then
- turnL(num1,num2)
- elseif tD[1]==1 then
- if num2==1 then
- turnR(num1,num2)
- elseif num2==-1 then
- turnL(num1,num2)
- end
- elseif tD[1]==-1 then
- if num2==-1 then
- turnR(num1,num2)
- elseif num2==1 then
- turnL(num1,num2)
- end
- elseif tD[2]==1 then
- if num1==-1 then
- turnR(num1,num2)
- elseif num1==1 then
- turnL(num1,num2)
- end
- elseif tD[2]==-1 then
- if num1==1 then
- turnR(num1,num2)
- elseif num1==-1 then
- turnL(num1,num2)
- end
- end
- end
- function moveXYZ(lx,ly,lz)
- local i
- if tZ<lz then
- for i=1,lz-tZ do
- forceMoveUp()
- end
- else
- for i=1,tZ-lz do
- forceMoveDown()
- end
- end
- if tY<ly then
- turnB(1,0)
- for i=1,ly-tY do
- forceMoveForward()
- end
- elseif tY>ly then
- turnB(-1,0)
- for i=1,tY-ly do
- forceMoveForward()
- end
- end
- if tX<lx then
- turnB(0,1)
- for i=1,lx-tX do
- forceMoveForward()
- end
- elseif tX>lx then
- turnB(0,-1)
- for i=1,tX-lx do
- forceMoveForward()
- end
- end
- tX,tY,tZ=lx,ly,lz
- end
- function toBase()
- local z=tZ
- local keyPressed=""
- moveXYZ(1,0,z)
- moveXYZ(1,0,1)
- turnB(1,0)
- buildGUI()
- keyPressed=keyWaiting()
- if keyPressed == "backspace" then
- --return
- error()
- --shell.exit() --rebooting
- end
- end
- function toWork(x,y,z,d)
- moveXYZ(1,0,z)
- moveXYZ(x,y,z)
- turnB(d[1],d[2])
- end
- function placeBlock(x2,y2,z2)
- local num
- local x,y,z,d
- local d={}
- local succes=true
- local slot=1
- slot=matr[z2][y2][x2]
- num=turtle.getItemCount(slot)
- if (num == 0) or (num == 1 and blockSum[slot]>1) then
- -----------work break start
- x,y,z,d[1],d[2]=tX,tY,tZ,tD[1],tD[2]
- toBase()
- toWork(x,y,z,d)
- num=turtle.getItemCount(slot)
- -----------work break end
- end
- if num>0 then
- turtle.select(slot)
- turtle.digDown()
- succes=turtle.placeDown()
- if succes then
- matr[z2][y2][x2] = 0
- blockPlaced = blockPlaced + 1
- blockSum[slot] = blockSum[slot]-1
- buildGUI()
- else
- --cant place block ERR--
- -----------work break start
- x,y,z,d[1],d[2]=tX,tY,tZ,tD[1],tD[2]
- toBase()
- toWork(x,y,z,d)
- -----------work break end
- end
- end
- end
- function buildScheme()
- local i
- local pos={}
- for i=1,sizeZ do
- pos=findeNearestPlot(i)
- while pos[1]~= -1 do
- moveXYZ(pos[1],pos[2],i+1+workHeight)
- placeBlock(pos[1],pos[2],i)
- pos=findeNearestPlot(i)
- end
- end
- end
- function GUIinputHeight()
- local input
- term.clear()
- term.setTextColor(colors.yellow)
- term.setCursorPos(1,6)
- term.write("+-------input the work height:--------+")
- term.setCursorPos(1,7)
- term.write("| |")
- term.setCursorPos(1,8)
- term.write("+-------------------------------------+")
- term.setTextColor(colors.white)
- term.setCursorPos(4,7)
- term.write("Height=")
- input = read()
- input=tonumber(input)
- if input == nil then
- workHeight=0
- else
- workHeight=input
- end
- end
- ----------------------------------------
- --global variables:
- tX,tY,tZ=1,0,1
- tD={1,0}
- sizeX, sizeY, sizeZ = 0,0,0
- matr={}
- readyToBuild = false
- blockPlaced = 0
- inProcess = false
- slotName={}
- blockSum={}
- totalSum=0
- IAmReady = false
- workHeight=0
- --Locals:
- local x,y,z=0,0,0
- local event, key
- local fileName
- local tmpTable={}
- local event,key
- local keyPressed=""
- fileName = GUIopenFile()
- if fileName=="noFile" then
- print(fileName)
- return
- end
- -- 1 -> title --
- -- 2 -> slotsName --
- -- 3 -> sizeX --
- -- 4 -> sizeY --
- -- 5 -> sizeZ --
- -- 6 -> the matrix --
- tmpTable = getInfoFromSchemeFile(fileName)
- for i=1,16 do
- slotName[i] = "block" .. tostring(i)
- if tmpTable[2][i] ~= "" then
- slotName[i] = tmpTable[2][i]
- end
- end
- sizeX = tmpTable[3]
- sizeY = tmpTable[4]
- sizeZ = tmpTable[5]
- matr = tmpTable[6]
- GUIinputHeight()
- --file creating debug
- --createSchemeFile("TEST_XXX.3dp",slotName,sizeX,sizeY,sizeZ,matr)
- calculateBlockSum()
- buildGUI()
- keyPressed=keyWaiting()
- if keyPressed == "backspace" then
- return
- end
- --print(" B U I L D I N G !")
- buildScheme()
- z=tZ
- moveXYZ(1,0,z)
- moveXYZ(1,0,1)
- turnB(1,0)
- buildGUI()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement