View difference between Paste ID: 9wzLtnMM and bx2dfYrR
SHOW: | | - or go back to the newest paste.
1
--
2
-- OptimineMgr
3
-- Bench test for mining Turtles
4
-- ComputerCraft 1.78
5
-- Require Command Computer 
6
-- 
7
-- author: SukaiPoppuGo
8
-- licence: CC BY-NC-SA 4.0
9
-- https://creativecommons.org/licenses/by-nc-sa/4.0/
10
--
11
12
if not commands then
13
	error("OptimineMgr require a Command Computer",-1)
14
	return
15
end
16
17
local settingsFile = "/.settings"
18
debugMode = true
19
turtleID = false
20
21
tw,th = term.getSize()
22
local sep = string.rep(string.char(131),tw-1)
23
local function setColor(fg,bg,m)
24
	m = m or term
25
	m.setTextColor(fg) m.setBackgroundColor(bg)
26
end
27
local com_x,com_y,com_z = commands.getBlockPosition()
28
local function sound_click()
29
	if _HOST=="ComputerCraft 1.78 (Minecraft 1.8.9)" then
30
		commands.playsound("gui.button.press","@p",com_x,com_y,com_z,0.1,0.6,0)
31
	end
32
end
33
34
if not os.getComputerLabel() then os.setComputerLabel("OptimineMgr") end
35
outputPad = string.len(string.format("#%d %s",os.getComputerID(),os.getComputerLabel()))+2
36
function output(str)
37
	if string.len(str) < tw - outputPad then
38
		str = str..string.rep(" ",tw-outputPad)
39
	elseif string.len(str) > tw - outputPad then
40
		str = string.sub(str,1,tw-outputPad)
41
	end
42
	term.setCursorPos(outputPad,1)
43
	setColor(colors.gray, colors.black)
44
	term.write(str)
45
end
46
47
function header()
48
	term.setCursorPos(1,1)
49
	term.clear()
50
	setColor(colors.lightGray,colors.black)
51
	print(string.format("#%d %s",os.getComputerID(),os.getComputerLabel()))
52
	print(sep)
53
end
54
55
header()
56
57
--init Turtle
58
local function giveTurtle(id)
59
	output("Give Turtle with ID: #"..id) --#
60
	commands.give("@p","computercraft:CC-TurtleAdvanced",1,0,"{"
61
.."fuelLevel:"..(opt.turtleFuelLevel and opt.turtleFuelLevel or "100000")..","
62
..(opt.turtleEquipLeft and "leftUpgrade:\""..opt.turtleEquipLeft.."\"," or "leftUpgrade:\"minecraft:diamond_pickaxe\",")
63
..(opt.turtleEquipRight and "rightUpgrade:\""..opt.turtleEquipRight.."\"," or "")
64
.."label:\"OptiMiner\","
65
.."computerID:"..id..","
66
.."id:\"turtleadv\"}")
67
end
68
local function initTurtleID()
69
	output("Init new Turtle") --#
70
	commands.setBlock(com_x,com_y+1,com_z,"computercraft:CC-TurtleAdvanced",0,"replace")
71
	sleep(.3)
72
	local t = peripheral.wrap("top")
73
	sleep(.3)
74
	t.turnOn()
75
	sleep(.3)
76
	turtleID = t.getID()
77
	output("New Turtle ID: #"..turtleID) --#
78
	commands.setBlock(com_x,com_y+1,com_z,"minecraft:air",0,"replace")
79
	settings.set("OptiMiner.turtleID",turtleID)
80
	settings.save(settingsFile)
81
	return turtleID
82
end
83
if fs.exists(settingsFile) then
84
	output("Load settings: "..settingsFile) --#
85
	settings.load(settingsFile)
86
	if not turtleID then
87
		turtleID = settings.get("OptiMiner.turtleCustomID",settings.get("OptiMiner.turtleID"))
88
	end
89
elseif not turtleID then
90
	giveTurtle(initTurtleID())
91
end
92
93
94
-- src: http://minecraft.gamepedia.com/Chunk_format#Mobs
95
--types:
96
-- Item, XPOrb
97
-- Blaze,CaveSpider,Creeper,Enderman,Ghast,Guardian,LavaSlime,PigZombie,Silverfish,Skeleton,Slime,Spider,Witch,Zombie
98
-- Bat,Chicken,Cow,EntityHorse,MushroomCow,Ozelot,Pig,Rabbit,Sheep,Squid,Wolf
99
local function kill(chunk,...)
100
	local entities= {...} or {"!Player"}
101
	local pos = ""
102
	if chunk then
103
		pos = string.format("x=%d,y=%d,z=%d,dx=%d,dy=%d,dz=%d,",
104
		chunk.x-1,chunk.y-1,chunk.z-1,16,16,16)
105
	end
106
	--summon LightningBolt
107
	local _,_e
108
	for _,_e in pairs(entities) do
109
		output("Killing Entity: type=".._e) --#
110
		commands.kill("@e["..pos.."type=".._e.."]")
111
		sleep(.1)
112
	end
113
end
114
115
output("Locate target chunk") --#
116
local targetChunk = {
117
	x = com_x+16 - (com_x%16),
118
	y = com_y,
119
	z = com_z - (com_z%16),
120
}
121
122
output("Locate ref chunk") --#
123
local refChunk = {
124
	x = targetChunk.x,
125
	y = targetChunk.y - 17,
126
	z = targetChunk.z,
127
}
128
function fillChunk(chunk,blockName)
129
	blockName = blockName or "minecraft:stone"
130
	commands.fill(chunk.x,chunk.y,chunk.z,chunk.x+15,chunk.y+15,chunk.z+15,blockName)
