View difference between Paste ID: bgWmf8Ja and MFrcBNS9
SHOW: | | - or go back to the newest paste.
1
--{program="aTreeFarm",version="1.04b",date="2018-01-07"}
2
---------------------------------------
3
-- aTreeFarm           by Kaikaku
4
-- 2018-01-07, v1.04   bugfix (turtle start position)
5
-- 2018-01-05, v1.03   bugfix (turtle digged drop chest)
6
-- 2017-12-02, v1.02   start with craft fuel and empty to allow tHome
7
-- 2015-01-31, v1.01   fixed initial refuelling
8
-- 2015-01-31, v1.00   finalized UI + counter
9
-- 2015-01-30, v0.80   auto set-up option
10
-- 2015-01-26, v0.70   preparing for video
11
-- 2014-01-12, v0.61   replant limited tries
12
-- 2014-01-04, v0.60   redstone stop
13
-- 2013-12-15, v0.51   initial
14
---------------------------------------
15
16
17
---------------------------------------
18
---- DESCRIPTION ---------------------- 
19
---------------------------------------
20
-- Turtle-automated tree farm.
21
-- Details see information during program
22
--   execution or YouTube video.
23
24
25
---------------------------------------
26
---- PARAMETERS ----------------------- 
27
---------------------------------------
28
local cVersion  ="1.04"
29
local cPrgName  ="aTreeFarm"
30
local cMinFuel  = 960*2      -- 2 stacks of planks
31
32
local minRandomCheckSapling=0.1 -- below this will check replant
33
local actRandomCheckSapling=minRandomCheckSapling*2
34
local cIncreaseCheckSapling_Sapling=0.02
35
local cIncreaseCheckSapling_Stub=0.04
36
local cMaxCheckSapling=0.6
37
local strC="tReeTreESdig!diG;-)FaRmKaIKAKUudIgYdIgyTreEAndsOrRygUYsd"
38
39
local cSlotChest=16           -- chest for crafty turtle
40
local cCraftRefuelMaxItems=32 -- use how many logs to refuel at max
41
local cSlotRefuel=2           -- where to put fuel
42
local cExtraDigUp=1           -- go how many extra levels to reach jungle branches
43
local cLoopEnd=56             -- one loop
44
local cWaitingTime=20         -- if redstone signal in back is on
45
46
---------------------------------------
47
---- VARIABLES ------------------------ 
48
---------------------------------------
49
local strC_now="" 
50
local strC_next=""
51
52
local tmpResult=""
53
local blnAskForParameters=true
54
local blnShowUsage=false
55
local blnAutoSetup=false
56
local strSimpleCheck="Press enter to start:"
57
local intCounter=0
58
local maxCounter=0
59
60
---------------------------------------
61
---- tArgs ----------------------------
62
---------------------------------------
63
local tArgs = {...}
64
if #tArgs >= 1 then -- no error check
65
  blnAskForParameters=false
66
  if tArgs[1]=="help" then blnShowUsage=true end
67
  if tArgs[1]=="setup" then blnAutoSetup=true end
68
  if tArgs[1]=="set-up" then blnAutoSetup=true end
69
  if tonumber(tArgs[1])~=nil then
70
    maxCounter=tonumber(tArgs[1])
71
  end
72
end
73
74
if blnShowUsage then
75
  print("+-------------------------------------+")
76
  print("  "..cPrgName..", by Kaikaku")
77
  print("+-------------------------------------+")
78
  print("Usage: aTreeFarm [setup/set-up]")
79
  print("   or: aTreeFarm [maxCounter]")
80
  print("setup or set-up:")
81
  print("   Will start auto set-up")
82
  print("maxCounter:")
83
  print("   0=will farm infinitely")
84
  print("   x=will farm x rounds")
85
  print("More details on YouTube ;)")
86
  return  
87
end
88
89
---------------------------------------
90
-- BASIC FUNCTIONS FOR TURTLE CONTROL -
91
---------------------------------------
92
local function gf(n)
93
  if n==nil then n=1 end
