require("pathfinding") pretty = require("cc.pretty") pp = pretty.pretty_print isFluid = { water = true, lava = true, still_milk = true, blood = true, molten_rose_gold = true, molten_copper = true, molten_gold = true, molten_bronze = true, molten_tin = true, molten_zinc = true, molten_brass = true, compound_mixture = true, molten_silver = true, } fluidDevicePos = { trash = vector.new(1, 0, -1), water_source = vector.new(0, 0, -1), mixer = vector.new(-1, 0, -1), compactor = vector.new(-2, 0, -1), spout = vector.new(-3, 0, -1), melter = vector.new(-4, 0, -1), } tankPos = { vector.new(4, 0, -3), vector.new(3, 0, -3), vector.new(2, 0, -3), vector.new(1, 0, -3), vector.new(0, 0, -3), vector.new(-1, 0, -3), vector.new(-2, 0, -3), vector.new(-3, 0, -3), vector.new(-4, 0, -3), } function setRedRouter(state) peripheral.call("bottom", "setOutput", "bottom", state) peripheral.call("bottom", "setOutput", "front", state) end function loadFluidInventory() return require("fluid_state") end function saveFluids() fs.delete("fluid_state.lua") repeat file = fs.open("fluid_state.lua", "w") until file file.write("return ") file.write(textutils.serialise(_G.fluidTanks)) file.close() end function getFluidAmount(type) for index, tank in pairs(_G.fluidTanks) do if tank.name == type then return tank.amount end end return 0 end function getFluidAmountInTanks(type, tanks) for _, fluid in pairs(tanks) do if stripModname(fluid.name) == type then return fluid.amount end end return 0 end function pumpToDevices(enable) goTo(vector.new(4, 0, -1)) -- clutches invert the signal setRedRouter(not enable) end function pumpToTanks(enable) goTo(vector.new(3, 0, -1)) -- clutches invert the signal setRedRouter(not enable) end function resetAllFluidDevices() pumpToDevices(false) pumpToTanks(false) -- for name, pos in pairs(fluidDevicePos) do -- goTo(pos) -- setRedRouter(false) -- end -- for x = 2, -4, -1 do -- goTo(vector.new(x, 0, -1)) -- setRedRouter(false) -- end end function selectFluidDevice(name) if fluidDevicePos[name] == nil then error("selectFluidDevice(" .. name .. "); not a known fluid device", 2) end if _G.activeFluidDevice ~= name then print("set active fluid device", name) _G.activeFluidDevice = name goTo(fluidDevicePos[name]) redstone.setOutput("bottom", true) sleep(0.1) redstone.setOutput("bottom", false) end end function connectTankOrAssign(fluid) local has_fluid = false for index, tank in pairs(_G.fluidTanks) do if tank.name == fluid then has_fluid = true print(fluid, "already assigned to", index) end end if not has_fluid then print(fluid, "not in tanks, assigning new") for index = 1, 9 do if _G.fluidTanks[index].name == nil or _G.fluidTanks[index].amount == 0 then _G.fluidTanks[index] = { name = fluid, amount = 0, } print("assigned tank", index, "to", fluid) break end end end connectTank(fluid) end function connectTank(name) for index, tank in pairs(_G.fluidTanks) do if tank.name == name then if index == _G.connectTank then print("tank", name, index, "already connected") break end goTo(tankPos[index]) redstone.setOutput("bottom", true) sleep(0.1) redstone.setOutput("bottom", false) _G.connectedTank = index print("tank", name, index, "already connected") break end end end function fluidInvAdd(name, amount) print("added", amount, "to", name) for index, tank in pairs(_G.fluidTanks) do if tank.name == name then tank.amount = tank.amount + amount if tank.amount < 1 then tank.amount = 0 end -- TODO limit capacity end end saveFluids() end _G.fluidTanks = _G.fluidTanks or loadFluidInventory()