--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)
Comments
0 B
|👍
/👎