Перейти к содержимому
Subss6

Выработка энергии HBM Nuclear Tech (NtmSpace) Управление и Контроль

Рекомендуемые сообщения

Тут будут программы для отслеживания и контроля всех генерирующих энергию устройств из этого мода

Интересные Особенности:

  1. Конвейер работает всегда, не может сбросить в инвентарь, сбросит в мир.
  2. Вставщик либо уничтожает предметы, либо блокирует путь и пункт 1.
  3. Предметы Может забирать только извлекатель ео делает это только при наличии конвейера.
  4. Есть механизм для сбора сбоку(как манипулятор в Factorio), собирает ресурсы всегда.
  5. Извлекатель контролируется редстоуном, API для Open Computers у него нет.
  6. Вставщик не контролируется никак.
  7. Все жидкости на идентификаторах, ни трубы, ни машины, ни хранилища не будут принимать/проводить жидкость если она не соответствует настройкам.
  8. Трубы жидкостей не хранят.
  9. Взрывается тут многое, многое сильно, многое с радиацией, многое с такой что, потом долго не подойдешь к месту взрыва.
  10. Многое настолько радиоактивно что трогать руками это не стоит.
  11. Что то взрывается когда ты горишь, что то когда тушишь себя водой.

Возможная интеграция с модом Open Computers

Не забудьте поставить мод расширитель ID

Изменено пользователем Subss6
Добавление Информации

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Цирнокс V1

Описание:

  1. Реактор начала игры.
  2. Быстрая переработка топлива, что позволяет быстро получить новые материалы.
  3. Из отработанного топлива получаются компоненты для дальнейшего развития (технеций, плутоний, нептуний).
  4. Принимает практически все ресурсы, доступные на этапе игры.
  5. Может облучать стержни (литий → тритий, торий → ториевое топливо, которое сразу идет в работу).
  6. Умный: не отдает свежее топливо и необработанные стержни, даже другим модам.
  7. Проблема: стержни с торием становятся топливом и также не отдаются.
  8. Относительно безопасен, но может детонировать быстро и грязно.

Вики: https://ntm.fandom.com/ru/wiki/ЦИРНОКС
Сборка из 4 реакторов:

  1. Топливо забирает с шины.
  2. Излишек выводит обратно.
  3. Вывод отработки на другую шину с той же стороны.
  4. Компьютер выводит информацию о реакторе, может отключить при опасной ситуации

Советы по постройке:

  1. Пар из реактора обрабатывается каскадом турбин
  2. 1 каскада хватит с лихвой на 4 реактора
  3. При переработке пара стоит учитывать, что для переработки пара низкого давления обратно в воду хватит 2-х конденсаторов пара(для 4 нужно 8)
  4. Лучше построить хорошее энергохранилище дабы реакторы не жгли топливо напрасно

Приблизительная схема(красный ящик отходы)

Скрытый текст

1.png.bdffbd80d77599392bb686cf41a4a9cf.png

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 собранный из гайдов и приправленный моими кривыми руками
Далее:

  1. Контроль загрузки
  2. Авто определение типа топлива и выставление параметров
  3. Ручная настройка допустимых значений на экране

Несколько вопросов к старожилам:

  1. Стоит ли разбирать постройку или оставлять только файл схематики?
  2. Аналогичный вопрос с реакторами и механизмами?
  3. Стоит ли оставлять это здесь?
  4. Существуют ли сайты для рисования схем?
Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Subss6 сказал:

Стоит ли разбирать постройку или оставлять только файл схематики?
Аналогичный вопрос с реакторами и механизмами?

Да, имеет смысл разобрать и объяснить. Я, например, этот мод вижу впервые, и по одному лишь коду программы понять работу реактора не могу.

 

2 часа назад, Subss6 сказал:

Стоит ли оставлять это здесь?

Конечно же, стоит. Не вижу никаких препятствий для этого.

Популярность Майнкрафта, конечно, упала, но полностью она не угасла, интересующиеся и играющие всегда есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можете пожалуйста предоставить схему как всё подключать. Просто картинку которую вы скинули не выглядит информативно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Faraday сказал:

