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 |