131
end
132
133
function clearChunk(chunk)
134
	output("Clear chunk") --#
135
	kill(chunk,"!Player","Item")
136
	fillChunk(chunk,"minecraft:air")
137
end
138
139
function markChunk(chunk,blockName)
140
	output("Mark chunk corners with: "..blockName) --#
141
	commands.setblock(chunk.x,   chunk.y,   chunk.z,   blockName,0,"replace")
142
	commands.setblock(chunk.x,   chunk.y+15,chunk.z,   blockName,0,"replace")
143
	commands.setblock(chunk.x,   chunk.y,   chunk.z+15,blockName,0,"replace")
144
	commands.setblock(chunk.x,   chunk.y+15,chunk.z+15,blockName,0,"replace")
145
	commands.setblock(chunk.x+15,chunk.y,   chunk.z,   blockName,0,"replace")
146
	commands.setblock(chunk.x+15,chunk.y+15,chunk.z,   blockName,0,"replace")
147
	commands.setblock(chunk.x+15,chunk.y,   chunk.z+15,blockName,0,"replace")
148
	commands.setblock(chunk.x+15,chunk.y+15,chunk.z+15,blockName,0,"replace")
149
end
150
151
function ore(x,y,z,base)
152
	local seed = math.random(16)
153
	local oreType
154
	if seed > 14 and y-base < 6 then oreType = "minecraft:diamond_ore"
155
	elseif seed > 12 and y-base < 6 then oreType = "minecraft:lapis_ore"
156
	elseif seed > 10 and y-base < 8 then oreType = "minecraft:redstone_ore"
157
	elseif seed > 10 and y-base < 10 then oreType = "minecraft:gold_ore"
158
	elseif seed > 8 and y-base < 12 then oreType = "minecraft:iron_ore"
159
	else oreType = "minecraft:coal_ore" end
160
	commands.fill(x,y,z,x+1,y+1,z+1,oreType,0,"replace")
161
	local _x,_y,_z
162
	for _x=0,1 do for _y=0,1 do for _z=0,1 do
163
		local chance = (seed+_x+_y+_z)%3
164
		if chance==0 then
165
			commands.setblock(x+_x,y+_y,z+_z,"minecraft:stone",0,"replace")
166
		end
167
	end end end
168
end
169
170
function ore_populate(chunk)
171
	output("Populate ores") --#
172
	local _x,_y,_z
173
	for _x=1,13 do for _y=0,12 do for _z=1,13 do
174
		output("Populate ores"..string.rep(".",_x%6)) --#
175
		if math.random(100)==1 then
176
			ore(chunk.x+_x,chunk.y+_y,chunk.z+_z,chunk.y)
177
			sleep(.1)
178
		end
179
	end end end
180
	commands.setblock(
181
		chunk.x+1+math.random(13),
182
		chunk.y+1+math.random(7),
183
		chunk.z+1+math.random(13),
184
		"minecraft:emerald_ore",0,"replace")
185
end
186
187
stoneDataValues = {0,1,3,5}
188
function bubble(x,y,z, blockType, dataValue)
189
	local seed = math.random(16)
190
	local v = seed%3
191
	dataValue = dataValue or 0
192
	if not blockType then
193
		blockType = "minecraft:stone"
194
		if seed < 4 then blockType = "minecraft:gravel"
195
		elseif seed < 12 then blockType = "minecraft:dirt"
196
		else dataValue = stoneDataValues[(seed%4)+1]
197
		end
198
	end
199
	commands.fill(x+1,y,z+1,x+1+v,y+1+(v*2),z+1+v,blockType,dataValue,"replace")
200
	commands.fill(x,y+1,z+1,x+1+(v*2),y+1+v,z+1+v,blockType,dataValue,"replace")
201
	commands.fill(x+1,y+1,z,x+1+v,y+1+v,z+1+(v*2),blockType,dataValue,"replace")
202
end
203
204
function dirt_populate(chunk)
205
	output("Populate dirt") --#
206
	local skip,_x,_y,_z=false
207
	for _x=1,10 do for _y=0,9 do for _z=1,10 do
208
		output("Populate dirt"..string.rep(".",_x%5)) --#
209
		if not skip and math.random(60)==1 then
210
			bubble(chunk.x+_x,chunk.y+_y,chunk.z+_z)
211
			sleep(.1)
212
			skip = true
213
		end
214
		skip = false
215
	end end end
216
end
217
218
function hole_populate(chunk)
219
	output("Populate holes") --#
220
	local nb,i = math.random(2,8)
221
	for i=1,nb do
222
		local _x,_y,_z= math.random(2,9), math.random(1,9), math.random(2,9)
223
		bubble(chunk.x+_x,chunk.y+_y,chunk.z+_z,"minecraft:air")
224
		sleep(.1)
225
	end
226
end
227
228
function lava_lake(x,y,z,chunk)
229
	output("Generate lava lake") --#
230
	local space_x,space_z = (chunk.x+15-x), (chunk.z+15-z)
231
	local heigth = math.random(2,4)
232
	local deep = math.random(math.max(1,heigth-1))
233
	local h=1
234
	local y1 = y+h-1
235
	local x1,z1 = x+math.random(0,space_x-2), z+math.random(0,space_z-2)
236
	local x2,z2 = x+math.random(space_x-1), z+math.random(space_z-1)
237
	commands.fill(x1,y1,z1,x2,y1,z2,"minecraft:lava",0,"replace")
238
	for h=2,heigth do
239
		y1 = y+h-1
240
		local filler = h>deep and "air" or "lava"