Можете пожалуйста предоставить схему как всё подключать. Просто картинку которую вы скинули не выглядит информативно :(

Сверху Кабель к компютеру + в гайде есть схематика

Скрытый текст

2.png.f1fae75b4f3f5efb69562a86e88f8a2e.png

Да и по сути схемы нет, у реактора по 2 порта с двух сторон, куда хочется, туда и подключаешь, кроме верхнего(только компютер)
P.S

  1. Автор обновляет конвейеры, работают они криво, проще использовать трубы из thermal dynamics
  2. Перед запуском стоит проверить работу схемы в тестовом мире(если  показатели реактора в крайнем положении в его интерфейсе, но он работает без взрывов, а скрипт его отключает, в самом начале надо покрутить эти настройки)
    local safeWaterLevel = 16000
    local safePressureLevel = 69000
    local safeSteamLevel = 4000
    local safeTemperatureLevel = 69000
    local safeCO2Level = 10000

     

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сканер стержней рбмк
https://ntm.fandom.com/ru/wiki/РБМК
вики ибо много текста

  1. Суть проста проверил область 15 на 15 занес в массив(в колоннах должны быть стержни для проверки).
  2. сканирует достаточно долго из за особенностей проверки.
  3. Кабель подключается снизу
  4. Как оказалось достаточно бесполезно из-за Времени
  5. Если кто сможет оптимизировать код буду только рад
    Скрытый текст
    
    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()

     

     

 

 

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Базовый контроль крана

  1. Красный - точка начала работы крана координата 1 - 1
  2. Зеленый соответствующая сторона реактора в мире и на панели управления 
  3. Карта стержней уже повернута на нужный угол
  4. Кран и консоль повернуты спиной к востоку
  5. Стержни пока не используются
  6. Записываем компоненты реактора с левого верхнего угла(Если кран стоит спиной к рбмк)

Обозначения

  1. 1 - стержень
  2. 2 - стержень остывания
  3. 3 - хранилище отработки
  4. 4 - облучатель
  5. 5 - хранилище 

Проблемы

  1. Не понятно как связать проверку стержней и их извлечение(если просто перебирать стержни краном рванет или остановится да и долго это)
  2. Авто проверки истощения нет(как бы есть но на отдельном компе(а координаты получить не могу поэтому не знаю как передать крану что ему нужно достать и куда поместить))
  3. Нет авто сканера(выше проверяет только стержни и работает 30 минут)
  4. Функция для манипулирования 1 стержнем нет

UPD

  1. Вынесено все в функции,
  2. Теперь умеет автоматически загружать разгружать все стержни
  3. Пока не отслеживает перемещение из/в хранилищ другими методами
Скрытый текст

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

 

 

Скрытый текст

1261932999_4(1).thumb.png.9831239e39d308dce072cb476a8058a6.png

И напоследок пару вопросов

  1. Как красиво сохранять состояния?
  2. Можно ли быстро узнать координату и адрес компонента если метода не предусмотрено?
  3. Ограничение на загрузку файлов позже снимется или возрастет?
  4. Сейчас не сезон, тут всегда так тихо или все что можно уже написали?
Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 13.04.2025 в 01:16, Subss6 сказал:

Сейчас не сезон, тут всегда так тихо или все что можно уже написали?

Старые игроки выросли из майнкрафта, а свежее мяско не прибывает.

Активность на форуме была в основном за счет игровых серверов, админу надоело возиться, форум следом стух.

К тому же мод не очень популярный и не развивается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Doob сказал:

Старые игроки выросли из майнкрафта, а свежее мяско не прибывает.

Новички приходят, но и они тоже быстро вырастают из Майнкрафта.

1 час назад, Doob сказал:

Активность на форуме была в основном за счет игровых серверов, админу надоело возиться, форум следом стух.

Справедливости ради надо сказать, что жизнь на серверах не особо кипела ещё до ухода админа. На EvilWorld перед его закрытием играли 1-2 человека, а более-менее регулярно играл вообще один. А причина всё та же: старожилы ушли в более взрослые проекты, а поток новичков был мизерным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 12.04.2025 в 23:16, Subss6 сказал:

Как красиво сохранять состояния?

Что ты имеешь в виду под состоянием? Что именно требуется хранить?

В 12.04.2025 в 23:16, Subss6 сказал:

Можно ли быстро узнать координату и адрес компонента если метода не предусмотрено?

Быстро вряд ли получится. Если компоненты устанавливаются автоматически, то их координаты можно узнать в момент установки. Робот знает, что он устанавливает, по каким координатам, и в какой момент времени. А управляющий компьютер знает, в какой момент новые компоненты появляются в сети. Сопоставив моменты времени, можно получить соответствие адресов компонентов их коородинатам.

В 12.04.2025 в 23:16, Subss6 сказал:

Ограничение на загрузку файлов позже снимется или возрастет?

А что за загрузка файлов? Прикреплённые к сообщению картинки? Попробую позвать @cyber01, он должен знать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, eu_tomat сказал:

Что ты имеешь в виду под состоянием? Что именно требуется хранить?

Сейчас программа считает что стержни изначально загружены, хранилище свежих полностью заполнено, хранилище пустых полностью свободно, и при при перезапуске всё возвращается к исходному, а получать данные из реактора пока адекватно не получается, данные хранятся в 4 массивах(положение компонентов, наличие стержня, заполнение 2-х типов хранилищ), можно сохранять в txt, но интересно есть ли другой способ дабы не забивать код лишними функциями.

 

17 часов назад, eu_tomat сказал:

А что за загрузка файлов? Прикреплённые к сообщению картинки?

Да

 

17 часов назад, eu_tomat сказал:

Быстро вряд ли получится. Если компоненты устанавливаются автоматически, то их координаты можно узнать в момент установки. Робот знает, что он устанавливает, по каким координатам, и в какой момент времени. А управляющий компьютер знает, в какой момент новые компоненты появляются в сети. Сопоставив моменты времени, можно получить соответствие адресов компонентов их коородинатам.

Было бы удивительно, если бы с РБМК не было проблем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 12.04.2025 в 05:28, Subss6 сказал:

Сканер стержней рбмк
https://ntm.fandom.com/ru/wiki/РБМК
вики ибо много текста

  1. Суть проста проверил область 15 на 15 занес в массив(в колоннах должны быть стержни для проверки).
  2. сканирует достаточно долго из за особенностей проверки.
  3. Кабель подключается снизу
  4. Как оказалось достаточно бесполезно из-за Времени
  5. Если кто сможет оптимизировать код буду только рад
      Показать содержимое
    
    
    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: Насколько понимаю, для использование этой команды необходимо подключить элемент управления.

Изменено пользователем Taoshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 15.04.2025 в 17:43, Subss6 сказал:

но интересно есть ли другой способ дабы

Возможно поможет serialization.serialize таблицы значений состояний элементов реактора и дальнейшее её сохранение в файл. С последующим serialization.unserialize при чтении из файла. Либо можно использовать свой формат хранения данных в строго фиксированном порядке, дабы сократить объем вычислений

 

Кстати говоря дня 3 назад нашел канал по HBM NTM в  telegram, но пока сам не исследовал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 13.04.2025 в 01:16, Subss6 сказал:

Ограничение на загрузку файлов позже снимется или возрастет

Никакой дискриминации нет. Поэтому все желающие обычно используют ссылки, размещая изображения на внешних ресурсах. Например imgur.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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

 

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Taoshi сказал:

Кстати говоря дня 3 назад нашел канал по HBM NTM в  telegram, но пока сам не исследовал.

Можешь посмотреть канал Ocelot на ютубе он очень хорошо рассказывает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Накатил мод. Исследовал Zirnox. Удалось выяснить, что путем установки адаптера на шапку реактора становится доступен инвентарь реактора, недоступный прямым подключением в это же место:

stacks = component.container_zirnox.getAllStacks() позволяет получить информацию о содержании всех слотов реактора, с последующим stack = stacks[slotNumber].all() для таблицы с информацией о всех значениях для слота.

Это получение текущей информации по всей видимости наиболее быстрое.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Наконец получилось вытащить информацию о положении стержней и преобразовать ее в двух мерный массив
единственное что надо указать левую верхнюю ячейку по отношению на 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()

 

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ВВЭР не взрывается(только плавится), по энергии  меньше чем рбмк, но меньше потребляет,  выхода отработки тоже меньше меньше
Код пример ибо возникли проблемы с пониманием что он мне выводит пока без контроля

Обратите внимание на обратную запись 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

 

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ICF реактор конца игры. Мощный не взрывается, нет радиоактивных компонентов топливо можно брать из воздуха, но если загорячится можно разогнать до x9 раз, но у него несколько особенностей

  1. Производит только до 3 миллиардов энергии(не знаю почему но выше бойлеры и турбины дать не способны сколько не ставь)
  2. Быстро сжигает топливо
  3. Весомую часть от выработки сжирают лазер(сами они не отключаются даже если пеллеты нет)
  4. Производит столько тепла что необходимо подавать с перерывами

Приблизительная Схема(обратите внимание на расположение транспозера и красного контролера)

Скрытый текст

1964261079_12(1).thumb.png.43427b85edf1f7e0e4178afcd31ef542.png

Код

Скрытый текст

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

Полностью автоматизирует реактор

  1. Если пеллета есть и тепло в реакторе не содержится то вкоючаем
  2. Если пеллеты нет а тепло осталось ждем пока переработается все тепло, отключив лазеры дабы впустуе не работали
  3. Если пеллеты нет, тепла нет то загружаем новую

Таким образом мы не теряем энергию впустую
Есть ли у кого то гайд на работу с МЭ сетью?

Изменено пользователем Subss6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...