View difference between Paste ID: MEmcPeyb and yVCsyvmX
SHOW: | | - or go back to the newest paste.
1
local wRequire = require("wRequire")
2
local tableFile = wRequire("tableFile")
3
local invClient = wRequire("invClient")
4
5
rednet.open("right")
6
7
invClient.storageComputerID = 12
8
9
local width = 6
10
local depth = 11
11
12
local botChestName = "enderstorage:ender_chest_14"
13
local toSmeltChestName = "enderstorage:ender_chest_13"
14
local smeltedChestName = "storagedrawers:standard_drawers_1_0"
15
16
local xpFor30levels = 1395
17
local checkFurnaceEach = 1
18
local checkFurnaceCount = 10000
19
20
local furnaces = tableFile.load("#furnaces.lua", {})
21
22
local function refuel()
23
	if turtle.getFuelLevel() > 2000 then
24
		return
25
	end
26
	
27
	local networkName = peripheral.wrap("top").getNameLocal()
28
	local botChest = peripheral.wrap(botChestName)
29
	
30
	turtle.select(1)
31
	turtle.dropDown(turtle.getItemCount())
32
	
33
	while turtle.getFuelLevel() < 5000 do
34
		print("Fuel: " .. tostring(turtle.getFuelLevel()) .. "/5000")
35
		local botChestList = botChest.list()
36
		if botChestList[1] ~= nil and botChestList[1].count > 32 then
37
			print("Refueling")
38
			botChest.pushItems(networkName, 1, 10, 1)
39
			turtle.refuel(turtle.getItemCount())
40
		else
41
			print("Fetching fuel from storage network")
42
			invClient.get("minecraft:charcoal.0.", 16, "enderstorage:ender_chest_2", 1)
43
		end
44
	end
45
end
46
47
local function goto(x, y, action)
48
	turtle.turnRight()
49
	for x2 = 1, x do
50
		turtle.forward()
51
	end
52
	turtle.turnLeft()
53
	
54
	for y2 = 1, y do
55
		turtle.forward()
56
	end
57
	
58
	action()
59
	
60
	for y2 = 1, y do
61
		turtle.back()
62
	end
63
	
64
	turtle.turnRight()
65
	for x2 = 1, x do
66
		turtle.back()
67
	end
68
	turtle.turnLeft()
69
end
70
71
local function mapFurnaces()
72
	refuel()
73
	local toSmeltChest = peripheral.wrap(toSmeltChestName)
74
	
75
	turtle.select(1)
76
	turtle.dropDown(turtle.getItemCount())
77
	
78
	local furnacePeripherals = { peripheral.find("minecraft:furnace") }
79
	
80
	for _, furnacePeripheral in pairs(furnacePeripherals) do
81
		furnacePeripheral.pushItems(peripheral.wrap("top").getNameLocal(), 1, 64)
82
	end
83
	
84
	while turtle.getItemCount() < 1 do
85
		print("Fetching filler items")
86
		toSmeltChest.pushItems(peripheral.wrap("top").getNameLocal(), 1, 1)
87
	end
88
	
89
	for _, furnacePeripheral in pairs(furnacePeripherals) do
90
		local furnaceName = peripheral.getName(furnacePeripheral)
91
		if furnaces[furnaceName] == nil then
92
			furnacePeripheral.pullItems(peripheral.wrap("top").getNameLocal(), 1, 1)
93
			print("Searching for position of furnace: " .. furnaceName)
94
			local found = false
95
			
96
			local function positionAlreadyFound(x, y)
97
				for _, furnace in pairs(furnaces) do
98
					if furnace.x == x and furnace.y == y then
99
						return true
100
					end
101
				end
102
				return false
103
			end
104
			
105
			local function find()
106
				for x = 0, (width - 1) do
107
					for y = 0, (depth - 1) do
108
						if (x == 0 and y == 0) or positionAlreadyFound(x, y) then
109
						else
110
							goto(x, y, function()
111
								local above = peripheral.wrap("top")
112
								if above ~= nil then
113
									local aboveList = above.list()
114
									if aboveList[1] ~= nil and aboveList[1].count == 1 then
115
										found = true
116
									end
117
								end
118
							end)
119
							
120
							if found then
121
								print("Found position of furnace: " .. furnaceName .. " " .. tostring(x) .. ", " .. tostring(y))
122
								furnaces[furnaceName] = {
123
									["name"] = furnaceName,
124
									["x"] = x,
125
									["y"] = y,
126
									["xp"] = 0
127
								}
128
								tableFile.save(furnaces, "#furnaces.lua")
129
								rednet.broadcast(furnaces, "bbXpShop-r2s")
130
								furnacePeripheral.pushItems(peripheral.wrap("top").getNameLocal(), 1, 64)
131
								return
132
							end
133
						end
134
					end
135
				end
136
			end
137
			
138
			find()
