View difference between Paste ID: A5264r9S and duNJnrvB
SHOW: | | - or go back to the newest paste.
1
local offReac = 9902 --температура перегрева реактора до отключения
2
local perDamage = 90 --процент износа конденсатора при котором он меняется
3
 
4
local com = require("component")
5
local computer = require("computer")
6
local event = require("event")
7
local gpu = com.gpu
8
local w,h = gpu.getResolution()
9
local per,noFuel,lowEu,toReac,run = 0,0,0,1,true
10
local sideReac,sideInv,sideRed,OutputEUt,StartEUt
11
local slotReac = {}
12
 
13
if not com.isAvailable("transposer") then
14
  print("нет транспозера")
15
  os.exit()
16
end
17
local tr = com.transposer
18
 
19
if not com.isAvailable("redstone") then
20
  print("нет контроллера красного камня")
21
  os.exit()
22
end
23
local red = com.redstone
24
 
25
if not com.isAvailable("reactor_chamber") then
26
  print("камера реактора не найдена")
27
  os.exit()
28
end
29
local reactor = com.reactor_chamber
30
 
31
if reactor.producesEnergy() then
32
  print("\n".."остановите реактор !")
33
  for i = 0,5 do
34
    if red.getOutput(i) > 0 then
35
      red.setOutput(i, 0)
36
    end
37
  end
38
  os.exit()
39
end
40
 
41
if reactor.getHeat() > offReac then
42
  print("\n".."перегрев реактора !")
43
  os.exit()
44
end
45
 
46
print("поиск реактора и сундука")
47
for i = 0,5 do
48
  local vr = tr.getInventorySize(i)
49
  if vr ~= nil then
50
    if vr == 58 then
51
      print("реактор в стороне: "..i)
52
      sideReac = i
53
    else
54
      sideInv = i
55
      print("сундук в стороне: "..i)
56
    end
57
  end
58
end
59
if not sideReac then
60
  print("\n".."камера реактора не найдена")
61
  os.exit()
62
end
63
if not sideInv then
64
  print("\n".."сундук не найден")
65
  os.exit()
66
end
67
local slotsReac = tr.getInventorySize(sideReac)
68
local slotsInv = tr.getInventorySize(sideInv)
69
 
70
local function getAllStacks(side)
71
  local temp = {}
72
  local tmp = false
73
  for i = 1, tr.getInventorySize(side) do
74
    tmp = tr.getStackInSlot(side, i)
75
    if tmp ~= nil then
76
      temp[i-1] = tmp
77
    end
78
  end
79
  return temp
80
end
81
 
82
print("сохранение конденсаторов")
83
local data = getAllStacks(sideReac)
84
for i = 0,slotsReac do
85
  if data[i] and data[i].name then
86
    if string.find(data[i].name,"ondensator") then
87
      local per = math.ceil(100*data[i].damage/data[i].maxDamage)
88
      print("слот: "..(i+1).."  износ: "..per.." %")
89
      if per >= perDamage then
90
        print("\n".."замените конденсатор в слоте: "..(i+1))
91
        os.exit()
92
      end
93
      table.insert(slotReac, i+1)
94
    end
95
  end
96
end
97
 
98
print("пробный запуск")
99
for k,n in pairs({3,2,4,5,0,1}) do
100
  red.setOutput(n, 15)
101
  if reactor.producesEnergy() then
102
    os.sleep(1)
103
    StartEUt = math.ceil(reactor.getReactorEUOutput())
104
    print("StartEUt = "..StartEUt)
105
    sideRed = n
106
    red.setOutput(n, 0)
107
    print("редстоун в стороне: "..sideRed)
108
    break
109
  else
110
    red.setOutput(n, 0)
111
  end
112
  if k == 6 then
113
    print("\n".."реактор не запускается")
114
    os.exit()
115
  end
116
end
117
 
118
print("настройка завершена".."\n".."старт...")
119
--os.sleep(2)
120
 
121
local function gui() 
122
  gpu.setResolution(28,15)
123
  gpu.setBackground(0x000000)
124
  gpu.fill(1,1,28,15," ")
125
  gpu.setForeground(0x669999)
126
  gpu.set(1,1,"┌──────────────────────────┐")
