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