Lejoni icon

ComputerCraft (Extreme) Reactor Control Program

Lejoni | PRO | 05/10/25 09:35:22 AM UTC (Edited) | -1 ⭐ | 279 👁️ | Never ⏰ | []
Lua |

18 KB

|

None

|

0 👍

/

1 👎

----------------- Lejoni Edition ------------------
--- This is a Extreme Reactors control program  ---
--- for Minecraft mod ComputerCraft             ---
---                                             ---
--- Original by Direwolf20 from:                ---
--- pastebin get R4kXR7RU reactor               ---
--- and it also uses the widgets API:           ---
--- pastebin get u2By4g18 widgets               ---
--- a modified version of button                ---
---                                             ---
--- Edited by Lejoni to adapt it for use with   ---
--- Draconic Evolution Energy Storage Core.     ---
--- As well as some minor tweaks.               ---
--- Edits are commented in code.                ---
---------------------------------------------------
 
local widgets = require("widgets")
--- Lejoni Edit ---
p = peripheral.find("draconic_rf_storage")
-------------------
m = peripheral.find("monitor")
r = peripheral.find("BigReactors-Reactor")
t = peripheral.find("BigReactors-Turbine")
 
-- Lejonis Edits --
local txtScale = 1
local colum2 = 28
local fname = "ssccrc"
 
local steamReactor = r.isActivelyCooled()
 
if steamReactor then
   local menuType = "Turbine"
else
   local menuType = "Reactor"
end
-------------------
 
local numCapacitors = 1
local turnOnAt = 50
local turnOffAt = 90
 
local energy = 0
local energyStored = 0
local energyMax = 0
local energyStoredPercent = 0
local timerCode
local mode = "Automatic"
local RFProduction = 0
local fuelUse = 0
local coreTemp = 0
local reactorOnline = false
local rodLevel = 0
 
local turbineOnline = false
local turbineRotorSpeed = 0
local turbineRFGen = 0
local turbineFluidRate = 0
local turbineInductor = false
 
local OptFuelRodLevel = 0
 
-- Lejonis Edits --
function loadSettingsFromFile()
   if (fs.exists(fname..".txt") == false) then
      file = io.open(fname..".txt","w")
      file:write(OptFuelRodLevel .. "\n")
      file:close()
   else
      file = fs.open(fname..".txt","r")
      OptFuelRodLevel = tonumber(file.readLine())
      file.close()
   end
end
 
function saveSettingsToFile()
   file = io.open(fname..".txt","w")
   file:write(OptFuelRodLevel .. "\n")
   file:flush()
   file:close()
end
-------------------
 
function autoMenu()
   m.setTextScale(txtScale) --- Lejoni Edit ---
   widgets.clearTable()
   widgets.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
   widgets.setTable("Manual", manualMode, "", 15, 25, 6, 6)
   
   if steamReactor then 
      widgets.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
      widgets.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
   end
   widgets.screen()
   checkMode()
   menuMode()
end
 
function manualMenu()
   m.setTextScale(txtScale) --- Lejoni Edit ---
   widgets.clearTable()
   widgets.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
   widgets.setTable("Manual", manualMode, "", 15, 25, 6, 6)
   widgets.setTable("Online", online, "", 3, 13, 8, 8)
   widgets.setTable("Offline", offline, "", 15, 25, 8, 8)
   widgets.setTable("0", setRods, 0, 11,14, 10, 10)
   widgets.setTable("10", setRods, 10, 5,8, 12, 12)
   widgets.setTable("20", setRods, 20, 11,14, 12, 12)
   widgets.setTable("30", setRods, 30, 17,20, 12, 12)
   widgets.setTable("40", setRods, 40, 5,8, 14, 14)
   widgets.setTable("50", setRods, 50, 11,14, 14, 14)
   widgets.setTable("60", setRods, 60, 17,20, 14, 14)
   widgets.setTable("70", setRods, 70, 5,8, 16, 16)
   widgets.setTable("80", setRods, 80, 11,14, 16, 16)
   widgets.setTable("90", setRods, 90, 17,20, 16, 16)
   widgets.setTable("+", rodPlus, "", 23, 25, 12, 12)
   widgets.setTable("-", rodMinus, "", 23, 25, 16, 16) 
 
   if steamReactor then 
      widgets.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
      widgets.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
      
   end
   widgets.screen()
   checkMode()
   reactorOnOff()
   menuMode()
end
 
function turbineAutoMenu()
   m.setTextScale(txtScale) --- Lejoni Edit ---
   widgets.clearTable()
   widgets.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
   widgets.setTable("Manual", manualMode, "", 15, 25, 6, 6)
   widgets.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
   widgets.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
   widgets.screen()
   checkMode()
   menuMode()
end
 
function turbineManualMenu()
   m.setTextScale(txtScale) --- Lejoni Edit ---
   widgets.clearTable()
   widgets.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
   widgets.setTable("Manual", manualMode, "", 15, 25, 6, 6)
   widgets.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
   widgets.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
   widgets.setTable("Online", setTurbineOnline, "", 3, 13, 8, 8)
   widgets.setTable("Offline", setTurbineOffline, "", 15, 25, 8, 8)
   widgets.setTable("Coils On", coilsOn, "", 3, 13, 10, 10)
   widgets.setTable("Coils Off", coilsOff, "", 15, 25, 10, 10)
   widgets.screen()
   checkMode()
   turbineOnOff()
   coilsOnOff()
   menuMode()
end
 
function reactorMenu()
   menuType = "Reactor"
   displayScreen()
end
 
function turbineMenu()
   menuType = "Turbine"
   displayScreen()
end
 
function online()
   r.setActive(true)
   --widgets.flash("Online")
end
 
function offline()
   r.setActive(false)
   --widgets.flash("Offline")
end
 
function setTurbineOnline()
   t.setActive(true)
   --widgets.flash("Online")
end
 
function setTurbineOffline()
   t.setActive(false)
   --widgets.flash("Offline")
end
 
function reactorOnOff()
   widgets.setButton("Online", r.getActive())
   widgets.setButton("Offline", not r.getActive())
end
 
function turbineOnOff()
   widgets.setButton("Online", t.getActive())
   widgets.setButton("Offline", not t.getActive())
end
 
function coilsOnOff()
   widgets.setButton("Coils On", t.getInductorEngaged())
   widgets.setButton("Coils Off", not t.getInductorEngaged())
end
 
function coilsOn()
   t.setInductorEngaged(true)
end
 
function coilsOff()
   t.setInductorEngaged(false)
end
 
function menuMode()
   if steamReactor then 
   if menuType == "Reactor" then
     widgets.setButton("Reactor", true)
     widgets.setButton("Turbine", false)
   else
     widgets.setButton("Reactor", false)
     widgets.setButton("Turbine", true)
   end
   end
end
 
function setRods(setLevel)
   print("Setting Rod Level: "..setLevel)
   widgets.flash(tostring(setLevel))
   r.setAllControlRodLevels(setLevel)
   fuelRodLevel()
end
 
function rodPlus()
   widgets.flash("+")
   r.setAllControlRodLevels(rodLevel+1)
   fuelRodLevel()
end
 
function rodMinus()
   widgets.flash("-")
   r.setAllControlRodLevels(rodLevel-1)
   fuelRodLevel()
end
 
function checkMode()
   widgets.toggleButton(mode)
end
   
function manualMode()
   mode = "Manual"
   manualMenu()
end
 
function autoMode()
   mode = "Automatic"
   displayScreen()
end
 
function comma_value(amount)
   local formatted = amount
   local swap = false
   if formatted < 0 then 
      formatted = formatted*-1
      swap = true
   end
   while true do
      formatted, k = string.gsub(formatted, "^(%d+)(%d%d%d)", '%1,%2')
      if k == 0 then
         break
      end
   end
   if swap then 
     formatted = "-"..formatted
   end
   return formatted
end
 
