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