241
		x1 = math.max(x,math.min(x+space_x-2, math.random(-2,2)+x1 ))
242
		z1 = math.max(z,math.min(z+space_z-2, math.random(-2,2)+z1 ))
243
		x2 = math.max(x,math.min(x+space_x-2, math.random(-2,2)+x2 ))
244
		z2 = math.max(z,math.min(z+space_z-2, math.random(-2,2)+z2 ))
245
		commands.fill(x1,y1,z1,x2,y1,z2,"minecraft:"..filler,0,"replace")
246
	end
247
	print("---")
248
end
249
250
function lava_populate(chunk)
251
	local nb,i = math.random(1,4)
252
	for i=1,nb do
253
		output("Populate lava") --#
254
		local _x,_y,_z= math.random(3,13), math.random(1,9), math.random(3,13)
255
		if _x<9 and _y<8 and _z<9 then lava_lake(chunk.x+_x,chunk.y+_y,chunk.z+_z,chunk)
256
		else liquid_source("lava",chunk,chunk.x+_x,chunk.y+_y,chunk.z+_z)
257
		end
258
		sleep(.1)
259
	end
260
end
261
262
function water_lake(chunk,x,y,z)
263
	output("Generate water lake") --#
264
	local space_x,space_z = math.min(8,chunk.x+15-x), math.min(8,chunk.z+15-z)
265
	local heigth = math.random(2,4)
266
	local deep = math.random(math.max(1,heigth-2))
267
	local h=1
268
	local y1,y2 = y+h-1, y+deep-1
269
	local x1,z1 = x+math.random(0,space_x-2), z+math.random(0,space_z-2)
270
	local x2,z2 = x+math.random(space_x-1), z+math.random(space_z-1)
271
	commands.fill(x1,y1,z1,x2,y2,z2,"minecraft:water",0,"replace")
272
	for h=2,heigth do
273
		y1 = y+h-1
274
		y2 = h>deep and y1 or y+deep-1
275
		local filler = h>deep and "air" or "water"
276
		x1 = math.max(x,math.min(x+space_x-2, math.random(-1,1)+x1 ))
277
		z1 = math.max(z,math.min(z+space_z-2, math.random(-1,1)+z1 ))
278
		x2 = math.max(x,math.min(x+space_x-2, math.random(-1,1)+x2 ))
279
		z2 = math.max(z,math.min(z+space_z-2, math.random(-1,1)+z2 ))
280
		commands.fill(x1,y1,z1,x2,y2,z2,"minecraft:"..filler,0,"replace")
281
	end
282
end
283
284
function liquid_source(liquid,chunk,x,y,z)
285
	output("Generate source of "..liquid) --#
286
	local deep= y>chunk.y+2 and math.random(0,math.min(6,y-(chunk.y+1))) or 0
287
	local side = math.random(-1,1)
288
	local _x,_z = x,z
289
	if deep>0 and side~=0 then
290
		if math.random(2)==1 then _x=x+side
291
		else _z=z+side end
292
		commands.fill(_x,y,_z,_x,y-deep,_z,"minecraft:air",0,"replace")
293
	end
294
	commands.setblock(x,y,z,"minecraft:"..liquid,0,"replace")
295
	if deep>0 and side~=0 then
296
		commands.setblock(_x,y,_z,"minecraft:gravel",0,"replace")
297
		sleep(.1)
298
		kill(chunk,"FallingSand")
299
	end
300
end
301
302
function water_populate(chunk)
303
	local nb,i = math.random(1,4)
304
	for i=1,nb do
305
		output("Populate water") --#
306
		local _x,_y,_z= math.random(3,13), math.random(3,13), math.random(3,13)
307
		if _x<9 and _y<9 and _z<9 and math.random(0,1)==1 then water_lake(chunk,chunk.x+_x,chunk.y+_y,chunk.z+_z)
308
		else liquid_source("water",chunk,chunk.x+_x,chunk.y+_y,chunk.z+_z)
309
		end
310
		sleep(.1)
311
	end
312
end
313
314
--src: http://minecraft.gamepedia.com/Dungeon
315
local function dungeon_loot()
316
	output("Generate dungeon loot") --#
317
	local loot = {}
318
	--Stack #1
319
	local slot,size=1,math.random(1,3)
320
	for slot=1,size do
321
		local chance = math.random(128)
322
		if     chance > 107 then table.insert(loot,"id:\"minecraft:name_tag\",Count:1b")
323
		elseif chance > 87  then table.insert(loot,"id:\"minecraft:saddle\",Count:1b")
324
		elseif chance > 72  then table.insert(loot,"id:\"minecraft:record_13\",Count:1b")
325
		elseif chance > 57  then table.insert(loot,"id:\"minecraft:record_cat\",Count:1b")
326
		elseif chance > 42  then table.insert(loot,"id:\"minecraft:iron_horse_armor\",Count:1b")
327
		elseif chance > 27  then table.insert(loot,"id:\"minecraft:golden_apple\",Count:1b")
328
		elseif chance > 17  then table.insert(loot,"id:\"minecraft:enchanted_book\",Count:1b")
329
		elseif chance > 7   then table.insert(loot,"id:\"minecraft:golden_horse_armor\",Count:1b")
330
		elseif chance > 2   then table.insert(loot,"id:\"minecraft:diamond_horse_armor\",Count:1b")
331
		else                     table.insert(loot,"id:\"minecraft:golden_apple\",Count:1b,Damage:1s")
332
		end
333
	end
334
	--Stack #2
335
	slot,size=1,math.random(1,4)
336
	for slot=1,size do
337
		local chance,qty = math.random(116), math.random(4)
338
		if     chance > 95 then table.insert(loot,"id:\"minecraft:wheat\",Count:"..qty.."b")
339
		elseif chance > 75 then table.insert(loot,"id:\"minecraft:bread\",Count:"..qty.."b")
340
		elseif chance > 60 then table.insert(loot,"id:\"minecraft:coal\",Count:"..qty.."b")
341
		elseif chance > 45 then table.insert(loot,"id:\"minecraft:redstone\",Count:"..qty.."b")
342
		elseif chance > 35 then table.insert(loot,"id:\"minecraft:melon_seeds\",Count:"..math.max(2,qty).."b")
343
		elseif chance > 25 then table.insert(loot,"id:\"minecraft:pumpkin_seeds\",Count:"..math.max(2,qty).."b")
344
		elseif chance > 15 then table.insert(loot,"id:\"minecraft:iron_ingot\",Count:"..qty.."b")
345
		elseif chance > 5  then table.insert(loot,"id:\"minecraft:bucket\",Count:1b")
346
		else                    table.insert(loot,"id:\"minecraft:gold_ingot\",Count:"..qty.."b")
347
		end
348
	end
349
	--Stack #3
350
	for slot=1,3 do
351
		local chance,qty = math.random(41), math.random(8)	
352
		if     chance > 30 then table.insert(loot,"id:\"minecraft:bone\",Count:"..qty.."b")
353
		elseif chance > 20 then table.insert(loot,"id:\"minecraft:gunpowder\",Count:"..qty.."b")
354
		elseif chance > 10 then table.insert(loot,"id:\"minecraft:rotten_flesh\",Count:"..qty.."b")
355
		else                    table.insert(loot,"id:\"minecraft:string\",Count:"..qty.."b")
356
		end
357
	end
358
	return loot
359
end
360
361
local function shuffle( t )
362
	output("Shuffle dungeon chest") --#
363
    local iterations = #t
364
    local j
365
    for i = iterations, 2, -1 do
366
        j = math.random(i)
367
        t[i], t[j] = t[j], t[i]
368
    end
369
	return t
370
end
371
372
local function chest_data(loot)
373
	local data,slotSet,s,slot = "",{},""
374
	--Add empty slots
375
	for slot=1,27 do loot[slot] = loot[slot] or false end
376
	--Randomize
377
	loot = shuffle(loot)
378
	--Compile
379
	for slot=1,27 do
380
		if loot[slot] then
381
			data = data..s..(slot-1)..":{Slot:"..(slot-1).."b,"..loot[slot].."}"
382
			s = ","
383
		end
384
	end
385
	return "Items:["..data.."]"
386
end
387
388
--id: Zombie, Spider, Skeleton, CaveSpider, Blaze, Silverfish
389
local function mobspawner_data(id)
390
	output("Setup "..id.." mobspawner") --#
391
	id = id or "Pig"
392
	return "{EntityId:\""..id.."\"}"
393
end
394
function dungeon(x,y,z)
395
	output("Generate dungeon") --#
396
	local i
397
	local Entiy = {"Zombie","Zombie","Spider","Skeleton"}
398
	local wx,wz = 7+(math.random(0,1)*2),7+(math.random(0,1)*2)
399
	--clear space and walls
400
	commands.fill(x,y,z, x+wx-1,y+4,z+wz-1, "minecraft:air",0,"replace")
401
	commands.fill(x,y,z, x+wx-1,y+4,z+wz-1, "minecraft:cobblestone",0,"outline")
402
	commands.fill(x+1,y+4,z+1, x+wx-2,y+4,z+wz-2, "minecraft:air",0,"replace")
403
	--floor
404
	commands.fill(x,y,z, x+wx-1,y,z+wz-1, "minecraft:mossy_cobblestone",0,"replace")
405
	for i=1,math.ceil(wx*wz/3) do
406
		output("Generate dungeon"..string.rep(".",i%5)) --#
407
		local _x,_z = math.random(0,wx-1),math.random(0,wz-1)
408
		commands.setblock(x+_x,y,z+_z,"minecraft:cobblestone",0,"replace")
409
		sleep(.1)
410
	end
411
	--Break wall
412
	for i=1,math.random(3,7) do
413
		bubble(math.random(x-1,x+wx-4),y+1,math.random(z-1,z+wz-4), "minecraft:air", 0)
414
		sleep(.1)
415
	end
416
	--Place mob spawner
417
	commands.setblock(x+math.ceil((wx-1)/2),y+1,z+math.ceil((wz-1)/2),
418
		"minecraft:mob_spawner",0,"replace",
419
		mobspawner_data(Entiy[math.random(1,4)]))
420
	--Chests
421
	if math.random(32)~=1 then
422
		local place_seed = math.random(1,5)*2
423
		local place = string.sub("121314232434",place_seed,place_seed+1)
424
		local chance = math.random(1,2)
425
		for i=1,chance do
426
			local side = string.sub(place,i,i)
427
			local dmg,_x,_z
428
			--North -z
429
			if side=="1" then dmg,_x,_z = 3,math.random(1,wx-2),1
430
			--East +x
431
			elseif side=="2" then dmg,_x,_z = 4,wx-2,math.random(1,wz-2)
432
			--South +z
433
			elseif side=="3" then dmg,_x,_z = 2,math.random(1,wx-1),wz-2
434
			--West -x
435
			elseif side=="4" then dmg,_x,_z = 5,1,math.random(1,wz-2)
436
			end
437
			commands.setblock(x+_x,y+1,z+_z,
438
				"minecraft:chest",dmg,"replace",
439
				"{"..chest_data(dungeon_loot()).."}")
440
			sleep(.1)
441
		end
442
	end
443
end
444
445
function clone()
446
	output("Clone ref to target chunk ref chunk") --#
447
	commands.clone(refChunk.x,refChunk.y,refChunk.z,
448
		refChunk.x+15,refChunk.y+15,refChunk.z+15,
449
		targetChunk.x,targetChunk.y,targetChunk.z, "replace")
450
end
451
452
local function getSwitchStoneSate()
453
	local data = commands.getBlockInfo(refChunk.x+8,refChunk.y-3,refChunk.z+8)
454
	if data.name=="minecraft:glass" then return false
455
	elseif data.name=="minecraft:stone" then return true
456
	else
457
		commands.setblock(refChunk.x+8,refChunk.y-3,refChunk.z+8,"minecraft:stone",0,"replace")
458
		return true
459
	end
460
end
461
462
settings.load(settingsFile)
463
opt = {
464
	stone=getSwitchStoneSate(),
465
	lava=settings.get("OptiMiner.lava",true),
466
	water=settings.get("OptiMiner.water",true),
467
	bedrock=settings.get("OptiMiner.bedrock",true),
468
	dungeon=settings.get("OptiMiner.dungeon",false),
469
	turtleCustomID=settings.get("OptiMiner.CustomID",turtleID),
470
	turtleFuelLevel=settings.get("OptiMiner.turtleFuelLevel",100000),
471
	turtleEquipLeft=settings.get("OptiMiner.turtleEquipLeft","minecraft:diamond_pickaxe"),
472
	turtleEquipRight=settings.get("OptiMiner.turtleEquipRight",false),
473
}
474
475
function save_params()
476
	settings.set("OptiMiner.turtleID",turtleID)
477
	local k,v
478
	for k,v in pairs(opt) do
479
		if k~="stone" then
480
			settings.set("OptiMiner."..k,v)
481
		end
482
	end
483
	settings.save(settingsFile)
484
end
485
save_params()
486
487
function bedrockLayer(state)
488
	local blockType = state and "minecraft:bedrock" or "minecraft:air"
489
	commands.fill(
490
		refChunk.x,		refChunk.y+16,refChunk.z,
491
		refChunk.x+15,	refChunk.y+16,refChunk.z+15,
492
		blockType,0,"replace")
493
end
494
495
function generate()
496
	output("Generate ref chunk") --#
497
	bedrockLayer(opt.bedrock)
498
	fillChunk(refChunk, opt.stone and "minecraft:stone" or "minecraft:glass")
499
	if opt.water then water_populate(refChunk) end
500
	dirt_populate(refChunk)
501
	ore_populate(refChunk)
502
	hole_populate(refChunk)
503
	if opt.lava then lava_populate(refChunk) end
504
	if opt.dungeon then
505
		dungeon(
506
			refChunk.x+math.random(5),
507
			refChunk.y+math.random(8),
508
			refChunk.z+math.random(5))
509
	end
510
end
511
512
function clearRefChunk()
513
	output("Clear ref chunk") --#
514
	commands.fill(
515
		refChunk.x,		refChunk.y+16,refChunk.z,
516
		refChunk.x+15,	refChunk.y+16,refChunk.z+15,
517
		"minecraft:air",0,"replace")
518
	clearChunk(refChunk)
519
end
520
function clearTargetChunk()
521
	output("Clear target chunk") --#
522
	commands.fill(
523
		targetChunk.x,		targetChunk.y+16,targetChunk.z,
524
		targetChunk.x+15,	targetChunk.y+16,targetChunk.z+15,
525
		"minecraft:air",0,"replace")
526
	clearChunk(targetChunk)
527
end
528
529
--fill <x1> <y1> <z1> <x2> <y2> <z2> <TileName> <dataValue> replace [replaceTileName] [replaceDataValue]
530
function switchStone()
531
	output(opt.stone and "Switch Glass to Stone" or "Switch Stone to Glass") --#
532
	commands.fill(refChunk.x,refChunk.y,refChunk.z,
533
		targetChunk.x+15,targetChunk.y+15,targetChunk.z+15,
534
		opt.stone and "minecraft:stone" or "minecraft:glass",
535
		0, "replace", opt.stone and "minecraft:glass" or "minecraft:stone")
536
	commands.setblock(refChunk.x+8,refChunk.y-3,refChunk.z+8, opt.stone and "minecraft:stone" or "minecraft:glass",0,"replace")
537
end
538
539
function highlightChunk(chunk)
540
	output("Highlight target chunk") --#
541
	commands.summon("LightningBolt",chunk.x+8, chunk.y+32,chunk.z+8)
542
	local i
543
	for i=-0,16 do
544
		commands.summon("XPOrb",chunk.x+i, chunk.y+18,chunk.z-1, "{Age:5900,Value:0}")
545
		commands.summon("XPOrb",chunk.x+i, chunk.y+18,chunk.z+16,"{Age:5900,Value:0}")
546
		commands.summon("XPOrb",chunk.x-1, chunk.y+18,chunk.z+i, "{Age:5900,Value:0}")
547
		commands.summon("XPOrb",chunk.x+16,chunk.y+18,chunk.z+i, "{Age:5900,Value:0}")
548
	end
549
end
550
551
local function btn(str,x,y,state,w)
552
	state = state or false
553
	local pad1,pad2 = " "," "
554
	if not w then
555
		w = string.len(str)+2
556
	else
557
		if string.len(str)>=w then
558
			str = string.sub(str,1,w)
559
			pad1,pad2 = "",""
560
		else
561
			pad1 = string.rep(" ",math.floor(w-string.len(str)/2))
