View difference between Paste ID: QSkT1bKD and hMzKGbj1
SHOW: | | - or go back to the newest paste.
1-
function findStartingPosition()
1+
--[[
2-
  print("Running findStartingPosition...")
2+
-- 
3-
  repeat
3+
-- There are config variables below.
4-
    if turtle.detectDown() == false then
4+
--
5-
      turtle.down()
5+
-- Modified to use a file to
6
-- 'remember' what action it was doing
7-
  until turtle.detectDown() == true
7+
-- when the world stopped existing.
8-
  repeat
8+
-- 
9-
    if turtle.detectDown() == true then
9+
-- Fair warning, I have not tested
10-
      turtle.forward()
10+
-- this code.
11
--
12-
    isBlockFront, whatBlockFront = turtle.inspect()
12+
-- Also, you should really make things
13-
  until whatBlockFront.name == "minecraft:chest"
13+
-- local, it keeps the computer global
14
-- memory cleaner.
15
-- 
16-
function goToLava()
16+
-- 39 characters are not enough width.
17-
  print("Running Go To Lava...")
17+
-- http://computercraft.info/wiki/Resolution#Turtle_resolution
18-
  repeat
18+
--
19-
    turtle.down()
19+
-- I've practically rewritten this
20-
    isBlockDown, whatBlockDown = turtle.inspectDown()
20+
-- entirely, feel free to not use it
21-
  until whatBlockDown.name == "minecraft:log"
21+
-- because of this.
22-
  repeat
22+
--
23-
    turtle.forward()
23+
-- If you need me to explain the code
24-
    isBlockFront, whatBlockFront = turtle.inspect()
24+
-- then feel free to ask me to do so.
25-
  until whatBlockFront.name == "minecraft:chest"
25+
--
26
-- Lupus590
27
--
28
-- P.S. I'm part way through this
29-
function goToSurface()
29+
-- rewrite and I'm realising that I
30-
  print("Running goToSurface...")
30+
-- may be doing a lot of tricks which
31-
    repeat
31+
-- you may not know about, I've tried
32-
    turtle.back()
32+
-- my best to comment regularly.
33-
    isBlockDown, whatBlockDown = turtle.inspectDown()
33+
--
34-
  until whatBlockDown.name == "minecraft:log"
34+
-- P.P.S. You have some odd logic.
35-
  repeat
35+
--
36
-- ]]
37-
    isBlockFront, whatBlockFront = turtle.inspect()
37+
--[[ multi line comment
38-
  until whatBlockFront.name == "minecraft:chest"
38+
I've done it oddly above as I believe
39
ComputerCraft reacts funny.
40
It might only be the syntax highlighter
41-
function pickupLavaBuckets()
41+
that goes funny, which this would
42-
  print("Running pickupLavaBuckets...")
42+
demonstrate if on an advanced system. ]]
43-
  repeat
43+
44-
    os.sleep(2)
44+
45-
    full = 1
45+
46-
    for i = 1,16 do 
46+
------------
47-
      turtle.select(i)
47+
-- Config --
48-
      turtle.suck()
48+
------------
49-
      if turtle.getItemCount() < 1 then
49+
50-
        full = 0
50+
local targetFuelLevel = 1000
51
  -- turtle will try to keep at this fuel level by using lava
52
  -- increase if turtle runs out of fuel and has no lava
53-
  until full == 1
53+
  -- decrease if it keeps drinking it all
54
55
local stateFileName = "lavaElelvatorState"
56-
function dropLavaBuckets()
56+
57-
  print("Running dropLavaBuckets...")
57+
----------
58-
  repeat
58+
-- Code --
59-
    isBlockFront, whatBlockFront = turtle.inspect()
59+
----------
60-
    print("No Chest Found")
60+
61-
    os.sleep(1)
61+
local currentState
62-
  until whatBlockFront.name == "minecraft:chest"
62+
local state = {}
63-
  repeat
63+
state.descend = "descend"
64-
    empty = 1
64+
state.goToLava = "goToLava"
65-
    print("Empty = 1")
