View difference between Paste ID: aCeP5uTT and 9e1Y9FCM
SHOW: | | - or go back to the newest paste.
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