94
  for i=1,n,1 do while not turtle.forward() do end end
95
end
96
local function gb(n)
97
  if n==nil then n=1 end
98
  for i=1,n,1 do while not turtle.back() do end end
99
end
100
local function gu(n)
101
  if n==nil then n=1 end
102
  for i=1,n,1 do while not turtle.up() do end end
103
end
104
local function gd(n)
105
  if n==nil then n=1 end
106
  for i=1,n,1 do while not turtle.down() do end end
107
end
108
local function gl(n)
109
  if n==nil then n=1 end
110
  for i=1,n,1 do while not turtle.turnLeft() do end end
111
end
112
local function gr(n)
113
  if n==nil then n=1 end
114
  for i=1,n,1 do while not turtle.turnRight() do end end
115
end
116
local function pf(n)
117
  -- moves backwards if n>1
118
  if n==nil then n=1 end
119
  for i=1,n,1 do if i~=1 then gb() end turtle.place() end
120
end
121
local function pu()  turtle.placeUp()    end
122
local function pd()  turtle.placeDown()  end
123
local function df()  return turtle.dig() end
124
local function du()  turtle.digUp()      end
125
local function dd()  turtle.digDown()    end
126
local function sf()  turtle.suck()       end
127
local function su()  turtle.suckUp()     end
128
local function sd(n)
129
  if n==nil then 
130
    while turtle.suckDown() do end
131
  else
132
    for i=1,n do
133
	  turtle.suckDown()
134
	end
135
  end 
136
end
137
local function Df()  turtle.drop()      end
138
local function Du(n) if n==nil then n=64 end turtle.dropUp(n) end
139
local function Dd(n) if n==nil then n=64 end turtle.dropDown(n) end
140
local function ss(s) turtle.select(s)   end
141
142
local function askForInputText(textt)
143
  local at=""
144
  -- check prompting texts
145
  if textt==nil then textt="Enter text:" end
146
  
147
  -- ask for input
148
  write(textt)
149
  at=read() 
150
  return at
151
end
152
153
local function checkFuel()
154
  local tmp=turtle.getFuelLevel()
155
  return tmp
156
end
157
158
function checkRefuel(minFuel, slotFuel)
159
  if slotFuel==nil then slotFuel=2 end
160
  if minFuel==nil then minFuel=1000 end
161
  local tmpFuel=0 tmpFuel2=0
162
  local tmpItems=65 --turtle.getItemCount(slotFuel) 
163
  local cSleep=5
164
  
165
  -- step 1 check if more fuel is required
166
  tmpFuel=turtle.getFuelLevel()
167
  tmpFuel2=tmpFuel-1 -- triggers print at least once
168
  if tmpFuel<minFuel then
169
	ss(slotFuel)
170
	-- step 2 refuel loop
171
	while tmpFuel<minFuel do
172
	  -- step 2.1 need to update fuel level?
173
	  if tmpFuel2~=tmpFuel then --tmpItems~=turtle.getItemCount(slotFuel) then
174
	    -- fuel still too low and there have been items consumed
175
        print("Need more fuel ("..tmpFuel.."/"..minFuel..") in slot "..slotFuel)
176
		if turtle.getItemCount(2)<64 then
177
            turtle.turnLeft()
178
            turtle.turnLeft()
179
            sf(64 - turtle.getItemCount(15))
180
            turtle.turnRight()
181
            turtle.turnRight() end
182
	  end
183
	  -- step 2.2 try to refuel
184-
	  if tmpItems>0 then
184+
      for i=3,15,1 do
185-
	    -- try to refuel this items
185+
186-
	    turtle.refuel()
186+
187-
	  else
187+
188-
	    os.sleep(cSleep)	    
188+
189
	  -- step 2.3 update variables
190
	  tmpItems=turtle.getItemCount(slotFuel)
191
	  tmpFuel2=tmpFuel
