----------------------------------------------------------
-- Active Cooling Big Reactor Monitor --
-- --
-- Minecraft HermitCraft FTB Infinity Episode 28 --
-- https://www.youtube.com/watch?v=cIPxwZJWOiE --
-- --
-- YouTube Channel http://youtube.com/hypnotizd --
----------------------------------------------------------
local mon = {}
local hasMon = false
local hasRMon = false
local rMonName = ""
local cPort = {}
local hasCPort = false
local hasRCPort = false
local rCPortName = ""
local directions = {"top", "bottom", "front", "back", "left", "right"}
local minX = 0
local minY = 0
local minZ = 0
local maxX = 0
local maxY = 0
local maxZ = 0
local crPrevCoreTemp = 0
local crCoreTemp = 0
local crCoreChangeWait = 0
local table = {}
local function findPeripherals()
for k, v in pairs(peripheral.getNames()) do
if string.find(v, "Reactor") then
hasCPort = true
hasRCPort = true
rCPortName = v
print("INFO: Found remote "..v)
os.sleep(1)
elseif string.find(v, "monitor") then
hasMon = true
hasRMon = true
rMonName = v
print("INFO: Found remote "..v)
os.sleep(1)
end
end
end
local function findCPort()
if hasRCPort then return end
for k, v in pairs(directions) do
local p = peripheral.wrap(v)
if p ~= nil then
if string.find(peripheral.getType(v), "Reactor") then
cPort = p
hasCPort = true
return
end
end
end
print("ERROR: No computer port detected!")
end
local function findMon()
if hasRMon then return end
for k, v in pairs(directions) do
local p = peripheral.wrap(v)
if p ~= nil then
if string.find(peripheral.getType(v), "monitor") then
mon = p
hasMon = true
return
end
end
end
print("WARNING: No monitor detected!")
os.sleep(5)
end
local function monClear()
if hasMon then
if hasRMon then
peripheral.call(rMonName, "setCursorPos", 1, 1)
peripheral.call(rMonName, "clear")
else
mon.setCursorPos(1, 1)
mon.clear()
end
else
term.clear()
term.setCursorPos(1, 1)
end
end
local function monWrite(x, y, text)
if hasMon then
if hasRMon then
peripheral.call(rMonName, "setCursorPos", x, y)
peripheral.call(rMonName, "write", text)
else
mon.setCursorPos(x, y)
mon.write(text)
end
else
term.setCursorPos(x, y)
term.write(text)
end
end
local function getSize()
if hasRCPort then
minX, minY, minZ = peripheral.call(rCPortName, "getMinimumCoordinate")
maxX, maxY, maxZ = peripheral.call(rCPortName, "getMaximumCoordinate")
else
minX, minY, minZ = cPort.getMinimumCoordinate()
maxX, maxY, maxZ = cPort.getMaximumCoordinate()
end
end
local function setAllControlRodLevels(x)
if hasRCPort then
peripheral.call(rCPortName, "setAllControlRodLevels", x)
else
cPort.setAllControlRodLevels(x)
end
end
local function getActive()
local ret = false
if hasRCPort then
ret = peripheral.call(rCPortName, "getActive")
else
ret = cPort.getActive()
end
return ret
end
local function getControlRodLevel()
local ret = 0
if hasRCPort then
ret = peripheral.call(rCPortName, "getControlRodLevel", 0)
else
ret = cPort.getControlRodLevel(0)
end
return ret
end
local function getFuelTemperature()
local ret
if hasRCPort then
ret = peripheral.call(rCPortName, "getFuelTemperature")
else
ret = cPort.getFuelTemperature()
end
return ret
end
local function setControlRods()
if getActive() then
if crCoreTemp ~= 0 then
crPrevCoreTemp = crCoreTemp
crCoreTemp = getFuelTemperature()
local ctrlRodLevel = getControlRodLevel()
local tempDiff = crPrevCoreTemp - crCoreTemp
if crCoreChangeWait > 0 then
crCoreChangeWait = crCoreChangeWait - 1
return
end
if crCoreTemp >= 1350 then
setAllControlRodLevels(ctrlRodLevel+1)
elseif crCoreTemp >= 1050 then
setAllControlRodLevels(ctrlRodLevel+1)
crCoreChangeWait = 1
elseif crCoreTemp <= 600 then
setAllControlRodLevels(ctrlRodLevel-1)
elseif crCoreTemp <= 950 then
setAllControlRodLevels(ctrlRodLevel-1)
crCoreChangeWait = 1
end
else
crCoreTemp = getFuelTemperature()
if getControlRodLevel() == 100 then
setAllControlRodLevels(99)
end
crCoreChangeWait = 1
end
end
end
local function init()
term.clear()
term.setCursorPos(1, 1)
findPeripherals()
findCPort()
findMon()
getSize()
monClear()
end
local function displayInfo()
local rods = 0
local casingTemp = 0
local coreTemp = 0
local rodLevel = 0
local fuelReactivity = 0
local fuelConsumed = 0
local steamProduced = 0
if hasRCPort then
rods = peripheral.call(rCPortName, "getNumberOfControlRods")
casingTemp = peripheral.call(rCPortName, "getCasingTemperature")
coreTemp = peripheral.call(rCPortName, "getFuelTemperature")
rodLevel = peripheral.call(rCPortName, "getControlRodLevel", 0)
fuelReactivity = peripheral.call(rCPortName, "getFuelReactivity")
fuelConsumed = peripheral.call(rCPortName, "getFuelConsumedLastTick")
steamProduced = peripheral.call(rCPortName, "getHotFluidProducedLastTick")
else
rods = cPort.getNumberOfControlRods()
casingTemp = cPort.getCasingTemperature()
coreTemp = cPort.getFuelTemperature()
rodLevel = cPort.getControlRodLevel(0)
fuelReactivity = cPort.getFuelReactivity()
fuelConsumed = cPort.getFuelConsumedLastTick()
steamProduced = cPort.getHotFluidProducedLastTick()
end
local active = "Inactive"
if getActive() then
active = "Active"
end
X = 1+maxX-minX
Y = 1+maxY-minY
Z = 1+maxZ-minZ
table[0] = rods
table[1] = casingTemp
table[2] = coreTemp
table[3] = rodLevel
table[4] = fuelReactivity
table[5] = fuelConsumed
table[6] = steamProduced
table[7] = active
table[8] = X
table[9] = Y
table[10] = Z
local msg = textutils.serialize(table)
rednet.open("back")
rednet.broadcast(msg)
monClear()
monWrite(1, 1, " Reactor Status: "..active)
monWrite(1, 2, " Reactor Size: "..X.."x"..Y.."x"..Z)
monWrite(1, 3, " Num Control Rods: "..rods)
monWrite(1, 4, " Casing Temp.: "..casingTemp)
monWrite(1, 5, " Core Temp.: "..coreTemp)
monWrite(1, 6, "Control Rod Level: "..rodLevel)
monWrite(1, 7, " Fuel Reactivity: "..fuelReactivity)
monWrite(1, 8, " Fuel Usage/tick: "..fuelConsumed)
monWrite(1, 9, " Steam Produced: "..steamProduced)
end
init()
if hasCPort == false then return end
while true do
setControlRods()
displayInfo()
os.sleep(3)
end
Comments