function displayEn()
   m.clear()
   m.setCursorPos(1,1)
   --print("Energy Use: "..energy)
   m.write("Energy Use: ")
   if energy < 0 then
      m.setTextColor(colors.red)
   else
      m.setTextColor(colors.green)
   end
   m.write(comma_value(math.floor(energy)).. "RF/t")
   m.setTextColor(colors.white)
   m.setCursorPos(1,2)
   m.write("Energy Stored: "..energyStoredPercent.."%")
   if menuType == "Reactor" then
      m.setCursorPos(1,3)
      m.write("Reactor is: ")
      if reactorOnline then 
       m.setTextColor(colors.green) 
       m.write("Online")
      else 
       m.setTextColor(colors.red) 
       m.write("Offline")
      end
      m.setTextColor(colors.white)
      m.setCursorPos(colum2,1) --- Lejoni Edit ---
      if steamReactor then
         m.write("Steam: ")
         m.setTextColor(colors.green)
         m.write(comma_value(math.floor(RFProduction)).."MB/t")
      else
         m.write("RF Gen: ")
         m.setTextColor(colors.green)
         m.write(comma_value(math.floor(RFProduction)).."RF/t")
      end
      m.setTextColor(colors.white)
      m.setCursorPos(colum2,2) --- Lejoni Edit ---
      m.write("Core Temp: "..math.floor(coreTemp).."c")
      m.setCursorPos(colum2,3) --- Lejoni Edit ---
      m.write("Fuel Use: "..fuelUse.."MB/t")  
  else
      m.setCursorPos(1,3)
      m.write("Turbine is: ")
      if turbineOnline then 
       m.setTextColor(colors.green) 
       m.write("Online")
      else 
       m.setTextColor(colors.red) 
       m.write("Offline")
      end
      m.setCursorPos(1,4)
      m.setTextColor(colors.white)
      m.write("Reactor is: ")
      if reactorOnline then
         m.setTextColor(colors.green)
         m.write("Online")
      else
         m.setTextColor(colors.red)
         m.write("Offline")
      end
      m.setTextColor(colors.white)
      m.setCursorPos(colum2,1) --- Lejoni Edit ---
      m.write("RFGen: ")
      m.setTextColor(colors.green)
      m.write(comma_value(math.floor(turbineRFGen)).."RF/t") 
      m.setTextColor(colors.white)
      m.setCursorPos(colum2,2) --- Lejoni Edit ---
      m.write("Rotor: "..comma_value(math.floor(turbineRotorSpeed)).." RPM")
      m.setCursorPos(colum2,3) --- Lejoni Edit ---
      m.write("Steam: "..comma_value(turbineFluidRate).."MB/t")
      m.setCursorPos(colum2,4) --- Lejoni Edit ---
      m.write("Fuel Use: "..fuelUse.."MB/t")
  end
  
end
 
function checkEn()
   local tempEnergy = 0
   energyStored = p.getEnergyStored()
   energyMax = p.getMaxEnergyStored()
   energyStoredPercent = math.floor((energyStored/energyMax)*100)
   --- Lejoni Edit ---
   if steamReactor then
      RFProduction = t.getEnergyProducedLastTick()
   else
      RFProduction = r.getEnergyProducedLastTick()
   end
   -------------------
   fuelUse = r.getFuelConsumedLastTick()
   fuelUse = math.floor(fuelUse*100)
   fuelUse = fuelUse/100
   coreTemp = r.getFuelTemperature()
   reactorOnline = r.getActive()
   tempEnergy = p.getEnergyStored()
   sleep(0.1)
   --- Lejoni Edit ---
   energy = RFProduction - ((p.getEnergyStored()-tempEnergy)/2)
   -------------------
   energy = energy*numCapacitors
   if steamReactor then
     turbineOnline = t.getActive()
     turbineRotorSpeed = t.getRotorSpeed()
     turbineRFGen = t.getEnergyProducedLastTick()
     turbineFluidRate = t.getFluidFlowRate()
   end
end
 
function fuelRodLevel()
   rodLevel = r.getControlRodLevel(0)
   --print(rodLevel)
   m.setCursorPos(30,5)
   m.write(tostring(rodLevel).."%")
   m.setBackgroundColor(colors.white)
   m.setCursorPos(28,6)
   m.write("       ")
   for i = 1,10 do
      m.setCursorPos(28,i+6)
      m.setBackgroundColor(colors.white)
      m.write(" ")
      m.setBackgroundColor(colors.yellow)
      m.write(" ")
      if rodLevel/10 >= i then
         m.setBackgroundColor(colors.red)
      else
         m.setBackgroundColor(colors.yellow)
      end
      m.write("   ")
      m.setBackgroundColor(colors.yellow)
      m.write(" ")
      m.setBackgroundColor(colors.white)
      m.write(" ")
   end
   m.setCursorPos(28,17)
   m.write("       ")
   m.setBackgroundColor(colors.black)
end
 
function turbineInductorDisplay()
   turbineInductor = t.getInductorEngaged()
   m.setCursorPos(39,5)
   if turbineInductor then
      m.write("On")
   else
      m.write("Off")
   end
   m.setBackgroundColor(colors.gray)
   m.setCursorPos(37,6)
   m.write("       ")
   for i = 1,7 do
      m.setCursorPos(37,i+6)
      m.setBackgroundColor(colors.gray)
      m.write(" ")
      m.setBackgroundColor(colors.lightGray)
      m.write(" ")
      if i % 2 == 0 then
         m.setBackgroundColor(colors.gray)
      end
      m.write(" ")
      m.setBackgroundColor(colors.gray)
      m.write(" ")
      if i % 2 ~= 0 then
         m.setBackgroundColor(colors.lightGray)
      end
      m.write(" ")
      m.setBackgroundColor(colors.lightGray)
      m.write(" ")
      m.setBackgroundColor(colors.gray)
      m.write(" ")
   end
   for i = 8,10 do
   m.setCursorPos(37,i+6)
      m.setBackgroundColor(colors.gray)
      m.write(" ")
      m.setBackgroundColor(colors.lightGray)
      m.write(" ")
      if turbineInductor then
         m.setBackgroundColor(colors.red)
      else
         m.setBackgroundColor(colors.blue)
      end
      m.write(" ")
      m.setBackgroundColor(colors.gray)
      m.write(" ")
      if turbineInductor then
         m.setBackgroundColor(colors.red)
      else
         m.setBackgroundColor(colors.blue)
      end
      m.write(" ")
      m.setBackgroundColor(colors.lightGray)
      m.write(" ")
      m.setBackgroundColor(colors.gray)
      m.write(" ")
   end
   m.setCursorPos(37,17)
   m.write("       ")
   m.setBackgroundColor(colors.black)
end
function getClick()
   local event, side, x, y = os.pullEvent("monitor_touch")
   widgets.checkxy(x,y)
end
 