192
	  tmpFuel=turtle.getFuelLevel()
193
    end
194
  end
195
  -- step 3 either no need to refuel 
196
  --        or successfully refuelled
197
  print("Fuel level ok  ("..tmpFuel.."/"..minFuel..")")
198
end
199
200
201
---------------------------------------
202
---- functions ------------------------
203
---------------------------------------
204
205
local function cutTree()
206
local tmpExtraDigUp=cExtraDigUp
207
208
  ---- assumptions
209
  -- turtle faces trunk one block below bottom
210
  ---- variables
211
  local intUpCount = 0
212
  local intFace = 0 -- -1=left, 1=right
213
  local blnDigSomething=false
214
  
215
  term.write("  cutting tree: ")
216
  
217
  -- get into tree column
218
  df()
219
  while not turtle.forward() do df() end
220
  gr() df() gl() df() gl() df()
221
  local intFace=-1 
222
223
  -- cut and go up
224
  repeat
225
    blnDigSomething=false
226
    du()
227
    while not turtle.up() do du() end
228
    blnDigSomething=df() or blnDigSomething
229
    if intFace==-1 then 
230
      gr()
231
      blnDigSomething=df() or blnDigSomething
232
      gr()
233
    elseif intFace==1 then
234
      gl()
235
      blnDigSomething=df() or blnDigSomething
236
      gl()
237
    end
238
    intFace=intFace * -1
239
    blnDigSomething=df() or blnDigSomething
240
    intUpCount = intUpCount +1
241
    term.write(".")
242
	
243
	-- check for 2 conditions
244
	-- either
245
	-- 1) nothing above the turtle
246
	-- or
247
	-- 2) nothing dig on the other columns blnDigSomething
248
	if not (turtle.detectUp() or blnDigSomething) then 
249
	  tmpExtraDigUp=tmpExtraDigUp-1  
250
    else
251
      tmpExtraDigUp=cExtraDigUp -- restore it	
252
	end		
253
  until tmpExtraDigUp<0 --not (turtle.detectUp() or blnDigSomething) ----- NOT kai_2 
254
  
255
  -- go off tree column  
256
  if intFace==-1 then 
257
    gl()
258
  elseif intFace==1 then
259
    gr()
260
  end
261
  df()
262
  while not turtle.forward() do df() end
263
  gl()
264
  intFace = 0 
265
266
  intFace = 1 -- 1=forward,-1=backwards
267
  -- go back down  
268
  -- hint: only digging front and back in order
269
  --       to not cut into larger neighbouring,
270
  --       as this may leave upper tree parts left
271
  for i = 1,intUpCount+1 do
272
    dd() df() gl(2)	df()
273
	intFace=intFace* -1
274
    while not turtle.down() do dd() end
275
  end
276
  if intFace==1 then
277
    gl()
278
  elseif intFace==-1 then
279
    gr()
280
  end
281
  sf() df() term.write(".")
282
  print(" done!")
283
284
  -- plant new
285
  plantTree()
286
  while not turtle.up() do du() end
287
  sd()  
288
end
289
290
---------------------------------------
291
function plantTree()
292
local tmpCount=0
293
  ---- assumptions
294
  -- turtle faces place to plant
295
296
  -- check for enough saplings
297
  sf()
298
  if turtle.getItemCount(1) > 1 then
299
    -- plant
300
    print("  plant new sapling")
301
    while not turtle.place() do 
302
	  print("  hard to plant here...")
303
	  tmpCount=tmpCount+1
304
	  if tmpCount>3 then break end
305
	  os.sleep(1)
306
	end  -- NOT kai_2
307
  else
308
    -- error
309
    print("  Out of saplings...") -- prog name
310
    os.sleep(5)
311
	actRandomCheckSapling=cMaxCheckSapling
312
    return
313
  end
314
end
315
316
---------------------------------------
317
local function replantStub()
318
  ss(2) -- compare with wood in slot 2
319
  if turtle.compare() then
