-- === Reactor Monitor & Control Script ===
-- CC:Tweaked - Extreme Reactors (ATM10)
-- Monitor GUI + Auto Control + Manual Button
-- Ethan Edition
local REACTOR_NAME = "BigReactors-Reactor_0" -- Adjust if different
local MONITOR_NAME = "monitor_0" -- Adjust if different
local autoControl = true
local reactor = peripheral.wrap(REACTOR_NAME)
local monitor = peripheral.wrap(MONITOR_NAME)
local function centerText(line, text)
local w, _ = monitor.getSize()
monitor.setCursorPos(math.floor((w - #text) / 2) + 1, line)
monitor.write(text)
end
local function drawButton(label, active)
local w, h = monitor.getSize()
monitor.setCursorPos(2, h - 1)
if active then
monitor.setBackgroundColor(colors.red)
monitor.setTextColor(colors.white)
else
monitor.setBackgroundColor(colors.lime)
monitor.setTextColor(colors.black)
end
monitor.write(" [ " .. label .. " ] ")
monitor.setBackgroundColor(colors.black)
end
local function drawGUI()
monitor.clear()
monitor.setTextColor(colors.cyan)
centerText(1, "=== Reactor Control ===")
monitor.setTextColor(colors.white)
monitor.setCursorPos(1, 3)
monitor.write("Status: ")
monitor.setTextColor(reactor.getActive() and colors.lime or colors.red)
monitor.write(reactor.getActive() and "ONLINE" or "OFFLINE")
monitor.setTextColor(colors.white)
monitor.setCursorPos(1, 4)
monitor.write(string.format("RF/t: %.0f", reactor.getEnergyProducedLastTick()))
monitor.setCursorPos(1, 5)
monitor.write(string.format("Fuel: %.2f%%", reactor.getFuelAmount() / reactor.getFuelAmountMax() * 100))
monitor.setCursorPos(1, 6)
monitor.write(string.format("Temp: %.1f C", reactor.getFuelTemperature()))
monitor.setCursorPos(1, 7)
monitor.write(string.format("Energy: %.0f / %.0f RF",
reactor.getEnergyStored(), reactor.getEnergyCapacity()))
monitor.setCursorPos(1, 8)
monitor.write("Mode: " .. (autoControl and "AUTO" or "MANUAL"))
drawButton(reactor.getActive() and "TURN OFF" or "TURN ON", not autoControl)
end
local function toggleReactor()
reactor.setActive(not reactor.getActive())
end
local function toggleControlMode()
autoControl = not autoControl
end
local function handleTouch(x, y)
local _, h = monitor.getSize()
if y == h - 1 then
if autoControl then
toggleControlMode()
else
toggleReactor()
end
end
end
local function autoControlLogic()
local stored = reactor.getEnergyStored()
local max = reactor.getEnergyCapacity()
if stored / max >= 0.95 then
reactor.setActive(false)
elseif stored / max <= 0.20 then
reactor.setActive(true)
end
end
-- === Startup ===
monitor.setTextScale(1)
monitor.setBackgroundColor(colors.black)
monitor.clear()
monitor.setCursorBlink(false)
-- === Event Loop ===
while true do
drawGUI()
if autoControl then
autoControlLogic()
end
local event, side, x, y = os.pullEvent()
if event == "monitor_touch" then
handleTouch(x, y)
end
end