139
		
140
			if found == false then
141
				error("Not found")
142
			end
143
		end
144
	end
145
	
146
	turtle.dropDown(64)
147
end
148
149
mapFurnaces()
150
151
local xpRequested = 0
152
153
local function networkLoop()
154
	--rednet.broadcast("ready", "bbXpShop-r2s")
155
	while true do
156
		local id, message = rednet.receive("bbXpShop-s2r", 10)
157
		if message ~= nil then
158
			xpRequested = xpRequested + message
159
			print(xpRequested)
160
		end
161
	end
162
end
163
164
local function getXp()
165
	if xpRequested > 0 then
166
		for _, furnace in pairs(furnaces) do
167
			os.sleep()
168
			if furnace.xp >= xpRequested then
169
				refuel()
170
				goto(furnace.x, furnace.y, function()
171
					turtle.digUp()
172
					if furnace.y > 1 then
173
						turtle.back()
174
						sleep(0.5)
175
						turtle.forward()
176
					else
177
						turtle.forward()
178
						sleep(0.5)
179
						turtle.back()
180
					end
181
					for i = 1, 16 do
182
						turtle.select(i)
183
						local itemDetail = turtle.getItemDetail()
184
						if itemDetail ~= nil and itemDetail.name == "minecraft:furnace" then
185
							turtle.placeUp()
186
							break
187
						else
188
							turtle.dropDown(turtle.getItemCount())
189
						end
190
					end
191
				end)
192
				
193
				xpRequested = xpRequested - furnace.xp
194
				furnaces[furnace.name].xp = 0
195
				tableFile.save(furnaces, "#furnaces.lua")
196
				rednet.broadcast(furnaces, "bbXpShop-r2s")
197
				
198
				if xpRequested <= 0 then
199
					xpRequested = 0
200
					break
201
				end
202
			end
203
		end
204
	end
205
end
206
207
local function checkFurnaces()
208
	local checked = 0
209
	for _, furnace in pairs(furnaces) do
210
		os.sleep()
211
		if furnace.timesSinceLastCheck == nil then
212
			furnace.timesSinceLastCheck = 0
213
		end
214
		if furnace.timesSinceLastCheck >= checkFurnaceEach and checked < checkFurnaceCount and furnaces[furnace.name].xp < xpFor30levels then
215
			furnace.timesSinceLastCheck = 0
216
			checked = checked + 1
217
			local f = peripheral.wrap(furnace.name)
218
			if f == nil then
219
				local furnacePeripherals = { peripheral.find("minecraft:furnace") }
220
				for _, furnacePeripheral in pairs(furnacePeripherals) do
221
					local fName = peripheral.getName(furnacePeripheral)
222
					local inList = false
223
					for _, furnace2 in pairs(furnaces) do
224
						if furnace2.name == fName then
225
							inList = true
226
						end
227
					end
228
					if inList == false then
229
						furnace.name = fName
230
						f = peripheral.wrap(furnace.name)
231
						break
232
					end
233
				end
234
			end
235
			
236
			if f == nil then
237
				error("Furnace not found")
238
			end
239
			
240
			local fList = f.list()
241
			
242
			--take items out
243
			if fList[3] ~= nil and fList[3].count >= 8 then
244
				f.pushItems(smeltedChestName, 3, fList[3].count)
245
				furnaces[furnace.name].xp = furnaces[furnace.name].xp + fList[3].count
246
				tableFile.save(furnaces, "#furnaces.lua")
247
				rednet.broadcast(furnaces, "bbXpShop-r2s")
248
			end
249
			
250
			--restock
251
			if fList[1] == nil or fList[1].count == 0 and furnaces[furnace.name].xp < xpFor30levels then
252
				local toSmeltPulled = 0
253
				for i = 1, 27 do
254
					if toSmeltPulled < 8 then
255
						toSmeltPulled = toSmeltPulled + f.pullItems(toSmeltChestName, i, 8 - toSmeltPulled, 1)
256
					end
257
				end
258
				
259
				local botChest = peripheral.wrap(botChestName)
260
				while f.list()[2] == nil or f.list()[2].count == 0 do
261
					local botChestList = botChest.list()
262
					if botChestList[1] ~= nil and botChestList[1].count > 32 then
263
						if f.pullItems(botChestName, 1, 1, 2) > 0 then
264
							break
265
						end
266
					else
267
						invClient.get("minecraft:charcoal.0.", 16, "enderstorage:ender_chest_2", 1)
268
					end
269
				end
270
			end
271
			
272
			getXp()
273
		else
274
			furnace.timesSinceLastCheck = furnace.timesSinceLastCheck + 1
275
		end
276
	end
277
end
278
279
local function actionLoop()
280
	while true do
281
		checkFurnaces()
282
		getXp()
283
	end
284
end
285
286
parallel.waitForAny(networkLoop, actionLoop)