Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function write(color, line, caption, text)
- local monitor = peripheral.find("monitor")
- monitor.setCursorPos(1, line)
- monitor.setTextColor(colors.white)
- monitor.write(caption)
- monitor.setTextColor(color)
- monitor.write(text)
- return line + 1
- end
- function findReactors()
- local reactors = {}
- local allReactors = {peripheral.find("BigReactors-Reactor")}
- local i = 0
- for k, v in pairs(allReactors) do
- print("Found reactor " .. i)
- local reactor = {}
- reactor.lastRf = 0
- reactor.maxControlRods = v.getNumberOfControlRods() * 100
- reactor.controlRods = reactor.maxControlRods
- reactor.energyProduced = 0
- reactor.fuelConsumed = 0
- reactor.tickCount = 0
- reactor.api = v
- reactor.lastCasingTemperature = 0
- reactor.lastFuelTemperature= 0
- reactors[i] = reactor
- i = i + 1
- end
- return reactors
- end
- function findTurbines()
- local turbines = {}
- local allTurbines = {peripheral.find("BigReactors-Turbine")}
- local i = 0
- for k, v in pairs(allTurbines) do
- print("Found turbine " .. i)
- local turbine = {}
- turbine.api = v
- turbines[i] = turbine
- i = i + 1
- end
- return turbines
- end
- function reactorControl(line, rt, reduceEnergy)
- local monitor = peripheral.find("monitor")
- local reactor = rt.api
- local rfStored = math.floor(reactor.getEnergyStored() / 100000)
- local fuelTemperature = reactor.getFuelTemperature()
- local casingTemperature = reactor.getCasingTemperature()
- if math.abs(fuelTemperature - rt.lastFuelTemperature) < 3 and math.abs(casingTemperature - rt.lastCasingTemperature) < 3 or rt.controlRods == rt.maxControlRods then
- if reduceEnergy then
- if rfStored >= rt.lastRf then
- rt.controlRods = rt.controlRods + 2
- end
- else
- if rfStored < rt.lastRf then
- rt.controlRods = rt.controlRods - 2
- end
- if rfStored > rt.lastRf then
- rt.controlRods = rt.controlRods + 2
- end
- if rfStored == rt.lastRf then
- if rfStored > 90 then
- rt.controlRods = rt.controlRods + 2
- end
- end
- if rfStored < 1 then
- rt.controlRods = rt.controlRods - 2
- end
- end
- end
- if rt.controlRods > rt.maxControlRods then
- rt.controlRods = rt.maxControlRods
- end
- if rt.controlRods < 0 then
- rt.controlRods = 0
- end
- if not reactor.getActive() then
- rt.controlRods = rt.maxControlRods
- end
- rt.lastRf = rfStored
- rt.lastFuelTemperature = fuelTemperature
- rt.lastCasingTemperature = casingTemperature
- local level = math.ceil(rt.controlRods * 100 / rt.maxControlRods)
- local numberOfReduced = (level * rt.api.getNumberOfControlRods()) - rt.controlRods
- for i = 1,numberOfReduced do
- reactor.setControlRodLevel(i-1, level-1)
- end
- for i = numberOfReduced + 1,reactor.getNumberOfControlRods() do
- reactor.setControlRodLevel(i-1, level)
- end
- if reactor.getActive() then
- rt.energyProduced = (rt.energyProduced * rt.tickCount + reactor.getEnergyProducedLastTick()) / (rt.tickCount + 1)
- rt.fuelConsumed = (rt.fuelConsumed * rt.tickCount + reactor.getFuelConsumedLastTick()) / (rt.tickCount + 1)
- rt.tickCount = rt.tickCount + 1
- if (rt.tickCount > 600) then
- rt.tickCount = 600
- end
- end
- local color
- if reactor.getActive() then
- color = colors.lime
- else
- color = colors.red
- end
- line = write(color, line, "RF/T : ", math.floor(reactor.getEnergyProducedLastTick()) .. " (" .. math.floor(rt.energyProduced) .. ")")
- line = write(color, line, "mB/T : ", math.floor(reactor.getFuelConsumedLastTick() * 1000) / 1000 .. " (" .. math.floor(rt.fuelConsumed * 1000) / 1000 .. ")")
- line = write(color, line, "RF/mB : ", math.floor(reactor.getEnergyProducedLastTick() / reactor.getFuelConsumedLastTick()) .. " (" .. math.floor(rt.energyProduced / rt.fuelConsumed).. ")")
- line = line + 1
- line = write(color, line, "Fuel Amount : ", math.floor(reactor. getFuelAmount()) .. " (" .. math.floor(reactor.getFuelAmount() * 1000 / reactor.getFuelAmountMax()) / 10 .. "%)")
- line = line + 1
- line = write(color, line, "Heat (C/F) : ", math.floor(reactor.getCasingTemperature()) .. " / " .. math.floor(reactor.getFuelTemperature()))
- line = line + 1
- line = write(color, line, "Control Rods : ", math.floor(rt.controlRods * 100 / rt.maxControlRods * 10) / 10)
- return line
- end
- function sumEnergyStored(list)
- local value = 0
- for k,v in pairs(list) do
- value = v.api.getEnergyStored() + value
- end
- return value
- end
- function checkReduce(turbines)
- for k,v in pairs(turbines) do
- if v.api.getEnergyStored() > 900000 then
- return true
- end
- end
- return false
- end
- function loop(reactors, turbines)
- local lastRfTurbine = 0
- while true do
- local monitor = peripheral.find("monitor")
- monitor.clear()
- monitor.setTextScale(1)
- local line = 1
- local rfTurbine = sumEnergyStored(turbines)
- local rfReactors = sumEnergyStored(reactors)
- local reduceEnergy
- if math.floor(rfTurbine / 100) > math.floor(lastRfTurbine / 100) then
- lastRfTurbine = rfTurbine
- reduceEnergy = true
- end
- if math.floor(lastRfTurbine / 100) > math.floor(rfTurbine / 100) then
- lastRfTurbine = rfTurbine
- reduceEnergy = false
- end
- if math.floor(lastRfTurbine / 100) == math.floor(rfTurbine / 100) then
- reduceEnergy = checkReduce(turbines)
- end
- local color = colors.lime
- if reduceEnergy then
- color = colors.red
- end
- line = write(color, line, "RF Stored : ", math.floor(rfTurbine + rfReactors))
- line = line + 2
- for k,v in pairs(reactors) do
- line = reactorControl(line, v, reduceEnergy) + 3
- end
- lastRfTurbine = rfTurbine
- sleep(2)
- end
- end
- function doLoop()
- local reactorList = findReactors()
- local turbineList = findTurbines()
- loop(reactorList, turbineList)
- end
- while true do
- local status, message = pcall(doLoop)
- local monitor = peripheral.find("monitor")
- monitor.clear()
- monitor.setTextScale(1)
- write(colors.red, 1, "Error : ", message)
- sleep(10)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement