Subss6
-
Публикации
16 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные пользователем Subss6
-
-
Проблема оказалась очень простой, эти слоты заблокированы во имя совместимости, если снять блокировку то все извлекатели/разгрузчики начнут пихать туда предметы или забирать их что полностью сломает мод
-
Возник вопрос
У цирнокса 28 слотов: 24 стержня, а 4 для загрузки/выгрузки воды/углекислого газа
Первые 24 работают с транспозером нормально, но забрать можно только отработанные стержни, стержни в работе он не вернет,Но в последние 4 не получилось ни загрузить ни выгрузить
Размер инвентаря проверил в нем 28 слотов, транспозер их видит, но последние 4 получить/забрать их не может
Моды- Ntm Space(замена на классическую версию ничего не дает)
- OpenComputers
- OpenPeripheral(integration, Addons)
- Inventory Tweaks
- Thermal(и его дополнения)
- Nei
- EndlessIDs
local component = require("component") local sides = require("sides") print(component.transposer.getInventorySize(sides.down)) component.transposer.transferItem(sides.down, sides.up, 16, 28, 1) component.transposer.transferItem(sides.down, sides.up, 16, 27, 2) component.transposer.transferItem(sides.down, sides.up, 16, 26, 3) component.transposer.transferItem(sides.down, sides.up, 16, 25, 4) component.transposer.transferItem(sides.down, sides.up, 16, 24, 5)--тут уже работает
Сталкивался ли кто то с подобной проблемой в других модах(Видит все слоты но не работает с некоторыми из них)
-
ICF реактор конца игры. Мощный не взрывается, нет радиоактивных компонентов топливо можно брать из воздуха, но если загорячится можно разогнать до x9 раз, но у него несколько особенностей
- Производит только до 3 миллиардов энергии(не знаю почему но выше бойлеры и турбины дать не способны сколько не ставь)
- Быстро сжигает топливо
- Весомую часть от выработки сжирают лазер(сами они не отключаются даже если пеллеты нет)
- Производит столько тепла что необходимо подавать с перерывами
Приблизительная Схема(обратите внимание на расположение транспозера и красного контролера)
Код
Скрытый текстlocal component = require("component")
local os = require("os")
local sides=require("sides")local ICFReactors = {}
for address, type in component.list() do
if type == "ntm_icf_reactor" then
table.insert(ICFReactors, {
address = address,
proxy = component.proxy(address)
})
end
endlocal rs=component.redstone
local transposer = component.transposerlocal function transferOneItem()
local inventorySize = transposer.getInventorySize(sides.up)
for slot = 1, inventorySize do
local stackSize = transposer.getSlotStackSize(sides.up, slot)
if stackSize > 0 then
local transferred = transposer.transferItem(sides.up, sides.down, 1, slot)
return
end
end
print("В верхнем хранилище нет доступных предметов для перемещения.")
end
while true do
for i, reactor in ipairs(ICFReactors) do
print("Адрес реактора " .. i .. ": " .. reactor.address)
local pelletStats = reactor.proxy.getPelletStats() or "N/A"
local heat = reactor.proxy.getHeat() or "N/A"
print("Пеллета " .. i .. ": " .. pelletStats)
print("Тепло " .. i .. ": " .. heat)if pelletStats ~= "N/A" and heat == 0 then
rs.setOutput(sides.bottom, 15)
elseif pelletStats == "N/A" and heat > 0 then
rs.setOutput(sides.bottom, 0)
elseif pelletStats == "N/A" and heat == 0 then
transferOneItem()
end
end
os.sleep(0.5)
endПолностью автоматизирует реактор
- Если пеллета есть и тепло в реакторе не содержится то вкоючаем
- Если пеллеты нет а тепло осталось ждем пока переработается все тепло, отключив лазеры дабы впустуе не работали
- Если пеллеты нет, тепла нет то загружаем новую
Таким образом мы не теряем энергию впустую
Есть ли у кого то гайд на работу с МЭ сетью?-
1
-
ВВЭР не взрывается(только плавится), по энергии меньше чем рбмк, но меньше потребляет, выхода отработки тоже меньше меньше
Код пример ибо возникли проблемы с пониманием что он мне выводит пока без контроляОбратите внимание на обратную запись 100-полностью опущен 0-полностью поднят в интерфейсе наоборот
https://ntm.fandom.com/ru/wiki/Водо-водяной_энергетический_реактор_(ВВЭР)
PS с интерфейсами также плохо
Стоит поискать функцию поиска максимального количества стержнейlocal component = require('component') local powerControls = {} for address, _ in pairs(component.list('ntm_pwr_control')) do table.insert(powerControls, address) end for i, address in ipairs(powerControls) do local control = component.proxy(address) local level = control.getLevel() or 'N/A' local coolantInfoCold, coolantInfoColdMax, coolantInfoHot, coolantInfoHotMax = control.getCoolantInfo() local flux = control.getFlux() or 'N/A' local heatCore, heat = control.getHeat() local fuelInfo = control.getFuelInfo() or 'N/A' local controlType = control.type or 'N/A' print('+--------------------------------+') print('| Компонент: ' .. address .. ' ') print('| Тип: ' .. controlType .. ' ') print('| Уровень: ' .. level .. ' ') print('| Тепло: ' .. (heatCore or 'N/A') .. '/' .. (heat or 'N/A') .. ' ') print('| Флюс: ' .. flux .. ' ') print('| Охлаждение: ' .. (coolantInfoCold or 0) .. '/' .. (coolantInfoColdMax or 0) .. ', ' .. (coolantInfoHot or 0) .. '/' .. (coolantInfoHotMax or 0) .. ' ') print('+--------------------------------+') end
-
Наконец получилось вытащить информацию о положении стержней и преобразовать ее в двух мерный массив
единственное что надо указать левую верхнюю ячейку по отношению на EAST
Во втором массиве уже хранятся и адрес и тип поэтому реализовать кнопки с методами будет просто
Опять косячу с прокси поэтому пока оставил управление и обновления на потомlocal component = require("component") local gpu = require("component").gpu -- Список типов компонентов РБМК local rbmkComponentTypes = { "rbmk_fuel_rod", "rbmk_heater", "rbmk_control_rod", "rbmk_cooler", "rbmk_outgasser", "rbmk_boiler", "rbmk_emitter", } local componentsInfo = {} for _, componentType in ipairs(rbmkComponentTypes) do for address, type in component.list() do if type == componentType then local componentProxy = component.proxy(address) local x, y, z = componentProxy.getCoordinates() table.insert(componentsInfo, { type = componentType, address = address, coordinates = {x = x, y = y, z = z} }) end end end local gridSize = 15 local componentGrid = {} for i = 1, gridSize do componentGrid[i] = {} for j = 1, gridSize do componentGrid[i][j] = nil end end local offsetX = 22--левая верхняя ячейка local offsetZ = 34--левая верхняя ячейка for _, component in ipairs(componentsInfo) do local x, z = component.coordinates.x, component.coordinates.z local gridX = x - offsetX + 1 local gridY = z + offsetZ + 1 if gridX >= 1 and gridX <= gridSize and gridY >= 1 and gridY <= gridSize then componentGrid[gridX][gridY] = { address = component.address, type = component.type } end end local function drawComponentGrid() gpu.fill(1, 1, 80, 1, " ") gpu.set(1, 1, " Компоненты РБМК ") gpu.fill(1, 2, 80, 1, "-") for i = 1, gridSize do local rowOutput = "" for j = 1, gridSize do if componentGrid[i][j] then local symbol if componentGrid[i][j].type == "rbmk_fuel_rod" then symbol = "Т" -- Топливо elseif componentGrid[i][j].type == "rbmk_control_rod" then symbol = "К" -- Контролирующий стержень elseif componentGrid[i][j].type == "rbmk_boiler" then symbol = "П" -- Паровой канал elseif componentGrid[i][j].type == "rbmk_outgasser" then symbol = "О" -- Облучатель elseif componentGrid[i][j].type == "rbmk_cooler" then symbol = "Х" -- Охладитель else symbol = "?" -- Неизвестный тип end rowOutput = rowOutput .. "[" .. symbol .. "] " else rowOutput = rowOutput .. "[ ] " end end print(rowOutput) end end drawComponentGrid()
-
Очень много чего можно получить из компонентов многих на вики нет
Тип компонента: ntm_coker, Адрес: 31f7c437-7da1-4068-8c4f-d957027b3bf6 Методы: - address - getHeat - type - getTypeStored - getInfo - slot - getFluidStored Коксовая установка Тип компонента: ntm_fluid_tank, Адрес: 084c94eb-bdfe-4565-81ff-6231d34acb50 Методы: - address - getMaxStored - type - getTypeStored - getInfo - slot - getFluidStored Любая цистерна или бочка Тип компонента: rbmk_fuel_rod, Адрес: cbad95b6-0e4f-4965-ae14-8f8f575139dc Методы: - getType - getHeat - type - getCoreHeat - getSkinHeat - slot - getModerated - address - getXenonPoison - getInfo - getDepletion - getFluxRatio - getFluxQuantity - getCoordinates Топливный стержень(не отличает реасим) Тип компонента: dfc_receiver, Адрес: 8be271ba-10f0-4cb9-989f-9c89149d0190 Методы: - address - type - getCryogel - getInfo - slot - getEnergyInfo Получатель РТС Тип компонента: rbmk_heater, Адрес: cd2a71f0-5efe-4b79-97e8-5b2086d037db Методы: - getExport - getHeat - getExportMax - slot - type - address - getFillMax - getInfo - getExportType - getFill - getFillType - getCoordinates Не отличает нагреватель от прогревателя Тип компонента: ntm_turbine, Адрес: 95dcf975-e7dc-457f-ab2a-15d171b832e8 Методы: - address - getType - type - getInfo - getFluid - slot - setType Только промышленая турбина и левиафан Тип компонента: ntm_fusion, Адрес: f03d43e6-bb93-42d8-b707-0163bea7795f Методы: - type - getFluid - slot - getBlanketDamage - address - getEnergyInfo - getMaxTemp - isActive - setActive - getPlasmaTemp Термоядерный реактор Тип компонента: dfc_injector, Адрес: a56cb751-5d0a-44ab-9dca-a3e625088d1e Методы: - address - type - getFuel - getInfo - slot - getTypes Инжектор РТС Тип компонента: ntm_combustion_engine, Адрес: 743f434d-31be-4cde-b346-88954268ad3e Методы: - getType - getThrottle - type - setThrottle - slot - stop - address - getFluid - getEfficiency - getState - getInfo - start - getPower Промышленный двигатель внутреннего сгорания Тип компонента: rbmk_control_rod, Адрес: 46579472-3fac-4106-949d-9316b0bf0845 Методы: - getLevel - type - getTargetLevel - slot - address - setColor - getInfo - getHeat - setLevel - getColor - getCoordinates Контролирующие стержни не отличает автоматические Тип компонента: ntm_power_gauge, Адрес: 4c766d98-2f92-4ac9-ba08-ecbc6441dda5 Методы: - address - type - getInfo - slot - getTransfer Датчик Мощности Тип компонента: dfc_emitter, Адрес: 5761d2d1-e720-43c0-b3dd-a1da1873a95b Методы: - setInput - type - setActive - slot - address - getInfo - getCryogel - isActive - getInput - getEnergyInfo Компонент РТС Тип компонента: rbmk_crane, Адрес: 3e4a748d-b557-4cfc-8a68-f0dd8c103d91 Методы: - type - slot - load - getXenonPoison - getDepletion - address - move - getCranePos Кран РБМК Тип компонента: ntm_energy_storage, Адрес: 82aae91a-63c5-4c9a-80ee-59a582fe54aa Методы: - address - type - getInfo - slot - getEnergyInfo Любое энерго хранилище Тип компонента: ntm_fluid_gauge, Адрес: 25d74115-4433-493a-8813-864134577f13 Методы: - address - type - getInfo - getFluid - slot - getTransfer Датчик Жидкости Тип компонента: ntm_geiger, Адрес: 9247cb6f-7fae-40d9-b061-e873a2dfa533 Методы: - address - type - getRads - slot Счетчик Гейгера Тип компонента: rbmk_cooler, Адрес: 86195305-110e-4683-935c-0812f0bf4b9a Методы: - getHeat - type - slot - address - getCryoMax - getInfo - getCryo - getCoordinates Охладитель рбмк Тип компонента: rbmk_outgasser, Адрес: c8569961-a7a5-4189-a4fa-e1ea566dded2 Методы: - getGasMax - type - slot - address - getInfo - getProgress - getGas - getGasType - getCoordinates Стержень облучения Тип компонента: rbmk_console, Адрес: 35a7aec9-99b5-41dd-9416-785825aa00f4 Методы: - setColumnLevel - pressAZ5 - slot - getRBMKPos - address - getColumnData - setColorLevel - setLevel - setColor - type Консоль рбмк Тип компонента: breeding_reactor, Адрес: 66d78cf9-be40-46dd-b480-893264a6194f Методы: - address - type - getProgress - getInfo - slot - getFlux Реактор Размножитель Тип компонента: ntm_pwr_control, Адрес: 2213412c-5edd-4ccc-98ce-527685a75510 Методы: - getLevel - getCoolantInfo - slot - getFlux - address - getInfo - getFuelInfo - setLevel - getHeat - type ВВЭР Тип компонента: ntm_icf_reactor, Адрес: 77069b71-c492-4aa4-9431-7d9bdb23f26f Методы: - getHeat - type - getFluid - slot - getPelletStats - getMaxHeat - getPower - address - getHeatingRate ИТС реактор Тип компонента: research_reactor, Адрес: 7db4d45d-1295-4752-bb10-f70c50e7437d Методы: - getLevel - type - getTargetLevel - slot - getFlux - address - getInfo - setLevel - getTemp Иследовательский реактор Тип компонента: dfc_stabilizer, Адрес: 3e492bc1-bd2c-4b7d-b9fd-3dbda323f752 Методы: - setInput - type - getInput - slot - getDurability - address - getInfo - getEnergyInfo Стабилизатор РТС Тип компонента: ntm_gas_turbine, Адрес: 891dbcef-5b2f-4410-9106-720dcead6e63 Методы: - getType - getThrottle - getAuto - stop - setThrottle - slot - getFluid - address - start - getInfo - getState - getPower - setAuto - type Газовая турбина Тип компонента: rbmk_boiler, Адрес: e1a12722-8750-4d91-a818-b68c5208c4f0 Методы: - getHeat - type - getSteam - getWaterMax - slot - address - getCoordinates - getInfo - setSteamType - getSteamMax - getWater - getSteamType Паровой канал Тип компонента: zirnox_reactor, Адрес: 470a4fe2-c2e8-4f74-b0b6-06b813cbd55a Методы: - type - getSteam - setActive - getTemp - getWater - getCarbonDioxide - getPressure - getInfo - ventCarbonDioxide - isActive - address - slot Цирнокс -
На вики сильно устаревшая информация поэтому решил написать код который выводит все компоненты и аккуратно оформляет их методы
local component = require("component") local file = io.open("components_info.txt", "w") if not file then print("Не удалось открыть файл для записи.") return end local encounteredTypes = {} for address, componentType in component.list() do if not encounteredTypes[componentType] then encounteredTypes[componentType] = true file:write("Тип компонента: " .. componentType .. ", Адрес: " .. address .. "\n") local componentProxy = component.proxy(address) local methods = {} for methodName in pairs(componentProxy) do table.insert(methods, methodName) end file:write("Методы:\n") for _, method in ipairs(methods) do file:write(" - " .. method .. "\n") end file:write("\n") end end file:close() print("Информация о компонентах записана в components_info.txt.")
-
4 часа назад, Taoshi сказал:Кстати говоря дня 3 назад нашел канал по HBM NTM в telegram, но пока сам не исследовал.
Можешь посмотреть канал Ocelot на ютубе он очень хорошо рассказывает
-
4 часа назад, Taoshi сказал:reactor_control.getReactor - возвращает массив значений реактора (уровень стержня, поток, тепло.
Применимо ли для получения той информации которую получает код выше?
P.S: Насколько понимаю, для использование этой команды необходимо подключить элемент управления.
Фокус в том что его нет или он относится к другому реактору
есть только rbmk_console, но он без методов
Upd
в вики полностью наврали, инфа устарела, а я в первый раз с прокси накосячил
local component = require("component") local file = io.open("components_info.txt", "w") if not file then print("Не удалось открыть файл для записи.") return end local encounteredTypes = {} for address, componentType in component.list() do if not encounteredTypes[componentType] then encounteredTypes[componentType] = true file:write("Тип компонента: " .. componentType .. ", Адрес: " .. address .. "\n") local componentProxy = component.proxy(address) local methods = {} for methodName in pairs(componentProxy) do table.insert(methods, methodName) end file:write("Методы:\n") for _, method in ipairs(methods) do file:write(" - " .. method .. "\n") end file:write("\n") end end file:close() print("Информация о компонентах записана в components_info.txt.")
Код ниже методы
Тип компонента: rbmk_console, Адрес: 7136f1b3-5e86-4e8e-bcbd-f10bb528f7cb Методы: - setColorLevel - setLevel - address - setColor - getRBMKPos - getColumnData - type - slot - setColumnLevel - pressAZ5 Тип компонента: rbmk_control_rod, Адрес: ac95789c-0726-40bd-acdb-862bc9641d57 Методы: - getHeat - getInfo - setColor - getTargetLevel - slot - getColor - getCoordinates - setLevel - getLevel - address - type Тип компонента: rbmk_outgasser, Адрес: 426395ec-fe8b-46fb-b003-e14fa5329ea3 Методы: - getInfo - getGasType - slot - getProgress - getGas - getCoordinates - getGasMax - address - type Тип компонента: rbmk_cooler, Адрес: f01807ad-f2fe-4dc9-9afa-0fa2bf260d94 Методы: - getHeat - getInfo - getCryo - slot - getCoordinates - getCryoMax - address - type Тип компонента: rbmk_fuel_rod, Адрес: 9c5ac831-1f59-46db-806c-8be97db6bfa5 Методы: - getHeat - getSkinHeat - getFluxRatio - getDepletion - getInfo - getXenonPoison - slot - getModerated - getType - type - getCoordinates - getCoreHeat - getFluxQuantity - address Тип компонента: rbmk_boiler, Адрес: 54eb8e49-9d97-4549-b393-4696f770c864 Методы: - getHeat - getInfo - setSteamType - getWaterMax - slot - getSteamMax - address - type - getWater - getSteam - getCoordinates - getSteamType
Нормально он координаты получает судя по всему а вики этого нет
Я на это полчаса угробил но все получилось
Вики если кто то захочет исправить
https://ntm.fandom.com/ru/wiki/Интеграция_OpenComputers -
16 часов назад, eu_tomat сказал:Что ты имеешь в виду под состоянием? Что именно требуется хранить?
Сейчас программа считает что стержни изначально загружены, хранилище свежих полностью заполнено, хранилище пустых полностью свободно, и при при перезапуске всё возвращается к исходному, а получать данные из реактора пока адекватно не получается, данные хранятся в 4 массивах(положение компонентов, наличие стержня, заполнение 2-х типов хранилищ), можно сохранять в txt, но интересно есть ли другой способ дабы не забивать код лишними функциями.
17 часов назад, eu_tomat сказал:А что за загрузка файлов? Прикреплённые к сообщению картинки?
Да
17 часов назад, eu_tomat сказал:Быстро вряд ли получится. Если компоненты устанавливаются автоматически, то их координаты можно узнать в момент установки. Робот знает, что он устанавливает, по каким координатам, и в какой момент времени. А управляющий компьютер знает, в какой момент новые компоненты появляются в сети. Сопоставив моменты времени, можно получить соответствие адресов компонентов их коородинатам.
Было бы удивительно, если бы с РБМК не было проблем
-
Базовый контроль крана
- Красный - точка начала работы крана координата 1 - 1
- Зеленый соответствующая сторона реактора в мире и на панели управления
- Карта стержней уже повернута на нужный угол
- Кран и консоль повернуты спиной к востоку
- Стержни пока не используются
- Записываем компоненты реактора с левого верхнего угла(Если кран стоит спиной к рбмк)
Обозначения
- 1 - стержень
- 2 - стержень остывания
- 3 - хранилище отработки
- 4 - облучатель
- 5 - хранилище
Проблемы
- Не понятно как связать проверку стержней и их извлечение(если просто перебирать стержни краном рванет или остановится да и долго это)
- Авто проверки истощения нет(как бы есть но на отдельном компе(а координаты получить не могу поэтому не знаю как передать крану что ему нужно достать и куда поместить))
- Нет авто сканера(выше проверяет только стержни и работает 30 минут)
- Функция для манипулирования 1 стержнем нет
UPD
- Вынесено все в функции,
- Теперь умеет автоматически загружать разгружать все стержни
- Пока не отслеживает перемещение из/в хранилищ другими методами
Скрытый текстlocal component = require("component") local crane = component.proxy(component.list("rbmk_crane")()) local rodsGrid = { {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'}, {'0', '0', '2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0', '0'}, {'0', '2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0'}, {'0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0'}, {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'}, {'0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0'}, {'0', '5', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0'}, {'0', '0', '0', '1', '0', '1', '0', '*', '0', '1', '0', '1', '0', '0', '0'}, {'0', '5', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '3', '0'}, {'0', '0', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'}, {'0', '0', '0', '0', '0', '1', '0', '1', '0', '1', '0', '0', '0', '0', '0'}, {'0', '2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0'}, {'0', '0', '2', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0', '0'}, {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'}, } local rodStatus = {} for y = 1, #rodsGrid do rodStatus[y] = {} for x = 1, #rodsGrid[y] do rodStatus[y][x] = (rodsGrid[y][x] == '1') and 0 or 1 -- Всех стержней изначально нет end end local rodCouts = {} for y = 1, #rodsGrid do rodCouts[y] = {} for x = 1, #rodsGrid[y] do rodCouts[y][x] = 0 -- Изначально в хранилищах нет стержней end end local workingRodCounts = {} for y = 1, #rodsGrid do workingRodCounts[y] = {} for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '5' then workingRodCounts[y][x] = 12 -- В каждом хранилище по 12 стержней else workingRodCounts[y][x] = 0 end end end function moveCrane(direction, blocks) blocks = blocks or 1 for i = 1, blocks*20 do crane.move(direction) end end moveCrane("up", 15) moveCrane("left", 15) local cur_x = 1 local cur_y = 1 local function moveCraneXY(x, y) local blocksX = x - cur_x -- Разница по X local blocksY = y - cur_y -- Разница по Y if blocksX > 0 then moveCrane("right", blocksX) elseif blocksX < 0 then moveCrane("left", math.abs(blocksX)) end if blocksY > 0 then moveCrane("down", blocksY) elseif blocksY < 0 then moveCrane("up", math.abs(blocksY)) end cur_x = x cur_y = y end local function moveToNonZeroPositions() for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] ~= '0' then moveCraneXY(x, y) end end end end local function findStorageAndMove() for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '3' and rodCouts[x][y] < 12 then moveCraneXY(x, y) print("Перемещаемся к хранилищу на позиции (" .. x .. ", " .. y .. ")") os.sleep(3) return end end end print("Хранилище не найдено.") end local function moveRodsToStorage() -- Функция для поиска хранилища с достаточным местом local function findStorage() for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '3' and rodCouts[y][x] < 12 then return x, y end end end return nil, nil end for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '1' and rodStatus[y][x] == 1 then local storageX, storageY = findStorage() if not storageX or not storageY then print("Нет доступного хранилища для перемещения стержня из позиции (" .. x .. ", " .. y .. ").") return end moveCraneXY(x, y) print("Переносим стержень из позиции (" .. x .. ", " .. y .. ") в позицию (" .. storageX .. ", " .. storageY .. ")") crane.load() os.sleep(3) moveCraneXY(storageX, storageY) crane.load() os.sleep(3) rodStatus[y][x] = 0 rodCouts[storageY][storageX] = rodCouts[storageY][storageX] + 1 print("Стержень из (" .. x .. ", " .. y .. ") успешно перемещен в хранилище.") end end end end local function loadWorkingRodsFromStorage() -- Функция для поиска хранилища со стержнями local function findStorage() for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '5' and workingRodCounts[y][x] > 0 then return x, y end end end return nil, nil end for y = 1, #rodsGrid do for x = 1, #rodsGrid[y] do if rodsGrid[y][x] == '1' and rodStatus[y][x] == 0 then local storageX, storageY = findStorage() if not storageX or not storageY then print("Нет доступного хранилища стержнями") return end moveCraneXY(storageX, storageY) print("Переносим стержень из позиции (" .. x .. ", " .. y .. ") в позицию (" .. storageX .. ", " .. storageY .. ")") crane.load() os.sleep(3) moveCraneXY(x, y) crane.load() os.sleep(3) rodStatus[y][x] = 1 workingRodCounts[storageY][storageX] = workingRodCounts[storageY][storageX] - 1 print("Стержень из (" .. x .. ", " .. y .. ") успешно перемещен в работу.") end end end end
И напоследок пару вопросов
- Как красиво сохранять состояния?
- Можно ли быстро узнать координату и адрес компонента если метода не предусмотрено?
- Ограничение на загрузку файлов позже снимется или возрастет?
- Сейчас не сезон, тут всегда так тихо или все что можно уже написали?
-
Сканер стержней рбмк
https://ntm.fandom.com/ru/wiki/РБМК
вики ибо много текста- Суть проста проверил область 15 на 15 занес в массив(в колоннах должны быть стержни для проверки).
- сканирует достаточно долго из за особенностей проверки.
- Кабель подключается снизу
- Как оказалось достаточно бесполезно из-за Времени
-
Если кто сможет оптимизировать код буду только рад
Скрытый текст
local component = require("component") local crane = component.proxy(component.list("rbmk_crane")()) local os = require("os") -- Подключаем модуль os для использования sleep local rodsGrid = {} for i = 1, 15 do rodsGrid[i] = {} for j = 1, 15 do rodsGrid[i][j] = "0" end end local function moveCrane(direction, blocks) blocks = blocks or 1 for i = 1, blocks*20 do crane.move(direction) end print("Кран перемещен на " .. blocks .. " блок(ов) в направлении " .. direction .. ".") end local function scanRods() moveCrane("up", 15) moveCrane("left", 15) for x = 1, 15 do for y = 1, 15 do os.sleep(4) crane.load() os.sleep(4) -- Пауза для загрузки local depletion = crane.getDepletion() if depletion ~= "N/A" then rodsGrid[x][y] = "1" else rodsGrid[x][y] = "0" end print("Проверка блока [" .. x .. ", " .. y .. "]: " .. (rodsGrid[x][y] == "1" and "Стержень найден." or "Стержень отсутствует.")) crane.load() os.sleep(5) -- Пауза для загрузки moveCrane("down", 1) end moveCrane("right", 1) moveCrane("up", 15) end print("Результаты сканирования:") for i = 1, 15 do for j = 1, 15 do io.write(rodsGrid[i][j] .. "\t") end print() end end scanRods()
-
1
-
2 часа назад, Faraday сказал:Можете пожалуйста предоставить схему как всё подключать. Просто картинку которую вы скинули не выглядит информативно
Сверху Кабель к компютеру + в гайде есть схематика
Скрытый текст
Да и по сути схемы нет, у реактора по 2 порта с двух сторон, куда хочется, туда и подключаешь, кроме верхнего(только компютер)
P.S- Автор обновляет конвейеры, работают они криво, проще использовать трубы из thermal dynamics
-
Перед запуском стоит проверить работу схемы в тестовом мире(если показатели реактора в крайнем положении в его интерфейсе, но он работает без взрывов, а скрипт его отключает, в самом начале надо покрутить эти настройки)
local safeWaterLevel = 16000 local safePressureLevel = 69000 local safeSteamLevel = 4000 local safeTemperatureLevel = 69000 local safeCO2Level = 10000
-
1
-
Цирнокс V1
Описание:
- Реактор начала игры.
- Быстрая переработка топлива, что позволяет быстро получить новые материалы.
- Из отработанного топлива получаются компоненты для дальнейшего развития (технеций, плутоний, нептуний).
- Принимает практически все ресурсы, доступные на этапе игры.
- Может облучать стержни (литий → тритий, торий → ториевое топливо, которое сразу идет в работу).
- Умный: не отдает свежее топливо и необработанные стержни, даже другим модам.
- Проблема: стержни с торием становятся топливом и также не отдаются.
- Относительно безопасен, но может детонировать быстро и грязно.
Вики: https://ntm.fandom.com/ru/wiki/ЦИРНОКС
Сборка из 4 реакторов:- Топливо забирает с шины.
- Излишек выводит обратно.
- Вывод отработки на другую шину с той же стороны.
- Компьютер выводит информацию о реакторе, может отключить при опасной ситуации
Советы по постройке:
- Пар из реактора обрабатывается каскадом турбин
- 1 каскада хватит с лихвой на 4 реактора
- При переработке пара стоит учитывать, что для переработки пара низкого давления обратно в воду хватит 2-х конденсаторов пара(для 4 нужно 8)
- Лучше построить хорошее энергохранилище дабы реакторы не жгли топливо напрасно
Приблизительная схема(красный ящик отходы)
Скрытый текст
Не забудьте поставить мод расширитель ID
как оказалось Hbm не дружит со схематикой и OpenComputers тоже Схема и строится и отображается криво компоненты заменяют друг друга и многоблочные структуры полностью ломают схему
Код
Скрытый текстlocal gpu = require('component').gpu local event = require('event') local W, H = gpu.getResolution() -- Получаем все реакторы local component = require('component') local reactors = {} for address, _ in pairs(component.list('zirnox_reactor')) do table.insert(reactors, address) end -- Ограничение количества реакторов до 4 if #reactors > 4 then reactors = { reactors[1], reactors[2], reactors[3], reactors[4] } end local safeWaterLevel = 16000 local safePressureLevel = 69000 local safeSteamLevel = 4000 local safeTemperatureLevel = 69000 local safeCO2Level = 10000 local function formatLine(label, value) return string.format('| %.25s: %.20s ', label, tostring(value)) end local function drawReactorInfo() gpu.setForeground(0xffffff) gpu.setBackground(0x000000) local columnWidth = 40 local columnSpacing = 10 for i, address in ipairs(reactors) do local reactor = component.proxy(address) local status = reactor.isActive() and 'Активен' or 'Неактивен' local temp = reactor.getTemp() local pressure = reactor.getPressure() local water = reactor.getWater() local co2 = reactor.getCarbonDioxide() local steam = reactor.getSteam() -- Проверка условий для отключения реактора if water < safeWaterLevel or pressure > safePressureLevel or steam > safeSteamLevel or temp > safeTemperatureLevel or (co2 < safeCO2Level - 2000 or co2 > safeCO2Level + 2000) then reactor.setActive(false) status = 'Неактивен' end -- Расположение реакторов 2 по 2 local col = (i - 1) % 2 local row = math.floor((i - 1) / 2) local x = 1 + col * (columnWidth + columnSpacing) local y = row * 12 + 1 gpu.set(x, y, '+--------------------------------+') gpu.set(x, y + 1, formatLine('Реактор', address)) -- Устанавливаем цвет в зависимости от статуса if reactor.isActive() then gpu.setForeground(0x00ff00) else gpu.setForeground(0xff0000) end gpu.set(x, y + 2, formatLine('Статус', status)) local waterColor = (water < safeWaterLevel) and 0xff0000 or 0x00ff00 local pressureColor = (pressure > safePressureLevel) and 0xff0000 or 0x00ff00 local steamColor = (steam > safeSteamLevel) and 0xff0000 or 0x00ff00 local temperatureColor = (temp > safeTemperatureLevel) and 0xff0000 or 0x00ff00 local co2Color = (safeCO2Level - 2000 > co2 and co2 > safeCO2Level + 2000) and 0xff0000 or 0x00ff00 gpu.setForeground(waterColor) gpu.set(x, y + 3, formatLine('Вода', water)) gpu.setForeground(pressureColor) gpu.set(x, y + 4, formatLine('Давление', pressure)) gpu.setForeground(temperatureColor) gpu.set(x, y + 5, formatLine('Температура', temp / 127.66 + 20)) gpu.setForeground(co2Color) gpu.set(x, y + 6, formatLine('CO2', co2)) gpu.setForeground(steamColor) gpu.set(x, y + 7, formatLine('Пар', steam)) gpu.setForeground(0xffffff) gpu.set(x, y + 8, '+--------------------------------+') gpu.set(x + columnWidth - 10, y + 9, '[ Включить ]') gpu.set(x + columnWidth - 10, y + 10, '[ Выключить ]') end gpu.setForeground(0x00ff00) gpu.set(1, H - 3, '[ Включить все ]') gpu.setForeground(0xff0000) gpu.set(1, H - 2, '[ Выключить все ]') gpu.setForeground(0xffffff) end local function handleReactorControl(x, y) for i, address in ipairs(reactors) do local col = (i - 1) % 2 local row = math.floor((i - 1) / 2) local startY = row * 12 + 1 local startX = 1 + col * (40 + 10) if x >= startX and x < startX + 40 then if y == startY + 9 then local reactor = component.proxy(address) reactor.setActive(true) drawReactorInfo() return elseif y == startY + 10 then local reactor = component.proxy(address) reactor.setActive(false) drawReactorInfo() return end end end -- Обработка кнопок для всех реакторов if x >= 1 and x < 20 then if y == H - 3 then for _, address in ipairs(reactors) do local reactor = component.proxy(address) reactor.setActive(true) end drawReactorInfo() return elseif y == H - 2 then for _, address in ipairs(reactors) do local reactor = component.proxy(address) reactor.setActive(false) end drawReactorInfo() return end end end -- Основной цикл gpu.fill(1, 1, W, H, ' ') while true do local _, _, x, y = event.pull(0.5) drawReactorInfo() if x and y then handleReactorControl(x, y) end end
По сути первый скрипт на Lua собранный из гайдов и приправленный моими кривыми руками
Далее:- Контроль загрузки
- Авто определение типа топлива и выставление параметров
- Ручная настройка допустимых значений на экране
Несколько вопросов к старожилам:
- Стоит ли разбирать постройку или оставлять только файл схематики?
- Аналогичный вопрос с реакторами и механизмами?
- Стоит ли оставлять это здесь?
- Существуют ли сайты для рисования схем?
-
2
-
Тут будут программы для отслеживания и контроля всех генерирующих энергию устройств из этого мода
Интересные Особенности:
- Конвейер работает всегда, не может сбросить в инвентарь, сбросит в мир.
- Вставщик либо уничтожает предметы, либо блокирует путь и пункт 1.
- Предметы Может забирать только извлекатель ео делает это только при наличии конвейера.
- Есть механизм для сбора сбоку(как манипулятор в Factorio), собирает ресурсы всегда.
- Извлекатель контролируется редстоуном, API для Open Computers у него нет.
- Вставщик не контролируется никак.
- Все жидкости на идентификаторах, ни трубы, ни машины, ни хранилища не будут принимать/проводить жидкость если она не соответствует настройкам.
- Трубы жидкостей не хранят.
- Взрывается тут многое, многое сильно, многое с радиацией, многое с такой что, потом долго не подойдешь к месту взрыва.
- Многое настолько радиоактивно что трогать руками это не стоит.
- Что то взрывается когда ты горишь, что то когда тушишь себя водой.
Возможная интеграция с модом Open Computers
Не забудьте поставить мод расширитель ID

Интеграция с OpenComputers HBM Nuclear Tech (NtmSpace)
в API
Опубликовано:
Да, это единственный способ, да и hbm предоставляет клапаны для труб контролируемые через редстоун, просто у труб пропускная способность близкая бесконечности, поэтому расход будет диким, а через капсулы будет точнее
Не, проверил все, да и разработчик ответил что так и должно быть