320
    -- assumption: there is only a stub left, so replant
321
	-- if there is a tree on top of it, it will be harvested next round
322
	print("  Replanting a stub")
323
	df() ss(1)
324
	if pf() then
325
	  actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Stub
326
	else
327
	  print("    failure!")	  
328
	end
329
  else
330
    ss(1)
331
    end
332
  end
333
  local function eS(sI,sA,eA)
334
  local sO=""
335
  local sR=""
336
  if sA==nil then sA=1 end
337
  if eA==nil then eA=string.len(sI) end
338
  for i=sA,eA,1 do
339
	sO=string.sub(sI,i,i)
340
	if sR~="" then break end
341
    if sO=="a" then
342
      gl()
343
    elseif sO=="d" then
344
      gr()
345
	else
346
      while not turtle.forward() do df() end
347
    end
348
  end
349
  return sR
350
end
351
352
---------------------------------------
353
local function randomReplant()
354
local intSuccess=0
355
  if turtle.getItemCount(1) > 10 then
356
	-- try to plant
357
    while not turtle.down() do dd() end
358
	sf() gl() sf()
359
	if turtle.place() then 
360
	  actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Sapling 
361
	else
362
	  if turtle.detect() then replantStub() end
363
	end
364
	gl() sf() gl() sf()
365
	if turtle.place() then 
366
	  actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Sapling 
367
	else
368
	  if turtle.detect() then replantStub() end
369
	end	
370
	gl() sf()
371
    while not turtle.up() do du() end
372
	-- ensure min probability and max 100%
373
	actRandomCheckSapling=math.max(actRandomCheckSapling-0.01,minRandomCheckSapling)
374
	actRandomCheckSapling=math.min(actRandomCheckSapling,cMaxCheckSapling)
375
    print((actRandomCheckSapling*100).."% check probability")
376
  else
377
    -- extra suck
378
    while not turtle.down() do dd() end
379
	sf() gr() sf() gr() sf() gr() sf() gr()	sf()
380
	while not turtle.up() do du() end
381
	sd()
382
  end
383
end
384
385
---------------------------------------
386
local function craftFuel()
387
local tmpFuelItems=turtle.getItemCount(15)
388
  
389
  -- step 1 need fuel?
390
  if (turtle.getFuelLevel()<cMinFuel) and (turtle.getItemCount(cSlotChest)==1) then
391
  -- no refuelling if not exactly 1 item in slot cSlotChest (=chest)
392
    print("Auto refuel    ("..turtle.getFuelLevel().."/"..cMinFuel..") ...") 
393
 
394
	-- step 2 enough mats to refuel?
395
    --        assumption: slot 2 has wood 
396
	if tmpFuelItems>1 then  
397
	  -- step 2 store away stuff!
398
      ss(cSlotChest) while not turtle.placeUp() do du() end
399
	  
400
	  for i=1,15,1 do
401
	    ss(i)
402
		if i~=2 then
403
		  Du()
404
		else
405
		  -- cCraftRefuelMaxItems
406
		  Du(math.max(1,turtle.getItemCount(2)-cCraftRefuelMaxItems)) -- to keep the wood
407
		end
408
	  end
409
	  
410
      -- step 3 get coal from chest behind
411
      if tmpFuelItems<64 then
412
      	turtle.turnLeft()
413
	  	turtle.turnLeft()
414
	  	sf(64 - tmpFuelItems)
415
		turtle.turnRight()
416
		turtle.turnRight() end
417
	  
418
	  
419
      -- step 4 refuel!
420
      for i=1,16,1 do
421
	   	ss(i)
422
		turtle.refuel()
423
	  end
424
	  print("New fuel level ("..turtle.getFuelLevel().."/"..cMinFuel..")")
425
	  
426
      -- step 5 get back stuff!
427
      ss(1) --su(64) 
428
	  while turtle.suckUp() do end
429
	  ss(cSlotChest) du() ss(1)
430
    else	
431
		if tmpFuelItems<64 then
