Advertisement
Guest User

ComputerCraft Schematic Builder

a guest
Jun 2nd, 2012
6,058
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.65 KB | None | 0 0
  1. -- Made By Orwell
  2. -- version 0.2 - 3 june 2012
  3.  
  4. local tArgs = { ... }
  5. if #tArgs ~= 1 then
  6.   print("Usage: build <gunzipped schematic file>")
  7.   return
  8. end
  9.  
  10. local filename = tArgs[1]
  11.  
  12. if not fs.exists(filename) then
  13.   print("File does not exist.")
  14.   return
  15. end
  16.  
  17. local length = 0
  18. local height = 0
  19. local width = 0
  20. local blocks = {}
  21. local data = {}
  22.  
  23. block_id = {}
  24.  
  25. block_id[0] = "Air"
  26. block_id[1] = "Stone"
  27. block_id[2] = "Grass"
  28. block_id[3] = "Dirt"
  29. block_id[4] = "Cobblestone"
  30. block_id[5] = "Wooden Plank"
  31. block_id[6] = "Sapling"
  32. block_id[7] = "Bedrock"
  33. block_id[8] = "Water"
  34. block_id[9] = "Stationary water"
  35. block_id[10] = "Lava"
  36. block_id[11] = "Stationary lava"
  37. block_id[12] = "Sand"
  38. block_id[13] = "Gravel"
  39. block_id[14] = "Gold Ore"
  40. block_id[15] = "Iron (Ore)"
  41. block_id[16] = "Coal Ore"
  42. block_id[17] = "Log"
  43. block_id[18] = "Leaves"
  44. block_id[19] = "Sponge"
  45. block_id[20] = "Glass"
  46. block_id[21] = "Lapis Lazuli (Ore)"
  47. block_id[22] = "Lapis Lazuli (Block)"
  48. block_id[23] = "Dispenser"
  49. block_id[24] = "Sandstone"
  50. block_id[25] = "Note Block Tile entity"
  51. block_id[26] = "Bed"
  52. block_id[27] = "Powered Rail "
  53. block_id[28] = "Detector Rail "
  54. block_id[29] = "Sticky Piston"
  55. block_id[30] = "Cobweb"
  56. block_id[31] = "Tall Grass"
  57. block_id[32] = "Dead Bush"
  58. block_id[33] = "Piston"
  59. block_id[34] = "Piston Extension"
  60. block_id[35] = "Wool"
  61. block_id[36] = "Block moved by Piston"
  62. block_id[37] = "Dandelionandelion"
  63. block_id[38] = "Rose"
  64. block_id[39] = "Brown Mushroom"
  65. block_id[40] = "Red Mushroom"
  66. block_id[41] = "Block of Gold"
  67. block_id[42] = "Block of Iron"
  68. block_id[43] = "Double Slabs"
  69. block_id[44] = "Slabs"
  70. block_id[45] = "Brick Block"
  71. block_id[46] = "TNT"
  72. block_id[47] = "Bookshelf"
  73. block_id[48] = "Moss Stone"
  74. block_id[49] = "Obsidian"
  75. block_id[50] = "Torch"
  76. block_id[51] = "Fire"
  77. block_id[52] = "Monster Spawner"
  78. block_id[53] = "Wooden Stairs"
  79. block_id[54] = "Chest"
  80. block_id[55] = "Redstone (Wire)"
  81. block_id[56] = "Diamond (Ore)"
  82. block_id[57] = "Block of Diamond"
  83. block_id[58] = "Crafting Table"
  84. block_id[59] = "Seeds"
  85. block_id[60] = "Farland"
  86. block_id[61] = "Furnace"
  87. block_id[62] = "Burning Furnace"
  88. block_id[63] = "Sign Post"
  89. block_id[64] = "Wooden Door"
  90. block_id[65] = "Ladders"
  91. block_id[66] = "Rails"
  92. block_id[67] = "Cobblestone Stairs"
  93. block_id[68] = "Wall Sign"
  94. block_id[69] = "Lever"
  95. block_id[70] = "Stone Pressure Plate"
  96. block_id[71] = "Iron Door"
  97. block_id[72] = "Wooden Pressure Plates"
  98. block_id[73] = "Redstone Ore"
  99. block_id[74] = "Glowing Redstone Ore"
  100. block_id[75] = "Redstone Torch"
  101. block_id[76] = "Redstone Torch"
  102. block_id[77] = "Stone Button "
  103. block_id[78] = "Snow"
  104. block_id[79] = "Ice"
  105. block_id[80] = "Snow Block"
  106. block_id[81] = "Cactus"
  107. block_id[82] = "Clay (Block)"
  108. block_id[83] = "Sugar Cane"
  109. block_id[84] = "Jukebox"
  110. block_id[85] = "Fence"
  111. block_id[86] = "Pumpkin"
  112. block_id[87] = "Netherrack"
  113. block_id[88] = "Soul Sand"
  114. block_id[89] = "Glowstone"
  115. block_id[90] = "Portal"
  116. block_id[91] = "Jack-O-Lantern"
  117. block_id[92] = "Cake Block"
  118. block_id[93] = "Redstone Repeater"
  119. block_id[94] = "Redstone Repeater"
  120. block_id[95] = "Locked Chest"
  121. block_id[96] = "Trapdoors"
  122. block_id[97] = "Hidden Silverfish"
  123. block_id[98] = "Stone Brick"
  124. block_id[99] = "Huge brown and red mushroom"
  125. block_id[100] = "Huge brown and red mushroom"
  126. block_id[101] = "Iron Bars"
  127. block_id[102] = "Glass Pane"
  128. block_id[103] = "Melon"
  129. block_id[104] = "Pumpkin Stem"
  130. block_id[105] = "Melon Stem"
  131. block_id[106] = "Vines"
  132. block_id[107] = "Fence Gate"
  133. block_id[108] = "Brick Stairs"
  134. block_id[109] = "Stone Brick Stairs"
  135. block_id[110] = "Mycelium"
  136. block_id[111] = "Lily Pad"
  137. block_id[112] = "Nether Brick"
  138. block_id[113] = "Nether Brick Fence"
  139. block_id[114] = "Nether Brick Stairs"
  140. block_id[115] = "Nether Wart"
  141. block_id[116] = "Enchantment Table"
  142. block_id[117] = "Brewing Stand"
  143. block_id[118] = "Cauldron"
  144. block_id[119] = "End Portal"
  145. block_id[120] = "End Portal Frame"
  146. block_id[121] = "End Stone "
  147. block_id[256] = "Iron Ingotron Shovel"
  148. block_id[257] = "Iron Pickaxe"
  149. block_id[258] = "Iron Axe"
  150. block_id[259] = "Flint and Steel"
  151. block_id[260] = "Red Apple"
  152. block_id[261] = "Bow"
  153. block_id[262] = "Arrow"
  154. block_id[263] = "Coal"
  155.  
  156. woolColors = {}
  157. woolColors[0] = "White"
  158. woolColors[1] = "Orange"
  159. woolColors[2] = "Magenta"
  160. woolColors[3] = "Light Blue"
  161. woolColors[4] = "Yellow"
  162. woolColors[5] = "Lime"
  163. woolColors[6] = "Pink"
  164. woolColors[7] = "Gray"
  165. woolColors[8] = "Light Gray"
  166. woolColors[9] = "Cyan"
  167. woolColors[10] = "Purple"
  168. woolColors[11] = "Blue"
  169. woolColors[12] = "Brown"
  170. woolColors[13] = "Green"
  171. woolColors[14] = "Red"
  172. woolColors[15] = "Black"
  173.  
  174. function getBlockName(id, blockData)
  175.   blockData = blockData or nil
  176.   if(block_id[id] == nil) then
  177.     return "UNKNOWN"
  178.   else
  179.     if(blockData) then
  180.       if(id == 35) then
  181.         str = woolColors[blockData] .. " " .. block_id[id]
  182.         return str
  183.       end
  184.     end
  185.     return block_id[id]
  186.   end
  187. end
  188.  
  189. function getBlockId(x,y,z)
  190.   return blocks[y + z*width + x*length*width + 1]
  191. end
  192.  
  193. function getData(x,y,z)
  194.   return data[y + z*width + x*length*width + 1]
  195. end
  196.  
  197. function readbytes(h, n)
  198.   for i=1,n do
  199.     h.read()
  200.   end
  201. end
  202.  
  203. function readname(h)  
  204.   n1 = h.read()
  205.   n2 = h.read()
  206.  
  207.   if(n1 == nil or n2 == nil) then
  208.     return ""
  209.   end
  210.  
  211.   n = n1*256 + n2
  212.  
  213.   str = ""
  214.   for i=1,n do
  215.     c = h.read()
  216.     if c == nil then
  217.       return
  218.     end  
  219.     str = str .. string.char(c)
  220.   end
  221.   return str
  222. end
  223.  
  224. function parse(a, h, containsName)
  225.   containsName = containsName or true
  226.   if a==0 then
  227.     return
  228.   end
  229.   if containsName then
  230.     name = readname(h)
  231.   end
  232.    
  233.   if a==1 then
  234.     readbytes(h,1)  
  235.   elseif a==2 then
  236.     i1 = h.read()
  237.     i2 = h.read()
  238.     i = i1*256 + i2
  239.     if(name=="Height") then
  240.       height = i
  241.     elseif (name=="Length") then
  242.       length = i
  243.     elseif (name=="Width") then
  244.       width = i
  245.     end
  246.   elseif a==3 then
  247.     readbytes(h,4)
  248.   elseif a==4 then
  249.     readbytes(h,8)
  250.   elseif a==5 then
  251.     readbytes(h,4)
  252.   elseif a==6 then
  253.     readbytes(h,8)
  254.   elseif a==7 then
  255.     i1 = h.read()
  256.     i2 = h.read()
  257.     i3 = h.read()
  258.     i4 = h.read()
  259.     i = i1*256*256*256 + i2*256*256 + i3*256 + i4
  260.     if name == "Blocks" then
  261.       for i=1,i do
  262.         table.insert(blocks, h.read())
  263.       end
  264.     elseif name == "Data" then
  265.       for i=1,i do
  266.         table.insert(data, h.read())
  267.       end
  268.     else
  269.       readbytes(h,i)
  270.     end
  271.   elseif a==8 then
  272.     i1 = h.read()
  273.     i2 = h.read()
  274.     i = i1*256 + i2
  275.     readbytes(h,i)
  276.   elseif a==9 then
  277.     --readbytes(h,5)
  278.     type = h.read()
  279.     i1 = h.read()
  280.     i2 = h.read()
  281.     i3 = h.read()
  282.     i4 = h.read()
  283.     i = i1*256*256*256 + i2*256*256 + i3*256 + i4
  284.     for j=1,i do
  285.       parse(h.read(), h, false)
  286.     end
  287.   end
  288. end
  289.  
  290. function forward()
  291.   while not turtle.forward() do
  292.     turtle.dig()
  293.   end
  294. end
  295.  
  296. function up()
  297.   while not turtle.up() do
  298.     turtle.digUp()
  299.   end
  300. end
  301.  
  302. function down()
  303.   while not turtle.down() do
  304.     turtle.digDown()
  305.   end
  306. end
  307.  
  308. function place()
  309.   while not turtle.placeDown() do
  310.     turtle.digDown()
  311.   end
  312. end
  313.  
  314. h = fs.open(filename, "rb")
  315.  
  316. a = 0
  317. while (a ~= nil) do
  318.   a = h.read()
  319.   parse(a, h)
  320. end
  321.  
  322. write("length: " .. length)
  323. write("   width: " .. width)
  324. write("   height: " .. height .. "\n")
  325.  
  326. uniqueblocks={}
  327. for i,v in ipairs(blocks) do
  328.   found = false
  329.   for j,w in ipairs(uniqueblocks) do
  330.     -- for now, data is only accounted for when the block is whool
  331.     if (w.blockID==v and (w.data==data[i] or w.blockID ~= 35)) then
  332.       found = true
  333.       w.amount = w.amount + 1
  334.       break
  335.     end
  336.   end
  337.  
  338.   if found==false then
  339.     uniqueblocks[#uniqueblocks+1] = {}
  340.     uniqueblocks[#uniqueblocks].blockID = v
  341.     uniqueblocks[#uniqueblocks].data = data[i]
  342.     uniqueblocks[#uniqueblocks].amount = 1
  343.   end
  344. end
  345.  
  346. print("number of block types: " .. #uniqueblocks)
  347. for i,v in ipairs(uniqueblocks) do
  348.   if (i%9)==0 then
  349.     read()
  350.   end
  351.   print(" -" .. getBlockName(v.blockID, v.data) .. ": " .. v.amount)
  352. end
  353.  
  354. read()
  355.  
  356. print("Give the numbers of all slots containing the specified block type:")
  357.  
  358. slots={}
  359. for i,block in ipairs(uniqueblocks) do
  360.   blockData = block.data
  361.   print(" -in which slots is " .. getBlockName(block.blockID, blockData) .. "?")
  362.   if not slots[block.blockID] then
  363.     slots[block.blockID] = {}
  364.   end
  365.   slots[block.blockID][blockData] = {}
  366.   write("   ")
  367.   str = read()
  368.   for i = 1, #str do
  369.     local c = str:sub(i,i)
  370.     n = tonumber(c)
  371.     if(n) then
  372.       if(n>0 and n<10) then
  373.         table.insert(slots[block.blockID][blockData], n)
  374.       end
  375.     end
  376.   end
  377. end
  378.  
  379. print("Press key to start building...")
  380. read()
  381.  
  382. up()
  383. n = 1
  384. turtle.select(n)
  385.  
  386. for x=1,height do
  387.   for y=1,width do
  388.     for z=1,length do
  389.       blockID = getBlockId(x-1,y-1,z-1)
  390.       blockData = getData(x-1,y-1,z-1)
  391.       forward()
  392.       turtle.digDown()
  393.       slot_lst = slots[blockID][blockData]
  394.       if(slot_lst ~= nil) then
  395.         if(#slot_lst > 0) then
  396.           local found=false
  397.           for i,v in ipairs(slot_lst) do
  398.             if(turtle.getItemCount(v) > 0) then
  399.               found=true
  400.               turtle.select(v)
  401.               break
  402.             end
  403.           end
  404.           if not found then
  405.             print("Not enough " .. getBlockName(blockID, blockData) .. ". Please refill...")
  406.             read()
  407.           end
  408.           place()
  409.         end
  410.       end
  411.     end
  412.     turtle.turnLeft()
  413.     forward()
  414.     turtle.turnLeft()
  415.     for i=1,length do
  416.       forward()
  417.     end
  418.     turtle.turnRight()
  419.     turtle.turnRight()
  420.   end
  421.   turtle.turnRight()
  422.   for i=1,width do
  423.     forward()
  424.   end
  425.   turtle.turnLeft()
  426.   up()
  427. end
  428.  
  429. for i=1,height+1 do
  430.   down()
  431. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement