View difference between Paste ID: 0gjBQHk9 and 9e1Y9FCM
SHOW: | | - or go back to the newest paste.
1
-- Made By Orwell
2
-- version 0.2 - 3 june 2012
3
--local type
4
5
function save(name,table)
6
	local h = fs.open(name,"w")
7
	table = textutils.serialize(table)
8
	h.write(table)
9
	h.close()
10
end
11
12
13
local block_id = {}
14
15
block_id[0] = "Air"
16
block_id[1] = "Stone"
17
block_id[2] = "Grass"
18
block_id[3] = "Dirt"
19
block_id[4] = "Cobblestone"
20
block_id[5] = "Wooden Plank"
21
block_id[6] = "Sapling"
22
block_id[7] = "Bedrock"
23-
block_id = {}
23+
24
block_id[9] = "Stationary water"
25
block_id[10] = "Lava"
26
block_id[11] = "Stationary lava"
27
block_id[12] = "Sand"
28
block_id[13] = "Gravel"
29
block_id[14] = "Gold Ore"
30
block_id[15] = "Iron (Ore)"
31
block_id[16] = "Coal Ore"
32
block_id[17] = "Log"
33
block_id[18] = "Leaves"
34
block_id[19] = "Sponge"
35
block_id[20] = "Glass"
36
block_id[21] = "Lapis Lazuli (Ore)"
37
block_id[22] = "Lapis Lazuli (Block)"
38
block_id[23] = "Dispenser"
39
block_id[24] = "Sandstone"
40
block_id[25] = "Note Block Tile entity"
41
block_id[26] = "Bed"
42
block_id[27] = "Powered Rail "
43
block_id[28] = "Detector Rail "
44
block_id[29] = "Sticky Piston"
45
block_id[30] = "Cobweb"
46
block_id[31] = "Tall Grass"
47
block_id[32] = "Dead Bush"
48
block_id[33] = "Piston"
49
block_id[34] = "Piston Extension"
50
block_id[35] = "Wool"
51
block_id[36] = "Block moved by Piston"
52
block_id[37] = "Dandelionandelion"
53
block_id[38] = "Rose"
54
block_id[39] = "Brown Mushroom"
55
block_id[40] = "Red Mushroom"
56
block_id[41] = "Block of Gold"
57
block_id[42] = "Block of Iron"
58
block_id[43] = "Double Slabs"
59
block_id[44] = "Slabs"
60
block_id[45] = "Brick Block"
61
block_id[46] = "TNT"
62
block_id[47] = "Bookshelf"
63
block_id[48] = "Moss Stone"
64
block_id[49] = "Obsidian"
65
block_id[50] = "Torch"
66
block_id[51] = "Fire"
67
block_id[52] = "Monster Spawner"
68
block_id[53] = "Wooden Stairs"
69
block_id[54] = "Chest"
70
block_id[55] = "Redstone (Wire)"
71
block_id[56] = "Diamond (Ore)"
72
block_id[57] = "Block of Diamond"
73
block_id[58] = "Crafting Table"
74
block_id[59] = "Seeds"
75
block_id[60] = "Farland"
76
block_id[61] = "Furnace"
77
block_id[62] = "Burning Furnace"
78
block_id[63] = "Sign Post"
79
block_id[64] = "Wooden Door"
80
block_id[65] = "Ladders"
81
block_id[66] = "Rails"
82
block_id[67] = "Cobblestone Stairs"
83
block_id[68] = "Wall Sign"
84
block_id[69] = "Lever"
85
block_id[70] = "Stone Pressure Plate"
86
block_id[71] = "Iron Door"
87
block_id[72] = "Wooden Pressure Plates"
88
block_id[73] = "Redstone Ore"
89
block_id[74] = "Glowing Redstone Ore"
90
block_id[75] = "Redstone Torch"
91
block_id[76] = "Redstone Torch"
92
block_id[77] = "Stone Button "
93
block_id[78] = "Snow"
94
block_id[79] = "Ice"
95
block_id[80] = "Snow Block"
96
block_id[81] = "Cactus"
97
block_id[82] = "Clay (Block)"
98
block_id[83] = "Sugar Cane"
99
block_id[84] = "Jukebox"
100
block_id[85] = "Fence"
101
block_id[86] = "Pumpkin"
102
block_id[87] = "Netherrack"
103
block_id[88] = "Soul Sand"
104
block_id[89] = "Glowstone"
105
block_id[90] = "Portal"
106
block_id[91] = "Jack-O-Lantern"
107
block_id[92] = "Cake Block"
108
block_id[93] = "Redstone Repeater"
109
block_id[94] = "Redstone Repeater"
110
block_id[95] = "Locked Chest"
111
block_id[96] = "Trapdoors"
112
block_id[97] = "Hidden Silverfish"
113
block_id[98] = "Stone Brick"
114
block_id[99] = "Huge brown and red mushroom"
115
block_id[100] = "Huge brown and red mushroom"
116
block_id[101] = "Iron Bars"
117
block_id[102] = "Glass Pane"
118
block_id[103] = "Melon"
119
block_id[104] = "Pumpkin Stem"
120
block_id[105] = "Melon Stem"
121
block_id[106] = "Vines"
122
block_id[107] = "Fence Gate"
123
block_id[108] = "Brick Stairs"
124
block_id[109] = "Stone Brick Stairs"
125
block_id[110] = "Mycelium"
126
block_id[111] = "Lily Pad"
127
block_id[112] = "Nether Brick"
128
block_id[113] = "Nether Brick Fence"
129
block_id[114] = "Nether Brick Stairs"
130
block_id[115] = "Nether Wart"
131
block_id[116] = "Enchantment Table"
132
block_id[117] = "Brewing Stand"
133
block_id[118] = "Cauldron"
134
block_id[119] = "End Portal"
135
block_id[120] = "End Portal Frame"
136
block_id[121] = "End Stone "
137
block_id[256] = "Iron Ingotron Shovel"
138
block_id[257] = "Iron Pickaxe"
139
block_id[258] = "Iron Axe"
140
block_id[259] = "Flint and Steel"
141
block_id[260] = "Red Apple"
142
block_id[261] = "Bow"
143
block_id[262] = "Arrow"
144
block_id[263] = "Coal"
145
146
local woolColors = {}
147
woolColors[0] = "White"
148
woolColors[1] = "Orange"
149
woolColors[2] = "Magenta"
150
woolColors[3] = "Light Blue"
151
woolColors[4] = "Yellow"
152
woolColors[5] = "Lime"
153
woolColors[6] = "Pink"
154
woolColors[7] = "Gray"
155
woolColors[8] = "Light Gray"
156-
woolColors = {}
156+
157
woolColors[10] = "Purple"
158
woolColors[11] = "Blue"
159
woolColors[12] = "Brown"
160
woolColors[13] = "Green"
161
woolColors[14] = "Red"
162
woolColors[15] = "Black"
163
164
--[[
165
local tArgs = { ... }
166
if #tArgs ~= 1 then
167
  print("Usage: build <gunzipped schematic file>")
168
  return
169
end
170
171
local filename = tArgs[1]
172
173
if not fs.exists(filename) then
174
  print("File does not exist.")
175
  return
176
end
177
]]--
178
179
180
local length = 0
181
local height = 0
182
local width = 0
183
local blocks = {}
184
local data = {}
185
186
function getBlockName(id, blockData)
187
  blockData = blockData or nil