432
        	turtle.turnLeft()
433
        	turtle.turnLeft()
434
        	sf(64 - tmpFuelItems)
435
        	turtle.turnRight()
436
        	turtle.turnRight() end
437
	end
438
  end
439
end
440
441
442
---------------------------------------
443
local function emptyTurtle()
444
  print("  Drop what I've harvested!")
445
  while not turtle.down() do dd() end
446
  ss(2)
447
448
  if turtle.compareTo(1) then
449
    print("Error: Ups, in slot 2 is the same as in slot 1??")
450
    --Dd()
451
  else
452
    -- if slot 2 has other item (wood) than slot 1
453
	--   keep one of them for comparison
454
	if turtle.getItemCount(2)>1 then
455
      Dd(math.max(turtle.getItemCount(2)-1,0))
456
	end
457
  end
458
  for i=3,15,1 do
459
    -- assumption slot 16 contains a chest
460
    ss(i) Dd()
461
  end
462
  os.sleep(0)
463
  ss(1)
464
end
465
466
---------------------------------------
467
---- main -----------------------------
468
---------------------------------------
469
-- step 0 info and initial check
470
term.clear() term.setCursorPos(1,1)
471
repeat
472
 print("+-------------------------------------+")
473
 print("| aTreeFarm "..cVersion..", by Kaikaku (1/2)    |")
474
 print("+-------------------------------------+")
475
 print("| Farm set-up: Place crafty felling   |")
476
 print("|   turtle down (e.g. bottom left     |")
477
 print("|   corner of chunk). Run program with|")
478
 print("|   parameter 'setup' (one time).     |")
479
 print("| Materials for auto set-up:          |")
480
 print("|   slot 3: chest   (1)               |")
481
 print("|   slot 4: cobble  (47)              |")
482
 print("|   slot 5: torches (8)               |")
483
 print("+-------------------------------------+")
484
485
if blnAutoSetup then
486
  if turtle.getItemCount(3)~=1 or turtle.getItemCount(4)<47 or turtle.getItemCount(5)<8 then
487
  -- inventory not ready for set-up
488
    strSimpleCheck="Fill in slots 3-5 and press enter:"
489
  else
490
    strSimpleCheck="Press enter to start:"
491
  end
492
else  
493
  strSimpleCheck="Press enter to start:"
494
end
495
if not blnAskForParameters and strSimpleCheck=="Press enter to start:" then break end
496
until askForInputText(strSimpleCheck)=="" and strSimpleCheck=="Press enter to start:"
497
498
499
500
term.clear() term.setCursorPos(1,1)
501
repeat
502
 print("+-------------------------------------+")
503
 print("| aTreeFarm "..cVersion..", by Kaikaku (2/2)    |")
504
 print("+-------------------------------------+")
505
 print("| Running the farm:                   |")
506
 print("|   Felling turtle sits above chest   |")
507
 print("|   (as after running set-up). Turtle |")
508
 print("|   needs some initial fuel to start. |")
509
 print("| Turtle inventory:                   |")
510
 print("|   slot  1: saplings          (20+x) |")
511
 print("|   slot  2: wood from sapling (1+x)  |")
512
 print("|   slot 16: chest             (1)    |")
513
 print("+-------------------------------------+")
514
515
if turtle.getItemCount(1)<11 or turtle.getItemCount(2)==0 or turtle.getItemCount(16)~=1 then
516
  -- inventory not ready
517
  strSimpleCheck="Provide materials and press enter:"
518
else  
519
  strSimpleCheck="Press enter to start:"
520
end
521
--strSimpleCheck="Press enter to start:"
522
if not blnAskForParameters and strSimpleCheck=="Press enter to start:" then break end
523
if blnAutoSetup then strSimpleCheck="Press enter to start:" end
524
until askForInputText(strSimpleCheck)=="" and strSimpleCheck=="Press enter to start:"
525
526
527
---------------------------------------
528
---- set-up farm ----------------------
529
---------------------------------------
530
-- set-up = not running the farm
531
if blnAutoSetup then
532
  write("Setting up tree farm...")
