371 lines
7.6 KiB
Lua
371 lines
7.6 KiB
Lua
require("inventory")
|
|
require("pathfinding")
|
|
require("fluids")
|
|
sfx = require("sfx")
|
|
|
|
press_pos = vector.new(1, 0, 0)
|
|
deployer_pos = vector.new(2, 0, 0)
|
|
furnace_pos = vector.new(4, 2, 0)
|
|
saw_pos = vector.new(3, 1, 0)
|
|
saw_out_pos = vector.new(2, 0, 0)
|
|
mill_pos = vector.new(4, 0, 0)
|
|
mixer_pos = vector.new(-1, 0, 0)
|
|
compactor_pos = vector.new(-2, 0, 0)
|
|
spout_pos = vector.new(-3, 0, 0)
|
|
melter_pos = vector.new(-4, 1, -3)
|
|
casting_pos = vector.new(-2, 1, -4)
|
|
washer_pos = vector.new(3, 0, -4)
|
|
growth_chamber_pos = vector.new(-3, 2, 0)
|
|
|
|
function spout(extra_items)
|
|
local fluid = extra_items[1]
|
|
if not fluid then
|
|
error("no fluid specified")
|
|
end
|
|
goTo(spout_pos, "south")
|
|
insertDepot(1)
|
|
selectFluidDevice("spout")
|
|
connectTank(fluid.name)
|
|
pumpToDevices(true)
|
|
sleep(10)
|
|
pumpToDevices(false)
|
|
goTo(spout_pos, "south")
|
|
takeDepot()
|
|
fluidInvAdd(fluid.name, -fluid.count)
|
|
pumpToTanks(true)
|
|
goTo(spout_pos, "south")
|
|
goUp()
|
|
goUp()
|
|
while pFront("tanks")[1].amount > 0 do
|
|
sleep(0.5)
|
|
end
|
|
pumpToTanks(false)
|
|
end
|
|
|
|
function saw(_)
|
|
goTo(saw_pos, "south")
|
|
turtle.drop()
|
|
goTo(saw_out_pos, "south")
|
|
takeDepot()
|
|
end
|
|
|
|
function mill(extra_items)
|
|
goTo(mill_pos, "south")
|
|
item_count = 0
|
|
if turtle.getItemCount() ~= 0 then
|
|
item_count = 1
|
|
end
|
|
insertForward(1, 1)
|
|
for _, item in pairs(extra_items) do
|
|
item_count = item_count + item.count
|
|
selectItem(item.name)
|
|
insertForward(1, item.count)
|
|
end
|
|
print(item_count, "items")
|
|
while pFront("getItemDetail", 1) do
|
|
sleep(0.1)
|
|
end
|
|
for i = 2, 10 do
|
|
takeForward(i)
|
|
end
|
|
end
|
|
|
|
function deploy(extra_items)
|
|
-- extra_items should only be one item
|
|
goTo(deployer_pos, "south")
|
|
insertDepot(1)
|
|
goUp()
|
|
goUp()
|
|
selectItem(extra_items[1].name)
|
|
turtle.dropUp(1)
|
|
pFront("pullItem", "top")
|
|
|
|
goDown()
|
|
goDown()
|
|
takeDepot()
|
|
end
|
|
|
|
function deploy_tool(extra_items)
|
|
-- extra_items should only be one item
|
|
goTo(deployer_pos, "south")
|
|
insertDepot(1)
|
|
goUp()
|
|
goUp()
|
|
selectItem(extra_items[1].name, true)
|
|
turtle.dropUp(1)
|
|
pFront("pullItem", "top")
|
|
|
|
goDown()
|
|
goDown()
|
|
takeDepot()
|
|
goUp()
|
|
goUp()
|
|
pFront("pushItem", "top")
|
|
turtle.suckUp()
|
|
end
|
|
|
|
function furnace(extra_items)
|
|
goTo(furnace_pos, "south")
|
|
item_count = 0
|
|
if turtle.getItemCount() ~= 0 then
|
|
item_count = 1
|
|
end
|
|
turtle.dropUp(1)
|
|
pFront("pullItems", "top", 1, 64, 1)
|
|
for _, item in pairs(extra_items) do
|
|
item_count = item_count + item.count
|
|
selectItem(item.name)
|
|
turtle.dropUp(item.count)
|
|
pFront("pullItems", "top", 1, 64, 1)
|
|
end
|
|
wait_time = 10 * item_count
|
|
-- TODO refuel
|
|
sleep(wait_time)
|
|
pFront("pushItems", "top", 3)
|
|
turtle.suckUp()
|
|
end
|
|
|
|
function press(_)
|
|
goTo(press_pos, "south")
|
|
insertDepot(1)
|
|
sleep(1)
|
|
takeDepot()
|
|
end
|
|
|
|
function compact(extra_items, product, yield)
|
|
silly_temp = mixer_pos
|
|
mixer_pos = compactor_pos
|
|
mix(extra_items, product, yield)
|
|
mixer_pos = silly_temp
|
|
end
|
|
|
|
function make_water(_, _, yield)
|
|
selectFluidDevice("water_source")
|
|
connectTank("water")
|
|
pumpToTanks(true)
|
|
print("waiting 30s for water tanks to fill")
|
|
sleep(30)
|
|
pumpToTanks(false)
|
|
fluidInvAdd("water", yield)
|
|
end
|
|
|
|
function alloy(parts, product)
|
|
for _, item in pairs(parts) do
|
|
if not isFluid[item.name] then
|
|
error(item.name .. " is not a known fluid, but was used in alloy")
|
|
end
|
|
end
|
|
selectFluidDevice("mixer")
|
|
for _, fluid in pairs(parts) do
|
|
connectTank(fluid.name)
|
|
pumpToDevices(true)
|
|
goTo(mixer_pos, "south")
|
|
-- TODO wait for 1B or tank content is in the mixer
|
|
sleep(5)
|
|
pumpToDevices(false)
|
|
end
|
|
goTo(mixer_pos, "south")
|
|
-- TODO wait for alloy to be done
|
|
sleep(10)
|
|
created_amount = 0
|
|
for _, fluid in pairs(pFront("tanks")) do
|
|
if fluid.amount > 0 then
|
|
connectTankOrAssign(stripModname(fluid.name))
|
|
pumpToTanks(true)
|
|
sleep(10)
|
|
pumpToTanks(false)
|
|
if stripModname(fluid.name) == product then
|
|
fluidInvAdd(product, fluid.amount)
|
|
created_amount = fluid.amount
|
|
end
|
|
end
|
|
end
|
|
for _, fluid in pairs(parts) do
|
|
fluidInvAdd(fluid.name, -created_amount)
|
|
end
|
|
end
|
|
|
|
function melt(_, product, yield)
|
|
goTo(melter_pos, "north")
|
|
goUp()
|
|
turtle.drop()
|
|
selectFluidDevice("melter")
|
|
connectTankOrAssign(product)
|
|
pumpToTanks(true)
|
|
goTo(melter_pos, "north")
|
|
while #pFront("items") > 0 do
|
|
sleep(1)
|
|
end
|
|
pumpToTanks(false)
|
|
fluidInvAdd(product, yield)
|
|
end
|
|
|
|
function mix(extra_items, product, yield)
|
|
-- prepare fluids
|
|
local fluids = {}
|
|
for index, item in pairs(extra_items) do
|
|
if isFluid[item.name] then
|
|
table.insert(fluids, item)
|
|
extra_items[index] = nil
|
|
end
|
|
end
|
|
if #fluids > 0 then
|
|
print("mixing with fluids", fluids[1])
|
|
selectFluidDevice("mixer")
|
|
connectTank(fluids[1].name)
|
|
pumpToDevices(true)
|
|
sleep(8)
|
|
pumpToDevices(false)
|
|
end
|
|
if isFluid[product] then
|
|
selectFluidDevice("mixer")
|
|
end
|
|
-- mix
|
|
goTo(mixer_pos, "south")
|
|
insertForward(1, 1)
|
|
for _, item in pairs(extra_items) do
|
|
selectItem(item.name)
|
|
insertForward(nil, item.count)
|
|
end
|
|
-- todo update the mixer somehow?
|
|
-- wait until ingredients are gone
|
|
repeat
|
|
sleep(1)
|
|
contents = pFront("list")
|
|
inputs_remaining = false
|
|
for i = 1, 9 do
|
|
if contents[i] then
|
|
inputs_remaining = true
|
|
break
|
|
end
|
|
end
|
|
until not inputs_remaining
|
|
if product == "still_milk" then
|
|
repeat
|
|
is_done = false
|
|
for _, t in pairs(pFront("tanks")) do
|
|
if stripModname(t.name) == "still_milk" then
|
|
is_done = t.amount >= yield
|
|
break
|
|
end
|
|
end
|
|
until is_done
|
|
end
|
|
|
|
for i = 10, 18 do
|
|
takeForward(i)
|
|
end
|
|
-- empty fluids
|
|
tanks = pFront("tanks")
|
|
for _, tank in pairs(tanks) do
|
|
if tank.amount > 0 then
|
|
connectTankOrAssign(stripModname(tank.name))
|
|
pumpToTanks(true)
|
|
sleep(8)
|
|
pumpToTanks(false)
|
|
end
|
|
end
|
|
fluidInvAdd(product, yield)
|
|
end
|
|
|
|
function craft(extra_items)
|
|
local slot = 0
|
|
for _, item in pairs(extra_items) do
|
|
slot = slot + 1
|
|
if slot == 4 then
|
|
slot = 5
|
|
elseif slot == 8 then
|
|
slot = 9
|
|
end
|
|
if item.name ~= "nil" then
|
|
turtle.select(slot)
|
|
takeItems(item.name, item.count)
|
|
end
|
|
end
|
|
turtle.craft()
|
|
end
|
|
|
|
function wash(_, product)
|
|
goTo(washer_pos, "east")
|
|
insertDepot(1)
|
|
repeat
|
|
is_done = false
|
|
for _, item in pairs(pFront("items")) do
|
|
if stripModname(item.name) == product then
|
|
is_done = true
|
|
end
|
|
end
|
|
until is_done
|
|
takeDepot()
|
|
end
|
|
|
|
function growth_chamber()
|
|
goTo(growth_chamber_pos, "west")
|
|
pTop("pushItem", "front")
|
|
turtle.suck()
|
|
end
|
|
|
|
function cast_ingot(source, product, yield)
|
|
fluid = source[1]
|
|
if not isFluid[fluid.name] then
|
|
error(fluid .. " is not a fluid")
|
|
end
|
|
connectTank(fluid)
|
|
selectFluidDevice("melter")
|
|
pumpToDevices(true)
|
|
goTo(melter_pos, "north")
|
|
repeat
|
|
melter_tank = pFront("tanks")[1]
|
|
local storage_emptied = melter_tank.amount >= getFluidAmount(fluid.name)
|
|
local melter_full = melter_tank.amount >= melter_tank.capacity
|
|
done_filling = storage_emptied or melter_full
|
|
until done_filling
|
|
pumpToDevices(false)
|
|
local fluid_in_melter = melter_tank.amount
|
|
local ingot_count = math.floor(fluid_in_melter / 111)
|
|
local leftover = fluid_in_melter - ingot_count * 111.11
|
|
print("expecting", ingot_count, "ingots")
|
|
goTo(casting_pos, "west")
|
|
for i = 1, ingot_count do
|
|
redstone.setOutput("front", true)
|
|
sleep(0.1)
|
|
redstone.setOutput("front", false)
|
|
goDown()
|
|
repeat
|
|
sleep(0.1)
|
|
until pFront("getItemDetail", 2)
|
|
takeForward(2)
|
|
goUp()
|
|
end
|
|
|
|
if leftover > 1 then
|
|
pumpToTanks(true)
|
|
sleep(5)
|
|
pumpToTanks(false)
|
|
end
|
|
fluidInvAdd(fluid.name, -(ingot_count * 111))
|
|
end
|
|
|
|
function rolling_mill()
|
|
print("unimplemented :3")
|
|
end
|
|
|
|
return {
|
|
mill = mill,
|
|
deploy = deploy,
|
|
deploy_tool = deploy_tool,
|
|
furnace = furnace,
|
|
press = press,
|
|
compact = compact,
|
|
mix = mix,
|
|
craft = craft,
|
|
alloy = alloy,
|
|
melt = melt,
|
|
saw = saw,
|
|
spout = spout,
|
|
make_water = make_water,
|
|
wash = wash,
|
|
cast_ingot = cast_ingot,
|
|
rolling_mill = rolling_mill,
|
|
growth_chamber = growth_chamber,
|
|
}
|