function findOptFuelRods()
   m.clear()
   r.setActive(false)
   checkEn()
   displayEn()
   fuelRodLevel()
   while r.getFuelTemperature() > 99 do
      for i= 1,3 do
        checkEn()
        displayEn()
        fuelRodLevel()
        m.setCursorPos(3,6)
        m.write("Finding Optimal Rod Level")
        m.setCursorPos(3,7)
        m.write("Core Temp: "..r.getFuelTemperature())
        m.setCursorPos(3,8)
        m.write("Waiting for 99c")
        sleep(1)
      end
   end
   while r.getHotFluidAmount() > 10000 do
     for i = 1,3 do
        checkEn()
        displayEn()
        fuelRodLevel()
        m.setCursorPos(3,6)
        m.write("Finding Optimal Rod Level, please wait....")
        m.setCursorPos(3,7)
        m.write("Fluid Amount: "..comma_value(r.getHotFluidAmount()).."mb")
        m.setCursorPos(3,8)
        m.write("Waiting for 10,000mb")
        sleep(1)
      end
   end
   r.setAllControlRodLevels(99)
   r.setActive(true)
   
   while r.getFuelTemperature() < 100 do
   for i = 1,5 do
     checkEn()
     displayEn()
     fuelRodLevel()
     m.setCursorPos(3,6)
     m.write("Set all rod levels to 99")
     m.setCursorPos(3,7)
     m.write("Waiting 5 seconds...")
     sleep(1)
   end
   end
   for i = 1,5 do
     checkEn()
     displayEn()
     fuelRodLevel()
     m.setCursorPos(3,6)
     m.write("Set all rod levels to 99")
     m.setCursorPos(3,7)
     m.write("Waiting 5 seconds...")
     sleep(1)
   end
   local tempMB = r.getEnergyProducedLastTick()
   print(tempMB.."MB/t of steam")
   local tempRodLevels = math.floor(2000/tempMB)
   print("2000/"..tempMB.." = "..tempRodLevels)
   tempRodLevels = 100-tempRodLevels+5
   print("Adding 5 to Rod Levels: "..math.floor(tempRodLevels))
   r.setAllControlRodLevels(math.floor(tempRodLevels))
   print("Waiting 10 seconds to confirm...")
   for i = 1,10 do
     checkEn()
     displayEn()
     fuelRodLevel()
     m.setCursorPos(3,6)
     m.write("Estimated Level: "..tempRodLevels)
     m.setCursorPos(3,7)
     m.write("Waiting 10 seconds...")
     sleep(1)
   end
   tempMB = r.getEnergyProducedLastTick()
   while tempMB > 2000 do
      tempRodLevels = tempRodLevels+1
      r.setAllControlRodLevels(math.floor(tempRodLevels))
      print("Setting Rod Levels to: "..tempRodLevels)
      for i = 1,5 do
       checkEn()
       displayEn()
       fuelRodLevel()
       m.setCursorPos(3,6)
       m.write("Getting below 2000mb/t")
       m.setCursorPos(3,7)
       m.write("Currently at: "..tempMB)
       sleep(1)
      end
      tempMB = r.getEnergyProducedLastTick()
   end
   while tempMB < 2000 do
      tempRodLevels = tempRodLevels -1
      r.setAllControlRodLevels(math.floor(tempRodLevels))
      print("Setting Rod Levels to: "..tempRodLevels)
      for i = 1,5 do
       checkEn()
       displayEn()
       fuelRodLevel()
       m.setCursorPos(3,6)
       m.write("Getting Above 2000mb/t")
       m.setCursorPos(3,7)
       m.write("Currently at: "..tempMB)
       sleep(1)
      end
      tempMB = r.getEnergyProducedLastTick()
   end
   OptFuelRodLevel = tempRodLevels
   saveSettingsToFile()
end
   
 
function autoReactor()
   if not steamReactor then
      r.setAllControlRodLevels(0)
      if energyStoredPercent < turnOnAt then
       if not reactorOnline then
         online()
       end
      end
      if energyStoredPercent > turnOffAt then
       if reactorOnline then
         offline()
       end
      end
    else
       r.setAllControlRodLevels(OptFuelRodLevel)
       if energyStoredPercent < turnOnAt then
         --online()
             setTurbineOnline()
             coilsOn()
       end
       if energyStoredPercent > turnOffAt then
         --if turbineRotorSpeed > 1800 then
         --   offline()
         --else
            --   online()
         --end
         setTurbineOnline()
         coilsOff()
       end
    if turbineRotorSpeed > 1810 then
       offline()
    else
       online()
    end
    end
end
 
function displayScreen()
 --  repeat
      checkEn()
      displayEn()
      if menuType == "Reactor" then
        fuelRodLevel()
        if mode == "Automatic" then
           autoMenu()
           autoReactor()
        else
           manualMenu()
        end
        
      else
        fuelRodLevel()
        turbineInductorDisplay()
        if mode == "Automatic" then
           turbineAutoMenu()
           autoReactor()
        else
           turbineManualMenu()
        end
        
      end
      
      timerCode = os.startTimer(1)
      local event, side, x, y
      repeat 
        event, side, x, y = os.pullEvent()
        print(event)
        if event == "timer" then
           print(timerCode..":"..side)
           if timerCode ~= side then
              print("Wrong Code")
            else
              print("Right Code")
            end
        end
       until event~= "timer" or timerCode == side
       if event == "monitor_touch" then
            print(x..":"..y)
            widgets.checkxy(x,y)
        end
 --  until event ~= "timer"
end
 
loadSettingsFromFile()
 
if steamReactor then
   if OptFuelRodLevel == 0 then
      findOptFuelRods()
   else
      m.setBackgroundColor(colours.black)
      m.clear()
      m.setCursorPos(3,6)
      m.write("Loading Settings:")
      m.setCursorPos(3,7)
      sleep(1)
      m.write("Optimal FuelRodLevel: "..OptFuelRodLevel)
      sleep(2)
   end
end
 
while true do
   displayScreen()
end

Comments