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

Subss6

Пользователи
  • Публикации

    16
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Сообщения, опубликованные пользователем Subss6


  1. 18 минут назад, Taoshi сказал:

    Кроме этого, как подсказывает интуиция, карбон возможно заливать по трубам. А воду положить бесконечной бочкой (infinity water tank). Что полностью снимет необходимость как-либо оперировать с 25...28 тоанспозером

    Да, это единственный способ, да и hbm предоставляет клапаны для труб контролируемые через редстоун, просто у труб пропускная способность близкая бесконечности, поэтому расход будет диким, а через капсулы будет точнее

     

    25 минут назад, Taoshi сказал:

    Возможно доступ осуществляется с другой стороны. Например снизу.

    Не, проверил все, да и разработчик ответил что так и должно быть


  2. Проблема оказалась очень простой, эти слоты заблокированы во имя совместимости, если снять блокировку то все извлекатели/разгрузчики начнут пихать туда предметы или забирать их что полностью сломает мод


  3. Возник вопрос
    У цирнокса 28 слотов: 24 стержня, а 4 для загрузки/выгрузки воды/углекислого газа
    Первые 24 работают с транспозером нормально, но забрать можно только отработанные стержни, стержни в работе он не вернет,

    Но в последние 4 не получилось ни загрузить ни выгрузить
    Размер инвентаря проверил в нем 28 слотов, транспозер их видит, но последние 4 получить/забрать их не может
    Моды

    1. Ntm Space(замена на классическую версию ничего не дает)
    2. OpenComputers
    3. OpenPeripheral(integration, Addons)
    4. Inventory Tweaks
    5. Thermal(и его дополнения)
    6. Nei
    7. 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)--тут уже работает

    Сталкивался ли кто то с подобной проблемой в других модах(Видит все слоты но не работает с некоторыми из них)


  4. 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. Если пеллеты нет, тепла нет то загружаем новую

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

    • Нравится 1

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

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

     


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

     


  7. Очень много чего можно получить из компонентов многих на вики нет

    Тип компонента: 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
    Цирнокс

     


  8. На вики сильно устаревшая информация поэтому решил написать код который выводит все компоненты и аккуратно оформляет их методы

    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.")

     


  9. 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

     


  10. 16 часов назад, eu_tomat сказал:

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

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

     

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

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

    Да

     

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

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

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


  11.  

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

    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. Сейчас не сезон, тут всегда так тихо или все что можно уже написали?

  12. Сканер стержней рбмк
    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()

       

       

     

     

    • Нравится 1

  13. 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

       

    • Спасибо 1

  14. Цирнокс 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. Существуют ли сайты для рисования схем?
    • Нравится 2

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

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

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

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

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

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