188
  if(block_id[id] == nil) then
189
    return "UNKNOWN"
190
  else
191
    if(blockData) then
192
      if(id == 35) then
193
        str = woolColors[blockData] .. " " .. block_id[id]
194
        return str
195
      end
196
    end
197
    return block_id[id]
198
  end
199
end
200
201
function getBlockId(x,y,z)
202
  return blocks[y + z*width + x*length*width + 1]
203
end
204-
  n1 = h.read()
204+
205-
  n2 = h.read()
205+
206
  return data[y + z*width + x*length*width + 1]
207
end
208
209
function readbytes(h, n)
210
  for i=1,n do
211-
  n = n1*256 + n2
211+
212
  end
213-
  str = ""
213+
214
215-
    c = h.read()
215+
216
  local n1 = h.read()
217
  local n2 = h.read()
218
219
  if(n1 == nil or n2 == nil) then
220
    return ""
221
  end
222
  
223
  local n = n1*256 + n2
224
  
225-
  containsName = containsName or true
225+
  local str = ""
226
  for i=1,n do
227
    local c = h.read()
228
    if c == nil then
229
      return
230
    end  
231
    str = str .. string.char(c)
232
  end
233
  return str
234
end
235
236
function parse(a, h, containsName)
237
  local containsName = containsName or true
