-
Notifications
You must be signed in to change notification settings - Fork 0
/
fuel.lua
177 lines (155 loc) · 4.47 KB
/
fuel.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
os.loadAPI("log.lua")
local fuelLimit = turtle.getFuelLimit()
local fuelRequired = turtle.getFuelLevel() ~= "unlimited"
local hasBucket = false
local bucketSlot = -1
function getFuelLimit()
return fuelLimit
end
function isFuelRequired()
return fuelRequired
end
function isBucketPresent()
return hasBucket
end
function getBucketSlot()
return bucketSlot
end
function getFuelLevel()
local fuelLevel = turtle.getFuelLevel()
if fuelLevel == "unlimited" then -- No fuel required
return math.huge
end
return fuelLevel
end
function bucketRefuel(directionFunc)
if not hasBucket or not fuelRequired or getFuelLevel() + 1000 >= fuelLimit then
log.trace("Skipping bucket refuelling, fuel level is high enougth")
return
end
local success, blockData = directionFunc["inspect"]()
if success and blockData and blockData.name == "minecraft:lava" then
log.trace("Refuelling turtle with lava, using bucket from slot " .. bucketSlot)
turtle.select(bucketSlot)
directionFunc["place"]()
if turtle.refuel() == false then
log.trace("Refuelling failed, bucket didn't pick any lava " .. bucketSlot)
directionFunc["place"]()
end
end
end
function checkForBucket()
if not fuelRequired then
log.info("Skipping bucket detection, turtle requires no fuel")
return
end
log.info("Searching inventory for Bucket")
local unlocked = false
repeat
for slot = 1, 16, 1 do
log.trace("Searching slot " .. slot)
local itemData = turtle.getItemDetail(slot)
if itemData then
log.trace("Slot " .. slot .. " has item: " .. itemData.name)
if itemData.name == "minecraft:bucket" then
log.info("Bucket found in slot " .. slot)
bucketSlot = slot
hasBucket = true
break
elseif itemData.name == "minecraft:lava_bucket" then
log.info("Lava bucket found in slot " .. slot)
bucketSlot = slot
hasBucket = true
log.info("Consuming lava from bucket")
turtle.select(bucketSlot)
turtle.refuel()
break
end
end
end
if hasBucket then
log.info("Turtle will use lava to automatically refuel during mining")
break
else
print("Please give me a bucket so I can refuel using lava found along the way!")
print("press [ENTER] to disable refuelling")
repeat
local event, param1 = os.pullEvent()
if event == "key" and param1 == keys.enter then
unlocked = true
break
elseif event == "turtle_inventory" then
break
end
until false
end
until unlocked
return true
end
function refuelWizard(fuelEstimate)
if not fuelRequired then
log.info("Skipping refuel wizard, turtle requires no fuel")
-- No fuel is required
return
end
log.info("Checking for fuel availability")
local unlocked = false
local storageState = { "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", }
repeat
-- Save a snapshot of the inventory and consume any fuel found
for i = 1, 16, 1 do
log.trace("Searching for fuel in slot " .. i)
local slotData = turtle.getItemDetail(i)
local slotDataName = "nil"
if slotData then
slotDataName = slotData.name
end
log.trace(tostring(slotDataName ~= storageState[i]) .. " = " .. slotDataName .. " ~= " .. storageState[i])
if slotDataName ~= storageState[i] then
-- Slot content changed from last check
storageState[i] = slotDataName
log.trace("Slot " .. i .. " changed, updating to: " .. slotDataName)
if storageState[i] ~= "nil" then
turtle.select(i)
if turtle.refuel(0) then
-- If item in slot is a valid fuel item, refuel!
log.info("Using item in slot " .. i .. " to refuel")
turtle.select(i)
turtle.refuel()
else
log.trace("Slot " .. i .. " is not a valid fuel, ignoring")
end
end
end
end
-- Repeat until enougth fuel is received or user skips refuel step
local fuelLevel = getFuelLevel()
if fuelLevel < fuelEstimate then
print()
print("Turtle is low on fuel!")
print()
print("Recommended:\t" .. fuelEstimate)
print("Current:\t\t\t\t\t" .. fuelLevel)
print("Missing:\t\t\t\t\t" .. (fuelEstimate - fuelLevel))
print()
print()
print("Place fuel in inventory or")
print("press [ENTER] to finish...")
repeat
local event, key = os.pullEvent()
if event == "key" then
if key == keys.enter then
unlocked = true
break
end
elseif event == "turtle_inventory" then
break
end
until false
else
unlocked = true
end
until unlocked
log.info("Fuel check complete")
return true
end