Фактически я так и делал на сборке с gregtechнесколько лет назад. Менял все стержни с помощью ме шин, а не труб, выключая на время замены охладителей подачу топливных стержней. Но дописывать программу для вылавливания момента рестарта сервера мне было откровенно лень. А поскольку после рестарта реактор сперва отсутствовал, а потом превращался в 7 реакторов с другими адресами на время до его самосборки в монолитную структуру с опять же новым адресом, недоделанная программа без обработки таких событий не могла продолжить работу. И пару раз реактор бахнул. Не имея возможности получить предварительные данные о рестарте сервера программа в энный момент времени оказывалась перед фактом отсутствия запрашиваемых методов и происходило это в рандомный момент выполнения кода, зачастую сразу же после проверки на наличие компонента реактор.
Хочу сказать, что запрос типа getAllStacks был лимитирован временным интервалом 59 секунд.
Прямым текстом написано
А на это из известных мне механизмов способен как раз транспозер. И ещё робот.
Предвосхищая возможный вопрос сразу скину то, что сохранилось от программы. Ёмкость охладителей которые использовал была 1080к. Контролировался один реактор, остальные, а их было штук 6 подключённых к фризеру, были паралельной цепью.
--nuccontrol
--1сверху-минус фризер (15) - задействовать
--2сзади - плюс фризер (15) - задействовать
--5слева - минус топливо(15) - задействовать
--0снизу - плюс топливо (0) -включить факел
local math,component,nuclear_item,error = require('math'),require('component'),{},0
local event,nuclear_scheme,iter = require('event'),{},1
local u,c,m = 'ic2stuff:hexadeca_uranium_fuel_rod','ic2stuff:coolant_cell_1080k','ic2stuff:hexadeca_mox_fuel_rod'
local depleted,vent = 'depleted','heat_vent'
--составим таблицу расположений элементов в реакторе
for f = 1,9 do
nuclear_scheme[f]=m nuclear_scheme[f+18]=m nuclear_scheme[f+27]=m
nuclear_scheme[f+45]=m nuclear_scheme[f+9]=c nuclear_scheme[f+36]=c
end
component.gpu.setResolution(30,15)
------------------------------------------
reFreezer = function()----заменить охладители
component.redstone.setOutput(1,15)
while component.reactor_chamber.getStackInSlot(14) == c do
computer.pullSignal(0.5) end computer.pullSignal(1)
component.redstone.setOutput(1,0)
computer.pullSignal(1)
component.redstone.setOutput(2,15)
while component.reactor_chamber.getStackInSlot(14) ~= c do
computer.pullSignal(0.5) end computer.pullSignal(1)
component.redstone.setOutput(2,0)
return true
end
reFuel = function()----заменить топливо
component.redstone.setOutput(5,15)
while component.reactor_chamber.getStackInSlot(5) == dm do
computer.pullSignal(0.5) end computer.pullSignal(1)
component.redstone.setOutput(5,0)
computer.pullSignal(1)
component.redstone.setOutput(0,15)
while component.reactor_chamber.getStackInSlot(5) == m do
computer.pullSignal(0.5) end computer.pullSignal(1)
component.redstone.setOutput(0,0)
return true
end
------------------------------------------
compareStacks=function()
error=0
for f = 1,54 do
nuclear_item[f]=component.reactor_chamber.getStackInSlot(f)
if not(nuclear_item[f].name:find('vent') or nuclear_item[f].name:find'fuel_rod' or nuclear_item[f].name:find'coolant_cell')
--~=nuclear_scheme[f] and nuclear_item[f].name~=vent and nuclear_item[f].name~=vent
then error=error+1
end
end
return true
end
----реактор проверить целостность схемы
reactor_compare_elements=function()
compareStacks() if error > 0 then return error end
--если охладители изношены отправить к их замене
if nuclear_item[14].damage > 920000 then
reFreezer()
end
compareStacks() if error > 0 then return error end
--если топливо выгорело - заменить
if nuclear_item[5].name:find('depleted')then
component.gpu.set(2,9,'depleted')
reFuel()
end
compareStacks()
return error
end
-----реактор включить выключить
nuc = function(flag)
if flag==component.reactor_chamber.isReactorWorking() then return true
end
if flag then component.reactor_chamber.startReactor()
else component.reactor_chamber.stopReactor()
end
--ждём
while(not(component.reactor_chamber.isReactorWorking() == flag))do
computer.pullSignal(0.1)
end
return true
end
--реактор работать до замены охладителей
work = function()
while component.reactor_chamber.getStackInSlot(14).damage<920000 do
component.gpu.set(2,11,'damage: '..tostring(component.reactor_chamber.getStackInSlot(14).damage)..' ')
computer.pullSignal(1)
local output=component.reactor_chamber.getReactorEUOutput()
component.gpu.set(2,12,'reactor output: '..tostring(output)..' ')
end
return true
end
------------------------------
function main()
---выключить реактор
nuc(false) reactor_compare_elements()
if error > 0 then
component.gpu.setResolution(80,40)
component.gpu.set(2,2,'схема не верна')
return "Схема не верна"
end
---включить реактор
if component.reactor_chamber.getStackInSlot(14).damage < 920000
and component.reactor_chamber.getStackInSlot(14).label == c
or component.reactor_chamber.getStackInSlot(14).label:find(vent)
then
component.gpu.set('Охладители готовы. Запуск '..tostring(iter))
iter=iter+1
nuc(true)
else
component.gpu.set(2,2,'Что-то пошло не так...')
return false
end
work()
return main()
end
main()
Впрочем, это не более чем пример сохранившийся от давно не существующей на том сервере сборки модов, поэтому является не более чем вариантом возможной реализции без уточнений о перезапуске программы, автовключении компьютера, и внешней обвязке реактора.