238
  local i,i1,i2,i3,i4
239
  if a==0 then
240
    return
241
  end
242
  if containsName then
243
    name = readname(h)
244
  end
245
    
246
  if a==1 then
247
    readbytes(h,1)  
248
  elseif a==2 then
249
    i1 = h.read()
250
    i2 = h.read()
251
    i = i1*256 + i2
252
    if(name=="Height") then
253
      height = i
254
    elseif (name=="Length") then
255
      length = i
256
    elseif (name=="Width") then
257
      width = i
258
    end
259
  elseif a==3 then
260
    readbytes(h,4)
261
  elseif a==4 then
262
    readbytes(h,8)
263
  elseif a==5 then
264
    readbytes(h,4)
265
  elseif a==6 then
266
    readbytes(h,8)
267
  elseif a==7 then
268
    i1 = h.read()
269
    i2 = h.read()
270
    i3 = h.read()
271
    i4 = h.read()
272
    i = i1*256*256*256 + i2*256*256 + i3*256 + i4
273
    if name == "Blocks" then
274
      for i=1,i do
275
        table.insert(blocks, h.read())
276
      end
277
    elseif name == "Data" then
278-
  	type = h.read()
278+
279
        table.insert(data, h.read())
280
      end
281
    else
282
      readbytes(h,i)
283
    end
284
  elseif a==8 then
285
    i1 = h.read()
286
    i2 = h.read()
287
    i = i1*256 + i2
288
    readbytes(h,i)
289
  elseif a==9 then
290
  	--readbytes(h,5)
291
  	local type = h.read()
292
  	i1 = h.read()
293
    i2 = h.read()
294
    i3 = h.read()
295
    i4 = h.read()
296
    i = i1*256*256*256 + i2*256*256 + i3*256 + i4
297
    for j=1,i do
298
      parse(h.read(), h, false)
299
    end
300
  end
301
end
302
303
function forward()
304
  while not turtle.forward() do
305
    turtle.dig()
306
  end
307
end
308
309
function up()
310
  while not turtle.up() do
311
    turtle.digUp()
312
  end
313
end
314-
h = fs.open(filename, "rb")
314+
315
function down()
316-
a = 0
316+
317-
while (a ~= nil) do
317+
318-
  a = h.read()
318+
319-
  parse(a, h)
319+
320
321
function place()
322-
write("length: " .. length)
322+
323-
write("   width: " .. width)
323+
324-
write("   height: " .. height .. "\n")
324+
325
end
326-
uniqueblocks={}
326+
327-
for i,v in ipairs(blocks) do
327+
328-
  found = false
328+
function setup(filename)
329-
  for j,w in ipairs(uniqueblocks) do
329+
--input file
330-
    -- for now, data is only accounted for when the block is whool
330+
--returns blocks,data
331-
    if (w.blockID==v and (w.data==data[i] or w.blockID ~= 35)) then
331+
--requires parse, getBlockName
332-
      found = true
332+
	if not fs.exists(filename) then