127
  gpu.set(1,2,"│  │  │  │  │  │  │  │  │  │")
128
  gpu.set(1,3,"│──────────────────────────│")
129
  gpu.set(1,4,"│  │  │  │  │  │  │  │  │  │")
130
  gpu.set(1,5,"│──────────────────────────│")
131
  gpu.set(1,6,"│  │  │  │  │  │  │  │  │  │")
132
  gpu.set(1,7,"│──────────────────────────│")
133
  gpu.set(1,8,"│  │  │  │  │  │  │  │  │  │")
134
  gpu.set(1,9,"│──────────────────────────│")
135
 gpu.set(1,10,"│  │  │  │  │  │  │  │  │  │")
136
 gpu.set(1,11,"│──────────────────────────│")
137
 gpu.set(1,12,"│  │  │  │  │  │  │  │  │  │")
138
 gpu.set(1,13,"└──────────────────────────┘")
139
end
140
 
141
local xy = {
142
{"2","2"},{"5","2"},{"8","2"},{"11","2"},{"14","2"},{"17","2"},{"20","2"},{"23","2"},{"26","2"},
143
{"2","4"},{"5","4"},{"8","4"},{"11","4"},{"14","4"},{"17","4"},{"20","4"},{"23","4"},{"26","4"},
144
{"2","6"},{"5","6"},{"8","6"},{"11","6"},{"14","6"},{"17","6"},{"20","6"},{"23","6"},{"26","6"},
145
{"2","8"},{"5","8"},{"8","8"},{"11","8"},{"14","8"},{"17","8"},{"20","8"},{"23","8"},{"26","8"},
146
{"2","10"},{"5","10"},{"8","10"},{"11","10"},{"14","10"},{"17","10"},{"20","10"},{"23","10"},{"26","10"},
147
{"2","12"},{"5","12"},{"8","12"},{"11","12"},{"14","12"},{"17","12"},{"20","12"},{"23","12"},{"26","12"},
148
}
149
 
150
local function stop(wait) 
151
  local e = ({event.pull(wait,"key_down")})[4]
152
  if e == 18 or e == 20 then
153
    red.setOutput(sideRed, 0)
154
    gpu.setResolution(w, h)
155
    gpu.setBackground(0x000000)
156
    gpu.setForeground(0xFFFFFF)
157
    gpu.fill(1, 1, w, h, " ")
158
    print("программа завершена")
159
    os.sleep(1)
160
    if reactor.producesEnergy() then
161
      print("ВНИМАНИЕ реактор по прежнему активен !!!")
162
    else
163
      print("реактор остановлен")
164
    end
165
    run = false
166
  end
167
end
168
 
169
local function alert(message) 
170
  gpu.setForeground(0xFF9900)
171
  gpu.set(1,14,"  для завершения нажмите E  ")
172
  gpu.setForeground(0xFF0000)
173
  gpu.set(1,15,message)
174
  computer.beep(500, 1)
175
  stop(3)
176
end
177
 
178
 
179
local function ReactorControl()
180
  local data = getAllStacks(sideReac)
181
    for i = 1,#slotReac do
182
      data = tr.getStackInSlot(sideReac, slotReac[i])
183
      if data.damage then
184
        per = math.ceil(100*data.damage/data.maxDamage)
185
        gpu.setForeground(0xFF9900)
186
        gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),tostring(per))
187
      else
188
        per = 0
189
      end
190
      if per == 100 then
191
        red.setOutput(sideRed, 0)
192
        alert(" снизте % замены конденсат. ")
193
        while run do
194
          computer.beep(500, 1)
195
          stop(3)
196
        end
197
        os.exit()
198
      end
199
      if per >= perDamage or per == 0 then
200
        gpu.setForeground(0xFF9900)
201
        gpu.set(1,15,"    замена конденсаторов    ")
202
        if red.getOutput(sideRed) > 0 then
203
          red.setOutput(sideRed, 0)
204
          os.sleep(0.5)
205
        end
206
        tr.transferItem(sideReac, sideInv, 1, slotReac[i])
207
        gpu.setForeground(0xFF0000)
208
        gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),"██")
209
        os.sleep(0.5)
210
        local data1 = getAllStacks(sideInv)
211
        for i1 = 0,slotsInv do
