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

No such component

Вопрос

Проблема в том, что периодически программа выбивает ошибку "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

 

 

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

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


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

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

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


function draw()
  local gpu = component.gpu
  gpu.set(1, "Hello World!!")
end

local ok, err = pcall(draw) -- Так в случае любых ошибок в ok попадет false, а в err название ошибки.

 

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

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


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

Делали проверку через component.isAvailable("Название_компонента") в итоге не помогло, есть подозрение что виновник торжества сама библиотека component.

Почему подозрение пало на библиотеку component?

 

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

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


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

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

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

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


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

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

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

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

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


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

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

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

Если судить по ошибке, то она происходит на 108 строке кода, где идет проверка подключен ли компонент к компьютеру, если подключен - выполнение последующей части кода, где используется данный компонент. Если отсутствует по любой причине (не успел увидеть при загрузке чанка, либо же был демонтирован) то должен выдать значение false и пропустить ту часть с использованием его. Если взять вариант, что не успевает загрузиться библиотека, в связи с эти и вылетает ошибка самой проверки.
Версия minecraft - 1.7.10
Версия OpenCompucters - 1.6.2.12 (в папке с модами написано), в игре OpenOS - 1.6.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, который сам по себе загружен все время так же происходит данная ошибка. Компонент не демонтируется, но перестаёт его видеть, чаще всего это происходит в позднее время, когда количество игроков на сервере уменьшается и мир со спавном успевает отгружаться.

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


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

Если судить по ошибке, то она происходит на 108 строке кода, где идет проверка подключен ли компонент к компьютеру, если подключен - выполнение последующей части кода, где используется данный компонент.

Да, действительно. Сразу я не смотрел скриншоты, а ориентировался по описанию:

19 часов назад, FKOLOBKOV сказал:

Делали проверку через component.isAvailable("Название_компонента") в итоге не помогло

Из этой формулировки не ясно, как именно не помогло, и что ошибка генерируется именно при выполнении component.isAvailable.

 

7 часов назад, FKOLOBKOV сказал:

Версия minecraft - 1.7.10
Версия OpenCompucters - 1.6.2.12 (в папке с модами написано), в игре OpenOS - 1.6.1

Я сейчас сравнил работу component.isAvailable в 1.6.2.12 и 1.7.5.1290. Отличий не вижу. При этом в 1.7.5.1290 подобная проблема у меня ни разу не возникала. Проблема вряд ли в библиотеке component.

 

7 часов назад, FKOLOBKOV сказал:

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

Ошибка возникает только на сервере или и в одиночной игре тоже? И что это за сборка?

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


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

Ошибка "no such component" всегда возникает при попытке доступа к proxy компонента, записанному в переменную, если по какой-то причине сам компонент был физически отсоединён.

 

А вот почему он отсоединился - фиг знает: либо сервак пролагал, либо с выгружающимися чанками проблема, либо возникает коллизия UUID'шников компонента (что маловероятно), либо вообще админ/сожитель своими кривыми ручонками пошарился. Исправить ситуацию можно путём периодического обновления proxy на актуальный через computer.uptime

 

В любом случае ставлю последний счетверённый МОХ, что 108 строка ошибки просто "сдвинулась" в трейсе на единицу, и isAvailable тут ни при чём. Пруф:

 

WNb4a5w.png

 

5SXzkDx.png?1

 

PtZY1Ob.png

  • Нравится 1
  • Одобряю 1
  • Спасибо 1

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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