SHOW:
|
|
- or go back to the newest paste.
1 | - | -- Wrapping starting peripheral |
1 | + | -- Made by Rnen10 |
2 | -- If problems/questions feel free to contact me | |
3 | - | inventory = peripheral.wrap("right") |
3 | + | -- https://twitter.com/Rnen10 |
4 | -- rnen. (Evan#7181) on discord | |
5 | ||
6 | --Here is a detailed view | |
7 | --https://imgur.com/a/FMfTi | |
8 | ||
9 | - | -- checking on starting seeds |
9 | + | --Here's a flowchart showing how it works |
10 | - | local s1, s2, s3 = analyzer.getSpecimenStats("NORTH") |
10 | + | --https://sketchboard.me/NAZDv63LNgBd#/ |
11 | - | p1 = s1 + s2 + s3 |
11 | + | |
12 | - | local s1, s2, s3 = analyzer.getSpecimenStats("EAST") |
12 | + | |
13 | - | p2 = s1 + s2 + s3 |
13 | + | --Use this for automatic updates-> pastebin get fehTMGPp startup |
14 | ||
15 | -- =============VARIABLES=================== | |
16 | - | -- Check if parents are mature |
16 | + | |
17 | ||
18 | --Plant 1 & 2 | |
19 | local p1 = nil | |
20 | local p2 = nil | |
21 | --Seeds in analyzer | |
22 | - | -- Place 2nd crop stick for crossbreeding |
22 | + | local p3 = nil |
23 | - | turtle.forward() |
23 | + | --Variable for when job is done |
24 | - | turtle.forward() |
24 | + | |
25 | - | turtle.turnLeft() |
25 | + | |
26 | - | turtle.forward() |
26 | + | local plantName = nil |
27 | ||
28 | - | sleep(1) |
28 | + | function DEBUG() |
29 | return fs.exists("seeddebug") | |
30 | end | |
31 | - | -- Move to 2nd analyzer |
31 | + | |
32 | - | turtle.forward() |
32 | + | local posData = { ["x"] = 0, ["y"] = 0, ["rot"] = 1 } |
33 | - | turtle.turnLeft() |
33 | + | -- ============VARIABLES END================ |
34 | - | turtle.forward() |
34 | + | |
35 | - | turtle.turnLeft() |
35 | + | -- ============FUNCTIONS==================== |
36 | function NewLine(Str) | |
37 | - | -- wait for crossbreed |
37 | + | local barLength = 40 |
38 | local tempPercentage = 0 | |
39 | - | while analyzer.isCrossCrop("SOUTH") do |
39 | + | term.clear() |
40 | - | sleep(1) |
40 | + | term.setCursorPos(1,2) |
41 | print("-------------[SeedBot v3.8]------------") | |
42 | term.setCursorPos(11,5) | |
43 | - | -- pick up new seed |
43 | + | write("v {Current action} v") |
44 | - | turtle.forward() |
44 | + | term.setCursorPos(21 - (math.floor(string.len(Str) / 2)),8) |
45 | print(Str) | |
46 | if not plantName == nil then | |
47 | plantString = "Current Type: "..plantName | |
48 | term.setCursorPos(20 - (math.floor(string.len(plantString) / 2)),9) | |
49 | print(plantString) | |
50 | - | turtle.forward() |
50 | + | end |
51 | - | turtle.turnRight() |
51 | + | if DEBUG() then |
52 | - | turtle.forward() |
52 | + | term.setCursorPos(1,11) |
53 | - | turtle.turnRight() |
53 | + | print("X: "..posData["x"].." Y: "..posData["y"].." Rot: "..posData["rot"]) |
54 | - | turtle.turnRight() |
54 | + | end |
55 | term.setCursorPos(12,12) | |
56 | - | print("Back at analyzer") |
56 | + | write("[Current Fuel %"..(math.floor(turtle.getFuelLevel()))) |
57 | - | -- Analyze new seed |
57 | + | write("]") |
58 | term.setCursorPos(1,13) | |
59 | - | --inventory.pushItem("down", 1) |
59 | + | barLength = turtle.getFuelLevel() / 100 * 40 |
60 | if barLength > 40 then barLength = 40 end | |
61 | if term.isColor() then | |
62 | - | sleep(3.5) |
62 | + | term.setBackgroundColor(colors.green) |
63 | else | |
64 | - | --inventory.pullItem("down", 1) |
64 | + | term.setBackgroundColor(colors.white) |
65 | end | |
66 | for i =1,(barLength) do | |
67 | - | print("seed analyzed") |
67 | + | write(" ") |
68 | end | |
69 | - | sleep(5) |
69 | + | if barLength < 40 then |
70 | - | end |
70 | + | if term.isColor() then term.setBackgroundColor(colors.red) else term.setBackgroundColor(colors.gray) end |
71 | local remainingBarLength = (40 - barLength) | |
72 | for i =1,(remainingBarLength) do | |
73 | write(" ") | |
74 | end | |
75 | end | |
76 | term.setBackgroundColor(colors.black) | |
77 | end | |
78 | ||
79 | function ClearSeeds() | |
80 | analyzer = peripheral.wrap("bottom") | |
81 | if analyzer.hasPlant("NORTH") then | |
82 | Left() | |
83 | Forward() | |
84 | turtle.select(1) | |
85 | turtle.digDown() | |
86 | turtle.suckDown() | |
87 | turtle.select(1) | |
88 | turtle.placeDown() | |
89 | Back() | |
90 | Right() | |
91 | end | |
92 | if analyzer.hasPlant("EAST") then | |
93 | Forward() | |
94 | turtle.select(1) | |
95 | turtle.digDown() | |
96 | turtle.suckDown() | |
97 | turtle.select(1) | |
98 | turtle.placeDown() | |
99 | Back() | |
100 | end | |
101 | Empty() | |
102 | end | |
103 | ||
104 | ||
105 | function Empty() | |
106 | if not done then NewLine("Emptying Inventory") end | |
107 | for i = 1,16 do | |
108 | turtle.select(i) | |
109 | if not turtle.dropUp() and (turtle.getItemCount()>0) then | |
110 | NewLine("Chest is full!") | |
111 | done = true | |
112 | break | |
113 | end | |
114 | end | |
115 | turtle.select(1) | |
116 | end | |
117 | ||
118 | function CheckSeeds() | |
119 | analyzer = peripheral.wrap("bottom") | |
120 | if analyzer.hasPlant("NORTH") == true and analyzer.hasPlant("EAST") == true then | |
121 | local s1, s2, s3 = analyzer.getSpecimenStats("NORTH") | |
122 | p1 = s1 + s2 + s3 | |
123 | local s1, s2, s3 = analyzer.getSpecimenStats("EAST") | |
124 | p2 = s1 + s2 + s3 | |
125 | if p1==30 or p2==30 then | |
126 | GetNewSeeds() | |
127 | end | |
128 | else | |
129 | GetNewSeeds() | |
130 | return | |
131 | end | |
132 | end | |
133 | ||
134 | function DuplicateSingleSeed() | |
135 | if analyzer.hasPlant("NORTH") or analyzer.hasPlant("EAST") then | |
136 | Empty() | |
137 | os.reboot() | |
138 | else | |
139 | NewLine("Analyzing single Seed") | |
140 | turtle.select(1) | |
141 | analyzer = peripheral.wrap("bottom") | |
142 | turtle.dropDown(turtle.getItemCount()) | |
143 | analyzer.analyze() | |
144 | while not analyzer.isAnalyzed() do | |
145 | sleep(1) | |
146 | end | |
147 | plantName = analyzer.getSpecimen() | |
148 | NewLine("Planting single seed") | |
149 | turtle.suckDown() | |
150 | Forward() | |
151 | Right() | |
152 | Forward() | |
153 | redstone.setOutput("bottom", true) | |
154 | while turtle.getItemCount() > 0 do turtle.dropDown(1) end | |
155 | sleep(2) | |
156 | redstone.setOutput("bottom", false) | |
157 | Back() | |
158 | Back() | |
159 | Left() | |
160 | Forward() | |
161 | redstone.setOutput("bottom", true) | |
162 | sleep(0.9) | |
163 | redstone.setOutput("bottom", false) | |
164 | Back() | |
165 | Right() | |
166 | Back() | |
167 | NewLine("Waiting for seed to duplicate...") | |
168 | while analyzer.isCrossCrop("SOUTH") do | |
169 | sleep(5) | |
170 | end | |
171 | NewLine("Picking up new seed") | |
172 | Forward() | |
173 | turtle.select(1) | |
174 | turtle.digDown() | |
175 | turtle.suckDown() | |
176 | turtle.placeDown() | |
177 | Forward() | |
178 | Left() | |
179 | Back() | |
180 | turtle.select(2) | |
181 | analyzer = peripheral.wrap("bottom") | |
182 | turtle.dropDown(turtle.getItemCount()) | |
183 | analyzer.analyze() | |
184 | sleep(3.5) | |
185 | turtle.suckDown() | |
186 | Left() | |
187 | Forward() | |
188 | Forward() | |
189 | redstone.setOutput("bottom", true) | |
190 | turtle.dropDown(1) | |
191 | sleep(2) | |
192 | redstone.setOutput("bottom", false) | |
193 | Back() | |
194 | Back() | |
195 | Right() | |
196 | Empty() | |
197 | os.reboot() | |
198 | end | |
199 | end | |
200 | ||
201 | function GetNewSeeds() | |
202 | plantName = nil | |
203 | NewLine("Changing out seeds") | |
204 | if p1 == nil or p2 == nil then | |
205 | p1 = 1 | |
206 | p2 = 1 | |
207 | elseif p1>p2 then | |
208 | Left() | |
209 | Forward() | |
210 | turtle.select(1) | |
211 | turtle.digDown() | |
212 | turtle.suckDown() | |
213 | turtle.select(1) | |
214 | turtle.placeDown() | |
215 | Back() | |
216 | Right() | |
217 | Forward() | |
218 | Empty() | |
219 | turtle.select(1) | |
220 | turtle.digDown() | |
221 | turtle.suckDown() | |
222 | turtle.select(1) | |
223 | turtle.placeDown() | |
224 | Back() | |
225 | Empty() | |
226 | elseif p1<p2 then | |
227 | Left() | |
228 | Forward() | |
229 | turtle.select(1) | |
230 | turtle.digDown() | |
231 | turtle.suckDown() | |
232 | turtle.select(1) | |
233 | turtle.placeDown() | |
234 | Back() | |
235 | Right() | |
236 | Empty() | |
237 | Forward() | |
238 | turtle.select(1) | |
239 | turtle.digDown() | |
240 | turtle.suckDown() | |
241 | turtle.select(1) | |
242 | turtle.placeDown() | |
243 | Empty() | |
244 | Back() | |
245 | else | |
246 | ClearSeeds() | |
247 | Empty() | |
248 | end | |
249 | Right() | |
250 | if turtle.suck() then | |
251 | Left() | |
252 | if turtle.getItemCount() == 1 then | |
253 | --Empty() | |
254 | --os.reboot() | |
255 | DuplicateSingleSeed() | |
256 | end | |
257 | analyzer = peripheral.wrap("bottom") | |
258 | turtle.dropDown(turtle.getItemCount()) | |
259 | analyzer.analyze() | |
260 | NewLine("Analyzing new seeds") | |
261 | while not analyzer.isAnalyzed() do | |
262 | sleep(1) | |
263 | end | |
264 | plantName = analyzer.getSpecimen() | |
265 | turtle.select(2) | |
266 | turtle.suckDown() | |
267 | ||
268 | NewLine("Planting new seeds") | |
269 | ||
270 | Forward() | |
271 | Right() | |
272 | Forward() | |
273 | redstone.setOutput("bottom", true) | |
274 | turtle.dropDown(1) | |
275 | sleep(2) | |
276 | redstone.setOutput("bottom", false) | |
277 | Back() | |
278 | Left() | |
279 | Back() | |
280 | Left() | |
281 | Forward() | |
282 | Forward() | |
283 | redstone.setOutput("bottom", true) | |
284 | turtle.dropDown(1) | |
285 | sleep(2) | |
286 | redstone.setOutput("bottom", false) | |
287 | Back() | |
288 | Back() | |
289 | Right() | |
290 | Empty() | |
291 | CheckSeeds() | |
292 | else | |
293 | Left() | |
294 | NewLine("Done!") | |
295 | done = true | |
296 | ClearSeeds() | |
297 | return | |
298 | end | |
299 | CheckSeeds() | |
300 | end | |
301 | ||
302 | function CheckFuel(bool) | |
303 | local fuel = turtle.getFuelLevel() | |
304 | --Checking fuel level & fueling if low | |
305 | if turtle.getFuelLevel() < 25 then | |
306 | GetFuel() | |
307 | return true | |
308 | else | |
309 | return false | |
310 | end | |
311 | end | |
312 | ||
313 | function GetFuel() | |
314 | if not done then NewLine("Getting fuel") end | |
315 | --print("Current Fuel Level: "..turtle.getFuelLevel()) | |
316 | Left() | |
317 | Left() | |
318 | turtle.select(16) | |
319 | while turtle.getFuelLevel() <= 100 do | |
320 | if not turtle.suck(1) and (turtle.getFuelLevel() <= 100) then | |
321 | NewLine("No fuel in fuel chest!") | |
322 | turtle.select(1) | |
323 | done = true | |
324 | break | |
325 | end | |
326 | turtle.refuel(1) | |
327 | turtle.drop(turtle.getItemCount(16)) | |
328 | NewLine("Getting fuel") | |
329 | --print("Current Fuel Level: "..turtle.getFuelLevel()) | |
330 | end | |
331 | turtle.select(1) | |
332 | Right() | |
333 | Right() | |
334 | end | |
335 | ||
336 | function CheckEmpty() | |
337 | local invItemNumber = 0 | |
338 | NewLine("Counting Items...") | |
339 | for i = 1,16 do | |
340 | turtle.select(i) | |
341 | invItemNumber = invItemNumber + turtle.getItemCount(i) | |
342 | end | |
343 | if invItemNumber > 0 then | |
344 | NewLine("Not empty! Resetting") | |
345 | turtle.select(1) | |
346 | return false | |
347 | else | |
348 | turtle.select(1) | |
349 | return true | |
350 | end | |
351 | end | |
352 | ||
353 | function CheckPosition() | |
354 | if fs.exists("seedPos") then | |
355 | local file = fs.open("seedPos","r") | |
356 | local data = file.readAll() | |
357 | file.close() | |
358 | posData = textutils.unserialize(data) | |
359 | else | |
360 | local file = fs.open("seedPos","w") | |
361 | file.write(textutils.serialize(posData)) | |
362 | file.close() | |
363 | end | |
364 | end | |
365 | ||
366 | function SavePosition() | |
367 | local file = fs.open("seedPos","w") | |
368 | file.write(textutils.serialize(posData)) | |
369 | file.close() | |
370 | end | |
371 | ||
372 | function Forward() | |
373 | turtle.forward() | |
374 | if posData["rot"] == 1 then | |
375 | posData["x"] = posData["x"] + 1 | |
376 | elseif posData["rot"] == 3 then | |
377 | posData["x"] = posData["x"] - 1 | |
378 | elseif posData["rot"] == 0 then | |
379 | posData["y"] = posData["y"] - 1 | |
380 | elseif posData["rot"] == 2 then | |
381 | posData["y"] = posData["y"] + 1 | |
382 | end | |
383 | SavePosition() | |
384 | end | |
385 | ||
386 | function Right() | |
387 | turtle.turnRight() | |
388 | posData["rot"] = posData["rot"] + 1 | |
389 | if posData["rot"] > 4 then posData["rot"] = 0 end | |
390 | SavePosition() | |
391 | end | |
392 | ||
393 | function Left() | |
394 | turtle.turnLeft() | |
395 | posData["rot"] = posData["rot"] - 1 | |
396 | if posData["rot"] < 0 then posData["rot"] = 4 end | |
397 | SavePosition() | |
398 | end | |
399 | ||
400 | function Back() | |
401 | turtle.back() | |
402 | if posData["rot"] == 1 then | |
403 | posData["x"] = posData["x"] - 1 | |
404 | elseif posData["rot"] == 3 then | |
405 | posData["x"] = posData["x"] + 1 | |
406 | elseif posData["rot"] == 0 then | |
407 | posData["y"] = posData["y"] + 1 | |
408 | elseif posData["rot"] == 2 then | |
409 | posData["y"] = posData["y"] - 1 | |
410 | end | |
411 | SavePosition() | |
412 | end | |
413 | ||
414 | -- ===========STARTUP SEQUENCE========== | |
415 | if turtle.getFuelLevel() > 4 then CheckPosition() end | |
416 | CheckFuel() | |
417 | -- ===========STARTUP SEQUENCE END====== | |
418 | ||
419 | -- ===========MAIN LOOP================= | |
420 | while not done do | |
421 | --Sleep to prevent timeout | |
422 | --sleep(1) | |
423 | ||
424 | p1Mature = analyzer.isMature("EAST") | |
425 | p2Mature = analyzer.isMature("NORTH") | |
426 | ||
427 | if p1Mature and p2Mature then | |
428 | NewLine("Going to cross-crop activator") | |
429 | ||
430 | --Place 2nd crop stick for crossbreeding | |
431 | Forward() | |
432 | Left() | |
433 | Forward() | |
434 | Right() | |
435 | Forward() | |
436 | redstone.setOutput("bottom", true) | |
437 | sleep(0.8) | |
438 | redstone.setOutput("bottom", false) | |
439 | ||
440 | NewLine("Moving to second Analyzer") | |
441 | ||
442 | Back() | |
443 | Right() | |
444 | if turtle.suckDown() then | |
445 | Forward() | |
446 | Left() | |
447 | Back() | |
448 | Empty() | |
449 | os.reboot() | |
450 | else | |
451 | Back() | |
452 | end | |
453 | ||
454 | ||
455 | NewLine("Waiting for new seed") | |
456 | ||
457 | analyzer = peripheral.wrap("bottom") | |
458 | if not analyzer.hasPlant("SOUTH") and not analyzer.isCrossCrop("SOUTH") then | |
459 | NewLine("No cross crop sticks, resetting") | |
460 | Forward() | |
461 | Forward() | |
462 | Left() | |
463 | Back() | |
464 | os.reboot() | |
465 | else | |
466 | while analyzer.isCrossCrop("SOUTH") do | |
467 | sleep(5) | |
468 | end | |
469 | end | |
470 | NewLine("Picking up new seed") | |
471 | ||
472 | Forward() | |
473 | turtle.select(1) | |
474 | turtle.digDown() | |
475 | turtle.suckDown() | |
476 | turtle.placeDown() | |
477 | ||
478 | NewLine("Going to Analyzer 1") | |
479 | ||
480 | turtle.select(2) | |
481 | Forward() | |
482 | Left() | |
483 | Back() | |
484 | sleep(0.1) | |
485 | ||
486 | if CheckEmpty() then os.reboot() else turtle.select(2) end | |
487 | NewLine("Analyzing new seed") | |
488 | ||
489 | analyzer = peripheral.wrap("bottom") | |
490 | turtle.dropDown(turtle.getItemCount()) | |
491 | analyzer.analyze() | |
492 | while not analyzer.isAnalyzed() do | |
493 | sleep(3.5) | |
494 | end | |
495 | local s1, s2, s3 = analyzer.getSpecimenStats() | |
496 | p3 = s1 + s2 + s3 | |
497 | if p3 == 30 then | |
498 | turtle.suckDown() | |
499 | Forward() | |
500 | Empty() | |
501 | Back() | |
502 | p1=nil | |
503 | p2=nil | |
504 | ClearSeeds() | |
505 | --return | |
506 | else | |
507 | turtle.select(2) | |
508 | turtle.suckDown() | |
509 | ||
510 | NewLine("Removing weakest seed") | |
511 | ||
512 | CheckSeeds() | |
513 | if p1<=p2 then | |
514 | Left() | |
515 | Forward() | |
516 | turtle.select(1) | |
517 | turtle.digDown() | |
518 | turtle.suckDown() | |
519 | turtle.select(1) | |
520 | turtle.placeDown() | |
521 | Forward() | |
522 | redstone.setOutput("bottom", true) | |
523 | turtle.select(2) | |
524 | turtle.dropDown(1) | |
525 | sleep(2) | |
526 | redstone.setOutput("bottom", false) | |
527 | Back() | |
528 | Back() | |
529 | Right() | |
530 | Empty() | |
531 | else | |
532 | Forward() | |
533 | turtle.select(1) | |
534 | turtle.digDown() | |
535 | turtle.suckDown() | |
536 | Right() | |
537 | turtle.select(1) | |
538 | turtle.placeDown() | |
539 | Forward() | |
540 | redstone.setOutput("bottom", true) | |
541 | turtle.select(2) | |
542 | turtle.dropDown(1) | |
543 | sleep(2) | |
544 | redstone.setOutput("bottom", false) | |
545 | Back() | |
546 | Left() | |
547 | Back() | |
548 | Empty() | |
549 | end | |
550 | end | |
551 | end | |
552 | CheckSeeds() | |
553 | if not done then | |
554 | NewLine("Waiting for growth") | |
555 | if not CheckFuel() then sleep(5) end | |
556 | end | |
557 | end | |
558 | -- ================Main Loop End========================= |