Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --this program can be used to manage Big Reactors
- --Reactors & Turbines
- --important note
- --your reactor HAS to be set to manual waste ejection
- local _interval = 1 -- in sec
- local reactor, turbine, monitor
- local isReactor
- local isMonitor
- local isTurbine
- local _maxEnergy = 10000000
- local _maxEnergyTurbine = 1000000
- local _cyaniteMode = false
- local _cyaniteToCreate = 0
- local _loop = true
- local turbinePowerToEnableReactor = 50 -- in % , at 0 reactor will run only if turbine has no power
- function search(perToFind)
- local printMode = false
- if perToFind == "print" then
- printMode=true
- end
- if printMode == true then
- term.clear()
- term.setCursorPos(1,1)
- end
- local sides = { "top", "bottom", "left", "right", "front", "back" }
- for i = 1, #sides do
- if peripheral.isPresent(sides[i]) then
- if peripheral.getType(sides[i]) == "modem" then
- local modem = peripheral.wrap(sides[i])
- local methods = peripheral.getMethods(sides[i])
- local wired = false
- for j = 1, #methods do
- if methods[j] == "getNamesRemote" then
- wired=true
- end
- end
- if wired == true then
- if printMode == true then
- print("There is " ..peripheral.getType(sides[i]).." on the "..sides[i] )
- else
- if perToFind==peripheral.getType(sides[i]) then
- return sides[i]
- end
- ----------------------------------------------------------------
- end
- local net = modem.getNamesRemote()
- for j = 1, #net do
- if printMode == true then
- print(" ".. peripheral.getType(net[j]))
- else
- if perToFind==peripheral.getType(net[j]) then
- return net[j]
- end
- ---------------------------------
- end
- end
- else
- if printMode == true then
- print("There is wireless modem on the "..sides[i] )
- else
- if perToFind==peripheral.getType(sides[i]) then
- return sides[i]
- end
- ---------------------------------
- end
- end
- else
- if printMode == true then
- print("There is " ..peripheral.getType(sides[i]).." on the "..sides[i] )
- else
- if perToFind==peripheral.getType(sides[i]) then
- return sides[i]
- end
- -----------------------
- end
- end
- else
- if printMode == true then
- print("There is nothing on the "..sides[i] )
- end
- end
- end
- return nil
- end
- function wrapper ()
- local r1 = search("BigReactors-Reactor")
- if r1 ~= nil then
- reactor = peripheral.wrap(r1)
- if reactor.getConnected() == true then
- isReactor = true
- else
- isReactor = false
- end
- isReactor = true
- else
- isReactor = false
- end
- local t1 = search("BigReactors-Turbine")
- if t1 ~= nil then
- turbine = peripheral.wrap(t1)
- if turbine.getConnected() == true then
- isTurbine = true
- else
- isTurbine = false
- end
- else
- isTurbine = false
- end
- local m1 = search("monitor")
- if m1 ~= nil then
- monitor = peripheral.wrap(m1)
- isMonitor = true
- else
- isMonitor = false
- end
- end
- function newLine(obj)
- local _,cY= obj.getCursorPos()
- obj.setCursorPos(1,cY+1)
- end
- function clear(obj)
- obj.clear()
- obj.setCursorPos(1,1)
- end
- function clearMarks(obj,number)
- local x,y = obj.getCursorPos()
- local obj_x,obj_y = obj.getSize()
- while x+number > obj_x do
- number=number-1
- if number>= 0 then
- return
- end
- end
- for i=1,number do
- obj.write(" ")
- end
- obj.setCursorPos(x,y)
- end
- local arr_x={}
- local arr_y={}
- function prepare (obj)
- clear(obj)
- if isReactor then
- obj.write("Reactor Status:")
- newLine(obj)
- obj.write("Energy stored: ")
- arr_x[1],arr_y[1] = obj.getCursorPos()
- newLine(obj)
- obj.write("Energy produced: ")
- arr_x[2],arr_y[2] = obj.getCursorPos()
- newLine(obj)
- obj.write("Fuel temperature: ")
- arr_x[3],arr_y[3] = obj.getCursorPos()
- newLine(obj)
- obj.write("Waste amount: ")
- arr_x[4],arr_y[4] = obj.getCursorPos()
- newLine(obj)
- obj.write("Reactivity: ")
- arr_x[5],arr_y[5] = obj.getCursorPos()
- newLine(obj)
- obj.write("Fuel burnup: ")
- arr_x[6],arr_y[6] = obj.getCursorPos()
- end
- if isTurbine then
- newLine(obj)
- newLine(obj)
- obj.write("Turbine Status:")
- newLine(obj)
- obj.write("Energy stored: ")
- arr_x[7],arr_y[7] = obj.getCursorPos()
- newLine(obj)
- obj.write("Energy produced: ")
- arr_x[8],arr_y[8] = obj.getCursorPos()
- newLine(obj)
- obj.write("Rotor speed: ")
- arr_x[9],arr_y[9] = obj.getCursorPos()
- end
- newLine(obj)
- newLine(obj)
- end
- function show (obj)
- local x,y = obj.getCursorPos()
- if isReactor then
- obj.setCursorPos(arr_x[1],arr_y[1])
- obj.write((math.floor(reactor.getEnergyStored()/_maxEnergy*1000)/10).." %")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[2],arr_y[2])
- obj.write((math.floor(reactor.getEnergyProducedLastTick())).. " RF")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[3],arr_y[3])
- obj.write((math.floor(reactor.getFuelTemperature())).. " C")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[4],arr_y[4])
- obj.write(reactor.getWasteAmount().. " mB")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[5],arr_y[5])
- obj.write((math.floor(reactor.getFuelReactivity())).. " %")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[6],arr_y[6])
- obj.write((math.floor(reactor.getFuelConsumedLastTick()*1000)/1000).. " mB")
- clearMarks(obj,5)
- end
- if isTurbine then
- obj.setCursorPos(arr_x[7],arr_y[7])
- obj.write((math.floor(turbine.getEnergyStored()/_maxEnergyTurbine*1000)/10).." %")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[8],arr_y[8])
- obj.write((math.floor(turbine.getEnergyProducedLastTick())).. " RF")
- clearMarks(obj,5)
- obj.setCursorPos(arr_x[9],arr_y[9])
- obj.write((math.ceil(turbine.getRotorSpeed()*10)/10).. " RPM")
- clearMarks(obj,5)
- end
- obj.setCursorPos(x,y)
- end
- function eject ()
- local wasteAmount = reactor.getWasteAmount()
- if wasteAmount > 1000 then
- reactor.doEjectWaste()
- return true
- else
- return false
- end
- end
- function cyanite ()
- local ejected = eject()
- if ejected == true then
- _cyaniteToCreate = _cyaniteToCreate - 1
- if _cyaniteToCreate <= 0 then
- _cyaniteMode = false
- end
- end
- end
- function updateReactor()
- eject()
- local rodControl = math.floor((reactor.getEnergyStored()/_maxEnergy)*100)
- if isTurbine then
- local turbineEnergy = math.floor(turbine.getEnergyStored()/_maxEnergy*100)
- local turbineMultipler = 100 / turbinePowerToEnableReactor
- local turbineControl = turbineEnergy * turbineMultipler
- if rodControl < turbineControl then
- if turbineControl > 100 then
- rodControl = 100
- else
- rodControl = turbineControl
- end
- end
- end
- reactor.setAllControlRodLevels(rodControl)
- end
- function psleep(n)
- local tTimer = os.startTimer(n)
- for sEvent, t in os.pullEventRaw do
- if sEvent == "timer" and t == tTimer then
- break
- end
- end
- end
- function reactorManagement()
- if _cyaniteMode == true then
- cyanite()
- else
- updateReactor()
- end
- end
- function menu()
- if isMonitor == true then
- clear(term)
- end
- print("1. Cyanite production")
- print("2. Normal reactor work")
- print("3. Shutdown")
- local x,y = term.getCursorPos()
- while _loop do
- local keyPressed = read()
- if keyPressed == "1" then
- term.write("How many: ")
- _cyaniteToCreate = tonumber(read())
- _cyaniteMode = true
- reactor.setAllControlRodLevels(0)
- elseif keyPressed == "2" then
- _cyaniteToCreate = 0
- _cyaniteMode = false
- elseif keyPressed == "3" then
- _loop = false
- break
- end
- local x2,y2 = term.getCursorPos()
- for i=y,y2 do
- term.setCursorPos(1,i)
- term.clearLine()
- end
- term.setCursorPos(x,y)
- end
- end
- function mainLoop()
- if isReactor == true then
- if reactor.getActive() == false then
- reactor.setActive(true)
- end
- end
- if isTurbine then
- if turbine.getActive() == false then
- turbine.setActive(true)
- end
- end
- while _loop do
- psleep(_interval)
- if isReactor == true then
- reactorManagement()
- end
- if isMonitor==true then
- show(monitor)
- else
- show(term)
- end
- end
- if isReactor == true then
- reactor.setActive(false)
- end
- end
- wrapper()
- if isMonitor == true then
- prepare(monitor)
- else
- prepare(term)
- end
- parallel.waitForAll(mainLoop, menu)
Advertisement
Add Comment
Please, Sign In to add comment