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

FKOLOBKOV

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

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

  • Посещение

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


  1. 48 минут назад, ZO125 сказал:

    Из статьи мне непонятно: компоненты периодически отваливаются самопроизвольно (Почему? Они сами отваливаются или их кто-то может сломать?) во время работы программы, или автор хочет проверить то, подключен ли конкретный компонент к системе и можно-ли с ним нормально взаимодействовать.
    Полагаю в случае, когда компонент отваливается из-за ошибок игры, данное решение грубое, или даже не годится, но во втором почему-бы просто не ловить ошибки вызовов компонентов с помощью оборачивания их pcall()?
    Да компонент может отвалиться по любой причине прямо во время работы программы, но тогда программа все равно не ляжет, а ты сможешь не знаю... Вывести на экран сообщение что компонент отвалился.

    
    
    function draw()
      local gpu = component.gpu
      gpu.set(1, "Hello World!!")
    end
    
    local ok, err = pcall(draw) -- Так в случае любых ошибок в ok попадет false, а в err название ошибки.

     

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


  2. 12 минуты назад, eu_tomat сказал:

    Именно component.isAvailable() вызывает ошибку?

    Если так, то на какой версии Minecraft и OpenComputers?

    Если судить по ошибке, то она происходит на 108 строке кода, где идет проверка подключен ли компонент к компьютеру, если подключен - выполнение последующей части кода, где используется данный компонент. Если отсутствует по любой причине (не успел увидеть при загрузке чанка, либо же был демонтирован) то должен выдать значение false и пропустить ту часть с использованием его. Если взять вариант, что не успевает загрузиться библиотека, в связи с эти и вылетает ошибка самой проверки.
    Версия minecraft - 1.7.10
    Версия OpenCompucters - 1.6.2.12 (в папке с модами написано), в игре OpenOS - 1.6.1


  3. 8 часов назад, eu_tomat сказал:

    component.isAvailable позволяет определить наличие компонента определённого типа, но не гарантирует, что найден именно тот компонент, что когда-то был сохранён в переменной программы.

    В системе всего по 1 компоненту, которые проверяются на наличие, т.е. если их нет, по логике должна программа писать "false", а не выбивать ошибку.


  4. Проблема в том, что периодически программа выбивает ошибку "No such component", с каждым разом она все чаще и чаще.
    Делали проверку через component.isAvailable("Название_компонента") в итоге не помогло, есть подозрение что виновник торжества сама библиотека component.
    Возможно кто то сталкивался с данной проблемой и на неё есть решение.
    Компоненты на которые вылетает данная ошибка:
    - opencb
    - me_interface
    - reactor_chamber
    Возможно и на другие компоненты проблема актуальна.
    P.S. Все компоненты "системы" находятся в одном чанке

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

    O44GmkN6Dl4.jpg.77b804b2e426fb6e4ccc6e618fbdabba.jpg

    jw7qK_EzkL4.jpg.878e398c7347d256b98e15b266095a9f.jpg

    kDpsPrle0UQ.jpg.a059e7b7476a8b809edb97847223ba70.jpg

    Скрытый текст
    
    local computer = require("computer")
    local com = require("component")
    local fs = require("filesystem")
    local event = require("event")
    local me = com.me_interface
    local r = com.reactor_chamber
    local red = com.redstone
    local g = com.gpu
    -------------------
    local condId, condDmg = "IC2:reactorCondensatorLap", 9500
    local EUOutput = 3800
    local condPosMe, fuelPosMe = 8, 9
    local maxHeat = 9300
    local toReact = "Down" -- сторона куда будет кидать из МЭ в реактор
    local fromReact = "East" -- сторона откуда будет кидать в мэ из реактора
    local sideRed = 0 -- с какой стороны сигнал красного камня
    local status = false -- статус реактора
    local k = 0
    g.setResolution(72, 42)
    -------------------
    fuel = {"IC2:reactorUraniumQuaddepleted", "IC2:reactorMOXQuaddepleted"}
    fuelList = { 1, 2, 3, 4, 5, 6, 7, 8, 9,
                19,20,21,22,23,24,25,26,27,
                28,29,30,31,32,33,34,35,36,
                46,47,48,49,50,51,52,53,54} -- слоты с топливом
    condList = {10,11,12,13,14,15,16,17,18,
                37,38,39,40,41,42,43,44,45} -- слоты с конденсаторами
    
    function onReact()
        red.setOutput(0, 15)
        status = true
        g.fill(66, 2, 3, 1, " ")
        g.set(66,2, "on")
    end
    
    function offReact()
        red.setOutput(0, 0)
        status = false
        g.fill(66, 2, 3, 1, " ")
        g.set(66,2, "off")
    end
    
    function checkFuel()
        if com.isAvailable("reactor_chamber") and com.isAvailable("me_interface") then
            red.setOutput(0,0)
            for i = 1, #fuelList do
                local pos = fuelList
                if r.getStackInSlot(pos) then
                    if r.getStackInSlot(pos).id == (fuel[1] or fuel[2]) then
                        local to = r.pushItem(fromReact, pos, 1)
                        local from = me.pushItem(toReact, fuelPosMe, 1, pos)
                        if (to or from) == 0 then os.exit() end
                    end
                end
            end
            red.setOutput(0,15)
        else
            offReact()
        end
    end
    
    function checkCond()
        if com.isAvailable("reactor_chamber") and com.isAvailable("me_interface") then
            g.fill(3, 3, 8, 18, " ")
            local data = r.getAllStacks(0)
            for i = 1, #condList do
                local pos = condList
                if data[pos] then
                    g.set(3, 2+i, pos.." "..data[pos].dmg)
                    if data[pos].dmg >= condDmg then
                        offReact()
                        local to = r.pushItem(fromReact, pos, 1)
                        local from = me.pushItem(toReact, condPosMe, 1, pos)
                        if (to or from) == 0 then os.exit() end
                    end
                end
            end
            onReact()
        else
            offReact()
        end 
    end
    
    function power(event,addres, x, y, nick)
        if (x == 113 or x == 1081) and y == 16 then
            if status then
                offReact()
            else
                onReact()
            end
        end
    end
    
    function window()
    g.fill(1,1,72,42, " ")
    g.set(1, 1, "Конденсаторы")
    g.set(63,1, "Состояние")
    g.set(66,2, "off")
    end
    
    window()
    event.listen("key_down", power)
    
    while true do
        if status then
            checkCond()
        end
        if com.isAvailable("reactor_chamber") then
            if r.getHeat() >= maxHeat then
                offReact()
            --elseif r.getReactorEUOutput() < EUOutput then
                --checkFuel()
            end
        else
            offReact()
        end
        os.sleep(0.1)
    end

     

     

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