562
			pad2 = string.rep(" ",math.ceil(w-string.len(str)/2))
563
		end
564
	end
565
	term.setCursorPos(x,y)
566
	setColor(colors.black,state and colors.black or colors.lightGray)
567
	term.write(string.rep(string.char(143),w))
568
	term.setCursorPos(x,y+1)
569
	setColor(colors.black,state and colors.white or colors.lightGray)
570
	term.write(pad1..str..pad2)
571
	setColor(state and colors.white or colors.gray,colors.black)
572
	term.setCursorPos(x,y+2)
573
	term.write(string.rep(string.char(131),w))
574
end
575
local function onclick_btn(_x,_y,str,bx,by)
576
	local w = string.len(str)+1
577
	return _x >= bx-1 and _x <= bx+w
578
	and _y >= by and _y <= by+1
579
end
580
581
local function btn_list(tItems,x,y,w)
582
	local k,v
583
	for k,v in pairs(tItems) do
584
		local last = k >= #tItems
585
		local str = v
586
		local pad1,pad2 = " "," "
587
		if not w then
588
			w = string.len(str)+2
589
		else
590
			if string.len(str)>=w then
591
				str = string.sub(str,1,w)
592
				pad1,pad2 = "",""
593
			else
594
				local len = (w-string.len(str))/2
595
				pad1 = string.rep(" ",math.floor(len))
596
				pad2 = string.rep(" ",math.ceil(len))
597
			end
598
		end
599
		if k == 1 then
600
			term.setCursorPos(x,y)
601
			setColor(colors.black,state and colors.black or colors.lightGray)
602
			term.write(string.rep(string.char(143),w))
603
			y = y+1
604
		end
605
		term.setCursorPos(x,y)
606
		setColor(colors.black,state and colors.white or colors.lightGray)
607
		term.write(pad1..str..pad2)
608
		term.setCursorPos(x,y+1)
609
		if last then
610
			setColor(colors.gray,colors.black)
611
			term.write(string.rep(string.char(131),w))
612
		else
613
			setColor(colors.black,colors.lightGray)
614
			term.write(string.rep(string.char(140),w))
615
		end
616
		y=y+2
617
	end
618
end
619
620
function display()
621
	header()
622
623
	term.setCursorPos(3,4)
624
	setColor(colors.yellow,colors.black)
625
	term.write("Chunk:")
626
	btn("Generate",9,3)
627
	btn("Clone",20,3)
628
	btn("Clear",28,3)
629
	btn(opt.stone and "Stone" or "Glass",36,3)
630
631
	term.setCursorPos(2,7)
632
	setColor(colors.yellow,colors.black)
633
	term.write("Option:")
634
	btn(opt.lava and string.char(26).."Lava" or "-Lava",9,6)
635
	btn(opt.water and string.char(26).."Water" or "-Water",17,6)
636
	btn(opt.bedrock and string.char(26).."Bedrock" or "-Bedrock",26,6)
637
	btn(opt.dungeon and string.char(26).."Dungeon" or "-Dungeon",37,6)
638
639
	term.setCursorPos(3,10)
640
	setColor(colors.yellow,colors.black)
641
	term.write("Utils:")
642
	btn("Turtle",11,9)
643
	btn("Clear Mobs",20,9)
644
	btn("Highlight chunk",33,9)
645
	
646
	--Credits
647
	btn(string.char(1),2,16)
648
end
649
650
function turtle_submenu()
651
	local editTurtleParams = true
652
	while editTurtleParams do
653
		--Clear
654
		term.setBackgroundColor(colors.black)
655
		local i
656
		for i=12,th do
657
			term.setCursorPos(1,i)
658
			term.clearLine()
659
		end
660
		
661
		--Display submenu
662
		term.setCursorPos(3,13)
663
		setColor(colors.yellow,colors.black)
664
		term.write("Turtle:{")
665
		term.setCursorPos(10,18)
666
		term.write("}")
667
		
668
		--GIVE
669
		btn("Give ",2,14)
670
		
671
		--
672
		btn("Close",2,17)
673
		
674
		btn_list({
675
			"ID"..string.char(16)..string.rep(" ",8),
676
			"Fuel"..string.char(16)..string.rep(" ",6),
677
			"Equip",
678
			},12,12,13)
679
		--Edit Turtle ID
680
		term.setCursorPos(16,13)
681
		local strID = "#"..(opt.turtleCustomID and opt.turtleCustomID or turtleID)
682
		setColor(colors.black,colors.white)
683
		term.write(string.sub(strID,1,8)..string.rep(" ",math.max(0,8-string.len(strID))))
684
685
		--Edit fuel level
686
		term.setCursorPos(18,15)
687
		local fuelLevel = tostring(opt.turtleFuelLevel)
688
		setColor(colors.black,colors.white)
689
		term.write(string.sub(fuelLevel,1,6)..string.rep(" ",math.max(0,6-string.len(fuelLevel))))
690
		
691
		--Select Equip left/right
692
		--btn("Equip",12,18)
693
		
694
		setColor(colors.yellow,colors.black)
695
		local e,b,x,y = os.pullEvent("mouse_click")
696
	--	output(string.format("Click %d x[%d],y[%d]",b,x,y)) --#
697
		if b==1 then
698
			if y<11 then
699
				editTurtleParams = false
700
				return false
701
			elseif x>=2 and x<=8 then
702
			--Close
703
				if y==18 or y==19 then
704
					sound_click()
705
					output("Close Turtle submenu") --#
706
					editTurtleParams = false
707
					return false
708
			--Give
709
				elseif y==15 or y==16 then
710
					giveTurtle(opt.turtleCustomID and opt.turtleCustomID or turtleID)
711
					return true
712
				end
713
			elseif x>=12 and x<=24 then
714
			--Edit ID
715
				if y==13 then
716
					output("Input Turtle ID") --#
717
					sound_click()
718
					local confirm=false
719
					while not confirm do
720
						term.setCursorPos(15,13)
721
						term.setBackgroundColor(colors.white)
722
						term.write(string.rep(" ",9))
723
						term.setBackgroundColor(colors.lightGray)
724
						term.write(" ")
725
						term.setBackgroundColor(colors.black)
726
						term.write(string.rep(" ",tw))
727
						setColor(colors.black,colors.white)
728
						term.setCursorPos(15,13)
729
						local input = tonumber(read())
730
						setColor(colors.white,colors.black)
731
						if input and input>=0 then
732
							if input == os.getComputerID() then
733
								output("ID #"..input.." used by "..os.getComputerLabel()) --#
734
							else
735
								confirm = true
736
								opt.turtleCustomID = input
737
								save_params()
738
								return true
739
							end
740
						else
741
							output("Turtle ID: number >= 0") --#
742
						end
743
					end
744
			--Edit fuel
745
				elseif y==15 then
746
					output("Input Turtle Fuel level") --#
747
					sound_click()
748
					local confirm=false
749
					while not confirm do
750
						term.setCursorPos(17,15)
751
						term.setBackgroundColor(colors.white)
752
						term.write(string.rep(" ",7))
753
						term.setBackgroundColor(colors.lightGray)
754
						term.write(" ")
755
						term.setBackgroundColor(colors.black)
756
						term.write(string.rep(" ",tw))
757
						setColor(colors.black,colors.white)
758
						term.setCursorPos(17,15)
759
						local input = tonumber(read())
760
						setColor(colors.white,colors.black)
761
						if input and input>=0 and input<=100000 then
762
							output("Fuel level set: "..input) --#
763
							confirm = true
764
							opt.turtleFuelLevel = input
765
							save_params()
766
							return true
767
						elseif input and input<0 then
768
							output("Fuel level: number >= 0") --#
769
						elseif input and input>100000 then
770
							output("Fuel level limit: 100000") --#
771
						else
772
							output("Fuel level should be a number") --#
773
						end
774
					end
775
			--Equip config
776
				elseif y==17 or y==18 then
777
					output("Config Turtle equipement") --#
778
					sound_click()
779
					--List (7 rows)
780
					local turtleEquipement = {
781
						{ name ="pickaxe",        id="minecraft:diamond_pickaxe",  },
782
						{ name ="shovel",         id="minecraft:diamond_shovel",   },
783
						{ name ="sword",          id="minecraft:diamond_sword",    },
784
						{ name ="crafting table", id="minecraft:crafting_table",   },
785
						{ name ="modem",          id="computercraft:wireless_modem"},
786
						{ name ="ender modem",    id="computercraft:advanced_modem"},
787
					}
788
					local sideEquipement = "L"
789
					local selectEquipment = true
790
					while selectEquipment do
791
						--Clear
792
						term.setBackgroundColor(colors.black)
793
						local i
794
						for i=12,th do
795
							term.setCursorPos(12,i)
796
							term.write(string.rep(" ",tw))
797
						end
798
						--Display
799
						btn_list({
800
							"Equip",
801
							(sideEquipement=="L" and "  Left  "..string.char(26) or"Left"),
802
							(sideEquipement=="R" and "  Right "..string.char(26) or"Right"),
803
							string.char(17),
804
							},12,12,13)
805
						local alt,k,item=false
806
						for k,item in pairs(turtleEquipement) do
807
							alt = not alt
808
							local cur = "  "
809
							if (sideEquipement=="L" and opt.turtleEquipLeft==item.id )
810
							or (sideEquipement=="R" and opt.turtleEquipRight==item.id) then
811
								cur = " "..string.char(26)
812
							end
813
							term.setCursorPos(26,k+12)
814
							setColor(
815
								cur=="  " and colors.black or colors.red,
816
								alt and colors.white or colors.yellow)
817
							term.write(cur..item.name..string.rep(" ",math.max(0,tw-29-string.len(item.name))))
818
						end
819
						setColor(colors.white,colors.black)
820
						
821
						local e,b,x,y = os.pullEvent("mouse_click")
822
						output(string.format("Click %d x[%d],y[%d]",b,x,y)) --#
823
						if b==1 then
824
							--Give Turtle
825
							if x>=2 and x<=8 and (y==15 or y==16) then
826
								giveTurtle(opt.turtleCustomID and opt.turtleCustomID or turtleID)
827
							--Close Turtle submenu
828
							elseif x>=2 and x<=8 and (y==18 or y==19) then
829
								output("Close Turtle submenu") --#
830
								sound_click()
831
								selectEquipment = false
832
								return false
833
							--Equipment submenu
834
							elseif x>=12 and x<=24 and y>=15 and y<=19 then
835
								--Select Left equipment
836
								if y==15 then
837
									output("Equip left") --#
838
									sound_click()
839
									sideEquipement="L"
840
								--Select Right equipment
841
								elseif y==17 then
842
									output("Equip right") --#
843
									sound_click()
844
									sideEquipement="R"
845
								--Close Equipment selection
846
								elseif y==19 then
847
									output("Close equipment selection") --#
848
									sound_click()
849
									selectEquipment = false
850
									break
851
								end
852
							--Equipment list
853
							elseif x>=26 and x<=49 and y>=13 and y<=18 then
854
								local selected = y-12
855
								sound_click()
856
								if sideEquipement=="L" then
857
									if opt.turtleEquipLeft==turtleEquipement[selected].id then
858
										output("Unequip left side") --#
859
										opt.turtleEquipLeft=false
860
									else
861
										output("Equip left side: "..turtleEquipement[selected].name) --#
862
										opt.turtleEquipLeft=turtleEquipement[selected].id
863
									end
864
								else
865
									if opt.turtleEquipRight==turtleEquipement[selected].id then
866
										output("Unequip right side") --#
867
										opt.turtleEquipRight=false
868
									else
869
										output("Equip right side: "..turtleEquipement[selected].name) --#
870
										opt.turtleEquipRight=turtleEquipement[selected].id
871
									end
872
								end
873
								save_params()
874
							end
875
						end
876
						sleep(.1)
877
						if not selectEquipment then
878
							break
879
						end
880
					end
881
				end
882
			end
883
		end
884
		sleep(.1)
885
	end
886
end
887
888
local function display_credits()
889
	--Clear
890
	term.setBackgroundColor(colors.black)
891
	local i
892
	for i=12,th do
893
		term.setCursorPos(1,i)
894
		term.clearLine()
895
	end
896
	setColor(colors.yellow,colors.black)
897
	term.setCursorPos(3,17) term.write(string.char(2))
898
	setColor(colors.white,colors.black)
899
	term.write(string.char(17))
900
	
901
	setColor(colors.black,colors.white)
902
	term.setCursorPos(5,16) term.write(string.rep(string.char(143),33))
903
	term.setCursorPos(5,17) term.write(" OptimineMgr by SukaiPoppuGo     ")
904
	term.setCursorPos(5,18) term.write(" Credits: 2016 - CC BY-NC-SA 4.0 ")
905
	setColor(colors.white,colors.black)
906
	term.setCursorPos(5,19) term.write(string.rep(string.char(131),33))
907
	sleep(.5)
908
	os.pullEvent("mouse_click")
909
end
910
	
911
while true do
912
	display()
913
	local e,b,_x,_y = os.pullEvent("mouse_click")
914
	term.setCursorPos(18,1)
915
	setColor(colors.gray, colors.black)
916
	--Credits
917
	if     onclick_btn(_x,_y,"c",2,16)    then
918
		output("Display credits "..string.char(3)) --#
919
		sound_click()
920
		display_credits()
921
		output(string.char(3)) --#
922
	--Chunk
923
	elseif onclick_btn(_x,_y,"Generate",9,3)    then
924
		output("Click: Generate chunk") --#
925
		sound_click()
926
		btn("Generate",9,3,true)
927
		clearRefChunk()
928
		generate(refChunk)
929
		output("Done") --#
930
	elseif onclick_btn(_x,_y,"Clone",20,3)      then
931
		output("Click: Clone chunk") --#
932
		sound_click()
933
		btn("Clone",20,3,true)
934
		clone()
935
		output("Done") --#
936
	elseif onclick_btn(_x,_y,"Clear",28,3)      then
937
		output("Click: Clear chunk") --#
938
		sound_click()
939
		btn("Clear",28,3,true)
940
		clearTargetChunk()
941
		output("Done") --#
942
	elseif onclick_btn(_x,_y,"Stone",36,3)       then
943
		output("Toggle Stone/Glass") --#
944
		sound_click()
945
		opt.stone = not opt.stone
946
		btn(opt.stone and "Stone" or "Glass",36,3,true)
947
		switchStone()
948
	--Options
949
	elseif onclick_btn(_x,_y,"-Lava",9,6)        then
950
		output("Click: Lava") --#
951
		sound_click()
952
		opt.lava = not opt.lava
953
		btn(opt.lava and string.char(26).."Lava" or "-Lava",9,6,true)
954
		save_params()
955
	elseif onclick_btn(_x,_y,"-Water",16,6)      then
956
		output("Click: Water") --#
957
		sound_click()
958
		opt.water = not opt.water
959
		btn(opt.water and string.char(26).."Water" or "-Water",17,6,true)
960
		save_params()
961
	elseif onclick_btn(_x,_y,"-Bedrock",24,6)    then
962
		output("Toggle Bedrock") --#
963
		sound_click()
964
		opt.bedrock = not opt.bedrock
965
		btn(opt.bedrock and string.char(26).."Bedrock" or "-Bedrock",26,6,true)
966
		bedrockLayer(opt.bedrock)
967
		save_params()
968
	elseif onclick_btn(_x,_y,"-Dungeon",34,6)    then
969
		output("Toggle Dungeon") --#
970
		sound_click()
971
		opt.dungeon = not opt.dungeon
972
		btn(opt.dungeon and string.char(26).."Dungeon" or "-Dungeon",37,6,true)
973
		save_params()
974
	--Utils
975
	elseif onclick_btn(_x,_y,"Turtle",11,9)      then
976
		output("Click: Turtle") --#
977
		sound_click()
978
		btn("Turtle",11,9,true)
979
		while turtle_submenu() do
980
			sleep(.1)
981
		end
982
	elseif onclick_btn(_x,_y,"Clear Mobs",20,9) then
983
		output("Click: Clear Mobs") --#
984
		sound_click()
985
		btn("Clear Mobs",20,9,true)
986
		kill(refChunk,"!Player")
987
		kill(targetChunk,"!Player")
988
	elseif onclick_btn(_x,_y,"Highlight chunk",33,9)then
989
		output("Click: Highlight chunk") --#
990
		sound_click()
991
		btn("Highlight chunk",33,9,true)
992
		highlightChunk(targetChunk)
993
	end
994
	sleep(.1)
995
end