65+
state.getLava = "getLava"
66-
    for i = 1,16 do 
66+
state.goToShaftBottom = "goToShaftBottom"
67-
      turtle.select(i)
67+
state.ascend = "ascend"
68-
      if turtle.getItemCount() > 0 then
68+
state.giveLava = "giveLava"
69-
        slotInfo = turtle.getItemDetail()
69+
local action = {} -- corresponds to the states above
70-
        if (slotInfo.name == "minecraft:lava_bucket") or (slotInfo.name == "minecraft:bucket") then
70+
action.descend
71-
          turtle.drop()
71+
action.goToLava
72-
          empty = 0
72+
action.getLava
73-
          print("empty = 0")
73+
action.goToShaftBottom
74-
        end
74+
action.ascend
75
action.giveLava
76
77-
  until empty == 1
77+
78
local function findResumeActions() -- figures out what the turtle was doing before chunk unload so that the turtle can continue efficiently
79
  -- print("Running findResumeActions...")
80
  
81-
while 0==0 do 
81+
  -- resume sequence { action.descend, action.goToLava, action.getLava, action.goToShaftBottom, action.ascend,  action.giveLava}
82-
  findStartingPosition()
82+
  
83-
  pickupLavaBuckets()
83+
  if fs.exists(stateFileName) then
84-
  goToSurface()
84+
    local stateFile = fs.open(stateFileName, "r")
85-
  dropLavaBuckets()
85+
    currentState = stateFile.readLine()
86-
  goToLava()
86+
    stateFile.close()
87
    if currentState == state.descend then
88
      return "continue" -- default actions are fine
89
      
90
    elseif currentState == state.goToLava then
91
      return {action.goToLava, action.getLava, action.goToShaftBottom, action.ascend, action.giveLava}
92
      
93
    elseif currentState == state.getLava then
94
      return {action.getLava, action.goToShaftBottom, action.ascend, action.giveLava}
95
    
96
    elseif currentState == state.goToShaftBottom then
97
      return {action.goToShaftBottom, action.ascend, action.giveLava}
98
      
99
    elseif currentState == state.ascend then
100
      return {action.ascend, action.giveLava}
101
      
102
    elseif currentState == state.givLava then
103
      return {action.giveLava}
104
      
105
    else
106
      error("Unexpected value in file: "..stateFileName)
107
    end	
108
  end
109
110
  
111
  print("Could not find file: "..stateFileName)
112
  print("Assistance required to start")
113
  print("Please place turtle to the shaft bottom and then restart this program")
114
  print("If the turtle is already there then type in 'Y', any other input will quit this program")
115
  
116
  if string.lower(read()) == "y" then
117
    return "continue"
118
  else
119
    return "quit"
120
  end
121
end
122
123
local function saveState(state)
124
  local stateFile = fs.open(stateFileName, "w")
125
  stateFile.writeLine(state) -- could error here if for some reason the file can't be opened
126
  stateFile.close()
127
  --print("state saved")
128
end
129
130
local function selectEmptySlot()
131
  for i = 1, 16 do
132
    turtle.select(i)
133
    if turtle.getItemCount() == 0 then
134
      return true
135
     end
136
  end
137
  return false -- could not find an empty slot
138
end
139
140
local function checkFuel() -- true = lava used
141
  local currentSlot = 1
142
  local drank = false
143
  while turtle.getFuelLevel < targetFuelLevel do
144
    turtle.select(currentSlot)
145
    if not turtle.refuel(1) then -- if we can't refuel from it
146
      if currentSlot ~= 16 then  
147
        currentSlot = currentSlot + 1 -- select the next slot
148
      else
149
        break -- exit the while loop as we have ran out of slots to try to refuel from
150
      end
151
    else
152
      drank = true -- we refuelled from something
153
    end
154
  end    
155
  return drank
156
end
157
158
function action.descend()
159
  --print("Running action.descend...")
160
  saveState(state.descending)
161
  while turtle.down() do -- if we can go down then we do, otherwise we must be at the bottom
162
    -- would check fuel but no lava on board so we are stuck anyway