533
  checkRefuel(cMinFuel,cSlotRefuel)
534
  -- chest
535
  gf(3) gr() gf(3) gl() ss(3) dd() pd() 
536
  -- path
537
  ss(4)
538
  for i=1,9,1 do gf() dd() pd() end gr()
539
  for i=1,3,1 do gf() dd() pd() end gr()
540
  for i=1,6,1 do gf() dd() pd() end gl()
541
  for i=1,3,1 do gf() dd() pd() end gl()
542
  for i=1,6,1 do gf() dd() pd() end gr()
543
  for i=1,3,1 do gf() dd() pd() end gr()
544
  for i=1,9,1 do gf() dd() pd() end gr()
545
  for i=1,8,1 do gf() dd() pd() end
546
  -- torches
547
  ss(5) gf(2) gl() pf() gu() gb(10) pd()
548
  gl() gf(5) pd() gf() pd() gf(5) pd() gr() gf(11) pd()
549
  gb(3) gr() gf(3) pd() gf(5) pd() gf(2) gr() gb(2) gd()
550
  print(" done!")
551
  print("You can now run the tree farm with: ",cPrgName)
552
  return
553
end
554
555
556
---------------------------------------
557
---- tree farm ------------------------
558
---------------------------------------
559
strC_next=string.sub(strC,1,1)
560
561
-- initial up
562
while not turtle.up() do du() end  
563
564
while true do  
565
   
566
  -- step 6 need to craft some fuel?
567
  craftFuel()
568
  
569
  -- step 7 empty into chest
570
  emptyTurtle()
571
  
572
  -- step 0 check exit 
573
  if maxCounter>0 then
574
    if intCounter==maxCounter then
575
	  print("Completed all ",maxCounter,"  farming rounds.")
576
	  print("I'm awaiting new commands, master!")
577
	  --while not turtle.up() do du() end
578
	  return
579
	end
580
  end
581
  
582
  -- step 1 check fuel
583
  checkRefuel(cMinFuel,cSlotRefuel)
584
  
585
  -- step 2 wait if redstone signal
586
  while rs.getInput("back") do
587
    print("Waiting due to redstone signal ",cWaitingTime,"s.")
588
    os.sleep(cWaitingTime)
589
  end
590
591
  -- step 3 new round 
592
  while not turtle.up() do du() end
593
  ss(1)
594
  intCounter=intCounter+1
595
  print("Starting round ",intCounter," with "..turtle.getItemCount(1).." saplings.")
596
597
  for i=1,cLoopEnd,1 do
598
  
599
    -- update commands
600
	strC_now=strC_next
601
	if i<cLoopEnd then
602
      strC_next=string.sub(strC,i+1,i+1)
603
    else
604
	  strC_next=string.sub(strC,1,1)
605
	end
606
	
607
    -- step 4 one step on the road
608
    tmpResult=eS(strC,i,i)
609
	if tmpResult~="" then
610
	  print("found special command: "..tmpResult)
611
	end
612
    
613
	-- step 5 check for blocks
614
	-- step 5.1 check left hand side
615
	if strC_now~="a" and strC_next~="a" then
616
	  -- now  a=>just turned left
617
	  -- next a=>will turned left
618
	  gl()
619
	  if turtle.detect() then cutTree() end
620
	  gr()
621
	end
622
	-- step 5.2 check right hand side
623
	if strC_now~="d" and strC_next~="d" then	
624
	  -- now  d=>just turned right
625
	  -- next d=>will turn right
626
	  gr()
627
	  if turtle.detect() then cutTree() end
628
	  gl()
629
	end
630
	sd()  
631
	
632
	if math.random()<=actRandomCheckSapling then
633
	  if strC_now~="d" and strC_now~="a" then	
634
	    randomReplant()
635
	  end
636
	end
637
  end
638
end