212
          if data1[i1] and data1[i1].name then
213
            local per = math.ceil(100*data1[i1].damage/data1[i1].maxDamage)
214
            if string.find(data1[i1].name,"ondensator") and per < 90 then
215
              toReac = tr.transferItem(sideInv, sideReac, 1, i1+1, slotReac[i])
216
              gpu.setForeground(0x00FF00)
217
              gpu.set(tonumber(xy[slotReac[i]][1]),tonumber(xy[slotReac[i]][2]),"██")
218
              break
219
            else
220
              toReac = 0
221
            end
222
          end
223
        end
224
      end
225
    end
226
 
227
  local function circuitCheck() 
228
    local data = getAllStacks(sideReac)
229
    local sh = 0
230
    for i = 1,#slotReac do
231
      if data[slotReac[i]-1].damage then
232
        sh = sh + 1
233
      end
234
    end
235
    if sh == #slotReac then
236
      return true
237
    else
238
      return false
239
    end
240
  end
241
  
242
  if reactor.getHeat() > offReac then
243
    red.setOutput(sideRed, 0)
244
    alert("     перегрев реактора !    ")
245
  elseif not circuitCheck() then
246
    alert(" нет целых конденсаторов !  ")
247
  elseif toReac == 0 then
248
    alert("    в сундуке нет места !   ")
249
  elseif noFuel >= 5 then
250
    alert("       нет топлива !        ")
251
  else
252
    red.setOutput(sideRed, 15)
253
    if not reactor.producesEnergy() then
254
      alert("  реактор не запускается !  ")
255
    else
256
      OutputEUt = math.ceil(reactor.getReactorEUOutput())
257
      gpu.setForeground(0x00FF00)
258
      gpu.set(1,14,"      eu/t =  "..OutputEUt.."            ")
259
      gpu.set(1,15,"      реактор активен       ")
260
    end
261
  end
262
  stop(0.1)
263
 
264
  if reactor.producesEnergy() and reactor.getReactorEUOutput() == 0 then
265
    noFuel = noFuel + 1
266
  else
267
    noFuel = 0
268
    if OutputEUt and OutputEUt < StartEUt then
269
      lowEu = lowEu + 1
270
    else
271
      lowEu = 0
272
    end
273
  end
274
  if noFuel == 3 or lowEu == 3 then
275
    local data2 = getAllStacks(sideReac)
276
    local data3 = getAllStacks(sideInv)
277
    for i2 = 0,slotsReac do
278
      if data2[i2] and data2[i2].name then
279
        if string.find(data2[i2].name,"depleted") then
280
          gpu.setForeground(0xFF9900)
281
          gpu.set(1,15,"      замена стержней       ")
282
          tr.transferItem(sideReac, sideInv, 1, i2+1)
283
          for i3 = 0,slotsInv do
284
            if data3[i3] and data3[i3].name then
285
              if string.find(data3[i3].name,"MOX") or string.find(data3[i3].name,"Uran") then
286
                if not string.find(data3[i3].name,"depleted") then
287
                  tr.transferItem(sideInv, sideReac, 1, i3+1, i2+1)
288
                  break
289
                end
290
              end
291
            end
292
          end
293
        end
294
      end
295
    end
296
    StartEUt = math.ceil(reactor.getReactorEUOutput())
297
    lowEu = 0
298
    
299
  end
300
  if OutputEUt and OutputEUt > StartEUt then
301
    StartEUt = math.ceil(reactor.getReactorEUOutput())
302
  end
303
end
304
 
305
gui()
306
gpu.setForeground(0xFF9900)
307
gpu.set(1,14,"  для завершения нажмите E  ")
308
os.sleep(1)
309
while run do
310
  local ok,err = pcall(ReactorControl)
311
  if not ok then
312
    red.setOutput(sideRed, 0)
313
    gpu.setResolution(w, h)
314
    gpu.setBackground(0x000000)
315
    gpu.setForeground(0xFFFFFF)
316
    os.execute("cls")
317
    print("программа аварийно завершена")
318
    if type(err) == "table" then
319
      io.stderr:write(table.unpack(err))
320
    else
321
      io.stderr:write(err)
322
    end
323
    run = false
324
  end
325
end