163
  end
164
end
165
166
  
167
function action.goToLava()
168
  --print("Running action.goToLava...")
169
  saveState(state.goToLava)
170
  while turtle.forward() do
171
    -- would check fuel but no lava on board so we are stuck anyway
172
  end
173
end
174
175
176
function action.getLava()
177
  --print("Running action.getLava...")
178
  saveState(state.getLava)
179
  -- drop off empty buckets
180
  for i = 1,16 do
181
    turtle.select(i)
182
    local _, item = turtle.getItemDetail()
183
    if item.name = "minecraft:bucket" then
184
      turtle.drop()
185
    end
186
  end
187
  
188
  -- pick up full buckets
189
  while selectEmptySlot() do
190
    turtle.suck()
191
    
192
    -- check that the item we got is not an empty bucket
193
    local _, item = turtle.getItemDetail()
194
    if item.name = "minecraft:bucket" then
195
      turtle.drop() -- if it is an empty bucket, put it back
196
      sleep(10) -- sleep a bit so the other turtle has time to fill the bucket
197
    end
198
    
199
    -- let's check our fuel while we have lava near us
200
    if checkFuel() then
201
      -- we just refuelled, may as well replace the empty bucket/s while we are here
202
      return action.getLava() -- trick: by returning we don't use another 'slot' on the function stack
203
    end
204
  end
205
end
206
  
207
  
208
function action.goToShaftBottom()
209
  --print("Running action.goToShaftBottom...")
210
  saveState(state.goToShaftBottom)
211
  checkFuel()
212
  while turtle.back() do
213
    checkFuel() -- have lava, don't want to get stuck
214
  end
215
end
216
217
218
function action.ascend()
219
  --print("Running action.ascend...")
220
  saveState(state.ascend)
221
  
222
  local _, blockInFront = turtle.inspect()
223
  local foundChest = blockInFront == "minecraft:chest" -- this should work
224
  while not foundChest do
225
    checkFuel()
226
    turtle.up()
227
    _, blockInFront = turtle.inspect() -- reusing the old variables
228
    foundChest = blockInFront == "minecraft:chest"
229
  end
230
end
231
    
232
function action.giveLava()
233
 --print("Running action.giveLava...")
234
  saveState(state.giveLava)
235
  
236
  checkFuel() -- just before we do, lets be a selfish turtle
237
  
238
  -- drop off full buckets
239
  for i = 1,16 do
240
    turtle.select(i)
241
    local _, item = turtle.getItemDetail()
242
    if item.name = "minecraft:lava_bucket" then
243
      turtle.drop()
244
    end
245
  end
246
  
247
  -- pick up empty buckets
248
  while selectEmptySlot() do
249
    turtle.suck()
250
    -- check that the item we got is not a full bucket
251
    local _, item = turtle.getItemDetail()
252
    if item.name = "minecraft:lava_bucket" then
253
      turtle.drop() -- if it is a full bucket, put it back
254
      sleep(10) -- sleep a bit so the quarry has time to drink
255
    end
256
  end
257
end
258
259
260
------------------
261
-- Main Program --
262
------------------
263
264
265
local resumeActions = findResumeActions() -- returns a table (usually)
266
if type(resumeActions) == "table" and #resumeActions > 0 then -- is it a table and does it have stuff in
267
  for _,v in ipairs(resumeActions) do -- go through each key in the table and put the value in v
268
    v() -- the value should be a function, run it. If it ends up not being a function the script will error here
269
  end
270
elseif type(resumeActions) == "string"
271
  if resumeActions == "quit" then
272
    return
273
  elseif resumeActions == "continue" then
274
    -- continue to while true loop
275
  else
276
    error("Unexpected string from findResumeActions")
277
  end
278
else
279
  error("Unexpected return value from findResumeActions")
280
end
281
282
while true do 
283
  action.descend()
284
  action.goToLava()
285
  action.getLava()
286
  action.goToShaftBottom()
287
  action.ascend()
288
  action.goToQuarry()
289
  action.giveLava()
290
  action.goToShaftTop()
291
end