View difference between Paste ID: 9LGhh30Y and B01DNgJT
SHOW: | | - or go back to the newest paste.
1-
flip=0
1+
-- Attempt at a variable width, length, and depth mining program
2-
width=16
2+
-- initially basic 2x1 mine down to depth, advance then 2x1 up and repeat length number of times (for width number of times)
3-
-- depth=37
3+
-- attempt to handle falling blocks (sand/gravel) as well as I can.  Nothing for fluids at this time.  Need to detect stelarite
4-
length=4
4+
-- so it doesn't blow up the turtle
5-
blocklag=0 -- .5
5+
-- Current draft is attempting to add offsets to allow return to chests when full ('heading' is relative, not absolute, so it shouldn't
6
-- matter what direction the turtle is facing to begin, the chest should be immediately behind the turtle.
7
8
heading=0 -- right to left 1,2,3 left to right 3,2,1
9
xpos=0 -- starting x position (relative to turtle, not literal x/y world orientation)
10
zpos=0 -- starting z position (relative to turtle)
11
ypos=0 -- ditto
12
13
flip=0 -- manages left or right u-turn at end of column
14
15
width=1
16
-- depth=37 passed by parameter now.  I might add this as a variable, I might not.
17
length=12 -- 2 or 4 is reasonable as these are 4x longer than specified
18
19
blocklag=0 -- .5 if you're in a sand heavy area this can help allow sand to fall into place to avoid false forward movement
20-
if turtle.getFuelLevel()<depth*4 then
20+
21
local args = {...}
22
if #args < 1 then
23
  print ("Usage: downup # (where depth=#)")
24
  return
25
end
26
27-
    turtle.dig()
27+
28-
    sleep(blocklag)
28+
29
if not depth or depth < 1 then
30
  print("error: absolute positive offsets only.")
31-
    
31+
32
end
33-
for x=1,width do
33+
34
if turtle.getFuelLevel()<(depth+(length*2))*width+(width*4) then  -- close the u-turns should be accounted for with the *4 addition
35
  print("Refuel or I can't get there and back.")
36
  return
37
end
38-
      turtle.digDown()
38+
39-
      turtle.down()
39+
local function pauseMe()
40
  print("Press any key...")
41
  os.pullEvent("key")
42-
    while not turtle.forward() do
42+
43
44
local function digForward()
45
  while turtle.detect() do
46
    local has_block, data = turtle.inspect()
47
    if has_block then
48
      if data.name == "forbidden_arcanus:stella_arcanum" or data.name == "allthemodium:allthemodium_slate_ore" or data.name == "lootr:lootr_chest" then 
49
        print("Special exception ore detected! Press any key to continue...")
50
        os.pullEvent("key")
51-
      while not turtle.up() do
51+
52-
        turtle.digUp()
52+
53
  turtle.dig()
54
  end
55
  sleep(blocklag)
56
end
57
58
local function goUp()
59
   while not turtle.up() do
60
      local has_block, data = turtle.inspectUp()
61
      if data.name == "forbidden_arcanus:stella_arcanum" or data.name == "allthemodium:allthemodium_slate_ore" or data.name == "lootr:lootr_chest" then 
62
        print("Special exception ore detected! Press any key to continue...")
63-
sleep(5) -- more moderate depths or widths  
63+
        os.pullEvent("key")
64
      end
65
66
     turtle.digUp()
67
   end
68
  zpos=zpos-1
69
end
70
71
local function goDown()
72
      local has_block, data = turtle.inspectDown()
73
      if data.name == "forbidden_arcanus:stella_arcanum" or data.name == "allthemodium:allthemodium_slate_ore" or data.name == "lootr:lootr_chest" then 
74
        print("Special exception ore detected! Press any key to continue...")
75
        os.pullEvent("key")
76
      end
77
  turtle.digDown()
78
  turtle.down()
79-
  digForward()
79+
  zpos=zpos+1
80-
  turtle.forward()
80+
81-
  if turtle.getItemCount(15)>1 then
81+
82-
    os.pullEvent("key")
82+
local function goForward()
83
  while not turtle.forward() do
84
    digForward()
85
  end
86
  -- xpos and ypos offsets depend on heading, presumably 1,2 + and 3,4 -
87
  if heading == 0 then
88
    ypos=ypos+1
89
  elseif heading == 1 then
90
    xpos=xpos+1
91
  elseif heading == 2 then
92
    ypos=ypos-1
93
  elseif heading == 3 then
94
    xpos=xpos-1
95
    -- Code for case 3
96
    print("Value is 3")
97
  end
98
  print("heading=",heading,"x=",xpos,",y=",ypos,",z=",zpos)
99
  if xpos<-1 or ypos<-1 then
100
     print("ERROR, ERROR, DANGER, WILL PARISH, DANGER!")
101
     pauseMe()
102
  end
103
end
104
105
local function turnRight()
106
  -- xpos=xpos+1 position only changes with movement, not with turning.
107
  heading=heading+1
108
  if heading==4 then heading=0 end
109
  turtle.turnRight()
110
end
111
112
local function turnLeft()
113
  heading=heading-1
114
  if heading==-1 then heading=0 end
115
  turtle.turnLeft()
116
end
117
118
-- first stab testing of a Grok routine to dump inventory to a chest
119
local function returnToStartAndBack(heading, posx, posy, posz)
120
    -- Step 1: Copy parameters to working variables to avoid modifying originals
121
    local currentHeading = heading
122
    local currentX = posx
123
    local currentY = posy
124
    local currentZ = posz
125
126
    -- Verify we're at the top (z = 0)
127
    if currentZ ~= 0 then
128
        print("Error: Turtle must be at z=0 to return to start (",currentZ,")")
129
        return
130
    end
131
132
    -- Step 2: Navigate to (0, 0, 0)
133
134
    -- Helper function to turn to a specific heading
135
local function turnTo(targetHeading)
136
  while currentHeading~=targetHeading do
137
    if currentHeading<targetHeading then
138
      turnLeft()
139
      currentHeading=currentHeading+1
140
    else
141
      turnRight()
142
      currentHeading=currentHeading-1
143
    end
144
    print("Correcting discrepancy between ",currentHeading," and ",targetHeading)
145
  end
146
end
147
148
-- Move along x-axis to get posx to 0
149
150
-- two valid states, turtle is on the side of the chest at 0, or it's 'length' away.  In the 0 state we'll turn right,
151
-- in the 'length' state we'll turn left.  Actually thinking that through heading 0 will always be away from the chest, so 2 will be
152
--  towards it.  heading 1 is away, and 0 is not toward, but 'near side' so I'll use heading instead.
153
-- It zig zags back and forth so there are only those two valid states (pointed towards chest at a distance, or to the right)
154
-- y may not be dug yet, so come back on x first, either way it should be clear back to 0.
155
156
print("flip==",flip," should be moving from currentX ",currentX," to 0 from heading ",currentHeading,". posx=",posx,",posy=",posy)
157
158
if flip==1 then
159
  turnRight()
160
else
161
  turnLeft()
162
end
163
164
if currentX > 0 then
165
  for i = 1, currentX do
166
    turtle.forward()
167
    currentX = currentX - 1 
168
  end
169
end
170
171
if flip==1 then --  ...actually lets see if it's always a left turn? and near side doesn't turn?
172
  turtle.turnLeft()
173
else
174
  turtle.turnLeft()
175
end
176
print("ready to move ",posy," y blocks at current heading.")
177
178
if currentY > 0 then 
179
  for i = 1, currentY do
180
    print("Moving in -y direction",currentY)
181
    turtle.forward()
182
    currentY = currentY-1
183
  end
184
end
185
186
print("Checking for fuel...")
187
for i = 1, 16 do -- loop through the slots
188
  turtle.select(i) -- change to the slot
189
  if turtle.refuel(0) then -- if it's valid fuel
190
    turtle.refuel(turtle.getItemCount(i)) -- consume IT ALL!
191
    print("Refueling...")
192
  end
193
end
194
195
196
-- Step 3: Face the chest
197
-- seems to work okay to here
198
print("Should be looking at chest...currentHeading ",currentHeading," flip ",flip," posx=",posx," posy=",posy)
199
print("Dig through issues with new frequency returns so next movement is 0=L, 1=R, H0,F0=U")
200
201
-- validated that heading=0, flip=0 should u-turn
202
    -- Step 4: Unload inventory into the chest
203
    print("Unloading...")
204
    for slot = 1, 16 do
205
        turtle.select(slot)
206
        turtle.drop()
207
    end
208
    turtle.select(1) -- Reset to slot 1
209
210
    print("Return to work.")
211
212
   if flip==1 then
213
      turnLeft() -- confirmed if flip==1 then turn left and head back y posx=1,posy=3 in test
214
      turnLeft() -- so then turn to go back and hook back into nook 
215
   elseif flip==0 and currentHeading==0 then
216
     print("(u-turn/two R) Should be aligning currentHeading ",currentHeading," with true heading of ",heading)
217
     turtle.turnRight()
218
     turtle.turnRight()
219
   end
220
221
   if posy > 0 then
222
     for i = 1, posy do
223
       turtle.forward()
224
     end
225
   end
226
227
-- it gets more complicated now if I call it at the top of the col., it was post-flip where I'd turn right or left based on end-of-row
228
-- (0 or length*4 essentially)
229
-- now most 'top of columns' return and either don't turn at all, or possibly turn right.
230
  -- flip0, heading0 wants a right turn (at least if x=0/first pass out)
231
   if flip==0 and currentHeading==1 then
232
     turtle.turnLeft()
233
   elseif flip==0 and currentHeading==0 then
234
     print("resuming in forward direction")
235
   else -- presumably ...
236
     turtle.turnRight() -- opposite of before
237
   end
238
  print("should be at end of return ",posy, " if 0,0 shouldn't turn.  flip==",flip)
239
  -- pauseMe()
240
241
  if posx > 0 then
242
    for i = 1, posx do
243
      turtle.forward()
244
    end
245
  end
246
247
  -- point back down mining row
248
  if flip==1 then  -- ok if flip==0 otherwise u-turn
249
    turtle.turnRight()
250
  elseif flip==0 and currentHeading==0 then
251
    print("Opt out of turns.")
252
  else
253
    turtle.turnLeft()
254
  end
255
256
  print("flip=",flip,"heading=",currentHeading,", ready to go?")
257
  --pauseMe()
258
end
259
260
-- begin the original/actual box miner
261
-- length is actually 4 times longer as it's 2 2 column passes
262
for x=1,width do 
263
  for y=1,length do
264
    -- depth down
265
    for z=1,depth do
266
      digForward()
267
      goDown()
268
    end
269
    goForward()
270
    goForward()
271
    -- end of 'down' in position for 'up'
272
    -- depth back up with while insurance
273
    for x=1,depth do
274
      digForward()
275
      goUp()
276
    end
277
    goForward()
278
    goForward()
279
-- for deep digs
280
--    sleep(5)
281
    -- top of first step to length
282
  end
283
284
  if turtle.getItemCount(13)>0 then -- return earlier for deeper depths
285
    -- legacy item... os.pullEvent("key")
286
    -- Call the function to return to start, unload, and come back
287
    print("Inventory full heading back")
288
    returnToStartAndBack(heading, xpos, ypos, zpos)
289
    print("back in position, how do I look, Boss?") 
290
   -- pauseMe()
291
  end
292
293
  -- shouldn't be needed any longer  sleep(5) -- more moderate depths or widths  
294
  if flip==0 then
295
    flip=1
296
    turnRight()
297
    goForward()
298
    turnRight()
299
  else
300
    flip=0
301
    turnLeft()
302
    goForward()
303
    turnLeft()
304
  end
305
  -- in position for next lane of width
306
  -- step forward to avoid offset
307
  goForward()
308
end
309
310