ProgramCrafter
-
Публикации
245 -
Зарегистрирован
-
Посещение
-
Победитель дней
41
Сообщения, опубликованные пользователем ProgramCrafter
-
-
В 24.02.2021 в 16:18, Totoro сказал:Выглядит как будто в какой-то момент сокет отвалился.
Скорее всего, причина здесь проще: до библиотеки (может быть, не проверял) не доходит событие internet_ready.
Проверял свой Thundernet и столкнулся с той же проблемой: программа не получает часть сообщений.
Причём:
1) на ocelot.fomalhaut.me всё работает хорошо;
2) интернет во время теста работал нормально, без потерь пакетов вообще;
3) при посылке сообщения через веб-мордочку оно доходит примерно в трети случаев.
-
Вышла версия "0.0.1.5"!
Из нового - добавлена поддержка Stem (т.е. теперь компьютеры могут подключаться через интернет).
Для работы нужна библиотека stem, установленная в системе.
P.S. Все ссылки остались прежними.
-
1
-
1
-
-
Судя по коду, переменные border1, ..., border4, bar и text_p глобальные.
При первом вызове функции для первого прогрессбара компоненты создаются и записываются в глобальные переменные.
При первом вызове для второго прогрессбара новые компоненты записываются поверх старых в те же переменные.
После этого на каждом этапе обновляется только второй прогрессбар, первый остаётся на месте.
-
1
-
-
А какой код у функции progressbar? Возможно, она просто не очищает пустое место в прогрессбаре.
Ещё подозрительно, что переменные p_energy и p_heat постоянно перезаписываются новыми значениями.
-
1 час назад, Zer0Galaxy сказал:Кто или что определяет, является ли компьютер корнем или нет?
Если компьютер начал принимать входящие подключения (запустил run_server), но не подключился ни к какому другому узлу (не запускал connect/не нашёл того, к кому можно подключиться), то он автоматически становится корнем.
1 час назад, Zer0Galaxy сказал:Можно ли объединить две сети в одну? Кто при этом станет корнем?
Тот компьютер (корень), который вызвал метод connect, станет подчинённым. Корнем, соответственно, останется другой.
Однако сейчас это не реализовано - сети не объединяются.
1 час назад, Zer0Galaxy сказал:Правильно ли я понял, что корень должен знать пути абсолютно ко всем абонентам сети?
Да, именно так. В моей библиотеке хранится только первый сегмент пути до абонента, дальше разбирается следующий компьютер в цепочке.
1 час назад, Zer0Galaxy сказал:А что будет если корень выключить?
Сеть разорвётся на несколько поддеревьев, внутри каждого из них доставка сообщений будет работать.
1 час назад, Zer0Galaxy сказал:Как осуществляется связь между серверами?
Любым удобным образом: сетевая карта, Stem или вообще звёздные врата.
Чтобы добавить свой интерфейс, надо отредактировать файл th_interfaces.lua: добавить туда компонент, как на строках 51-54.
4 часа назад, AtomicScience сказал:Разве такая сложная система адресации необходима?
Придумывал я её, чтобы исключить коллизии для всех возможных вариантов. Да, можно сократить адреса, но не знаю, будет ли это иметь смысл.
1 час назад, AtomicScience сказал:А если заменить числа произвольными строками, то можно получить что-то вроде computerCraftServer.LagodromVasi.MainComputer - вот и удобочитаемые домены, считайте, подъехали
Можно завести какой-нибудь DNS-сервер, который будет переводить названия доменов в адреса компьютеров. Но я планирую сделать это вне рамок Thunderlib.
-
На форуме в последнее время начали появляться темы с сетевыми библиотеками и браузерами.
Продолжу это движение (да, скоро и мой браузер будет). Итак, представляю вам ThunderNet!
Кстати, анонс уже был: вот это сообщение как раз рассказывало про пришествие ThunderNet.
ThunderNet - это сеть, позволяющая объединить множество компьютеров OC, даже на разных серверах.
По топологии это (почти) дерево, при этом корнем может быть любой компьютер. Уровней может быть любое количество.
Компьютеры взаимодействуют по некоторому каналу: сетевая/соединённая карта/красный камень/Stem/звёздные врата и т.д.
Идентификация происходит при помощи MUID (Minecraft-Unique IDentifiers): кодов, уникальных для каждого запуска на каждом компьютере OC.
Скрытый текстMUID состоит из следующих элементов:
- 14 бит - разность времени сервера и реального с точностью до 6 секунд
- 32 бита - IP сервера
- 4 бита - версия OpenComputers
- 1 бит - версия Lua
- 128 бит - адрес компьютера как компонента
- 128 бит - адрес EEPROM
- 128 бит - адрес загрузочного диска
- 4 бита - вид подключения к ThunderNet
- 7 бит - средний пинг до корневого узла ThunderNet
- 128 бит - случайные данные
- 128 бит - адрес временной ФС (папки /tmp)
Спецификация протокола:
1. Подключение к сети:
— WTC <uid> (Want-To-Connect) Ближайшие компьютеры запоминают этого соседа и отвечают (или не отвечают) — CAC <uid> <level> (Can-Accept-Connection) (level - глубина дерева от корня до отвечающего компьютера); Подключаемый компьютер подтверждает соединение: — AC <uid> (Accept-Connection) Отвечающий компьютер ("родитель") отправляет сообщение до корня: — UCA <uid> (Underlying-Connection-Accepted) Все компьютеры от корня до отвечающего запоминают, в каком направлении посылать сообщение новому.2. Пересылка сообщений:
— RM <message> <target-uid> (Retranslate-Message) Компьютер, получивший такое сообщение, должен: 1) Если он знает путь до <target-uid>, переслать этот пакет по пути. 2) Если он не знает путь и не является корнем, отправить этот пакет родителю. 3) Если он не знает путь и является корнем, забыть это сообщение (потому что куда его отправить? некуда.) При получении сообщения с target-uid, равным uid текущего компьютера, библиотека вызывает событие: thunderlib_incoming <message>
3. Отключение от сети:
— DC <disconnected-uid> Компьютеры выше по дереву забывают путь до указанного компьютера и его потомков.
Моя реализация этого протокола:
Библиотека сейчас состоит из трёх файлов: th_inform.lua, thlib.lua и th_interfaces.lua.
Для работы их надо сложить в ту папку, откуда будет запускаться программа.
Важное замечание: все методы Thunderlib являются синхронными, т.е. блокируют вызывающий поток!
В некоторых функциях есть параметр is_timeout, который завершает выполнение, когда функция возвращает true.
Документация по методам:
thunderlib.connect([is_timeout]) - подключение к ThunderNet thunderlib.disconnect() - отключение Отключение после использования крайне рекомендовано! В противном случае у компьютеров выше в иерархии может кончиться память. thunderlib.send(<address>,<data>) - посылка сообщения заданному компьютеру по его MUID thunderlib.run_server([is_timeout[, allow_connections]]) - запуск сервера ThunderNet Сервер нужен для приёма входящих подключений и обнаружения соседних компьютеров. thunderlib.uid() - возвращает MUID текущего компьютера thunderlib.parent_node() - возвращает MUID родительского компьютера-
3
-
3
-
1
-
-
2 часа назад, Totoro сказал:Напрашивается вывод о том, что какие-то проблемы с сетью.
Хотя если отправка работает, это странно.
Кто-нибудь ещё может подтвердить такие проблемы при использовании Стема из майна?Какие-то странные проблемы. Это точно не сеть, не VPN и сомнительно, что брандмауэр:
- Ocelot Desktop (Lua 5.2) работает замечательно;
- OCEmu (Lua 5.2) не принимает входящие сообщения, но может отправлять;
- Minecraft 1.7.10 (Lua 5.3) работает замечательно.
P.S. Я проверял всё с локального компьютера.
-
1
-
-
22 часа назад, Bs0Dd сказал:Браузер делается НЕ ПОД СТАНДАРТ HTML, т.е. смотреть на нем обычный интернет не выйдет
Я пришёл ровно к тому же, но у меня получился другой формат страниц, более похожий на Python.
Интересно, будет ли потом битва браузеров. Представляю себе: половина страниц в одном формате, половина в другом.
page: addr: "browser:about" desc: "О TigerFox" styles: style: properties: "@ 5 nil * 0x0 0xFFFF00" id: "styles_test" script: command: "client.test_style = searchID[[styles_test]]" rect: properties: "@ 0 0 | 60 20 * 0x333333 0xAAAAAA" text: properties: "@ 1 1" txt: "TigerFox - удобный браузер для OpenComputers."-
2
-
-
Если нужен именно красный цвет, можно использовать вывод через io.stderr.
io.stderr:write('Hello World\n')
Ещё можно использовать такой трюк (он встречается в библиотеке io), там цвета можно менять:
print('\27[31mHello World\27[37m')
-
1
-
-
Нашлась пара багов. Не знаю, как один из них стабильно воспроизводить, но назову.
1. Менее страшный: ошибка или зависание во время выхода из эмулятора.
2. Более страшный: некоторые сейвы отказываются грузиться. В сейве два включенных компьютера, на каждом OpenOS установлена на диск.
Логи stderr (открыт сейв "NostdWorkspace", открываю "StdWorkspace"):
Скрытый текстException in thread "Thread-10" java.io.FileNotFoundException: D:\Ocelot\NostdWorkspace\480d7bb1-2c59-4969-8a7e-7111c32a6f93\lib\core\lua_shell.lua (Системе не удается найти указанный путь)
at java.io.RandomAccessFile.open0(Native Method)
at java.io.RandomAccessFile.open(Unknown Source)
at java.io.RandomAccessFile.<init>(Unknown Source)
at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem$FileChannel.<init>(FileInputStreamFileSystem.scala:51)
at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem.openInputChannel(FileInputStreamFileSystem.scala:48)
at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem.openInputChannel$(FileInputStreamFileSystem.scala:48)
at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.openInputChannel(FileSystemAPI.scala:253)
at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.openInputChannel(FileSystemAPI.scala:253)
at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.$anonfun$load$2(InputStreamFileSystem.scala:65)
at scala.collection.immutable.Vector.foreach(Vector.scala:1794)
at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.load(InputStreamFileSystem.scala:61)
at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.load$(InputStreamFileSystem.scala:58)
at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.totoro$ocelot$brain$entity$fs$OutputStreamFileSystem$$super$load(FileSystemAPI.scala:253)
at totoro.ocelot.brain.entity.fs.OutputStreamFileSystem.load(OutputStreamFileSystem.scala:51)
at totoro.ocelot.brain.entity.fs.OutputStreamFileSystem.load$(OutputStreamFileSystem.scala:50)
at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.totoro$ocelot$brain$entity$fs$Capacity$$super$load(FileSystemAPI.scala:253)
at totoro.ocelot.brain.entity.fs.Capacity.load(Capacity.scala:58)
at totoro.ocelot.brain.entity.fs.Capacity.load$(Capacity.scala:55)
at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.load(FileSystemAPI.scala:253)
at totoro.ocelot.brain.entity.fs.FileSystem.load(FileSystem.scala:319)
at totoro.ocelot.brain.entity.traits.DiskManaged.load(DiskManaged.scala:84)
at totoro.ocelot.brain.entity.traits.DiskManaged.load$(DiskManaged.scala:75)
at totoro.ocelot.brain.entity.HDDManaged.totoro$ocelot$brain$entity$traits$Tiered$$super$load(HDDManaged.scala:6)
at totoro.ocelot.brain.entity.traits.Tiered.load(Tiered.scala:26)
at totoro.ocelot.brain.entity.traits.Tiered.load$(Tiered.scala:25)
at totoro.ocelot.brain.entity.HDDManaged.load(HDDManaged.scala:6)
at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:68)
at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:64)
at totoro.ocelot.brain.entity.traits.Inventory.$anonfun$load$1(Inventory.scala:87)
at totoro.ocelot.brain.entity.traits.Inventory.$anonfun$load$1$adapted(Inventory.scala:86)
at totoro.ocelot.brain.nbt.ExtendedNBT$ExtendedNBTTagList.foreach(ExtendedNBT.scala:248)
at totoro.ocelot.brain.entity.traits.Inventory.load(Inventory.scala:86)
at totoro.ocelot.brain.entity.traits.Inventory.load$(Inventory.scala:84)
at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Entity$$super$load(Case.scala:10)
at totoro.ocelot.brain.entity.traits.Entity.load(Entity.scala:34)
at totoro.ocelot.brain.entity.traits.Entity.load$(Entity.scala:33)
at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Computer$$super$load(Case.scala:10)
at totoro.ocelot.brain.entity.traits.Computer.load(Computer.scala:76)
at totoro.ocelot.brain.entity.traits.Computer.load$(Computer.scala:75)
at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Tiered$$super$load(Case.scala:10)
at totoro.ocelot.brain.entity.traits.Tiered.load(Tiered.scala:26)
at totoro.ocelot.brain.entity.traits.Tiered.load$(Tiered.scala:25)
at totoro.ocelot.brain.entity.Case.load(Case.scala:33)
at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:68)
at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:64)
at totoro.ocelot.brain.workspace.Workspace.$anonfun$load$1(Workspace.scala:165)
at totoro.ocelot.brain.workspace.Workspace.$anonfun$load$1$adapted(Workspace.scala:164)
at totoro.ocelot.brain.nbt.ExtendedNBT$ExtendedNBTTagList.foreach(ExtendedNBT.scala:248)
at totoro.ocelot.brain.workspace.Workspace.load(Workspace.scala:164)
at ocelot.desktop.OcelotDesktop$.loadWorld(OcelotDesktop.scala:97)
at ocelot.desktop.OcelotDesktop$.$anonfun$open$1(OcelotDesktop.scala:161)
at ocelot.desktop.OcelotDesktop$.$anonfun$open$1$adapted(OcelotDesktop.scala:156)
at ocelot.desktop.OcelotDesktop$.$anonfun$chooseDirectory$1(OcelotDesktop.scala:179)
at java.lang.Thread.run(Unknown Source)Stdout при закрытии с ошибкой:
Скрытый текст16:23:40.737 [main] INFO ocelot.desktop.OcelotDesktop$ - Starting up Ocelot Desktop
16:23:40.777 [main] INFO totoro.ocelot.brain.Ocelot$ - Brain initialization...
16:23:40.777 [main] INFO totoro.ocelot.brain.Ocelot$ - Version: 0.6.5
16:23:40.777 [main] INFO totoro.ocelot.brain.Ocelot$ - Loading configuration...
16:23:41.037 [main] INFO totoro.ocelot.brain.Ocelot$ - Registering available machine architectures...
16:23:42.747 [main] INFO totoro.ocelot.brain.Ocelot$ - Found a compatible native library: 'Ocelot-0.6.5-lua52-native.64.dll'.
16:23:42.827 [main] INFO totoro.ocelot.brain.Ocelot$ - Found a compatible native library: 'Ocelot-0.6.5-lua53-native.64.dll'.
16:23:42.827 [main] INFO totoro.ocelot.brain.Ocelot$ - Registering loot (floppies and EEPROMs with standard OpenComputers software)...
16:23:42.827 [main] INFO totoro.ocelot.brain.Ocelot$ - Registering entity constructors (for persistence purposes)...
16:23:42.857 [main] INFO totoro.ocelot.brain.Ocelot$ - Initializing unicode wcwidth.
16:23:42.867 [main] INFO totoro.ocelot.brain.Ocelot$ - Initializing font glyph widths.
16:23:42.897 [main] WARN totoro.ocelot.brain.Ocelot$ - Invalid glyph char code detected in font.hex. Expected 0<= charCode <10000, got: 1D300
16:23:42.897 [main] WARN totoro.ocelot.brain.Ocelot$ - 87 total invalid glyph char codes detected in font.hex
16:23:42.897 [main] INFO totoro.ocelot.brain.Ocelot$ - glyph width ready.
16:23:42.907 [main] INFO totoro.ocelot.brain.Ocelot$ - Initialization finished.
16:23:42.907 [main] INFO ocelot.desktop.ColorScheme$ - Loading color scheme
16:23:42.917 [main] INFO ocelot.desktop.ColorScheme$ - Loaded 39 colors
16:23:42.947 [main] INFO ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
16:23:42.947 [main] INFO ocelot.desktop.util.Ticker - Setting tick interval to 16.666666 ms (60.000004 s^-1)
16:23:43.487 [main] INFO ocelot.desktop.ui.UiHandler$ - Loaded window icons of sizes 256, 128, 64, 32, 16
16:23:43.807 [main] INFO ocelot.desktop.ui.UiHandler$ - Created window with Size2D [ 800,00 x 600,00 ]
16:23:43.807 [main] INFO ocelot.desktop.ui.UiHandler$ - OpenGL vendor: NVIDIA Corporation
16:23:43.807 [main] INFO ocelot.desktop.ui.UiHandler$ - OpenGL renderer: GeForce 8800 GTX/PCIe/SSE2
16:23:43.807 [main] INFO ocelot.desktop.util.Spritesheet$ - Loading sprites
16:23:43.867 [main] INFO ocelot.desktop.util.Spritesheet$ - Loaded 108 sprites
16:23:43.877 [main] INFO ocelot.desktop.graphics.ShaderProgram - Loading shader program (general)
16:23:43.907 [main] INFO ocelot.desktop.util.Font - Loading font unscii-16
16:23:44.067 [main] INFO ocelot.desktop.util.Font - Packed 8942 glyphs into 1536x1536 1-bit texture (294912 bytes)
16:23:44.097 [main] INFO ocelot.desktop.util.Font - Loading font unscii-8
16:23:44.117 [main] INFO ocelot.desktop.util.Font - Packed 2005 glyphs into 1536x1536 1-bit texture (294912 bytes)
16:23:44.217 [main] INFO ocelot.desktop.ui.UiHandler$ - OpenAL device: OpenAL Soft
16:23:44.227 [Thread-3] INFO ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
16:23:44.227 [Thread-3] INFO ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
16:25:44.109 [main] INFO ocelot.desktop.OcelotDesktop$ - Cleaning up
16:25:44.110 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 1)
16:25:44.110 [main] DEBUG ocelot.desktop.graphics.ShaderProgram - Destroyed shader program (general)
16:25:44.110 [main] DEBUG ocelot.desktop.graphics.mesh.VertexArray - Destroyed VAO (ID: 1)
16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 2)
16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 3)
16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 4)
16:25:44.129 [main] ERROR ocelot.desktop.OcelotDesktop$ - java.io.IOException: Unable to delete file: C:\Users\***\AppData\Local\Temp\ocelot-desktop2808142413485854439\OpenAL64.dll
at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:2400)
at org.apache.commons.io.FileUtils.cleanDirectory(FileUtils.java:1721)
at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1617)
at ocelot.desktop.ui.UiHandler$.terminate(UiHandler.scala:218)
at ocelot.desktop.OcelotDesktop$.mainInner(OcelotDesktop.scala:58)
at ocelot.desktop.OcelotDesktop$.main(OcelotDesktop.scala:65)
at ocelot.desktop.OcelotDesktop.main(OcelotDesktop.scala)При зависании лог такой же, но заканчивается перед надписью "Cleaning up".
Версия Java:
Скрытый текстjava version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)-
1
-
-
2 часа назад, serafim сказал:почему-то он плохо ломает землю
Видимо, центральный блок, по которому он ударяет - это камень, и в 3x3 разрушаются только камни.
-
В 03.01.2021 в 18:29, Doob сказал:Чтобы избавиться от древовидной структуры надо придумать, как обходить кольца при поиске пути.
Я сделал макет хранилища, и у меня возникла такая идея: можно каждый раз перемещать предметы в ближайший к конечному сундук, который ещё не посещён. Такой алгоритм будет работать, если в середине сети нет тупиков, в которые предмет мог бы заскочить.
-
Я думаю, можно ещё пошаманить с функцией magic и не рассчитывать максимальную и минимальную плотность камня.
Если
1 час назад, Doob сказал:2112 * (R - H) / D
это выражение - это RANDOM_BYTE, то его можно перед взятием дробной части проверить и на попадание в диапазон [-128; 127].
-
2
-
-
В 02.01.2021 в 13:36, ZO125 сказал:А такое чудо от потери событий не спасет?
Спасёт, но с двумя оговорками:
1. События должны быть нужны только одной программе. Если доставлять события всем программам, то yield надо делать на каждую программу и на каждое событие (вдруг каждая программа обрабатывает нажатие клавиши по секунде?) Тогда и начнётся пропуск части событий.
2. Вредоносные программы по-прежнему будут нагружать сервер и получать TLWY, а при этом могут крашиться любые компы.
-
9 часов назад, hohserg сказал:Предлагаешь сделать среду выполнения луа внутри среды выполнения луа?
Или так, или вообще переписать OpenComputers и сделать среду выполнения Lua на Java. (Кстати, тогда не понадобится та dll, которая идёт в комплекте с модом.)
1 час назад, eu_tomat сказал:Куда возвращать управление?
@hohserg предлагает возвращать управление джаве, но это невозможно из-за ограничений самого Lua: coroutine.yield нельзя вызывать из кода, запущенного библиотекой debug. Возможно, в этом есть и своя логика: во время выполнения той функции checkDeadline управление принадлежит не пользовательскому коду, и yield может прервать не тот поток.
-
6 часов назад, hohserg сказал:Как это может помочь с TLWY?
Идея состоит вот в чём: код запускаемой программы компилируется стандартной функцией load, а выполняется уже системой (то есть система выполняет роль виртуальной машины Lua). После интерпретирования каждой K-ой команды байткода система уступает управление с помощью coroutine.yield. Таким образом, прерывания будут происходить независимо от кода программы и достаточно часто, чтобы не вылетать в нормальных условиях.
Бонус - можно заново написать библиотеку debug, чтобы отлаживать пользовательские программы.
Хотя сразу возникает проблема с подачей событий: они начнут или пропускаться, или активно копиться в буфере. Если несколько игроков будут активно тормошить компьютер, он может вылететь с нехваткой памяти.
-
Disclaimer:
1. Ниже в этой теме может встречаться код, который может нанести ущерб вашему серверу. Эти образцы предоставлены лишь в ознакомительных целях! Я не несу ответственности за положенные ими сервера Майнкрафта.
2. Я не залазил глубоко в исходники OpenComputers, поэтому могу где-то ошибаться.
Одна из часто встречающихся проблем в OpenComputers - превышение таймаута выполнения программы. При этом выбрасывается ошибка TLWY (too long without yielding).
При лагах сервера эта ошибка может возникать совершенно случайным образом, иногда даже в консоли OpenOS. Иногда компьютер может вообще выключиться с синим экраном.
Чтобы создать стабильную систему, проблему TLWY надо решить. У меня были такие идеи:
1. Обёртки из pcall. Это будет некрасиво выглядеть и понизит максимальную глубину рекурсии.
2. Принудительная вставка yield в код. Проблемы такого подхода - потеря множества событий и необходимость парсинга кода.
3. Принудительное прерывание кода по обращениям к глобальным переменным. Проблема - невозможность отследить вызов анонимной функции.
Например, так не прервать код (function(f) return f(f) end)(function(f) return f(f) end).
4. Интерпретировать байткод Lua. Самое доступное решение, но надо знать формат байткода и обновлять с выходом каждой версии Lua.
5. Переписать виртуальную машину Lua так, чтобы она сама уступала управление другим потокам (тогда ошибка TLWY уйдёт в прошлое). Для этого надо договориться с разработчиками OpenComputers и уметь программировать на Java.
Есть ли какие-то варианты избежания TLWY, которые я упустил?
-
1
-
-
Видимо, файл не так составлен, как программа ожидает, или принтер почему-то не подключился.
Стандартные модели печатаются или нет?
-
1
-
-
В 27.04.2020 в 23:03, Totoro сказал:Рендер новый уже есть
Новый рендер действительно похож на Minecraft. Единственное, что мне не нравится - это неограниченное потребление памяти браузером - достаточно запустить такой код, и реальный компьютер станет лагать:
while true do for i = 1, 50 do print(string.char(math.random(56, 126))) end os.sleep(0) end
-
Скорее всего, distance надо заменить на range (в документации написано, что сканер возвращает) или рассчитывать на основе x, y и z.
-
Насколько я помню, команда return вне функции выполняет выход из программы. Скорее всего, там нужно что-то вроде print(redstone.setAnalogOutput("bottom", 15)).
-
@hohserg Закинул: https://pastebin.com/raw/qdYmD7Bw
Только что перепроверил, вроде все тесты работают. Единственная странность - что Юникод рендерится дольше, чем простой ASCII, хотя вызовов к gpu.set остаётся столько же. Возможно, быстрее исчерпывается бюджет вызовов, но это сомнительно.
-
1
-
1
-
-
4 часа назад, Zer0Galaxy сказал:Как все таки тут создавать файлы?
OpenOS надо устанавливать с дискеты на жёсткий диск, как и в Minecraft.
На дискете с OpenOS файл создать невозможно - файловая система дискет защищена от записи.
-
В 26.08.2020 в 21:55, Totoro сказал:Скажи какие там по дефолту input на сторонах и какие лимиты по output.
Только что проверил в майне. Стандартные значения входов (если редстоун не подключен / не запитан) равны 0.
Лимиты по output - от -2 147 483 648 до 2 147 483 647. При превышении лимита значение приводится к этим порогам (ошибок нет).
При этом для красной пыли реальное значение напряжённости (в мире, а не для компьютера) приводится к диапазону от 0 до 15.
-
2
-

Контроллер реактора из IC2
в Программы новичков
Опубликовано:
Не совсем. Если в реакторе есть пластины обшивки, они увеличат максимальную теплоёмкость, и значения формул начнут расходиться.