333-
      w.amount = w.amount + 1
333+
  		error("File "..tostring(filename).." does not exist.")
334-
      break
334+
	end
335
	h = fs.open(filename, "rb")
336
337
	a = 0
338-
  if found==false then
338+
	while (a ~= nil) do
339-
    uniqueblocks[#uniqueblocks+1] = {}
339+
 		a = h.read()
340-
    uniqueblocks[#uniqueblocks].blockID = v
340+
  		parse(a, h)
341-
    uniqueblocks[#uniqueblocks].data = data[i]
341+
	end
342-
    uniqueblocks[#uniqueblocks].amount = 1
342+
343
	write("length: " .. length)
344
	write("   width: " .. width)
345
	write("   height: " .. height .. "\n")
346-
print("number of block types: " .. #uniqueblocks)
346+
	
347-
for i,v in ipairs(uniqueblocks) do
347+
	uniqueblocks={}
348-
  if (i%9)==0 then
348+
	for i,v in ipairs(blocks) do
349-
    read()
349+
  		found = false
350
  		for j,w in ipairs(uniqueblocks) do
351-
  print(" -" .. getBlockName(v.blockID, v.data) .. ": " .. v.amount)
351+
352
			--[[if (w.blockID==v and (w.data==data[i] or w.blockID ~= 35)) then
353
      			found = true
354
      			w.amount = w.amount + 1
355
      			break
356-
print("Give the numbers of all slots containing the specified block type:")
356+
    		end]]--
357
358-
slots={}
358+
    		--for now, data is only accounted for when the block is whool
359-
for i,block in ipairs(uniqueblocks) do
359+
    		if (w.blockID==v) and (w.data==data[i]) then
360-
  blockData = block.data
360+
      			found = true
361-
  print(" -in which slots is " .. getBlockName(block.blockID, blockData) .. "?")
361+
      			w.amount = w.amount + 1
362-
  if not slots[block.blockID] then
362+
      			break
363-
    slots[block.blockID] = {}
363+
    		end
364
			
365-
  slots[block.blockID][blockData] = {}
365+
			
366-
  write("   ")
366+
367-
  str = read()
367+
368-
  for i = 1, #str do
368+
  		end
369-
    local c = str:sub(i,i)
369+
370-
    n = tonumber(c)
370+
  		if found==false then
371-
    if(n) then
371+
    		uniqueblocks[#uniqueblocks+1] = {}
372-
      if(n>0 and n<10) then
372+
    		uniqueblocks[#uniqueblocks].blockID = v
373-
        table.insert(slots[block.blockID][blockData], n)
373+
    		uniqueblocks[#uniqueblocks].data = data[i]
374
    		uniqueblocks[#uniqueblocks].amount = 1
375
  		end
376
	end
377
378
	print("number of block types: " .. #uniqueblocks)
379
	for i,v in ipairs(uniqueblocks) do
380
  		if (i%9)==0 then
381
    		read()
382
  		end
383
  		print(" -" .. getBlockName(v.blockID, v.data) .. ": " .. v.amount)
384
	end
385
386
	read()
387
388
	print("Give the numbers of all slots containing the specified block type:")
389
390
	slots={}
391
	for i,block in ipairs(uniqueblocks) do
392
  		blockData = block.data
393
  		print(" -in which slots is " .. getBlockName(block.blockID, blockData) .. "?")
394
  		if not slots[block.blockID] then
395
    		slots[block.blockID] = {}
396
  		end
397
  		slots[block.blockID][blockData] = {}
398
  		write("   ")
399
  		str = read()
400
  		for i = 1, #str do
401
    		local c = str:sub(i,i)
402
    		n = tonumber(c)
403
    		if(n) then
404
      			if(n>0 and n<10) then
405
        			table.insert(slots[block.blockID][blockData], n)
406
      			end
407
   			end
408
  		end
409
	end
410
	
411
	h.close()
412
	save("slots",slots)
413
	save("blocks",blocks)
414
	save("data",data)
415
	save("uniqueblocks",uniqueblocks)
416
end
417
418
419
setup(...)
420
-- [[ Iterators ]] --
421
422
function checkIfAir()
423
	--finds the location to place the next block
424
    while true do
425
	x,y,z = iterate(x,y,z,startx,starty,startz,height-1,width-1,length-1)
426
		--makes the turtle build faster by having to travel less
427
        blockID2 = getBlockId(x,y,z)	-- temporary variable 
428
        blockData2 = getData(x,y,z) 	-- temporary variable
429
        if slots[blockID2] then
430
			-- makes sure the next block to place at location is not air
431-
end
431+
            slot_2nd = slots[blockID2][blockData2]
432
            if slot_2nd then
433
                if #slot_2nd > 0 then
434
                    recordObj(x,y,z)
435
                    break
436
                end
437
            end
438
        end
439
    end
440
end
441
442
function check(x,y,z,startx,starty,startz)
443
    if x%2==startx%2 then
444
        oddx = true
445
        if y%2==starty%2 then
446
            oddy = true
447
        else
448
            oddy = false
449
        end
450
    else
451
        oddx = false
452
        if y%2==starty%2 then
453
            oddy = false
454
        else
455
            oddy = true
456
        end
457
    end
458
	return oddx,oddy
459
end
460
461
462
function Yiterate(x,y,z,startx,starty,startz,finalx,finaly,finalz)
463
	
464
	local height = finalx
465
	local width = finaly
466
	local length = finalz
467
	
468
    if oddx then
469
        if y < width then
470
            y = y + 1
471
        elseif y == width then
472
            if x < height then
473
                x = x + 1
474
            --elseif x == height then
475
                --x,y,z = "max","max","max"
476
            end
477
        end
478
    else
479
        if y <= starty then
480
            if x < height then
481
                x = x + 1
482
			elseif x == height then
483
				x = "max"
484
				y = "max"
485
				z = "max"
486
            end
487
        else
488
            y=y-1
489
        end
490
    end
491
	return x,y,z
492
end
493
494
function iterate(x,y,z,startx,starty,startz,finalx,finaly,finalz) 
495
	
496
	local height = finalx
497
	local width = finaly
498
	local length = finalz
499
	
500
	
501
    local oddx,oddy = check(x,y,z,startx,starty,startz)
502
    if z == length and oddy then
503
        x,y,z = Yiterate(x,y,z,startx,starty,startz,finalx,finaly,finalz)    
504
    elseif z == startz and oddy then
505
        z = z + 1
506
    elseif z == startz and (not oddy) then
507
        x,y,z = Yiterate(x,y,z,startx,starty,startz,finalx,finaly,finalz)
508
    elseif z==length and (not oddy) then
509
        z = z - 1
510
511
    elseif z < length then
512
        if oddy then
513
            z = z + 1
514
        else
515
            z = z - 1
516
        end
517
    end
518
	return x,y,z
519
 end
520
521
522
-- [[ schematic --> blueprint ]] --
523
524
--turtles[i].instructions[n] = {x,y,z,id,data}
525
--i = multiturtle ie 1,2,3,4 ; n = step ie 1 - 256 (no air) 
526
527
--fn splits 16x16 grid between 4 turtles returning startx,y,z and endx,y,z of 4 4x4 grids
528
--fn takes each 4x4 grid and turns them into instructions[n] = {x,y,z,id,data}
529
--fn for master turtle to setup all slave turtles with the instructions[n] table and goto/find/place functions
530
531
532
function blueprint()
533
	--uses iterator to make instructions[n] table
534
	local x,y,z = 0,0,0
535
	local instructions = {}
536
	while true do
537
		if x == "max" then
538
			break
539
		end
540
		local id = getBlockId(x,y,z)
541
		local data = getData(x,y,z)
542
		if id > 0 then
543
			table.insert(instructions,{x,y,z,id,data})
544
		end
545
		x,y,z = iterate(x,y,z,0,0,0,height-1,width-1,length-1)
546
	end
547
	return instructions
548
end
549
550
551
function createInstructions(startx,starty,startz,height,width,length,nTurtles,placeMode)
552
553
	 local x,y,z = startx,starty,startz
554
	 instructions = {}
555
	 nTurtles = nTurtles or 1
556
	 --startx,starty,startz = startx,starty,startz or 0,0,0
557
	 placeMode = placeMode or "horizontal"
558
	 local oTurtles = {}
559
	
560
	--if horizontal
561
	for i = 1,nTurtles do
562
		oTurtles[i] = {}
563
		if i == tonumber(nTurtles) then
564
			oTurtles[tonumber(nTurtles)].responsibleLength = math.floor(x/nTurtles) + (x - (math.floor(x/nTurtles)*nTurtles))
565
		else
566
			oTurtles[i].responsibleLength =  math.floor(x/nTurtles)
567
		end
568
		oTurtles[i].startHeight = startx
569
		if i == 1 then
570
			oTurtles[i].startWidth = starty
571
		else
572
			oTurtles[i].startWidth = oTurtles[i-1].startWidth + oTurtles[i].responsibleLength
573
		end
574
		oTurtles[i].startLength = startz
575
		oTurtles[i].finalHeight = height-1
576
		oTurtles[i].finalWidth = oTurtles[i].startWidth + oTurtles[i].responsibleLength - 1
577
		oTurtles[i].finalLength = length-1
578
		instructions[i] = {}
579
	end
580
	
581
	
582
583
		for i = 1,nTurtles do
584
			x,y,z = startx,starty,startz
585
			
586
			
587
			while true do
588
				local n = #instructions[i]+1
589
				instructions[i][n]={}
590
				instructions[i][n].x,instructions[1][n].y,instructions[1][n].z = x,y,z
591
				instructions[i][n].placeMode = placeMode
592
				instructions[i][n].id = getBlockId(x,y,z)
593
				instructions[i][n].data = getData(x,y,z)
594
				x,y,z = iterate(x,y,z,
595
					oTurtles[i].startHeight, oTurtles[i].startWidth, oTurtles[i].startLength,
596
					oTurtles[i].finalHeight, oTurtles[i].finalWidth, oTurtles[i].finalLength
597
				)
598
				--attach methods here
599
			end
600
			
601
			
602
		end
603
	return instructions
604
end
605
606
local ins = blueprint()
607
save("instructions",ins)
608
609
--[[
610
print("Press key to start building...")
611
read()
612
613
up()
614
n = 1
615
turtle.select(n)
616
617
for x=1,height do
618
  for y=1,width do
619
    for z=1,length do
620
      blockID = getBlockId(x-1,y-1,z-1)
621
      blockData = getData(x-1,y-1,z-1)
622
      forward()
623
      turtle.digDown()
624
      slot_lst = slots[blockID][blockData]
625
      if(slot_lst ~= nil) then
626
        if(#slot_lst > 0) then
627
          local found=false
628
          for i,v in ipairs(slot_lst) do
629
            if(turtle.getItemCount(v) > 0) then
630
              found=true
631
              turtle.select(v)
632
              break
633
            end
634
          end
635
          if not found then
636
            print("Not enough " .. getBlockName(blockID, blockData) .. ". Please refill...")
637
            read()
638
          end
639
          place()
640
        end
641
      end
642
    end
643
    turtle.turnLeft()
644
    forward()
645
    turtle.turnLeft()
646
    for i=1,length do
647
      forward()
648
    end
649
    turtle.turnRight()
650
    turtle.turnRight()
651
  end
652
  turtle.turnRight()
653
  for i=1,width do
654
    forward()
655
  end
656
  turtle.turnLeft()
657
  up()
658
end
659
660
for i=1,height+1 do
661
  down()
662
end]]