View difference between Paste ID: i2ZriqN9 and NDNaK5cu
SHOW: | | - or go back to the newest paste.
1
function write(color, line, caption, text)
2
  local monitor = peripheral.find("monitor")
3
  monitor.setCursorPos(1, line)
4-
  local reactor = peripheral.wrap("BigReactors-Reactor_0")
4+
5
  monitor.write(caption)
6
  monitor.setTextColor(color)
7-
  monitor.setTextScale(0.5)
7+
  monitor.write(text)
8
  return line + 1
9-
  local low = 100000
9+
end
10-
  local high = 9000000
10+
11-
  local max = 10000000
11+
function findReactors()
12
  local reactors = {}
13-
  reactor.setAllControlRodLevels(reactor.getEnergyStored() * 100 / max)
13+
  local allReactors = {peripheral.find("BigReactors-Reactor")}
14
  local i = 0
15-
  monitor.setCursorPos(1,1)
15+
  for k, v in pairs(allReactors) do 
16
    print("Found reactor " .. i)
17-
  monitor.write("Active: ")
17+
    local reactor = {}
18-
  monitor.setTextColor(colors.lime)
18+
    reactor.lastRf = 0
19-
  monitor.write(reactor.getActive())
19+
    reactor.maxControlRods = v.getNumberOfControlRods() * 100
20-
   
20+
    reactor.controlRods = reactor.maxControlRods
21-
  monitor.setCursorPos(1,2)
21+
    reactor.energyProduced = 0
22
    reactor.fuelConsumed = 0
23-
  monitor.write("RF/T: ")  
23+
    reactor.tickCount = 0
24-
  monitor.setTextColor(colors.lime)
24+
    reactor.api = v
25-
  monitor.write(math.floor(reactor.getEnergyProducedLastTick()))
25+
    reactor.lastCasingTemperature = 0
26-
 
26+
    reactor.lastFuelTemperature= 0
27-
  monitor.setCursorPos(1,3)
27+
    reactors[i] = reactor
28
    i = i + 1
29-
  monitor.write("RF Stored: ")
29+
  end
30-
  monitor.setTextColor(colors.lime)
30+
  return reactors
31-
  monitor.write(math.floor(reactor.getEnergyStored()))
31+
end
32-
 
32+
33-
  monitor.setCursorPos(1,4)
33+
function findTurbines()
34
  local turbines = {}
35-
  monitor.write("Casing Heat: ")
35+
  local allTurbines = {peripheral.find("BigReactors-Turbine")}
36-
  monitor.setTextColor(colors.lime)
36+
  local i = 0
37-
  monitor.write(math.floor(reactor.getCasingTemperature()))
37+
  for k, v in pairs(allTurbines) do 
38-
 
38+
    print("Found turbine " .. i)
39-
  monitor.setCursorPos(1,5)
39+
    local turbine = {}
40
    turbine.api = v
41-
  monitor.write("Fuel Heat: ")
41+
    turbines[i] = turbine
42-
  monitor.setTextColor(colors.lime)
42+
    i = i + 1
43-
  monitor.write(math.floor(reactor.getFuelTemperature()))
43+
  end
44
  return turbines 
45-
  monitor.setCursorPos(1,6)
45+
end
46
47-
  monitor.write("Control Rods: ")
47+
function reactorControl(line, rt, reduceEnergy)
48-
  monitor.setTextColor(colors.lime)
48+
49-
  monitor.write(math.floor(reactor.getControlRodLevel(0)))
49+
50
  local reactor = rt.api
51-
  -- End Reactor 1
51+
52
53-
  sleep(1)
53+
  local rfStored = math.floor(reactor.getEnergyStored() / 100000)
54
  local fuelTemperature = reactor.getFuelTemperature()
55
  local casingTemperature = reactor.getCasingTemperature()
56
57
  if math.abs(fuelTemperature - rt.lastFuelTemperature) < 3 and math.abs(casingTemperature - rt.lastCasingTemperature) < 3 or rt.controlRods == rt.maxControlRods then
58
    if reduceEnergy then
59
      if rfStored >= rt.lastRf then
60
        rt.controlRods = rt.controlRods + 2
61
      end  
62
    else
63
      if rfStored < rt.lastRf then
64
        rt.controlRods = rt.controlRods - 2
65
      end
66
      if rfStored > rt.lastRf then
67
        rt.controlRods = rt.controlRods + 2
68
      end
69
      if rfStored == rt.lastRf then
70
        if rfStored > 90 then
71
          rt.controlRods = rt.controlRods + 2
72
        end 
73
      end
74
      if rfStored < 1 then
75
        rt.controlRods = rt.controlRods - 2
76
      end
77
    end 
78
  end
79
80
  if rt.controlRods > rt.maxControlRods then
81
    rt.controlRods = rt.maxControlRods
82
  end
83
  if rt.controlRods < 0 then
84
    rt.controlRods = 0
85
  end
86
  
87
  if not reactor.getActive() then
