Subss6 5 Опубликовано: 10 апреля (изменено) Тут будут программы для отслеживания и контроля всех генерирующих энергию устройств из этого мода Интересные Особенности: Конвейер работает всегда, не может сбросить в инвентарь, сбросит в мир. Вставщик либо уничтожает предметы, либо блокирует путь и пункт 1. Предметы Может забирать только извлекатель ео делает это только при наличии конвейера. Есть механизм для сбора сбоку(как манипулятор в Factorio), собирает ресурсы всегда. Извлекатель контролируется редстоуном, API для Open Computers у него нет. Вставщик не контролируется никак. Все жидкости на идентификаторах, ни трубы, ни машины, ни хранилища не будут принимать/проводить жидкость если она не соответствует настройкам. Трубы жидкостей не хранят. Взрывается тут многое, многое сильно, многое с радиацией, многое с такой что, потом долго не подойдешь к месту взрыва. Многое настолько радиоактивно что трогать руками это не стоит. Что то взрывается когда ты горишь, что то когда тушишь себя водой. Возможная интеграция с модом Open Computers Не забудьте поставить мод расширитель ID Изменено 11 апреля пользователем Subss6 Добавление Информации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 10 апреля (изменено) Цирнокс V1 Описание: Реактор начала игры. Быстрая переработка топлива, что позволяет быстро получить новые материалы. Из отработанного топлива получаются компоненты для дальнейшего развития (технеций, плутоний, нептуний). Принимает практически все ресурсы, доступные на этапе игры. Может облучать стержни (литий → тритий, торий → ториевое топливо, которое сразу идет в работу). Умный: не отдает свежее топливо и необработанные стержни, даже другим модам. Проблема: стержни с торием становятся топливом и также не отдаются. Относительно безопасен, но может детонировать быстро и грязно. Вики: https://ntm.fandom.com/ru/wiki/ЦИРНОКС Сборка из 4 реакторов: Топливо забирает с шины. Излишек выводит обратно. Вывод отработки на другую шину с той же стороны. Компьютер выводит информацию о реакторе, может отключить при опасной ситуации Советы по постройке: Пар из реактора обрабатывается каскадом турбин 1 каскада хватит с лихвой на 4 реактора При переработке пара стоит учитывать, что для переработки пара низкого давления обратно в воду хватит 2-х конденсаторов пара(для 4 нужно 8) Лучше построить хорошее энергохранилище дабы реакторы не жгли топливо напрасно Приблизительная схема(красный ящик отходы) Скрытый текст Zir.schematic Не забудьте поставить мод расширитель 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 собранный из гайдов и приправленный моими кривыми руками Далее: Контроль загрузки Авто определение типа топлива и выставление параметров Ручная настройка допустимых значений на экране Несколько вопросов к старожилам: Стоит ли разбирать постройку или оставлять только файл схематики? Аналогичный вопрос с реакторами и механизмами? Стоит ли оставлять это здесь? Существуют ли сайты для рисования схем? Изменено 11 апреля пользователем Subss6 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 157 Опубликовано: 10 апреля 2 часа назад, Subss6 сказал: Стоит ли разбирать постройку или оставлять только файл схематики? Аналогичный вопрос с реакторами и механизмами? Да, имеет смысл разобрать и объяснить. Я, например, этот мод вижу впервые, и по одному лишь коду программы понять работу реактора не могу. 2 часа назад, Subss6 сказал: Стоит ли оставлять это здесь? Конечно же, стоит. Не вижу никаких препятствий для этого. Популярность Майнкрафта, конечно, упала, но полностью она не угасла, интересующиеся и играющие всегда есть. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Faraday 0 Опубликовано: 11 апреля Можете пожалуйста предоставить схему как всё подключать. Просто картинку которую вы скинули не выглядит информативно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 11 апреля (изменено) 2 часа назад, Faraday сказал: Можете пожалуйста предоставить схему как всё подключать. Просто картинку которую вы скинули не выглядит информативно Сверху Кабель к компютеру + в гайде есть схематика Скрытый текст Да и по сути схемы нет, у реактора по 2 порта с двух сторон, куда хочется, туда и подключаешь, кроме верхнего(только компютер) P.S Автор обновляет конвейеры, работают они криво, проще использовать трубы из thermal dynamics Перед запуском стоит проверить работу схемы в тестовом мире(если показатели реактора в крайнем положении в его интерфейсе, но он работает без взрывов, а скрипт его отключает, в самом начале надо покрутить эти настройки) local safeWaterLevel = 16000 local safePressureLevel = 69000 local safeSteamLevel = 4000 local safeTemperatureLevel = 69000 local safeCO2Level = 10000 Изменено 11 апреля пользователем Subss6 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 12 апреля (изменено) Сканер стержней рбмк 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() Изменено 12 апреля пользователем Subss6 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 12 апреля (изменено) Базовый контроль крана Красный - точка начала работы крана координата 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 Скрытый текст И напоследок пару вопросов Как красиво сохранять состояния? Можно ли быстро узнать координату и адрес компонента если метода не предусмотрено? Ограничение на загрузку файлов позже снимется или возрастет? Сейчас не сезон, тут всегда так тихо или все что можно уже написали? Изменено 12 апреля пользователем Subss6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 751 Опубликовано: 14 апреля В 13.04.2025 в 01:16, Subss6 сказал: Сейчас не сезон, тут всегда так тихо или все что можно уже написали? Старые игроки выросли из майнкрафта, а свежее мяско не прибывает. Активность на форуме была в основном за счет игровых серверов, админу надоело возиться, форум следом стух. К тому же мод не очень популярный и не развивается. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 157 Опубликовано: 14 апреля 1 час назад, Doob сказал: Старые игроки выросли из майнкрафта, а свежее мяско не прибывает. Новички приходят, но и они тоже быстро вырастают из Майнкрафта. 1 час назад, Doob сказал: Активность на форуме была в основном за счет игровых серверов, админу надоело возиться, форум следом стух. Справедливости ради надо сказать, что жизнь на серверах не особо кипела ещё до ухода админа. На EvilWorld перед его закрытием играли 1-2 человека, а более-менее регулярно играл вообще один. А причина всё та же: старожилы ушли в более взрослые проекты, а поток новичков был мизерным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 157 Опубликовано: 14 апреля В 12.04.2025 в 23:16, Subss6 сказал: Как красиво сохранять состояния? Что ты имеешь в виду под состоянием? Что именно требуется хранить? В 12.04.2025 в 23:16, Subss6 сказал: Можно ли быстро узнать координату и адрес компонента если метода не предусмотрено? Быстро вряд ли получится. Если компоненты устанавливаются автоматически, то их координаты можно узнать в момент установки. Робот знает, что он устанавливает, по каким координатам, и в какой момент времени. А управляющий компьютер знает, в какой момент новые компоненты появляются в сети. Сопоставив моменты времени, можно получить соответствие адресов компонентов их коородинатам. В 12.04.2025 в 23:16, Subss6 сказал: Ограничение на загрузку файлов позже снимется или возрастет? А что за загрузка файлов? Прикреплённые к сообщению картинки? Попробую позвать @cyber01, он должен знать. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 15 апреля 16 часов назад, eu_tomat сказал: Что ты имеешь в виду под состоянием? Что именно требуется хранить? Сейчас программа считает что стержни изначально загружены, хранилище свежих полностью заполнено, хранилище пустых полностью свободно, и при при перезапуске всё возвращается к исходному, а получать данные из реактора пока адекватно не получается, данные хранятся в 4 массивах(положение компонентов, наличие стержня, заполнение 2-х типов хранилищ), можно сохранять в txt, но интересно есть ли другой способ дабы не забивать код лишними функциями. 17 часов назад, eu_tomat сказал: А что за загрузка файлов? Прикреплённые к сообщению картинки? Да 17 часов назад, eu_tomat сказал: Быстро вряд ли получится. Если компоненты устанавливаются автоматически, то их координаты можно узнать в момент установки. Робот знает, что он устанавливает, по каким координатам, и в какой момент времени. А управляющий компьютер знает, в какой момент новые компоненты появляются в сети. Сопоставив моменты времени, можно получить соответствие адресов компонентов их коородинатам. Было бы удивительно, если бы с РБМК не было проблем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi 61 Опубликовано: 17 апреля (изменено) В 12.04.2025 в 05:28, Subss6 сказал: Сканер стержней рбмк 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() reactor_control.getReactor - возвращает массив значений реактора (уровень стержня, поток, тепло. Применимо ли для получения той информации которую получает код выше? P.S: Насколько понимаю, для использование этой команды необходимо подключить элемент управления. Изменено 17 апреля пользователем Taoshi 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi 61 Опубликовано: 17 апреля В 15.04.2025 в 17:43, Subss6 сказал: но интересно есть ли другой способ дабы Возможно поможет serialization.serialize таблицы значений состояний элементов реактора и дальнейшее её сохранение в файл. С последующим serialization.unserialize при чтении из файла. Либо можно использовать свой формат хранения данных в строго фиксированном порядке, дабы сократить объем вычислений Кстати говоря дня 3 назад нашел канал по HBM NTM в telegram, но пока сам не исследовал. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi 61 Опубликовано: 17 апреля В 13.04.2025 в 01:16, Subss6 сказал: Ограничение на загрузку файлов позже снимется или возрастет Никакой дискриминации нет. Поэтому все желающие обычно используют ссылки, размещая изображения на внешних ресурсах. Например imgur. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 17 апреля (изменено) 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 Изменено 17 апреля пользователем Subss6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 17 апреля 4 часа назад, Taoshi сказал: Кстати говоря дня 3 назад нашел канал по HBM NTM в telegram, но пока сам не исследовал. Можешь посмотреть канал Ocelot на ютубе он очень хорошо рассказывает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi 61 Опубликовано: 18 апреля Накатил мод. Исследовал Zirnox. Удалось выяснить, что путем установки адаптера на шапку реактора становится доступен инвентарь реактора, недоступный прямым подключением в это же место: stacks = component.container_zirnox.getAllStacks() позволяет получить информацию о содержании всех слотов реактора, с последующим stack = stacks[slotNumber].all() для таблицы с информацией о всех значениях для слота. Это получение текущей информации по всей видимости наиболее быстрое. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 18 апреля (изменено) Наконец получилось вытащить информацию о положении стержней и преобразовать ее в двух мерный массив единственное что надо указать левую верхнюю ячейку по отношению на 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() Изменено 18 апреля пользователем Subss6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 18 апреля (изменено) ВВЭР не взрывается(только плавится), по энергии меньше чем рбмк, но меньше потребляет, выхода отработки тоже меньше меньше Код пример ибо возникли проблемы с пониманием что он мне выводит пока без контроля Обратите внимание на обратную запись 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 Изменено 19 апреля пользователем Subss6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Subss6 Автор темы 5 Опубликовано: 19 апреля (изменено) 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 end local rs=component.redstone local transposer = component.transposer local 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 Полностью автоматизирует реактор Если пеллета есть и тепло в реакторе не содержится то вкоючаем Если пеллеты нет а тепло осталось ждем пока переработается все тепло, отключив лазеры дабы впустуе не работали Если пеллеты нет, тепла нет то загружаем новую Таким образом мы не теряем энергию впустую Есть ли у кого то гайд на работу с МЭ сетью? Изменено 19 апреля пользователем Subss6 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах