SHOW:
|
|
- or go back to the newest paste.
1 | -- pastebin get 4SHjtFAU tfarm.lua | |
2 | -- This turtle program harvests rows of crops with rows of water between them | |
3 | - | local turnRightFirst = true |
3 | + | -- Seeds go in the first slot and fuel goes in the last (16th) slot. Everything else gets dumped. |
4 | -- The turtle needs to be outside the end of the last crop row facing into the row and 1 block above crop height | |
5 | -- To automate storage of crops and extra seeds place a chest under this position | |
6 | ||
7 | -- Farm parameters | |
8 | local rowLength = 20 | |
9 | local numRows = 16 | |
10 | local matureCropStage = 7 -- 7 will work for most crops | |
11 | local turnRightFirst = true -- true if the first turn needed to face the next row is right | |
12 | --Network parameters | |
13 | local networkMessageKeyword = "harvest" -- if received over the network, this will trigger a harvest | |
14 | local modemSide = "left" -- side the modem is on | |
15 | ||
16 | ||
17 | - | print("Harvesting...") |
17 | + | -- Initialize |
18 | - | setActiveSlot(1) |
18 | + | |
19 | - | turtle.digDown() |
19 | + | |
20 | - | turtle.placeDown() |
20 | + | local onFirstRow = true; |
21 | ||
22 | function setActiveSlot(slotNumber) | |
23 | slotNumber = tonumber(slotNumber) | |
24 | if slotNumber ~= nil then | |
25 | currentSlot = slotNumber | |
26 | turtle.select(slotNumber) | |
27 | end | |
28 | - | function turn(numberOfTimes, goRight) |
28 | + | |
29 | ||
30 | - | for i=0, numberOfTimes do |
30 | + | |
31 | - | turtle.turnRight() |
31 | + | local success, data = turtle.inspectDown() |
32 | ||
33 | if success then | |
34 | - | for i=0, numberOfTimes do |
34 | + | if data.state.age == matureCropStage then -- 7 = fully grown |
35 | - | turtle.turnLeft() |
35 | + | setActiveSlot(1) |
36 | turtle.digDown() | |
37 | turtle.placeDown() | |
38 | end | |
39 | end | |
40 | end | |
41 | - | turtle.forward() |
41 | + | |
42 | - | turtle.turnRight() |
42 | + | |
43 | - | for i=0, 30 do |
43 | + | |
44 | - | turtle.forward() |
44 | + | |
45 | end | |
46 | ||
47 | function forceMoveForward() | |
48 | - | refuelFromLastSlot() |
48 | + | while not turtle.forward() do |
49 | - | for i=0, numRows do |
49 | + | print("Failed to move forward!") |
50 | - | for j=0, rowLength do |
50 | + | sleep(1) |
51 | - | turtle.forward() |
51 | + | |
52 | end | |
53 | ||
54 | function forceTurn(goRight) | |
55 | - | turn(1, turnRightNext) |
55 | + | |
56 | - | turtle.forward() |
56 | + | while not turtle.turnRight() do |
57 | - | turtle.forward() |
57 | + | print("Failed to turn right!") |
58 | - | turn(1, turnRightNext) |
58 | + | sleep(1) |
59 | - | turnRightNext = not turnRightNext |
59 | + | |
60 | else | |
61 | while not turtle.turnLeft() do | |
62 | - | returnHome() |
62 | + | print("Failed to turn left!") |
63 | sleep(1) | |
64 | end | |
65 | end | |
66 | end | |
67 | ||
68 | function forceDropDown() | |
69 | while not turtle.dropDown() do | |
70 | print("Failed to transfer items!") | |
71 | sleep(1) | |
72 | end | |
73 | end | |
74 | ||
75 | function returnHome() | |
76 | ||
77 | local distanceToHome = (numRows * 2) - 2 | |
78 | ||
79 | forceMoveForward() | |
80 | forceTurn(true) -- TODO handle more cases | |
81 | ||
82 | for i=1, distanceToHome do | |
83 | forceMoveForward() | |
84 | end | |
85 | ||
86 | forceTurn(true) | |
87 | end | |
88 | ||
89 | function transferItems() | |
90 | for i=2, 15 do | |
91 | turtle.select(i) | |
92 | turtle.dropDown() | |
93 | end | |
94 | end | |
95 | ||
96 | function harvestField() | |
97 | print("Harvesting crops...") | |
98 | refuelFromLastSlot() | |
99 | forceMoveForward() | |
100 | ||
101 | for i=1, numRows do | |
102 | ||
103 | if onFirstRow == true then | |
104 | onFirstRow = false | |
105 | else | |
106 | -- Get to next row | |
107 | forceTurn(turnRightNext) | |
108 | forceMoveForward() | |
109 | forceMoveForward() | |
110 | forceTurn(turnRightNext) | |
111 | ||
112 | -- Zig zag efficiently through the crop rows | |
113 | turnRightNext = not turnRightNext | |
114 | end | |
115 | ||
116 | for j=2, rowLength do | |
117 | harvest() | |
118 | forceMoveForward() | |
119 | end | |
120 | ||
121 | harvest() | |
122 | ||
123 | end | |
124 | ||
125 | returnHome() | |
126 | transferItems() | |
127 | ||
128 | turnRightNext = turnRightFirst | |
129 | onFirstRow = true | |
130 | ||
131 | end | |
132 | ||
133 | -- Execution starts here -- | |
134 | print("Listening for messages...") | |
135 | rednet.open(modemSide) | |
136 | while true do | |
137 | id, msg = rednet.receive() | |
138 | if msg == networkMessageKeyword then | |
139 | rednet.close(modemSide) | |
140 | harvestField() | |
141 | print("Harvest finished. Listening...") | |
142 | rednet.open(modemSide) | |
143 | end | |
144 | end |