88
    rt.controlRods = rt.maxControlRods 
89
  end  
90
91
  rt.lastRf = rfStored
92
  rt.lastFuelTemperature = fuelTemperature
93
  rt.lastCasingTemperature = casingTemperature
94
95
  local level = math.ceil(rt.controlRods * 100 / rt.maxControlRods)
96
  local numberOfReduced = (level * rt.api.getNumberOfControlRods()) - rt.controlRods
97
98
  for i = 1,numberOfReduced do
99
    reactor.setControlRodLevel(i-1, level-1)
100
  end
101
  for i = numberOfReduced + 1,reactor.getNumberOfControlRods() do
102
    reactor.setControlRodLevel(i-1, level)
103
  end
104
105
  if reactor.getActive() then
106
    rt.energyProduced = (rt.energyProduced * rt.tickCount + reactor.getEnergyProducedLastTick()) / (rt.tickCount + 1)
107
    rt.fuelConsumed = (rt.fuelConsumed * rt.tickCount + reactor.getFuelConsumedLastTick()) / (rt.tickCount + 1)
108
    rt.tickCount = rt.tickCount + 1
109
    if (rt.tickCount > 600) then
110
      rt.tickCount = 600
111
    end
112
  end 
113
  
114
  local color
115
  if reactor.getActive() then
116
    color = colors.lime
117
  else 
118
    color = colors.red
119
  end
120
121
  line = write(color, line, "RF/T         : ", math.floor(reactor.getEnergyProducedLastTick()) .. " (" .. math.floor(rt.energyProduced) .. ")")
122
  line = write(color, line, "mB/T         : ", math.floor(reactor.getFuelConsumedLastTick() * 1000) / 1000 .. " (" .. math.floor(rt.fuelConsumed * 1000) / 1000 .. ")")
123
  line = write(color, line, "RF/mB        : ", math.floor(reactor.getEnergyProducedLastTick() / reactor.getFuelConsumedLastTick()) .. " (" .. math.floor(rt.energyProduced / rt.fuelConsumed).. ")")
124
  line = line + 1
125
  line = write(color, line, "Fuel Amount  : ", math.floor(reactor. getFuelAmount()) .. " (" .. math.floor(reactor.getFuelAmount() * 1000  / reactor.getFuelAmountMax()) / 10 .. "%)")
126
  line = line + 1
127
  line = write(color, line, "Heat (C/F)   : ", math.floor(reactor.getCasingTemperature()) .. " / " .. math.floor(reactor.getFuelTemperature()))
128
  line = line + 1
129
  line = write(color, line, "Control Rods : ", math.floor(rt.controlRods * 100 / rt.maxControlRods * 10) / 10)
130
131
  return line
132
133
end
134
135
function sumEnergyStored(list)
136
  local value = 0
137
  for k,v in pairs(list) do
138
    value = v.api.getEnergyStored() + value
139
  end
140
  return value
141
end
142
143
function checkReduce(turbines)
144
  for k,v in pairs(turbines) do
145
    if v.api.getEnergyStored() > 900000 then
146
      return true
147
    end
148
  end
149
  return false
150
end
151
152
function loop(reactors, turbines) 
153
  local lastRfTurbine = 0
154
  while true do
155
    local monitor = peripheral.find("monitor")
156
    monitor.clear()
157
    monitor.setTextScale(1)
158
    local line = 1
159
    local rfTurbine = sumEnergyStored(turbines)
160
    local rfReactors = sumEnergyStored(reactors)
161
    local reduceEnergy 
162
    if math.floor(rfTurbine / 100) > math.floor(lastRfTurbine / 100) then
163
      lastRfTurbine = rfTurbine
164
      reduceEnergy = true
165
    end
166
    if math.floor(lastRfTurbine / 100) > math.floor(rfTurbine / 100) then
167
      lastRfTurbine = rfTurbine
168
      reduceEnergy = false
169
    end
170
    if math.floor(lastRfTurbine / 100) == math.floor(rfTurbine / 100) then
171
      reduceEnergy = checkReduce(turbines)
172
    end  
173
    local color = colors.lime
174
    if reduceEnergy then
175
      color = colors.red
176
    end
177
    line = write(color, line, "RF Stored    : ", math.floor(rfTurbine + rfReactors))
178
    line = line + 2
179
180
    for k,v in pairs(reactors) do
181
      line = reactorControl(line, v, reduceEnergy) + 3
182
    end
183
    lastRfTurbine = rfTurbine
184
    sleep(2)
185
  end
186
end
187
188
function doLoop() 
189
  local reactorList = findReactors()
190
  local turbineList = findTurbines()  
191
  loop(reactorList, turbineList)
192
end
193
194
while true do
195
  local status, message = pcall(doLoop)
196
  local monitor = peripheral.find("monitor")
197
  monitor.clear()
198
  monitor.setTextScale(1)
199
  write(colors.red, 1, "Error : ", message)
200
  sleep(10)
201
end